Kaynağa Gözat

GPU particles: fixes

Panagiotis Christopoulos Charitos 1 ay önce
ebeveyn
işleme
554c76768b

+ 1 - 1
AnKi/Scene/Components/ParticleEmitter2Component.cpp

@@ -267,7 +267,7 @@ void ParticleEmitter2Component::update(SceneComponentUpdateInfo& info, Bool& upd
 		ConstWeakArray<U8> prefilled = m_particleEmitterResource->getPrefilledAnKiParticleEmitterProperties();
 		ConstWeakArray<U8> prefilled = m_particleEmitterResource->getPrefilledAnKiParticleEmitterProperties();
 		m_gpuScene.m_anKiParticleEmitterProperties = GpuSceneBuffer::getSingleton().allocate(prefilled.getSizeInBytes(), alignof(U32));
 		m_gpuScene.m_anKiParticleEmitterProperties = GpuSceneBuffer::getSingleton().allocate(prefilled.getSizeInBytes(), alignof(U32));
 
 
-		GpuSceneMicroPatcher::getSingleton().newCopy(m_gpuScene.m_anKiParticleEmitterProperties, prefilled);
+		GpuSceneMicroPatcher::getSingleton().newCopy(m_gpuScene.m_anKiParticleEmitterProperties, prefilled.getSizeInBytes(), prefilled.getBegin());
 	}
 	}
 
 
 	// GpuSceneParticleEmitter2
 	// GpuSceneParticleEmitter2

+ 5 - 0
AnKi/Scene/Components/ParticleEmitterComponent.cpp

@@ -114,12 +114,17 @@ public:
 
 
 		const F32 dt = F32(crntTime - prevUpdateTime);
 		const F32 dt = F32(crntTime - prevUpdateTime);
 
 
+#if 0
 		const Vec3 xp = m_crntPosition;
 		const Vec3 xp = m_crntPosition;
 		const Vec3 xc = m_acceleration * (dt * dt) + m_velocity * dt + xp;
 		const Vec3 xc = m_acceleration * (dt * dt) + m_velocity * dt + xp;
 
 
 		m_crntPosition = xc;
 		m_crntPosition = xc;
 
 
 		m_velocity += m_acceleration * dt;
 		m_velocity += m_acceleration * dt;
+#else
+		m_velocity += m_acceleration * dt;
+		m_crntPosition += m_velocity * dt;
+#endif
 	}
 	}
 };
 };
 
 

+ 3 - 2
AnKi/Shaders/ForwardShadingParticlesGass.ankiprog

@@ -41,9 +41,10 @@ VertOut main(VertIn input)
 	const GpuSceneParticleEmitter2 particles = SBUFF(g_particleEmitters2, instance.m_particleEmitterIndex);
 	const GpuSceneParticleEmitter2 particles = SBUFF(g_particleEmitters2, instance.m_particleEmitterIndex);
 	const GpuSceneMeshLod meshLod = SBUFF(g_meshLods, instance.m_meshLodIndex);
 	const GpuSceneMeshLod meshLod = SBUFF(g_meshLods, instance.m_meshLodIndex);
 
 
-	const U32 particleId = input.m_svInstanceId;
+	U32 offset = particles.m_aliveParticleIndicesOffset + input.m_svInstanceId * sizeof(U32);
+	const U32 particleId = BAB_LOAD(g_gpuScene, U32, offset);
 
 
-	U32 offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kPosition] + particleId * sizeof(Vec3);
+	offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kPosition] + particleId * sizeof(Vec3);
 	const Vec3 particlePos = BAB_LOAD(g_gpuScene, Vec3, offset);
 	const Vec3 particlePos = BAB_LOAD(g_gpuScene, Vec3, offset);
 
 
 	offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kScale] + particleId * sizeof(Vec3);
 	offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kScale] + particleId * sizeof(Vec3);

+ 1 - 1
AnKi/Shaders/GpuParticlesCommon.hlsl

@@ -168,5 +168,5 @@ void simulatePhysics(Vec3 F, F32 m, F32 dt, inout Vec3 v, inout Vec3 x, Bool che
 	}
 	}
 
 
 	// Add some small damping to avoid jitter
 	// Add some small damping to avoid jitter
-	v *= 0.95;
+	// v *= 0.95;
 }
 }

+ 3 - 2
AnKi/Shaders/GpuParticlesGass.ankiprog

@@ -73,7 +73,7 @@ void simulateParticle(AnKiParticleEmitterProperties props, GpuSceneParticleEmitt
 	Vec3 x = readProp<Vec3>(emitter, ParticleProperty::kPosition);
 	Vec3 x = readProp<Vec3>(emitter, ParticleProperty::kPosition);
 	const Vec3 prevX = x;
 	const Vec3 prevX = x;
 
 
-	simulatePhysics(F, m, g_consts.m_dt, v, x);
+	simulatePhysics(F, m, g_consts.m_dt, v, x, false);
 
 
 	// Write
 	// Write
 	writeProp(emitter, ParticleProperty::kVelocity, v);
 	writeProp(emitter, ParticleProperty::kVelocity, v);
@@ -96,10 +96,11 @@ void simulateParticle(AnKiParticleEmitterProperties props, GpuSceneParticleEmitt
 
 
 void initializeParticle(AnKiParticleEmitterProperties props, GpuSceneParticleEmitter2 emitter, Mat3x4 emitterTrf, Bool makeAlive)
 void initializeParticle(AnKiParticleEmitterProperties props, GpuSceneParticleEmitter2 emitter, Mat3x4 emitterTrf, Bool makeAlive)
 {
 {
-	const Vec3 m = getRandomRange(props.m_minMass, props.m_maxMass);
+	const F32 m = getRandomRange(props.m_minMass, props.m_maxMass);
 
 
 	Vec3 g = normalize(getRandomRange(props.m_minGravityDirection, props.m_maxGravityDirection));
 	Vec3 g = normalize(getRandomRange(props.m_minGravityDirection, props.m_maxGravityDirection));
 	g = mul(emitterTrf, Vec4(g, 0.0));
 	g = mul(emitterTrf, Vec4(g, 0.0));
+	g = normalize(g); // Because the emitter's trf might have scale
 	g *= getRandomRange(props.m_minGravityMagnitude, props.m_maxGravityMagnitude);
 	g *= getRandomRange(props.m_minGravityMagnitude, props.m_maxGravityMagnitude);
 
 
 	const F32 dt = 1.0 / 60;
 	const F32 dt = 1.0 / 60;