struct EdEmitter : EDGUILayoutRow { EdEmitter() : grpSpawn( false, "Spawn properties" ), spawn_MaxCount( 0, 0, MAX_PARTICLES ), spawn_Count( 0, 0, MAX_PARTICLES ), spawn_CountExt( 0, 0, MAX_PARTICLES ), spawn_TimeExt( V2(0), 2, V2(0), V2(MAX_TIME) ), grpPosition( false, "Initial position" ), create_Pos( V3(0), 2, V3(-MAX_POS), V3(MAX_POS) ), create_PosBox( V3(0), 2, V3(0), V3(MAX_POS) ), create_PosRadius( 0, 2, 0, MAX_POS ), grpVelocity( false, "Initial velocity" ), create_VelMicroDir( V3(0), 2, V3(-MAX_NORMAL), V3(MAX_NORMAL) ), create_VelMicroDvg( 0, 2, 0, 1 ), create_VelMicroDistExt( V2(0), 2, V2(0), V2(MAX_VEL) ), create_VelMacroDir( V3(0), 2, V3(-MAX_NORMAL), V3(MAX_NORMAL) ), create_VelMacroDvg( 0, 2, 0, 1 ), create_VelMacroDistExt( V2(0), 2, V2(0), V2(MAX_VEL) ), create_VelCluster( 0, 0, MAX_PARTICLES ), create_VelClusterExt( 0, 0, MAX_PARTICLES ), grpMisc( false, "Misc. properties" ), create_LifetimeExt( V2(0), 2, V2(0), V2(MAX_TIME) ), create_AngleDirDvg( V2(0), 2, V2(0,0), V2(360,180) ), create_AngleVelDvg( V2(0), 2, V2(-1000), V2(1000) ), tick_AngleAcc( 0, 2, -10000, 10000 ), absolute( true ), grpSizeColor( false, "Size/color curves" ), curve_Size( false, "Size" ), curve_ColorHue( false, "Color - hue" ), curve_ColorSat( false, "Color - saturation" ), curve_ColorVal( false, "Color - value" ), curve_Opacity( false, "Opacity" ), grpRender( true, "Rendering data" ), render_Texture0( g_UITexPicker, "bullet" ), render_Texture1( g_UITexPicker, "" ), render_Texture2( g_UITexPicker, "" ), render_Texture3( g_UITexPicker, "" ), render_Shader( g_UIShaderPicker, "particle" ), render_Additive( false ), render_Stretch( false ), m_psys( NULL ), m_emitter( NULL ) { spawn_MaxCount.caption = "Max. particle count"; spawn_Count.caption = "# of particles to spawn"; spawn_CountExt.caption = "# + random"; spawn_TimeExt.caption = "Spawn time / rand.ext."; create_Pos.caption = "Origin"; create_PosBox.caption = "Random extents"; create_PosRadius.caption = "Random radius"; create_VelMicroDir.caption = "V/micro/direction"; create_VelMicroDvg.caption = "V/micro/divergence"; create_VelMicroDistExt.caption = "V/micro/dist+rand.ext."; create_VelMacroDir.caption = "V/macro/direction"; create_VelMacroDvg.caption = "V/macro/divergence"; create_VelMacroDistExt.caption = "V/macro/dist+rand.ext."; create_VelCluster.caption = "V - cluster size"; create_VelClusterExt.caption = "V - cluster rand.ext."; create_LifetimeExt.caption = "Lifetime + rand.ext."; create_AngleDirDvg.caption = "Angle / divergence"; create_AngleVelDvg.caption = "Angular velocity / divergence"; tick_AngleAcc.caption = "Angle - acceleration"; absolute.caption = "World space"; render_Texture0.caption = "Texture #1"; render_Texture1.caption = "Texture #2"; render_Texture2.caption = "Texture #3"; render_Texture3.caption = "Texture #4"; render_Shader.caption = "Shader"; render_Additive.caption = "Is additive+unlit?"; render_Stretch.caption = "Is velocity-stretched?"; grpSpawn.Add( &spawn_MaxCount ); grpSpawn.Add( &spawn_Count ); grpSpawn.Add( &spawn_CountExt ); grpSpawn.Add( &spawn_TimeExt ); Add( &grpSpawn ); grpPosition.Add( &create_Pos ); grpPosition.Add( &create_PosBox ); grpPosition.Add( &create_PosRadius ); Add( &grpPosition ); grpVelocity.Add( &create_VelMicroDir ); grpVelocity.Add( &create_VelMicroDvg ); grpVelocity.Add( &create_VelMicroDistExt ); grpVelocity.Add( &create_VelMacroDir ); grpVelocity.Add( &create_VelMacroDvg ); grpVelocity.Add( &create_VelMacroDistExt ); grpVelocity.Add( &create_VelCluster ); grpVelocity.Add( &create_VelClusterExt ); Add( &grpVelocity ); grpMisc.Add( &create_LifetimeExt ); grpMisc.Add( &create_AngleDirDvg ); grpMisc.Add( &create_AngleVelDvg ); grpMisc.Add( &tick_AngleAcc ); grpMisc.Add( &absolute ); Add( &grpMisc ); grpSizeColor.Add( &curve_Size ); grpSizeColor.Add( &curve_ColorHue ); grpSizeColor.Add( &curve_ColorSat ); grpSizeColor.Add( &curve_ColorVal ); grpSizeColor.Add( &curve_Opacity ); Add( &grpSizeColor ); grpRender.Add( &render_Texture0 ); grpRender.Add( &render_Texture1 ); grpRender.Add( &render_Texture2 ); grpRender.Add( &render_Texture3 ); grpRender.Add( &render_Shader ); grpRender.Add( &render_Additive ); grpRender.Add( &render_Stretch ); Add( &grpRender ); } int OnEvent( EDGUIEvent* e ) { switch( e->type ) { case EDGUI_EVENT_PROPEDIT: if( e->target == &spawn_MaxCount ){ m_emitter->spawn_MaxCount = spawn_MaxCount.m_value; _U(false); } if( e->target == &spawn_Count ){ m_emitter->spawn_Count = spawn_Count.m_value; _U(false); } if( e->target == &spawn_CountExt ){ m_emitter->spawn_CountExt = spawn_CountExt.m_value; _U(false); } if( e->target == &spawn_TimeExt ){ m_emitter->spawn_TimeExt = spawn_TimeExt.m_value; _U(false); } if( e->target == &create_Pos ){ m_emitter->create_Pos = create_Pos.m_value; _U(false); } if( e->target == &create_PosBox ){ m_emitter->create_PosBox = create_PosBox.m_value; _U(false); } if( e->target == &create_PosRadius ){ m_emitter->create_PosRadius = create_PosRadius.m_value; _U(false); } if( e->target == &create_VelMicroDir ){ m_emitter->create_VelMicroDir = create_VelMicroDir.m_value; _U(false); } if( e->target == &create_VelMicroDvg ){ m_emitter->create_VelMicroDvg = create_VelMicroDvg.m_value; _U(false); } if( e->target == &create_VelMicroDistExt ){ m_emitter->create_VelMicroDistExt = create_VelMicroDistExt.m_value; _U(false); } if( e->target == &create_VelMacroDir ){ m_emitter->create_VelMacroDir = create_VelMacroDir.m_value; _U(false); } if( e->target == &create_VelMacroDvg ){ m_emitter->create_VelMacroDvg = create_VelMacroDvg.m_value; _U(false); } if( e->target == &create_VelMacroDistExt ){ m_emitter->create_VelMacroDistExt = create_VelMacroDistExt.m_value; _U(false); } if( e->target == &create_VelCluster ){ m_emitter->create_VelCluster = create_VelCluster.m_value; _U(false); } if( e->target == &create_VelClusterExt ){ m_emitter->create_VelClusterExt = create_VelClusterExt.m_value; _U(false); } if( e->target == &create_LifetimeExt ){ m_emitter->create_LifetimeExt = create_LifetimeExt.m_value; _U(false); } if( e->target == &create_AngleDirDvg ){ m_emitter->create_AngleDirDvg = DEG2RAD( create_AngleDirDvg.m_value ); _U(false); } if( e->target == &create_AngleVelDvg ){ m_emitter->create_AngleVelDvg = DEG2RAD( create_AngleVelDvg.m_value ); _U(false); } if( e->target == &tick_AngleAcc ){ m_emitter->tick_AngleAcc = DEG2RAD( tick_AngleAcc.m_value ); _U(false); } if( e->target == &absolute ){ m_emitter->absolute = absolute.m_value; _U(false); } if( e->target == &render_Texture0 ){ m_emitter->render_Textures[0] = GetParticleTexHandle( render_Texture0.m_value ); _U(true); } if( e->target == &render_Texture1 ){ m_emitter->render_Textures[1] = GetParticleTexHandle( render_Texture1.m_value ); _U(true); } if( e->target == &render_Texture2 ){ m_emitter->render_Textures[2] = GetParticleTexHandle( render_Texture2.m_value ); _U(true); } if( e->target == &render_Texture3 ){ m_emitter->render_Textures[3] = GetParticleTexHandle( render_Texture3.m_value ); _U(true); } if( e->target == &render_Shader ){ m_emitter->render_Shader = render_Shader.m_value; _U(true); } if( e->target == &render_Additive ){ m_emitter->render_Additive = render_Additive.m_value; _U(true); } if( e->target == &render_Stretch ){ m_emitter->render_Stretch = render_Stretch.m_value; _U(true); } break; } return EDGUILayoutRow::OnEvent( e ); } void _U( bool renderupdate ) { if( renderupdate ) m_psys->OnRenderUpdate(); } void Prepare( ParticleSystem* PS, size_t emid ) { m_psys = PS; m_emitter = &PS->emitters[ emid ]; spawn_MaxCount.SetValue( m_emitter->spawn_MaxCount ); spawn_Count.SetValue( m_emitter->spawn_Count ); spawn_CountExt.SetValue( m_emitter->spawn_CountExt ); spawn_TimeExt.SetValue( m_emitter->spawn_TimeExt ); create_Pos.SetValue( m_emitter->create_Pos ); create_PosBox.SetValue( m_emitter->create_PosBox ); create_PosRadius.SetValue( m_emitter->create_PosRadius ); create_VelMicroDir.SetValue( m_emitter->create_VelMicroDir ); create_VelMicroDvg.SetValue( m_emitter->create_VelMicroDvg ); create_VelMicroDistExt.SetValue( m_emitter->create_VelMicroDistExt ); create_VelMacroDir.SetValue( m_emitter->create_VelMacroDir ); create_VelMacroDvg.SetValue( m_emitter->create_VelMacroDvg ); create_VelMacroDistExt.SetValue( m_emitter->create_VelMacroDistExt ); create_VelCluster.SetValue( m_emitter->create_VelCluster ); create_VelClusterExt.SetValue( m_emitter->create_VelClusterExt ); create_LifetimeExt.SetValue( m_emitter->create_LifetimeExt ); create_AngleDirDvg.SetValue( RAD2DEG( m_emitter->create_AngleDirDvg ) ); create_AngleVelDvg.SetValue( RAD2DEG( m_emitter->create_AngleVelDvg ) ); tick_AngleAcc.SetValue( RAD2DEG( m_emitter->tick_AngleAcc ) ); absolute.SetValue( m_emitter->absolute ); curve_Size.SetValue( m_emitter->curve_Size ); curve_ColorHue.SetValue( m_emitter->curve_ColorHue ); curve_ColorSat.SetValue( m_emitter->curve_ColorSat ); curve_ColorVal.SetValue( m_emitter->curve_ColorVal ); curve_Opacity.SetValue( m_emitter->curve_Opacity ); render_Texture0.SetValue( GetParticleTexName( m_emitter->render_Textures[0] ) ); render_Texture1.SetValue( GetParticleTexName( m_emitter->render_Textures[1] ) ); render_Texture2.SetValue( GetParticleTexName( m_emitter->render_Textures[2] ) ); render_Texture3.SetValue( GetParticleTexName( m_emitter->render_Textures[3] ) ); render_Shader.SetValue( m_emitter->render_Shader ); render_Additive.SetValue( m_emitter->render_Additive ); render_Stretch.SetValue( m_emitter->render_Stretch ); } EDGUIGroup grpSpawn; EDGUIPropInt spawn_MaxCount; EDGUIPropInt spawn_Count; EDGUIPropInt spawn_CountExt; EDGUIPropVec2 spawn_TimeExt; EDGUIGroup grpPosition; EDGUIPropVec3 create_Pos; EDGUIPropVec3 create_PosBox; EDGUIPropFloat create_PosRadius; EDGUIGroup grpVelocity; EDGUIPropVec3 create_VelMicroDir; EDGUIPropFloat create_VelMicroDvg; EDGUIPropVec2 create_VelMicroDistExt; EDGUIPropVec3 create_VelMacroDir; EDGUIPropFloat create_VelMacroDvg; EDGUIPropVec2 create_VelMacroDistExt; EDGUIPropInt create_VelCluster; EDGUIPropInt create_VelClusterExt; EDGUIGroup grpMisc; EDGUIPropVec2 create_LifetimeExt; EDGUIPropVec2 create_AngleDirDvg; EDGUIPropVec2 create_AngleVelDvg; EDGUIPropFloat tick_AngleAcc; EDGUIPropBool absolute; EDGUIGroup grpSizeColor; EdEmitCurve curve_Size; EdEmitCurve curve_ColorHue; EdEmitCurve curve_ColorSat; EdEmitCurve curve_ColorVal; EdEmitCurve curve_Opacity; EDGUIGroup grpRender; EDGUIPropRsrc render_Texture0; EDGUIPropRsrc render_Texture1; EDGUIPropRsrc render_Texture2; EDGUIPropRsrc render_Texture3; EDGUIPropRsrc render_Shader; EDGUIPropBool render_Additive; EDGUIPropBool render_Stretch; ParticleSystem* m_psys; ParticleSystem::Emitter* m_emitter; };