1
0
forked from mirrors/0ad

Adds fixed orientation to particles

New features:

* Relative position
* Relative and absolute fixed axis
* Local space
* Axis along velocity vector
This commit is contained in:
Vladislav Belov
2026-02-17 19:33:26 +01:00
parent 4dff44ac9b
commit aae957ec7b
11 changed files with 228 additions and 32 deletions
+22 -4
View File
@@ -181,15 +181,33 @@ void ParticleRenderer::RenderParticles(
deviceCommandContext->BeginPass();
Renderer::Backend::IShaderProgram* shader = lastTech->GetShader();
const CMatrix3D transform =
g_Renderer.GetSceneRenderer().GetViewCamera().GetViewProjection();
const CMatrix3D modelViewMatrix =
g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse();
const CCamera& viewCamera{g_Renderer.GetSceneRenderer().GetViewCamera()};
const CMatrix3D transform{viewCamera.GetViewProjection()};
const CMatrix3D modelViewMatrix{viewCamera.GetOrientation().GetInverse()};
deviceCommandContext->SetUniform(
shader->GetBindingSlot(str_transform), transform.AsFloatArray());
deviceCommandContext->SetUniform(
shader->GetBindingSlot(str_modelViewMatrix), modelViewMatrix.AsFloatArray());
deviceCommandContext->SetUniform(
shader->GetBindingSlot(str_cameraPos),
viewCamera.GetOrientation().GetTranslation().AsFloatArray());
}
const CMatrix3D rotationMatrix{emitter->GetRotation().ToMatrix()};
CMatrix3D spaceTransform;
if (emitter->m_Type->m_UseLocalSpace)
{
spaceTransform = rotationMatrix;
spaceTransform.Translate(emitter->GetPosition());
}
else
spaceTransform.SetIdentity();
Renderer::Backend::IShaderProgram* shader = lastTech->GetShader();
deviceCommandContext->SetUniform(
shader->GetBindingSlot(str_spaceTransform), spaceTransform.AsFloatArray());
emitter->Bind(deviceCommandContext, lastTech->GetShader());
emitter->RenderArray(deviceCommandContext);
}