diff --git a/binaries/data/mods/public/shaders/effects/particle.xml b/binaries/data/mods/public/shaders/effects/particle.xml
index 59163729b0..857e7d174a 100644
--- a/binaries/data/mods/public/shaders/effects/particle.xml
+++ b/binaries/data/mods/public/shaders/effects/particle.xml
@@ -1,14 +1,18 @@
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
diff --git a/source/renderer/ParticleRenderer.cpp b/source/renderer/ParticleRenderer.cpp
index 3cbe75abf4..b2e0a253a0 100644
--- a/source/renderer/ParticleRenderer.cpp
+++ b/source/renderer/ParticleRenderer.cpp
@@ -32,8 +32,8 @@
struct ParticleRendererInternals
{
int frameNumber;
- CShaderTechniquePtr shader;
- CShaderTechniquePtr shaderSolid;
+ CShaderTechniquePtr tech;
+ CShaderTechniquePtr techSolid;
std::vector emitters[CSceneRenderer::CULL_MAX];
};
@@ -87,10 +87,10 @@ void ParticleRenderer::PrepareForRendering(const CShaderDefines& context)
// Can't load the shader in the constructor because it's called before the
// renderer initialisation is complete, so load it the first time through here
- if (!m->shader)
+ if (!m->tech)
{
- m->shader = g_Renderer.GetShaderManager().LoadEffect(str_particle, context);
- m->shaderSolid = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, context);
+ m->tech = g_Renderer.GetShaderManager().LoadEffect(str_particle, context);
+ m->techSolid = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, context);
}
++m->frameNumber;
@@ -120,36 +120,32 @@ void ParticleRenderer::PrepareForRendering(const CShaderDefines& context)
void ParticleRenderer::RenderParticles(int cullGroup, bool solidColor)
{
- CShaderTechniquePtr shader = solidColor ? m->shaderSolid : m->shader;
+ const CShaderTechniquePtr& tech = solidColor ? m->techSolid : m->tech;
std::vector& emitters = m->emitters[cullGroup];
- shader->BeginPass();
+ tech->BeginPass();
- shader->GetShader()->Uniform(str_transform, g_Renderer.GetSceneRenderer().GetViewCamera().GetViewProjection());
- shader->GetShader()->Uniform(str_modelViewMatrix, g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse());
+ const CShaderProgramPtr& shader = tech->GetShader();
+
+ shader->Uniform(str_transform, g_Renderer.GetSceneRenderer().GetViewCamera().GetViewProjection());
+ shader->Uniform(str_modelViewMatrix, g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse());
- if (!solidColor)
- glEnable(GL_BLEND);
glDepthMask(0);
- for (size_t i = 0; i < emitters.size(); ++i)
+ for (CParticleEmitter* emitter : m->emitters[cullGroup])
{
- CParticleEmitter* emitter = emitters[i];
-
- emitter->Bind(shader->GetShader());
- emitter->RenderArray(shader->GetShader());
+ emitter->Bind(shader);
+ emitter->RenderArray(shader);
}
CVertexBuffer::Unbind();
glBlendEquationEXT(GL_FUNC_ADD);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_BLEND);
glDepthMask(1);
- shader->EndPass();
+ tech->EndPass();
}
void ParticleRenderer::RenderBounds(int cullGroup)