2023-01-05 13:25:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*  cpu_particles_2d.cpp                                                  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                         This file is part of:                          */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                             GODOT ENGINE                               */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                        https://godotengine.org                         */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Permission is hereby granted, free of charge, to any person obtaining  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* a copy of this software and associated documentation files (the        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* "Software"), to deal in the Software without restriction, including    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* without limitation the rights to use, copy, modify, merge, publish,    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* distribute, sublicense, and/or sell copies of the Software, and to     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* permit persons to whom the Software is furnished to do so, subject to  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* the following conditions:                                              */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* The above copyright notice and this permission notice shall be         */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* included in all copies or substantial portions of the Software.        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2018-08-29 22:38:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "cpu_particles_2d.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "cpu_particles_2d.compat.inc" 
  
						 
					
						
							
								
									
										
										
										
											2020-02-21 23:26:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/math/random_number_generator.h" 
  
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/math/transform_interpolator.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-03-27 08:44:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/2d/gpu_particles_2d.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-07-11 22:29:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/atlas_texture.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-12-20 22:05:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/canvas_item_material.h" 
  
						 
					
						
							
								
									
										
										
										
											2023-07-11 22:29:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/curve_texture.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "scene/resources/gradient_texture.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-08-18 11:09:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/particle_process_material.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emitting ( bool  p_emitting )  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( emitting  = =  p_emitting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-02-20 13:04:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_emitting  & &  ! use_fixed_seed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_seed ( Math : : rand ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emitting  =  p_emitting ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( emitting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-20 13:04:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_set_emitting ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : _set_emitting ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									active  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_process_internal ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// first update before rendering to avoid one frame delay after emitting starts
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( time  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_update_internal ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_amount ( int  p_amount )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-25 10:28:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( p_amount  <  1 ,  " Amount of particles must be greater than 0. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									particles . resize ( p_amount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Particle  * w  =  particles . ptrw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  p_amount ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											w [ i ] . active  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 11:35:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									particle_data . resize ( ( 8  +  4  +  4 )  *  p_amount ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-09 13:19:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > multimesh_allocate_data ( multimesh ,  p_amount ,  RS : : MULTIMESH_TRANSFORM_2D ,  true ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									particle_order . resize ( p_amount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_lifetime ( double  p_lifetime )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-25 10:28:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( p_lifetime  < =  0 ,  " Particles lifetime must be greater than 0. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									lifetime  =  p_lifetime ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_one_shot ( bool  p_one_shot )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									one_shot  =  p_one_shot ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_pre_process_time ( double  p_time )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									pre_process_time  =  p_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_explosiveness_ratio ( real_t  p_ratio )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									explosiveness_ratio  =  p_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_randomness_ratio ( real_t  p_ratio )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									randomness_ratio  =  p_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_lifetime_randomness ( double  p_random )  {  
						 
					
						
							
								
									
										
										
										
											2019-07-14 21:48:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									lifetime_randomness  =  p_random ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_use_local_coordinates ( bool  p_enable )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									local_coords  =  p_enable ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Prevent sending item transforms when using global coords,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// and inform the RenderingServer to use identity mode.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_canvas_item_use_identity_transform ( ! local_coords ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// We only need NOTIFICATION_TRANSFORM_CHANGED
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// when following an interpolated target.
 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_notify_transform ( _interpolation_data . interpolated_follow  | |  ( Engine : : get_singleton ( ) - > is_editor_hint ( )  & &  ! local_coords ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_notify_transform ( _interpolation_data . interpolated_follow ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queue_redraw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_speed_scale ( double  p_scale )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									speed_scale  =  p_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  CPUParticles2D : : is_emitting ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  emitting ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								int  CPUParticles2D : : get_amount ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  particles . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								double  CPUParticles2D : : get_lifetime ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  lifetime ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								bool  CPUParticles2D : : get_one_shot ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  one_shot ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								double  CPUParticles2D : : get_pre_process_time ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  pre_process_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								real_t  CPUParticles2D : : get_explosiveness_ratio ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  explosiveness_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								real_t  CPUParticles2D : : get_randomness_ratio ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  randomness_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								double  CPUParticles2D : : get_lifetime_randomness ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2019-07-14 21:48:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  lifetime_randomness ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  CPUParticles2D : : get_use_local_coordinates ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  local_coords ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								double  CPUParticles2D : : get_speed_scale ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  speed_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_draw_order ( DrawOrder  p_order )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									draw_order  =  p_order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								CPUParticles2D : : DrawOrder  CPUParticles2D : : get_draw_order ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  draw_order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 18:19:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _update_mesh_texture ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Size2  tex_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( texture . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tex_size  =  texture - > get_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tex_size  =  Size2 ( 1 ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-11 21:12:39 +05:45 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < Vector2 >  vertices  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										- tex_size  *  0.5 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										- tex_size  *  0.5  +  Vector2 ( tex_size . x ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										- tex_size  *  0.5  +  tex_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										- tex_size  *  0.5  +  Vector2 ( 0 ,  tex_size . y ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < Vector2 >  uvs ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-08 11:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AtlasTexture  * atlas_texture  =  Object : : cast_to < AtlasTexture > ( * texture ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( atlas_texture  & &  atlas_texture - > get_atlas ( ) . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Rect2  region_rect  =  atlas_texture - > get_region ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Size2  atlas_size  =  atlas_texture - > get_atlas ( ) - > get_size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( region_rect . position . x  /  atlas_size . x ,  region_rect . position . y  /  atlas_size . y ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( ( region_rect . position . x  +  region_rect . size . x )  /  atlas_size . x ,  region_rect . position . y  /  atlas_size . y ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( ( region_rect . position . x  +  region_rect . size . x )  /  atlas_size . x ,  ( region_rect . position . y  +  region_rect . size . y )  /  atlas_size . y ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( region_rect . position . x  /  atlas_size . x ,  ( region_rect . position . y  +  region_rect . size . y )  /  atlas_size . y ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( 0 ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( 1 ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( 1 ,  1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uvs . push_back ( Vector2 ( 0 ,  1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-11 21:12:39 +05:45 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < Color >  colors  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Color ( 1 ,  1 ,  1 ,  1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Color ( 1 ,  1 ,  1 ,  1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Color ( 1 ,  1 ,  1 ,  1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Color ( 1 ,  1 ,  1 ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < int >  indices  =  {  0 ,  1 ,  2 ,  2 ,  3 ,  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Array  arr ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									arr . resize ( RS : : ARRAY_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									arr [ RS : : ARRAY_VERTEX ]  =  vertices ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									arr [ RS : : ARRAY_TEX_UV ]  =  uvs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									arr [ RS : : ARRAY_COLOR ]  =  colors ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									arr [ RS : : ARRAY_INDEX ]  =  indices ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > mesh_clear ( mesh ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > mesh_add_surface_from_arrays ( mesh ,  RS : : PRIMITIVE_TRIANGLES ,  arr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_texture ( const  Ref < Texture2D >  & p_texture )  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_texture  = =  texture )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( texture . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-03 21:29:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										texture - > disconnect_changed ( callable_mp ( this ,  & CPUParticles2D : : _texture_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									texture  =  p_texture ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( texture . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-03 21:29:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										texture - > connect_changed ( callable_mp ( this ,  & CPUParticles2D : : _texture_changed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queue_redraw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 18:19:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_mesh_texture ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _texture_changed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( texture . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										queue_redraw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-02 17:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_update_mesh_texture ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _refresh_interpolation_state ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! is_inside_tree ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The logic for whether to do an interpolated follow.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This is rather complex, but basically:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If project setting interpolation is ON and this particle system is in global mode,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// we will follow the INTERPOLATED position rather than the actual position.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This is so that particles aren't generated AHEAD of the interpolated parent.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  follow  =  ! local_coords  & &  get_tree ( ) - > is_physics_interpolation_enabled ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( follow  = =  _interpolation_data . interpolated_follow )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_interpolation_data . interpolated_follow  =  follow ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_physics_process_internal ( _interpolation_data . interpolated_follow ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 15:43:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Texture2D >  CPUParticles2D : : get_texture ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  texture ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_fixed_fps ( int  p_count )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fixed_fps  =  p_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  CPUParticles2D : : get_fixed_fps ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  fixed_fps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_fractional_delta ( bool  p_enable )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fractional_delta  =  p_enable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  CPUParticles2D : : get_fractional_delta ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  fractional_delta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-17 19:03:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								PackedStringArray  CPUParticles2D : : get_configuration_warnings ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PackedStringArray  warnings  =  Node2D : : get_configuration_warnings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									CanvasItemMaterial  * mat  =  Object : : cast_to < CanvasItemMaterial > ( get_material ( ) . ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( get_material ( ) . is_null ( )  | |  ( mat  & &  ! mat - > get_particles_animation ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( get_param_max ( PARAM_ANIM_SPEED )  ! =  0.0  | |  get_param_max ( PARAM_ANIM_OFFSET )  ! =  0.0  | | 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 18:19:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												get_param_curve ( PARAM_ANIM_SPEED ) . is_valid ( )  | |  get_param_curve ( PARAM_ANIM_OFFSET ) . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-28 15:24:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											warnings . push_back ( RTR ( " CPUParticles2D animation requires the usage of a CanvasItemMaterial with  \" Particles Animation \"  enabled. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 18:19:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  warnings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : restart ( bool  p_keep_seed )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									frame_remainder  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cycle  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-24 21:38:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									emitting  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-21 22:33:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  pc  =  particles . size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Particle  * w  =  particles . ptrw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  pc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											w [ i ] . active  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_keep_seed  & &  ! use_fixed_seed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										seed  =  Math : : rand ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-24 21:38:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-02-20 13:04:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									emitting  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_set_emitting ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 23:45:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_direction ( Vector2  p_direction )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									direction  =  p_direction ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Vector2  CPUParticles2D : : get_direction ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  direction ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_spread ( real_t  p_spread )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									spread  =  p_spread ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								real_t  CPUParticles2D : : get_spread ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  spread ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_param_min ( Parameter  p_param ,  real_t  p_value )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_param ,  PARAM_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parameters_min [ p_param ]  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( parameters_min [ p_param ]  >  parameters_max [ p_param ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_param_max ( p_param ,  p_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								real_t  CPUParticles2D : : get_param_min ( Parameter  p_param )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_param ,  PARAM_MAX ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  parameters_min [ p_param ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_param_max ( Parameter  p_param ,  real_t  p_value )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_param ,  PARAM_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parameters_max [ p_param ]  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( parameters_min [ p_param ]  >  parameters_max [ p_param ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_param_min ( p_param ,  p_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-03 16:01:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									update_configuration_warnings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								real_t  CPUParticles2D : : get_param_max ( Parameter  p_param )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_param ,  PARAM_MAX ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  parameters_max [ p_param ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  _adjust_curve_range ( const  Ref < Curve >  & p_curve ,  real_t  p_min ,  real_t  p_max )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Ref < Curve >  curve  =  p_curve ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-25 14:15:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( curve . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									curve - > ensure_default_setup ( p_min ,  p_max ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_param_curve ( Parameter  p_param ,  const  Ref < Curve >  & p_curve )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_param ,  PARAM_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									curve_parameters [ p_param ]  =  p_curve ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( p_param )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_INITIAL_LINEAR_VELOCITY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//do none for this one
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_ANGULAR_VELOCITY :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 360 ,  360 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 17:47:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  PARAM_ORBIT_VELOCITY :  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 500 ,  500 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 17:47:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  PARAM_LINEAR_ACCEL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 200 ,  200 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_RADIAL_ACCEL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 200 ,  200 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_TANGENTIAL_ACCEL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 200 ,  200 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_DAMPING :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  0 ,  100 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_ANGLE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 360 ,  360 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_SCALE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_HUE_VARIATION :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  - 1 ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_ANIM_SPEED :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_adjust_curve_range ( p_curve ,  0 ,  200 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  PARAM_ANIM_OFFSET :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-08 16:00:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										default :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-03 16:01:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									update_configuration_warnings ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								Ref < Curve >  CPUParticles2D : : get_param_curve ( Parameter  p_param )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_param ,  PARAM_MAX ,  Ref < Curve > ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  curve_parameters [ p_param ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_color ( const  Color  & p_color )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									color  =  p_color ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Color  CPUParticles2D : : get_color ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  color ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_color_ramp ( const  Ref < Gradient >  & p_ramp )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									color_ramp  =  p_ramp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ref < Gradient >  CPUParticles2D : : get_color_ramp ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  color_ramp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_color_initial_ramp ( const  Ref < Gradient >  & p_ramp )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									color_initial_ramp  =  p_ramp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ref < Gradient >  CPUParticles2D : : get_color_initial_ramp ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  color_initial_ramp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_particle_flag ( ParticleFlags  p_particle_flag ,  bool  p_enable )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_particle_flag ,  PARTICLE_FLAG_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									particle_flags [ p_particle_flag ]  =  p_enable ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  CPUParticles2D : : get_particle_flag ( ParticleFlags  p_particle_flag )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_particle_flag ,  PARTICLE_FLAG_MAX ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  particle_flags [ p_particle_flag ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emission_shape ( EmissionShape  p_shape )  {  
						 
					
						
							
								
									
										
										
										
											2020-01-16 10:59:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_shape ,  EMISSION_SHAPE_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emission_shape  =  p_shape ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 17:18:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									notify_property_list_changed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Engine : : get_singleton ( ) - > is_editor_hint ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										queue_redraw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emission_sphere_radius ( real_t  p_radius )  {  
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_radius  = =  emission_sphere_radius )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emission_sphere_radius  =  p_radius ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Engine : : get_singleton ( ) - > is_editor_hint ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										queue_redraw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emission_rect_extents ( Vector2  p_extents )  {  
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_extents  = =  emission_rect_extents )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emission_rect_extents  =  p_extents ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Engine : : get_singleton ( ) - > is_editor_hint ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										queue_redraw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emission_points ( const  Vector < Vector2 >  & p_points )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emission_points  =  p_points ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emission_normals ( const  Vector < Vector2 >  & p_normals )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emission_normals  =  p_normals ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_emission_colors ( const  Vector < Color >  & p_colors )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emission_colors  =  p_colors ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								real_t  CPUParticles2D : : get_emission_sphere_radius ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  emission_sphere_radius ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								Vector2  CPUParticles2D : : get_emission_rect_extents ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  emission_rect_extents ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector < Vector2 >  CPUParticles2D : : get_emission_points ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  emission_points ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector < Vector2 >  CPUParticles2D : : get_emission_normals ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  emission_normals ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector < Color >  CPUParticles2D : : get_emission_colors ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  emission_colors ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								CPUParticles2D : : EmissionShape  CPUParticles2D : : get_emission_shape ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  emission_shape ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_gravity ( const  Vector2  & p_gravity )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gravity  =  p_gravity ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Vector2  CPUParticles2D : : get_gravity ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  gravity ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_scale_curve_x ( Ref < Curve >  p_scale_curve )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scale_curve_x  =  p_scale_curve ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_scale_curve_y ( Ref < Curve >  p_scale_curve )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scale_curve_y  =  p_scale_curve ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_split_scale ( bool  p_split_scale )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									split_scale  =  p_split_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									notify_property_list_changed ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ref < Curve >  CPUParticles2D : : get_scale_curve_x ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  scale_curve_x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ref < Curve >  CPUParticles2D : : get_scale_curve_y ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  scale_curve_y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  CPUParticles2D : : get_split_scale ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  split_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_use_fixed_seed ( bool  p_use_fixed_seed )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_use_fixed_seed  = =  use_fixed_seed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									use_fixed_seed  =  p_use_fixed_seed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									notify_property_list_changed ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  CPUParticles2D : : get_use_fixed_seed ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  use_fixed_seed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_seed ( uint32_t  p_seed )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									seed  =  p_seed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : set_show_gizmos ( bool  p_show_gizmos )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( show_gizmos  = =  p_show_gizmos )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									show_gizmos  =  p_show_gizmos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queue_redraw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								uint32_t  CPUParticles2D : : get_seed ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  seed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : request_particles_process ( real_t  p_requested_process_time )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_requested_process_time  =  p_requested_process_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _validate_property ( PropertyInfo  & p_property )  const  {  
						 
					
						
							
								
									
										
										
										
											2024-08-18 04:00:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " emitting " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . hint  =  one_shot  ?  PROPERTY_HINT_ONESHOT  :  PROPERTY_HINT_NONE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " emission_sphere_radius "  & &  ( emission_shape  ! =  EMISSION_SHAPE_SPHERE  & &  emission_shape  ! =  EMISSION_SHAPE_SPHERE_SURFACE ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " emission_rect_extents "  & &  emission_shape  ! =  EMISSION_SHAPE_RECTANGLE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( p_property . name  = =  " emission_point_texture "  | |  p_property . name  = =  " emission_color_texture " )  & &  ( emission_shape  <  EMISSION_SHAPE_POINTS ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " emission_normals "  & &  emission_shape  ! =  EMISSION_SHAPE_DIRECTED_POINTS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " emission_points "  & &  emission_shape  ! =  EMISSION_SHAPE_POINTS  & &  emission_shape  ! =  EMISSION_SHAPE_DIRECTED_POINTS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " emission_colors "  & &  emission_shape  ! =  EMISSION_SHAPE_POINTS  & &  emission_shape  ! =  EMISSION_SHAPE_DIRECTED_POINTS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 23:57:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_property . name . begins_with ( " scale_curve_ " )  & &  ! split_scale )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_property . name  = =  " seed "  & &  ! use_fixed_seed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-04 11:51:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_property . usage  =  PROPERTY_USAGE_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  uint32_t  idhash ( uint32_t  x )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									x  =  ( ( x  > >  uint32_t ( 16 ) )  ^  x )  *  uint32_t ( 0x45d9f3b ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									x  =  ( ( x  > >  uint32_t ( 16 ) )  ^  x )  *  uint32_t ( 0x45d9f3b ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									x  =  ( x  > >  uint32_t ( 16 ) )  ^  x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  real_t  rand_from_seed ( uint32_t  & seed )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									int  k ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  s  =  int ( seed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( s  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										s  =  305420679 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									k  =  s  /  127773 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									s  =  16807  *  ( s  -  k  *  127773 )  -  2836  *  k ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( s  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										s  + =  2147483647 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									seed  =  uint32_t ( s ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ( seed  %  uint32_t ( 65536 ) )  /  65535.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _update_internal ( )  {  
						 
					
						
							
								
									
										
										
										
											2025-03-20 00:07:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( particles . is_empty ( )  | |  ! is_visible_in_tree ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_set_do_redraw ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Change update mode?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_refresh_interpolation_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									double  delta  =  get_process_delta_time ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 10:18:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! active  & &  ! emitting )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_process_internal ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_set_do_redraw ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 10:18:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//reset variables
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										frame_remainder  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cycle  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_set_do_redraw ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									double  frame_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( fixed_fps  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										frame_time  =  1.0  /  fixed_fps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										frame_time  =  1.0  /  30.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									double  todo  =  _requested_process_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_requested_process_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( time  = =  0  & &  pre_process_time  >  0.0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										todo  + =  pre_process_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									real_t  tmp_speed  =  speed_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									speed_scale  =  1.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( todo  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_particles_process ( frame_time ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										todo  - =  frame_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									speed_scale  =  tmp_speed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									todo  =  0.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( fixed_fps  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										double  decr  =  frame_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										double  ldelta  =  delta ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ldelta  >  0.1 )  {  //avoid recursive stalls if fps goes below 10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ldelta  =  0.1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( ldelta  < =  0.0 )  {  //unlikely but..
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ldelta  =  0.001 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										todo  =  frame_remainder  +  ldelta ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-19 17:30:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( todo  > =  frame_time )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_particles_process ( frame_time ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											todo  - =  decr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										frame_remainder  =  todo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_particles_process ( delta ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_particle_data_buffer ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _particles_process ( double  p_delta )  {  
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									p_delta  * =  speed_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  pcount  =  particles . size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Particle  * w  =  particles . ptrw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Particle  * parray  =  w ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									double  prev_time  =  time ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									time  + =  p_delta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( time  >  lifetime )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										time  =  Math : : fmod ( time ,  lifetime ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cycle + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( one_shot  & &  cycle  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-20 11:20:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											set_emitting ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 17:18:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											notify_property_list_changed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Transform2D  emission_xform ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Transform2D  velocity_xform ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! local_coords )  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! _interpolation_data . interpolated_follow )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											emission_xform  =  get_global_transform ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TransformInterpolator : : interpolate_transform_2d ( _interpolation_data . global_xform_prev ,  _interpolation_data . global_xform_curr ,  emission_xform ,  Engine : : get_singleton ( ) - > get_physics_interpolation_fraction ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										velocity_xform  =  emission_xform ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										velocity_xform [ 2 ]  =  Vector2 ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									double  system_phase  =  time  /  lifetime ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 23:38:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 10:18:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  should_be_active  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  pcount ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Particle  & p  =  parray [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! emitting  & &  ! p . active )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										double  local_delta  =  p_delta ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 23:38:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// The phase is a ratio between 0 (birth) and 1 (end of life) for each particle.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// While we use time in tests later on, for randomness we use the phase as done in the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// original shader code, and we later multiply by lifetime to get the time.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										double  restart_phase  =  double ( i )  /  double ( pcount ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 23:38:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( randomness_ratio  >  0.0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uint32_t  _seed  =  cycle ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 23:38:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( restart_phase  > =  system_phase )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_seed  - =  uint32_t ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_seed  * =  uint32_t ( pcount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_seed  + =  uint32_t ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											double  random  =  double ( idhash ( _seed )  %  uint32_t ( 65536 ) )  /  65536.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											restart_phase  + =  randomness_ratio  *  random  *  1.0  /  double ( pcount ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 23:38:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										restart_phase  * =  ( 1.0  -  explosiveness_ratio ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-01 21:16:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										double  restart_time  =  restart_phase  *  lifetime ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										bool  restart  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( time  >  prev_time )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// restart_time >= prev_time is used so particles emit in the first frame they are processed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( restart_time  > =  prev_time  & &  restart_time  <  time )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												restart  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( fractional_delta )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-10 00:33:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													local_delta  =  time  -  restart_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( local_delta  >  0.0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( restart_time  > =  prev_time )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												restart  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( fractional_delta )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-10 00:33:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													local_delta  =  lifetime  -  restart_time  +  time ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( restart_time  <  time )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												restart  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( fractional_delta )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-10 00:33:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													local_delta  =  time  -  restart_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 21:48:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p . time  *  ( 1.0  -  explosiveness_ratio )  >  p . lifetime )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											restart  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 14:18:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										float  tv  =  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( restart )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! emitting )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . active  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . active  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/*real_t tex_linear_velocity = 0;
 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_INITIAL_LINEAR_VELOCITY ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_linear_velocity  =  curve_parameters [ PARAM_INITIAL_LINEAR_VELOCITY ] - > sample ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 11:35:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_angle  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ANGLE ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_angle  =  curve_parameters [ PARAM_ANGLE ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-12 11:35:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_anim_offset  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ANGLE ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_anim_offset  =  curve_parameters [ PARAM_ANGLE ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . seed  =  seed  +  uint32_t ( i )  +  i  +  cycle ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rng - > set_seed ( p . seed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . angle_rand  =  rng - > randf ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . scale_rand  =  rng - > randf ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . hue_rot_rand  =  rng - > randf ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . anim_offset_rand  =  rng - > randf ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( color_initial_ramp . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												p . start_color_rand  =  color_initial_ramp - > get_color_at_offset ( rng - > randf ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . start_color_rand  =  Color ( 1 ,  1 ,  1 ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  angle1_rad  =  direction . angle ( )  +  Math : : deg_to_rad ( ( rng - > randf ( )  *  2.0  -  1.0 )  *  spread ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Vector2  rot  =  Vector2 ( Math : : cos ( angle1_rad ) ,  Math : : sin ( angle1_rad ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . velocity  =  rot  *  Math : : lerp ( parameters_min [ PARAM_INITIAL_LINEAR_VELOCITY ] ,  parameters_max [ PARAM_INITIAL_LINEAR_VELOCITY ] ,  rng - > randf ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  base_angle  =  tex_angle  *  Math : : lerp ( parameters_min [ PARAM_ANGLE ] ,  parameters_max [ PARAM_ANGLE ] ,  p . angle_rand ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 17:45:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . rotation  =  Math : : deg_to_rad ( base_angle ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . custom [ 0 ]  =  0.0 ;  // unused
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . custom [ 1 ]  =  0.0 ;  // phase [0..1]
 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . custom [ 2 ]  =  tex_anim_offset  *  Math : : lerp ( parameters_min [ PARAM_ANIM_OFFSET ] ,  parameters_max [ PARAM_ANIM_OFFSET ] ,  p . anim_offset_rand ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . custom [ 3 ]  =  ( 1.0  -  rng - > randf ( )  *  lifetime_randomness ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											p . transform  =  Transform2D ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-01 14:00:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . lifetime  =  lifetime  *  p . custom [ 3 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											p . base_color  =  Color ( 1 ,  1 ,  1 ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											switch  ( emission_shape )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_POINT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													//do none
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-17 11:59:31 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_SPHERE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													real_t  t  =  Math_TAU  *  rng - > randf ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													real_t  radius  =  emission_sphere_radius  *  rng - > randf ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-27 23:28:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													p . transform [ 2 ]  =  Vector2 ( Math : : cos ( t ) ,  Math : : sin ( t ) )  *  radius ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_SPHERE_SURFACE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													real_t  s  =  rng - > randf ( ) ,  t  =  Math_TAU  *  rng - > randf ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													real_t  radius  =  emission_sphere_radius  *  Math : : sqrt ( 1.0  -  s  *  s ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-06 00:13:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													p . transform [ 2 ]  =  Vector2 ( Math : : cos ( t ) ,  Math : : sin ( t ) )  *  radius ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_RECTANGLE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													p . transform [ 2 ]  =  Vector2 ( rng - > randf ( )  *  2.0  -  1.0 ,  rng - > randf ( )  *  2.0  -  1.0 )  *  emission_rect_extents ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_POINTS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_DIRECTED_POINTS :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													int  pc  =  emission_points . size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( pc  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													int  random_idx  =  Math : : rand ( )  %  pc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p . transform [ 2 ]  =  emission_points . get ( random_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( emission_shape  = =  EMISSION_SHAPE_DIRECTED_POINTS  & &  emission_normals . size ( )  = =  pc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-09 18:16:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Vector2  normal  =  emission_normals . get ( random_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Transform2D  m2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 07:50:35 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														m2 . columns [ 0 ]  =  normal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														m2 . columns [ 1 ]  =  normal . orthogonal ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-09 18:16:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														p . velocity  =  m2 . basis_xform ( p . velocity ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( emission_colors . size ( )  = =  pc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														p . base_color  =  emission_colors . get ( random_idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-16 10:59:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												case  EMISSION_SHAPE_MAX :  {  // Max value for validity check.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! local_coords )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . velocity  =  velocity_xform . xform ( p . velocity ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . transform  =  emission_xform  *  p . transform ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( ! p . active )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 21:48:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( p . time  >  p . lifetime )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . active  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 14:18:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tv  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uint32_t  _seed  =  p . seed ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											p . time  + =  local_delta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . custom [ 1 ]  =  p . time  /  lifetime ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 14:18:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tv  =  p . time  /  p . lifetime ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_linear_velocity  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_INITIAL_LINEAR_VELOCITY ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_linear_velocity  =  curve_parameters [ PARAM_INITIAL_LINEAR_VELOCITY ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_orbit_velocity  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 17:47:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ORBIT_VELOCITY ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_orbit_velocity  =  curve_parameters [ PARAM_ORBIT_VELOCITY ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 17:47:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_angular_velocity  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ANGULAR_VELOCITY ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_angular_velocity  =  curve_parameters [ PARAM_ANGULAR_VELOCITY ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_linear_accel  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_LINEAR_ACCEL ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_linear_accel  =  curve_parameters [ PARAM_LINEAR_ACCEL ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_tangential_accel  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_TANGENTIAL_ACCEL ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_tangential_accel  =  curve_parameters [ PARAM_TANGENTIAL_ACCEL ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_radial_accel  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_RADIAL_ACCEL ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_radial_accel  =  curve_parameters [ PARAM_RADIAL_ACCEL ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_damping  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_DAMPING ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_damping  =  curve_parameters [ PARAM_DAMPING ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_angle  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ANGLE ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_angle  =  curve_parameters [ PARAM_ANGLE ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_anim_speed  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ANIM_SPEED ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_anim_speed  =  curve_parameters [ PARAM_ANIM_SPEED ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  tex_anim_offset  =  1.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_ANIM_OFFSET ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_anim_offset  =  curve_parameters [ PARAM_ANIM_OFFSET ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  force  =  gravity ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  pos  =  p . transform [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//apply linear acceleration
 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											force  + =  p . velocity . length ( )  >  0.0  ?  p . velocity . normalized ( )  *  tex_linear_accel  *  Math : : lerp ( parameters_min [ PARAM_LINEAR_ACCEL ] ,  parameters_max [ PARAM_LINEAR_ACCEL ] ,  rand_from_seed ( _seed ) )  :  Vector2 ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//apply radial acceleration
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  org  =  emission_xform [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  diff  =  pos  -  org ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											force  + =  diff . length ( )  >  0.0  ?  diff . normalized ( )  *  ( tex_radial_accel ) * Math : : lerp ( parameters_min [ PARAM_RADIAL_ACCEL ] ,  parameters_max [ PARAM_RADIAL_ACCEL ] ,  rand_from_seed ( _seed ) )  :  Vector2 ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//apply tangential acceleration;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  yx  =  Vector2 ( diff . y ,  diff . x ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											force  + =  yx . length ( )  >  0.0  ?  ( yx  *  Vector2 ( - 1.0 ,  1.0 ) ) . normalized ( )  *  ( tex_tangential_accel  *  Math : : lerp ( parameters_min [ PARAM_TANGENTIAL_ACCEL ] ,  parameters_max [ PARAM_TANGENTIAL_ACCEL ] ,  rand_from_seed ( _seed ) ) )  :  Vector2 ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//apply attractor forces
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . velocity  + =  force  *  local_delta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//orbit velocity
 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  orbit_amount  =  tex_orbit_velocity  *  Math : : lerp ( parameters_min [ PARAM_ORBIT_VELOCITY ] ,  parameters_max [ PARAM_ORBIT_VELOCITY ] ,  rand_from_seed ( _seed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 17:47:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( orbit_amount  ! =  0.0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												real_t  ang  =  orbit_amount  *  local_delta  *  Math_TAU ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-18 11:09:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Not sure why the ParticleProcessMaterial code uses a clockwise rotation matrix,
 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 17:47:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// but we use -ang here to reproduce its behavior.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Transform2D  rot  =  Transform2D ( - ang ,  Vector2 ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . transform [ 2 ]  - =  diff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . transform [ 2 ]  + =  rot . basis_xform ( diff ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_INITIAL_LINEAR_VELOCITY ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . velocity  =  p . velocity . normalized ( )  *  tex_linear_velocity ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( parameters_max [ PARAM_DAMPING ]  +  tex_damping  >  0.0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												real_t  v  =  p . velocity . length ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												real_t  damp  =  tex_damping  *  Math : : lerp ( parameters_min [ PARAM_DAMPING ] ,  parameters_max [ PARAM_DAMPING ] ,  rand_from_seed ( _seed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												v  - =  damp  *  local_delta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( v  <  0.0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p . velocity  =  Vector2 ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p . velocity  =  p . velocity . normalized ( )  *  v ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											real_t  base_angle  =  ( tex_angle ) * Math : : lerp ( parameters_min [ PARAM_ANGLE ] ,  parameters_max [ PARAM_ANGLE ] ,  p . angle_rand ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											base_angle  + =  p . custom [ 1 ]  *  lifetime  *  tex_angular_velocity  *  Math : : lerp ( parameters_min [ PARAM_ANGULAR_VELOCITY ] ,  parameters_max [ PARAM_ANGULAR_VELOCITY ] ,  rand_from_seed ( _seed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 17:45:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . rotation  =  Math : : deg_to_rad ( base_angle ) ;  //angle
 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . custom [ 2 ]  =  tex_anim_offset  *  Math : : lerp ( parameters_min [ PARAM_ANIM_OFFSET ] ,  parameters_max [ PARAM_ANIM_OFFSET ] ,  p . anim_offset_rand )  +  tv  *  tex_anim_speed  *  Math : : lerp ( parameters_min [ PARAM_ANIM_SPEED ] ,  parameters_max [ PARAM_ANIM_SPEED ] ,  rand_from_seed ( _seed ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//apply color
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//apply hue rotation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  tex_scale  =  Vector2 ( 1.0 ,  1.0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( split_scale )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( scale_curve_x . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_scale . x  =  scale_curve_x - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tex_scale . x  =  1.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( scale_curve_y . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_scale . y  =  scale_curve_y - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tex_scale . y  =  1.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( curve_parameters [ PARAM_SCALE ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												real_t  tmp_scale  =  curve_parameters [ PARAM_SCALE ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tex_scale . x  =  tmp_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tex_scale . y  =  tmp_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										real_t  tex_hue_variation  =  0.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( curve_parameters [ PARAM_HUE_VARIATION ] . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-24 18:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tex_hue_variation  =  curve_parameters [ PARAM_HUE_VARIATION ] - > sample ( tv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										real_t  hue_rot_angle  =  ( tex_hue_variation ) * Math_TAU  *  Math : : lerp ( parameters_min [ PARAM_HUE_VARIATION ] ,  parameters_max [ PARAM_HUE_VARIATION ] ,  p . hue_rot_rand ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-29 23:10:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										real_t  hue_rot_c  =  Math : : cos ( hue_rot_angle ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										real_t  hue_rot_s  =  Math : : sin ( hue_rot_angle ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Basis  hue_rot_mat ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Basis  mat1 ( 0.299 ,  0.587 ,  0.114 ,  0.299 ,  0.587 ,  0.114 ,  0.299 ,  0.587 ,  0.114 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Basis  mat2 ( 0.701 ,  - 0.587 ,  - 0.114 ,  - 0.299 ,  0.413 ,  - 0.114 ,  - 0.300 ,  - 0.588 ,  0.886 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Basis  mat3 ( 0.168 ,  0.330 ,  - 0.497 ,  - 0.328 ,  0.035 ,  0.292 ,  1.250 ,  - 1.050 ,  - 0.203 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  j  =  0 ;  j  <  3 ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												hue_rot_mat [ j ]  =  mat1 [ j ]  +  mat2 [ j ]  *  hue_rot_c  +  mat3 [ j ]  *  hue_rot_s ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( color_ramp . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-27 14:18:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . color  =  color_ramp - > get_color_at_offset ( tv )  *  color ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . color  =  color ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector3  color_rgb  =  hue_rot_mat . xform_inv ( Vector3 ( p . color . r ,  p . color . g ,  p . color . b ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . color . r  =  color_rgb . x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . color . g  =  color_rgb . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . color . b  =  color_rgb . z ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p . color  * =  p . base_color  *  p . start_color_rand ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( particle_flags [ PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( p . velocity . length ( )  >  0.0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-24 16:59:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												p . transform . columns [ 1 ]  =  p . velocity . normalized ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . transform . columns [ 0 ]  =  p . transform . columns [ 1 ] . orthogonal ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-24 16:59:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p . transform . columns [ 0 ]  =  Vector2 ( Math : : cos ( p . rotation ) ,  - Math : : sin ( p . rotation ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . transform . columns [ 1 ]  =  Vector2 ( Math : : sin ( p . rotation ) ,  Math : : cos ( p . rotation ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//scale by scale
 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  base_scale  =  tex_scale  *  Math : : lerp ( parameters_min [ PARAM_SCALE ] ,  parameters_max [ PARAM_SCALE ] ,  p . scale_rand ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( base_scale . x  <  0.00001 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											base_scale . x  =  0.00001 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( base_scale . y  <  0.00001 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											base_scale . y  =  0.00001 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-24 16:59:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p . transform . columns [ 0 ]  * =  base_scale . x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . transform . columns [ 1 ]  * =  base_scale . y ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . transform [ 2 ]  + =  p . velocity  *  local_delta ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 10:18:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										should_be_active  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! Math : : is_equal_approx ( time ,  0.0 )  & &  active  & &  ! should_be_active )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										active  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-04 17:01:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										emit_signal ( SceneStringName ( finished ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : _update_particle_data_buffer ( )  {  
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( update_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  pc  =  particles . size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  * ow ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  * order  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									float  * w  =  particle_data . ptrw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  Particle  * r  =  particles . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									float  * ptr  =  w ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( draw_order  ! =  DRAW_ORDER_INDEX )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ow  =  particle_order . ptrw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										order  =  ow ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  pc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											order [ i ]  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( draw_order  = =  DRAW_ORDER_LIFETIME )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortArray < int ,  SortLifetime >  sorter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sorter . compare . particles  =  r ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sorter . sort ( order ,  pc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  pc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  idx  =  order  ?  order [ i ]  :  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Transform2D  t  =  r [ idx ] . transform ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! local_coords )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t  =  inv_emission_transform  *  t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( r [ idx ] . active )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-24 16:59:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ptr [ 0 ]  =  t . columns [ 0 ] [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ptr [ 1 ]  =  t . columns [ 1 ] [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ptr [ 2 ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-24 16:59:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ptr [ 3 ]  =  t . columns [ 2 ] [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ptr [ 4 ]  =  t . columns [ 0 ] [ 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ptr [ 5 ]  =  t . columns [ 1 ] [ 1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ptr [ 6 ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-24 16:59:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ptr [ 7 ]  =  t . columns [ 2 ] [ 1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-27 16:19:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											memset ( ptr ,  0 ,  sizeof ( float )  *  8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Color  c  =  r [ idx ] . color ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 11:35:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ptr [ 8 ]  =  c . r ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ptr [ 9 ]  =  c . g ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ptr [ 10 ]  =  c . b ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ptr [ 11 ]  =  c . a ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 11:35:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ptr [ 12 ]  =  r [ idx ] . custom [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ptr [ 13 ]  =  r [ idx ] . custom [ 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ptr [ 14 ]  =  r [ idx ] . custom [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ptr [ 15 ]  =  r [ idx ] . custom [ 3 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 11:35:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ptr  + =  16 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  CPUParticles2D : : _set_do_redraw ( bool  p_do_redraw )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( do_redraw  = =  p_do_redraw )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-08 16:00:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									do_redraw  =  p_do_redraw ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-28 18:31:52 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( update_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( do_redraw )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RS : : get_singleton ( ) - > connect ( " frame_pre_draw " ,  callable_mp ( this ,  & CPUParticles2D : : _update_render_thread ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											RS : : get_singleton ( ) - > canvas_item_set_update_when_visible ( get_canvas_item ( ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RS : : get_singleton ( ) - > multimesh_set_visible_instances ( multimesh ,  - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( RS : : get_singleton ( ) - > is_connected ( " frame_pre_draw " ,  callable_mp ( this ,  & CPUParticles2D : : _update_render_thread ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												RS : : get_singleton ( ) - > disconnect ( " frame_pre_draw " ,  callable_mp ( this ,  & CPUParticles2D : : _update_render_thread ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RS : : get_singleton ( ) - > canvas_item_set_update_when_visible ( get_canvas_item ( ) ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RS : : get_singleton ( ) - > multimesh_set_visible_instances ( multimesh ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-08 16:00:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queue_redraw ( ) ;  // redraw to update render list
 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-08 16:00:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : _update_render_thread ( )  {  
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( update_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > multimesh_set_buffer ( multimesh ,  particle_data ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : _notification ( int  p_what )  {  
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( p_what )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  NOTIFICATION_ENTER_TREE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											set_process_internal ( emitting ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_refresh_interpolation_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If we are interpolated following, then reset physics interpolation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// when first appearing. This won't be called by canvas item, as in the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// following mode, is_physics_interpolated() is actually FALSE.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( _interpolation_data . interpolated_follow )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												notification ( NOTIFICATION_RESET_PHYSICS_INTERPOLATION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 18:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_EXIT_TREE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_set_do_redraw ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 18:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_DRAW :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// first update before rendering to avoid one frame delay after emitting starts
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( emitting  & &  ( time  = =  0 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_internal ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-13 23:21:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! do_redraw )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return ;  // don't add to render list
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RID  texrid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( texture . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												texrid  =  texture - > get_rid ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RS : : get_singleton ( ) - > canvas_item_add_multimesh ( get_canvas_item ( ) ,  multimesh ,  texrid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( show_gizmos )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_draw_emission_gizmo ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 18:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_INTERNAL_PROCESS :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_internal ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 18:06:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_INTERNAL_PHYSICS_PROCESS :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( _interpolation_data . interpolated_follow )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Keep the interpolated follow target updated.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_interpolation_data . global_xform_prev  =  _interpolation_data . global_xform_curr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_interpolation_data . global_xform_curr  =  get_global_transform ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_TRANSFORM_CHANGED :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( _interpolation_data . interpolated_follow )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If the transform has been updated AFTER the physics tick, keep data flowing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( Engine : : get_singleton ( ) - > is_in_physics_frame ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_interpolation_data . global_xform_curr  =  get_global_transform ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! local_coords )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												queue_redraw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2021-02-28 21:11:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  NOTIFICATION_RESET_PHYSICS_INTERPOLATION :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Make sure current is up to date with any pending global transform changes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_interpolation_data . global_xform_curr  =  get_global_transform_const ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_interpolation_data . global_xform_prev  =  _interpolation_data . global_xform_curr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-14 13:22:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-29 16:42:52 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : _draw_emission_gizmo ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Color  emission_ring_color  =  Color ( 0.8 ,  0.7 ,  0.4 ,  0.4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Transform2D  gizmo_transform ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! local_coords )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										gizmo_transform  =  get_global_transform ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									draw_set_transform_matrix ( gizmo_transform ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( emission_shape )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  CPUParticles2D : : EMISSION_SHAPE_RECTANGLE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											draw_rect ( Rect2 ( - emission_rect_extents ,  emission_rect_extents  *  2.0 ) ,  emission_ring_color ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  CPUParticles2D : : EMISSION_SHAPE_SPHERE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  CPUParticles2D : : EMISSION_SHAPE_SPHERE_SURFACE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											draw_circle ( Vector2 ( ) ,  emission_sphere_radius ,  emission_ring_color ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : convert_from_particles ( Node  * p_particles )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GPUParticles2D  * gpu_particles  =  Object : : cast_to < GPUParticles2D > ( p_particles ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-06 14:59:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_MSG ( gpu_particles ,  " Only GPUParticles2D nodes can be converted to CPUParticles2D. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_emitting ( gpu_particles - > is_emitting ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_amount ( gpu_particles - > get_amount ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_lifetime ( gpu_particles - > get_lifetime ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_one_shot ( gpu_particles - > get_one_shot ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_pre_process_time ( gpu_particles - > get_pre_process_time ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_explosiveness_ratio ( gpu_particles - > get_explosiveness_ratio ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_randomness_ratio ( gpu_particles - > get_randomness_ratio ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_use_local_coordinates ( gpu_particles - > get_use_local_coordinates ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_fixed_fps ( gpu_particles - > get_fixed_fps ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_fractional_delta ( gpu_particles - > get_fractional_delta ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_speed_scale ( gpu_particles - > get_speed_scale ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_draw_order ( DrawOrder ( gpu_particles - > get_draw_order ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_texture ( gpu_particles - > get_texture ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < Material >  mat  =  gpu_particles - > get_material ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( mat . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_material ( mat ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < ParticleProcessMaterial >  proc_mat  =  gpu_particles - > get_process_material ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( proc_mat . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector3  dir  =  proc_mat - > get_direction ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 23:45:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_direction ( Vector2 ( dir . x ,  dir . y ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_spread ( proc_mat - > get_spread ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_color ( proc_mat - > get_color ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < GradientTexture1D >  gt  =  proc_mat - > get_color_ramp ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( gt . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_color_ramp ( gt - > get_gradient ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < GradientTexture1D >  gti  =  proc_mat - > get_color_initial_ramp ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( gti . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_color_initial_ramp ( gti - > get_gradient ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_particle_flag ( PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY ,  proc_mat - > get_particle_flag ( ParticleProcessMaterial : : PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_emission_shape ( EmissionShape ( proc_mat - > get_emission_shape ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_emission_sphere_radius ( proc_mat - > get_emission_sphere_radius ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector2  rect_extents  =  Vector2 ( proc_mat - > get_emission_box_extents ( ) . x ,  proc_mat - > get_emission_box_extents ( ) . y ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 13:05:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_emission_rect_extents ( rect_extents ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < CurveXYZTexture >  scale3D  =  proc_mat - > get_param_texture ( ParticleProcessMaterial : : PARAM_SCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scale3D . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										split_scale  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scale_curve_x  =  scale3D - > get_curve_x ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scale_curve_y  =  scale3D - > get_curve_y ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_gravity ( Vector2 ( proc_mat - > get_gravity ( ) . x ,  proc_mat - > get_gravity ( ) . y ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_lifetime_randomness ( proc_mat - > get_lifetime_randomness ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-18 11:09:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define CONVERT_PARAM(m_param)                                                                  \ 
  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_param_min ( m_param ,  proc_mat - > get_param_min ( ParticleProcessMaterial : : m_param ) ) ;           \
							 
						 
					
						
							
								
									
										
										
										
											2022-08-18 11:09:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{                                                                                            \
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < CurveTexture >  ctex  =  proc_mat - > get_param_texture ( ParticleProcessMaterial : : m_param ) ;  \
							 
						 
					
						
							
								
									
										
										
										
											2022-08-18 11:09:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ctex . is_valid ( ) )                                                                     \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											set_param_curve ( m_param ,  ctex - > get_curve ( ) ) ;                                         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}                                                                                            \
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_param_max ( m_param ,  proc_mat - > get_param_max ( ParticleProcessMaterial : : m_param ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_INITIAL_LINEAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_ANGULAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_ORBIT_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_LINEAR_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_RADIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_TANGENTIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_DAMPING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_ANGLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_SCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_HUE_VARIATION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_ANIM_SPEED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									CONVERT_PARAM ( PARAM_ANIM_OFFSET ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# undef CONVERT_PARAM 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  CPUParticles2D : : _bind_methods ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emitting " ,  " emitting " ) ,  & CPUParticles2D : : set_emitting ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_amount " ,  " amount " ) ,  & CPUParticles2D : : set_amount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_lifetime " ,  " secs " ) ,  & CPUParticles2D : : set_lifetime ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_one_shot " ,  " enable " ) ,  & CPUParticles2D : : set_one_shot ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_pre_process_time " ,  " secs " ) ,  & CPUParticles2D : : set_pre_process_time ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_explosiveness_ratio " ,  " ratio " ) ,  & CPUParticles2D : : set_explosiveness_ratio ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_randomness_ratio " ,  " ratio " ) ,  & CPUParticles2D : : set_randomness_ratio ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 21:48:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_lifetime_randomness " ,  " random " ) ,  & CPUParticles2D : : set_lifetime_randomness ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_use_local_coordinates " ,  " enable " ) ,  & CPUParticles2D : : set_use_local_coordinates ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_fixed_fps " ,  " fps " ) ,  & CPUParticles2D : : set_fixed_fps ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_fractional_delta " ,  " enable " ) ,  & CPUParticles2D : : set_fractional_delta ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_speed_scale " ,  " scale " ) ,  & CPUParticles2D : : set_speed_scale ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " request_particles_process " ,  " process_time " ) ,  & CPUParticles2D : : request_particles_process ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " is_emitting " ) ,  & CPUParticles2D : : is_emitting ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_amount " ) ,  & CPUParticles2D : : get_amount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_lifetime " ) ,  & CPUParticles2D : : get_lifetime ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_one_shot " ) ,  & CPUParticles2D : : get_one_shot ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_pre_process_time " ) ,  & CPUParticles2D : : get_pre_process_time ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_explosiveness_ratio " ) ,  & CPUParticles2D : : get_explosiveness_ratio ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_randomness_ratio " ) ,  & CPUParticles2D : : get_randomness_ratio ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-14 21:48:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_lifetime_randomness " ) ,  & CPUParticles2D : : get_lifetime_randomness ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_use_local_coordinates " ) ,  & CPUParticles2D : : get_use_local_coordinates ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_fixed_fps " ) ,  & CPUParticles2D : : get_fixed_fps ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_fractional_delta " ) ,  & CPUParticles2D : : get_fractional_delta ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_speed_scale " ) ,  & CPUParticles2D : : get_speed_scale ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_use_fixed_seed " ,  " use_fixed_seed " ) ,  & CPUParticles2D : : set_use_fixed_seed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_use_fixed_seed " ) ,  & CPUParticles2D : : get_use_fixed_seed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_seed " ,  " seed " ) ,  & CPUParticles2D : : set_seed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_seed " ) ,  & CPUParticles2D : : get_seed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_draw_order " ,  " order " ) ,  & CPUParticles2D : : set_draw_order ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_draw_order " ) ,  & CPUParticles2D : : get_draw_order ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_texture " ,  " texture " ) ,  & CPUParticles2D : : set_texture ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_texture " ) ,  & CPUParticles2D : : get_texture ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " restart " ,  " keep_seed " ) ,  & CPUParticles2D : : restart ,  DEFVAL ( false ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-18 04:00:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL ,  " emitting " ,  PROPERTY_HINT_ONESHOT ) ,  " set_emitting " ,  " is_emitting " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-16 10:21:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : INT ,  " amount " ,  PROPERTY_HINT_RANGE ,  " 1,1000000,1,exp " ) ,  " set_amount " ,  " get_amount " ) ;  // FIXME: Evaluate support for `exp` in integer properties, or remove this.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-09 16:13:24 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT ,  " texture " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Texture2D " ) ,  " set_texture " ,  " get_texture " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Time " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-04 15:33:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " lifetime " ,  PROPERTY_HINT_RANGE ,  " 0.01,600.0,0.01,or_greater,exp,suffix:s " ) ,  " set_lifetime " ,  " get_lifetime " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL ,  " one_shot " ) ,  " set_one_shot " ,  " get_one_shot " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-13 11:26:35 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " preprocess " ,  PROPERTY_HINT_RANGE ,  " 0.00,10.0,0.01,or_greater,exp,suffix:s " ) ,  " set_pre_process_time " ,  " get_pre_process_time " ) ; 
							 
						 
					
						
							
								
									
										
										
											
												Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
											 
										 
										
											2020-02-24 15:20:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " speed_scale " ,  PROPERTY_HINT_RANGE ,  " 0,64,0.01 " ) ,  " set_speed_scale " ,  " get_speed_scale " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " explosiveness " ,  PROPERTY_HINT_RANGE ,  " 0,1,0.01 " ) ,  " set_explosiveness_ratio " ,  " get_explosiveness_ratio " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " randomness " ,  PROPERTY_HINT_RANGE ,  " 0,1,0.01 " ) ,  " set_randomness_ratio " ,  " get_randomness_ratio " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-18 18:13:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL ,  " use_fixed_seed " ) ,  " set_use_fixed_seed " ,  " get_use_fixed_seed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : INT ,  " seed " ,  PROPERTY_HINT_RANGE ,  " 0, "  +  itos ( UINT32_MAX )  +  " ,1 " ) ,  " set_seed " ,  " get_seed " ) ; 
							 
						 
					
						
							
								
									
										
										
											
												Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
											 
										 
										
											2020-02-24 15:20:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " lifetime_randomness " ,  PROPERTY_HINT_RANGE ,  " 0,1,0.01 " ) ,  " set_lifetime_randomness " ,  " get_lifetime_randomness " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-02 18:09:19 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : INT ,  " fixed_fps " ,  PROPERTY_HINT_RANGE ,  " 0,1000,1,suffix:FPS " ) ,  " set_fixed_fps " ,  " get_fixed_fps " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL ,  " fract_delta " ) ,  " set_fractional_delta " ,  " get_fractional_delta " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Drawing " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-11 18:56:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// No visibility_rect property contrarily to Particles2D, it's updated automatically.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL ,  " local_coords " ) ,  " set_use_local_coordinates " ,  " get_use_local_coordinates " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : INT ,  " draw_order " ,  PROPERTY_HINT_ENUM ,  " Index,Lifetime " ) ,  " set_draw_order " ,  " get_draw_order " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( DRAW_ORDER_INDEX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( DRAW_ORDER_LIFETIME ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-02-04 11:51:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY_DEFAULT ( " seed " ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									////////////////////////////////
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 23:45:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_direction " ,  " direction " ) ,  & CPUParticles2D : : set_direction ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_direction " ) ,  & CPUParticles2D : : get_direction ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-02 18:09:19 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_spread " ,  " spread " ) ,  & CPUParticles2D : : set_spread ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_spread " ) ,  & CPUParticles2D : : get_spread ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_param_min " ,  " param " ,  " value " ) ,  & CPUParticles2D : : set_param_min ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_param_min " ,  " param " ) ,  & CPUParticles2D : : get_param_min ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_param_max " ,  " param " ,  " value " ) ,  & CPUParticles2D : : set_param_max ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_param_max " ,  " param " ) ,  & CPUParticles2D : : get_param_max ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_param_curve " ,  " param " ,  " curve " ) ,  & CPUParticles2D : : set_param_curve ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_param_curve " ,  " param " ) ,  & CPUParticles2D : : get_param_curve ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_color " ,  " color " ) ,  & CPUParticles2D : : set_color ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_color " ) ,  & CPUParticles2D : : get_color ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_color_ramp " ,  " ramp " ) ,  & CPUParticles2D : : set_color_ramp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_color_ramp " ) ,  & CPUParticles2D : : get_color_ramp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_color_initial_ramp " ,  " ramp " ) ,  & CPUParticles2D : : set_color_initial_ramp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_color_initial_ramp " ) ,  & CPUParticles2D : : get_color_initial_ramp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_particle_flag " ,  " particle_flag " ,  " enable " ) ,  & CPUParticles2D : : set_particle_flag ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_particle_flag " ,  " particle_flag " ) ,  & CPUParticles2D : : get_particle_flag ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emission_shape " ,  " shape " ) ,  & CPUParticles2D : : set_emission_shape ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_emission_shape " ) ,  & CPUParticles2D : : get_emission_shape ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emission_sphere_radius " ,  " radius " ) ,  & CPUParticles2D : : set_emission_sphere_radius ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_emission_sphere_radius " ) ,  & CPUParticles2D : : get_emission_sphere_radius ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emission_rect_extents " ,  " extents " ) ,  & CPUParticles2D : : set_emission_rect_extents ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_emission_rect_extents " ) ,  & CPUParticles2D : : get_emission_rect_extents ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emission_points " ,  " array " ) ,  & CPUParticles2D : : set_emission_points ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_emission_points " ) ,  & CPUParticles2D : : get_emission_points ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emission_normals " ,  " array " ) ,  & CPUParticles2D : : set_emission_normals ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_emission_normals " ) ,  & CPUParticles2D : : get_emission_normals ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_emission_colors " ,  " array " ) ,  & CPUParticles2D : : set_emission_colors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_emission_colors " ) ,  & CPUParticles2D : : get_emission_colors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_gravity " ) ,  & CPUParticles2D : : get_gravity ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_gravity " ,  " accel_vec " ) ,  & CPUParticles2D : : set_gravity ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_split_scale " ) ,  & CPUParticles2D : : get_split_scale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_split_scale " ,  " split_scale " ) ,  & CPUParticles2D : : set_split_scale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_scale_curve_x " ) ,  & CPUParticles2D : : get_scale_curve_x ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_scale_curve_x " ,  " scale_curve " ) ,  & CPUParticles2D : : set_scale_curve_x ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " get_scale_curve_y " ) ,  & CPUParticles2D : : get_scale_curve_y ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " set_scale_curve_y " ,  " scale_curve " ) ,  & CPUParticles2D : : set_scale_curve_y ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " convert_from_particles " ,  " particles " ) ,  & CPUParticles2D : : convert_from_particles ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 10:18:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " finished " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Emission Shape " ,  " emission_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-18 16:06:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : INT ,  " emission_shape " ,  PROPERTY_HINT_ENUM ,  " Point,Sphere,Sphere Surface,Rectangle,Points,Directed Points " ,  PROPERTY_USAGE_DEFAULT  |  PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) ,  " set_emission_shape " ,  " get_emission_shape " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-02 18:09:19 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " emission_sphere_radius " ,  PROPERTY_HINT_RANGE ,  " 0.01,128,0.01,suffix:px " ) ,  " set_emission_sphere_radius " ,  " get_emission_sphere_radius " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-20 00:24:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : VECTOR2 ,  " emission_rect_extents " ,  PROPERTY_HINT_NONE ,  " suffix:px " ) ,  " set_emission_rect_extents " ,  " get_emission_rect_extents " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : PACKED_VECTOR2_ARRAY ,  " emission_points " ) ,  " set_emission_points " ,  " get_emission_points " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : PACKED_VECTOR2_ARRAY ,  " emission_normals " ) ,  " set_emission_normals " ,  " get_emission_normals " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : PACKED_COLOR_ARRAY ,  " emission_colors " ) ,  " set_emission_colors " ,  " get_emission_colors " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_GROUP ( " Particle Flags " ,  " particle_flag_ " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : BOOL ,  " particle_flag_align_y " ) ,  " set_particle_flag " ,  " get_particle_flag " ,  PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 23:45:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_GROUP ( " Direction " ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : VECTOR2 ,  " direction " ) ,  " set_direction " ,  " get_direction " ) ; 
							 
						 
					
						
							
								
									
										
										
											
												Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
											 
										 
										
											2020-02-24 15:20:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : FLOAT ,  " spread " ,  PROPERTY_HINT_RANGE ,  " 0,180,0.01 " ) ,  " set_spread " ,  " get_spread " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Gravity " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-02 18:09:19 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : VECTOR2 ,  " gravity " ,  PROPERTY_HINT_NONE ,  U " suffix:px/s \u00B2 " ) ,  " set_gravity " ,  " get_gravity " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Initial Velocity " ,  " initial_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-02 18:09:19 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " initial_velocity_min " ,  PROPERTY_HINT_RANGE ,  " 0,1000,0.01,or_greater,suffix:px/s " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_INITIAL_LINEAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " initial_velocity_max " ,  PROPERTY_HINT_RANGE ,  " 0,1000,0.01,or_greater,suffix:px/s " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_INITIAL_LINEAR_VELOCITY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Angular Velocity " ,  " angular_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " angular_velocity_min " ,  PROPERTY_HINT_RANGE ,  " -720,720,0.01,or_less,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_ANGULAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " angular_velocity_max " ,  PROPERTY_HINT_RANGE ,  " -720,720,0.01,or_less,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_ANGULAR_VELOCITY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " angular_velocity_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_ANGULAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Orbit Velocity " ,  " orbit_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " orbit_velocity_min " ,  PROPERTY_HINT_RANGE ,  " -1000,1000,0.01,or_less,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_ORBIT_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " orbit_velocity_max " ,  PROPERTY_HINT_RANGE ,  " -1000,1000,0.01,or_less,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_ORBIT_VELOCITY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " orbit_velocity_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_ORBIT_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Linear Accel " ,  " linear_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " linear_accel_min " ,  PROPERTY_HINT_RANGE ,  " -100,100,0.01,or_less,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_LINEAR_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " linear_accel_max " ,  PROPERTY_HINT_RANGE ,  " -100,100,0.01,or_less,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_LINEAR_ACCEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " linear_accel_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_LINEAR_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Radial Accel " ,  " radial_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " radial_accel_min " ,  PROPERTY_HINT_RANGE ,  " -100,100,0.01,or_less,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_RADIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " radial_accel_max " ,  PROPERTY_HINT_RANGE ,  " -100,100,0.01,or_less,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_RADIAL_ACCEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " radial_accel_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_RADIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Tangential Accel " ,  " tangential_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " tangential_accel_min " ,  PROPERTY_HINT_RANGE ,  " -100,100,0.01,or_less,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_TANGENTIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " tangential_accel_max " ,  PROPERTY_HINT_RANGE ,  " -100,100,0.01,or_less,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_TANGENTIAL_ACCEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " tangential_accel_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_TANGENTIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Damping " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-07 15:26:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " damping_min " ,  PROPERTY_HINT_RANGE ,  " 0,100,0.001,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_DAMPING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " damping_max " ,  PROPERTY_HINT_RANGE ,  " 0,100,0.001,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_DAMPING ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " damping_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_DAMPING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Angle " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " angle_min " ,  PROPERTY_HINT_RANGE ,  " -720,720,0.1,or_less,or_greater,degrees " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_ANGLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " angle_max " ,  PROPERTY_HINT_RANGE ,  " -720,720,0.1,or_less,or_greater,degrees " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_ANGLE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " angle_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_ANGLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Scale " ,  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " scale_amount_min " ,  PROPERTY_HINT_RANGE ,  " 0,1000,0.01,or_greater " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_SCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " scale_amount_max " ,  PROPERTY_HINT_RANGE ,  " 0,1000,0.01,or_greater " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_SCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-27 11:07:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " scale_amount_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_SCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL ,  " split_scale " ) ,  " set_split_scale " ,  " get_split_scale " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT ,  " scale_curve_x " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_scale_curve_x " ,  " get_scale_curve_x " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT ,  " scale_curve_y " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_scale_curve_y " ,  " get_scale_curve_y " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Color " ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : COLOR ,  " color " ) ,  " set_color " ,  " get_color " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-10 21:07:22 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT ,  " color_ramp " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Gradient " ) ,  " set_color_ramp " ,  " get_color_ramp " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 13:50:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT ,  " color_initial_ramp " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Gradient " ) ,  " set_color_initial_ramp " ,  " get_color_initial_ramp " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Hue Variation " ,  " hue_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " hue_variation_min " ,  PROPERTY_HINT_RANGE ,  " -1,1,0.01 " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_HUE_VARIATION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " hue_variation_max " ,  PROPERTY_HINT_RANGE ,  " -1,1,0.01 " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_HUE_VARIATION ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " hue_variation_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_HUE_VARIATION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_GROUP ( " Animation " ,  " anim_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-27 19:16:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " anim_speed_min " ,  PROPERTY_HINT_RANGE ,  " 0,128,0.01,or_greater,or_less " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_ANIM_SPEED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " anim_speed_max " ,  PROPERTY_HINT_RANGE ,  " 0,128,0.01,or_greater,or_less " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_ANIM_SPEED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " anim_speed_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_ANIM_SPEED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-29 22:15:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " anim_offset_min " ,  PROPERTY_HINT_RANGE ,  " 0,1,0.0001 " ) ,  " set_param_min " ,  " get_param_min " ,  PARAM_ANIM_OFFSET ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : FLOAT ,  " anim_offset_max " ,  PROPERTY_HINT_RANGE ,  " 0,1,0.0001 " ) ,  " set_param_max " ,  " get_param_max " ,  PARAM_ANIM_OFFSET ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : OBJECT ,  " anim_offset_curve " ,  PROPERTY_HINT_RESOURCE_TYPE ,  " Curve " ) ,  " set_param_curve " ,  " get_param_curve " ,  PARAM_ANIM_OFFSET ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_INITIAL_LINEAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_ANGULAR_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_ORBIT_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_LINEAR_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_RADIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_TANGENTIAL_ACCEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_DAMPING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_ANGLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_SCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_HUE_VARIATION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_ANIM_SPEED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_ANIM_OFFSET ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARAM_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARTICLE_FLAG_ROTATE_Y ) ;  // Unused, but exposed for consistency with 3D.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARTICLE_FLAG_DISABLE_Z ) ;  // Unused, but exposed for consistency with 3D.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( PARTICLE_FLAG_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_POINT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-17 11:59:31 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_SPHERE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-27 23:28:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_SPHERE_SURFACE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_RECTANGLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_POINTS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_DIRECTED_POINTS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-16 10:59:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BIND_ENUM_CONSTANT ( EMISSION_SHAPE_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								CPUParticles2D : : CPUParticles2D ( )  {  
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mesh  =  RenderingServer : : get_singleton ( ) - > mesh_create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									multimesh  =  RenderingServer : : get_singleton ( ) - > multimesh_create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RenderingServer : : get_singleton ( ) - > multimesh_set_mesh ( multimesh ,  mesh ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_emitting ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_amount ( 8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-09 17:38:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_use_local_coordinates ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-04 11:51:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_seed ( Math : : rand ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 12:00:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rng . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-13 19:46:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_param_min ( PARAM_INITIAL_LINEAR_VELOCITY ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_ANGULAR_VELOCITY ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_ORBIT_VELOCITY ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_LINEAR_ACCEL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_RADIAL_ACCEL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_TANGENTIAL_ACCEL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_DAMPING ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_ANGLE ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_SCALE ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_HUE_VARIATION ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_ANIM_SPEED ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_min ( PARAM_ANIM_OFFSET ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_INITIAL_LINEAR_VELOCITY ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_ANGULAR_VELOCITY ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_ORBIT_VELOCITY ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_LINEAR_ACCEL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_RADIAL_ACCEL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_TANGENTIAL_ACCEL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_DAMPING ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_ANGLE ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_SCALE ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_HUE_VARIATION ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_ANIM_SPEED ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_param_max ( PARAM_ANIM_OFFSET ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-04 18:35:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  PARTICLE_FLAG_MAX ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										particle_flags [ i ]  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_color ( Color ( 1 ,  1 ,  1 ,  1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-13 18:19:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_mesh_texture ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 13:24:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// CPUParticles2D defaults to interpolation off.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This is because the result often looks better when the particles are updated every frame.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Note that children will need to explicitly turn back on interpolation if they want to use it,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// rather than relying on inherit mode.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_physics_interpolation_mode ( Node : : PHYSICS_INTERPOLATION_MODE_OFF ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								CPUParticles2D : : ~ CPUParticles2D ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-12-12 12:42:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL ( RenderingServer : : get_singleton ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-27 15:21:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > free ( multimesh ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RS : : get_singleton ( ) - > free ( mesh ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-29 16:48:32 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}