| 61 | } |
| 62 | |
| 63 | void ParticleEffect::LoadDeviceResources(ID3D12Device* device) |
| 64 | { |
| 65 | (device); // Currently unused. May be useful with multi-adapter support. |
| 66 | |
| 67 | m_OriginalEffectProperties = m_EffectProperties; //In case we want to reset |
| 68 | |
| 69 | //Fill particle spawn data buffer |
| 70 | ParticleSpawnData* pSpawnData = (ParticleSpawnData*)_malloca(m_EffectProperties.EmitProperties.MaxParticles * sizeof(ParticleSpawnData)); |
| 71 | |
| 72 | for (UINT i = 0; i < m_EffectProperties.EmitProperties.MaxParticles; i++) |
| 73 | { |
| 74 | ParticleSpawnData& SpawnData = pSpawnData[i]; |
| 75 | SpawnData.AgeRate = 1.0f / s_RNG.NextFloat( m_EffectProperties.LifeMinMax.x, m_EffectProperties.LifeMinMax.y ); |
| 76 | float horizontalAngle = s_RNG.NextFloat(XM_2PI); |
| 77 | float horizontalVelocity = s_RNG.NextFloat( m_EffectProperties.Velocity.GetX(), m_EffectProperties.Velocity.GetY() ); |
| 78 | SpawnData.Velocity.x = horizontalVelocity * cos(horizontalAngle); |
| 79 | SpawnData.Velocity.y = s_RNG.NextFloat( m_EffectProperties.Velocity.GetZ(), m_EffectProperties.Velocity.GetW() ); |
| 80 | SpawnData.Velocity.z = horizontalVelocity * sin(horizontalAngle); |
| 81 | |
| 82 | SpawnData.SpreadOffset = RandSpread(m_EffectProperties.Spread ) ; |
| 83 | |
| 84 | SpawnData.StartSize = s_RNG.NextFloat( m_EffectProperties.Size.GetX(), m_EffectProperties.Size.GetY() ); |
| 85 | SpawnData.EndSize = s_RNG.NextFloat( m_EffectProperties.Size.GetZ(), m_EffectProperties.Size.GetW() ); |
| 86 | SpawnData.StartColor = RandColor( m_EffectProperties.MinStartColor, m_EffectProperties.MaxStartColor ); |
| 87 | SpawnData.EndColor = RandColor( m_EffectProperties.MinEndColor, m_EffectProperties.MaxEndColor ); |
| 88 | SpawnData.Mass = s_RNG.NextFloat( m_EffectProperties.MassMinMax.x, m_EffectProperties.MassMinMax.y ); |
| 89 | SpawnData.RotationSpeed = s_RNG.NextFloat(); //todo |
| 90 | SpawnData.Random = s_RNG.NextFloat(); |
| 91 | } |
| 92 | |
| 93 | m_RandomStateBuffer.Create(L"ParticleSystem::SpawnDataBuffer", m_EffectProperties.EmitProperties.MaxParticles, sizeof(ParticleSpawnData), pSpawnData); |
| 94 | _freea(pSpawnData); |
| 95 | |
| 96 | m_StateBuffers[0].Create(L"ParticleSystem::Buffer0", m_EffectProperties.EmitProperties.MaxParticles, sizeof(ParticleMotion)); |
| 97 | m_StateBuffers[1].Create(L"ParticleSystem::Buffer1", m_EffectProperties.EmitProperties.MaxParticles, sizeof(ParticleMotion)); |
| 98 | m_CurrentStateBuffer = 0; |
| 99 | |
| 100 | //DispatchIndirect args buffer / number of thread groups |
| 101 | __declspec(align(16)) UINT DispatchIndirectData[3] = { 0, 1, 1 }; |
| 102 | m_DispatchIndirectArgs.Create(L"ParticleSystem::DispatchIndirectArgs", 1, sizeof(D3D12_DISPATCH_ARGUMENTS), DispatchIndirectData); |
| 103 | |
| 104 | } |
| 105 | |
| 106 | void ParticleEffect::Update(ComputeContext& CompContext, float timeDelta) |
| 107 | { |