diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index 52876592..e9d823ca 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -32,6 +32,7 @@ private: const LightCullingPass* m_LightCullingPass; ShaderProgram* m_ForwardPlusProgram; + ShaderProgram* m_ExplosionEffectProgram; }; diff --git a/include/Engine/Rendering/ExplosionEffectJob.h b/include/Engine/Rendering/ExplosionEffectJob.h index 48f33550..86749f7f 100644 --- a/include/Engine/Rendering/ExplosionEffectJob.h +++ b/include/Engine/Rendering/ExplosionEffectJob.h @@ -45,7 +45,7 @@ struct ExplosionEffectJob : ModelJob //bool Wireframe = false; bool ExponentialAccelaration = false; - std::array RandomNumbers = { + std::array RandomNumbers = { 0.3257552917701f, 0.07601508315467f, 0.57408909014151f, @@ -65,7 +65,37 @@ struct ExplosionEffectJob : ModelJob 0.26291620883295f, 0.07685032816457f, 0.30760929515008f, - 0.2781575388639f }; + 0.2781575388639f , + 0.016950582161988f , + 0.25787915254844f , + 0.76293767279151f , + 0.67730279903733f , + 0.49042877018937f , + 0.13002237823327f , + 0.62803373841012f , + 0.94525353747665f , + 0.32893980076953f , + 0.95952951719962f , + 0.056386206790985f , + 0.012030893476694f , + 0.93090049220757f, + 0.83579883064879f, + 0.79733513938139f, + 0.8796381046435f , + 0.94160434600972f , + 0.76901855588379f , + 0.50253688101775f , + 0.82457069578793f , + 0.80157403359263f , + 0.87291810189975f , + 0.64679548919517f , + 0.42664138899494f , + 0.77171308303797f , + 0.75567959237643f , + 0.45190826265696f , + 0.59844922628181f , + 0.56534937655802f , + 0.195656257307f}; void CalculateHash() override { diff --git a/resources/Shaders/ExplosionEffect.frag.glsl b/resources/Shaders/ExplosionEffect.frag.glsl index 9108aa81..32ababe5 100644 --- a/resources/Shaders/ExplosionEffect.frag.glsl +++ b/resources/Shaders/ExplosionEffect.frag.glsl @@ -7,17 +7,19 @@ uniform vec4 Color; uniform sampler2D texture0; -in vec3 Normal; -in vec3 Position; -in vec2 TextureCoordinate; -in vec4 DiffuseColor; -in vec4 ExplosionColor; +in VertexData{ + vec3 Position; + vec3 Normal; + vec2 TextureCoordinate; + vec4 DiffuseColor; + vec4 ExplosionColor; +}Input; out vec4 fragmentColor; void main() { - vec4 texel = texture2D(texture0, TextureCoordinate); - fragmentColor = texel * DiffuseColor * Color + ExplosionColor; + vec4 texel = texture2D(texture0, Input.TextureCoordinate); + fragmentColor = texel * Input.DiffuseColor * Color + Input.ExplosionColor; } \ No newline at end of file diff --git a/resources/Shaders/ExplosionEffect.geom.glsl b/resources/Shaders/ExplosionEffect.geom.glsl index 4056dad9..b5c5b4ba 100644 --- a/resources/Shaders/ExplosionEffect.geom.glsl +++ b/resources/Shaders/ExplosionEffect.geom.glsl @@ -11,7 +11,7 @@ uniform float ExplosionDuration; //uniform float ObjectRadius; uniform vec4 EndColor; uniform bool Randomness; -uniform float RandomNumbers[20]; +uniform float RandomNumbers[50]; uniform float RandomnessScalar; uniform vec2 Velocity; uniform bool ColorByDistance; @@ -24,13 +24,16 @@ in VertexData{ vec3 Normal; vec2 TextureCoordinate; vec4 DiffuseColor; + vec4 ExplosionColor; }Input[]; -out vec3 Normal; -out vec3 Position; -out vec2 TextureCoordinate; -out vec4 DiffuseColor; -out vec4 ExplosionColor; +out VertexData{ + vec3 Position; + vec3 Normal; + vec2 TextureCoordinate; + vec4 DiffuseColor; + vec4 ExplosionColor; +}Output; layout(triangles) in; layout(triangle_strip, max_vertices = 3) out; @@ -38,7 +41,7 @@ layout(triangle_strip, max_vertices = 3) out; // returns a "random" number based on input parameter float GetRandomNumber(int polygon_index) { - int randomIndex = int(mod(polygon_index, 20)); + int randomIndex = int(mod(polygon_index, 50)); switch (randomIndex) { @@ -62,6 +65,36 @@ float GetRandomNumber(int polygon_index) case 17: return RandomNumbers[17]; case 18: return RandomNumbers[18]; case 19: return RandomNumbers[19]; + case 20: return RandomNumbers[20]; + case 21: return RandomNumbers[21]; + case 22: return RandomNumbers[22]; + case 23: return RandomNumbers[23]; + case 24: return RandomNumbers[24]; + case 25: return RandomNumbers[25]; + case 26: return RandomNumbers[26]; + case 27: return RandomNumbers[27]; + case 28: return RandomNumbers[28]; + case 29: return RandomNumbers[29]; + case 30: return RandomNumbers[30]; + case 31: return RandomNumbers[31]; + case 32: return RandomNumbers[32]; + case 33: return RandomNumbers[33]; + case 34: return RandomNumbers[34]; + case 35: return RandomNumbers[35]; + case 36: return RandomNumbers[36]; + case 37: return RandomNumbers[37]; + case 38: return RandomNumbers[38]; + case 39: return RandomNumbers[39]; + case 40: return RandomNumbers[40]; + case 41: return RandomNumbers[41]; + case 42: return RandomNumbers[42]; + case 43: return RandomNumbers[43]; + case 44: return RandomNumbers[44]; + case 45: return RandomNumbers[45]; + case 46: return RandomNumbers[46]; + case 47: return RandomNumbers[47]; + case 48: return RandomNumbers[48]; + case 49: return RandomNumbers[49]; } } @@ -102,8 +135,16 @@ void main() // time percentage until end of explosion (0.0-1.0) float timePercetage = TimeSinceDeath / ExplosionDuration; + // get a random number if randomness is enabled, otherwise the random number will be zero and won't affect the other algorithms + if (Randomness == true) + { + randomDistance = GetRandomNumber(gl_PrimitiveIDIn) * RandomnessScalar; + } + + vec2 randomVelocity = Velocity * (randomDistance + 1.0); + // accelaration to use on current frame. is a interpolation between start and end value - float currentVelocity = mix(Velocity.x, Velocity.y, timePercetage); + float currentVelocity = mix(randomVelocity.x, randomVelocity.y, timePercetage); if (ExponentialAccelaration == true) { @@ -113,12 +154,6 @@ void main() // distance between origin and the center of the current triangle float origin2TriangleCenterDistance = length(origin2TriangleCenterVector); - // get a random number if randomness is enabled, otherwise the random number will be zero and won't affect the other algorithms - if (Randomness == true) - { - randomDistance = GetRandomNumber(gl_PrimitiveIDIn) * RandomnessScalar; - } - // the distance from origin to the triangle center with eventual randomness added float fullDistanceWithRandomness = origin2TriangleCenterDistance + randomDistance; @@ -130,20 +165,20 @@ void main() { float maxRadius = max(TimeSinceDeath * currentVelocity, (ExplosionDuration * currentVelocity)); - float a = (Velocity.y - Velocity.x) / ExplosionDuration; + float a = (randomVelocity.y - randomVelocity.x) / ExplosionDuration; //float t = sqrt((2 * origin2TriangleCenterDistance) / a); // if explosion color should be affected by distance instead of time... if (ColorByDistance == true) { // calculate the max distance (s) the triangle will move - float s = (Velocity.x * ExplosionDuration) + (0.5 * a * pow(ExplosionDuration, 2)); + float s = (randomVelocity.x * ExplosionDuration) + (0.5 * a * pow(ExplosionDuration, 2)); - ExplosionColor = EndColor * (length(triangleCenter2ExplosionRadius) / s); + Output.ExplosionColor = EndColor * (length(triangleCenter2ExplosionRadius) / s); } else { - ExplosionColor = EndColor * timePercetage; + Output.ExplosionColor = EndColor * timePercetage; } // for every vertex on the triangle... @@ -153,10 +188,10 @@ void main() vec3 ExplodedPosition = Input[i].Position + triangleCenter2ExplosionRadius; // pass through vertex data - Normal = Input[i].Normal; - Position = Input[i].Position; - TextureCoordinate = Input[i].TextureCoordinate; - DiffuseColor = Input[i].DiffuseColor; + Output.Normal = Input[i].Normal; + Output.Position = Input[i].Position; + Output.TextureCoordinate = Input[i].TextureCoordinate; + Output.DiffuseColor = Input[i].DiffuseColor; // convert to model space for the gravity to always be in -y vec4 ExplodedPositionInModelSpace = M * vec4(ExplodedPosition, 1.0); @@ -179,25 +214,27 @@ void main() // if explosion color should be affected by distance instead of time... if (ColorByDistance == true) { - ExplosionColor = vec4(0.0); + Output.ExplosionColor = vec4(0.0); } else { - ExplosionColor = EndColor * timePercetage; + Output.ExplosionColor = EndColor * timePercetage; } // for every vertex on the triangle... for(int i = 0; i < gl_in.length(); i++) { // pass through vertex data - Normal = Input[i].Normal; - Position = Input[i].Position; - TextureCoordinate = Input[i].TextureCoordinate; - DiffuseColor = Input[i].DiffuseColor; + Output.Normal = Input[i].Normal; + Output.Position = Input[i].Position; + Output.TextureCoordinate = Input[i].TextureCoordinate; + Output.DiffuseColor = Input[i].DiffuseColor; // no change in position, pass through vertex gl_Position = gl_in[i].gl_Position; EmitVertex(); } - } + } + + //EndPrimitive(); } diff --git a/resources/Shaders/ExplosionEffect.vert.glsl b/resources/Shaders/ExplosionEffect.vert.glsl index 20ab9051..04e1bda2 100644 --- a/resources/Shaders/ExplosionEffect.vert.glsl +++ b/resources/Shaders/ExplosionEffect.vert.glsl @@ -21,6 +21,7 @@ out VertexData{ vec3 Normal; vec2 TextureCoordinate; vec4 DiffuseColor; + vec4 ExplosionColor; }Output; void main() @@ -31,4 +32,5 @@ void main() Output.TextureCoordinate = TextureCoords; Output.Normal = Normal; Output.DiffuseColor = DiffuseVertexColor; + Output.ExplosionColor = vec4(0.0); } \ No newline at end of file diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 3d5b9bfd..f659f508 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -45,6 +45,7 @@ in VertexData{ vec3 Normal; vec2 TextureCoordinate; vec4 DiffuseColor; + vec4 ExplosionColor; }Input; out vec4 fragmentColor; @@ -114,7 +115,7 @@ void main() totalLighting.Specular += result.Specular; } - fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; + fragmentColor += (Input.DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + totalLighting.Specular) * texel * Color; //fragmentColor += Input.DiffuseColor * (totalLighting.Diffuse) * texel * Color; //fragmentColor += vec4(0.0, LightGrids.Data[currentTile].Amount/3.0, 0, 1); //fragmentColor = texel * Input.DiffuseColor * Color; diff --git a/resources/Shaders/ForwardPlus.vert.glsl b/resources/Shaders/ForwardPlus.vert.glsl index 20ab9051..04e1bda2 100644 --- a/resources/Shaders/ForwardPlus.vert.glsl +++ b/resources/Shaders/ForwardPlus.vert.glsl @@ -21,6 +21,7 @@ out VertexData{ vec3 Normal; vec2 TextureCoordinate; vec4 DiffuseColor; + vec4 ExplosionColor; }Output; void main() @@ -31,4 +32,5 @@ void main() Output.TextureCoordinate = TextureCoords; Output.Normal = Normal; Output.DiffuseColor = DiffuseVertexColor; + Output.ExplosionColor = vec4(0.0); } \ No newline at end of file diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index b0ca4afe..c464f8ab 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -20,6 +20,13 @@ void DrawFinalPass::InitializeShaderPrograms() m_ForwardPlusProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlus.frag.glsl"))); m_ForwardPlusProgram->Compile(); m_ForwardPlusProgram->Link(); + + m_ExplosionEffectProgram = ResourceManager::Load("#ExplosionEffectProgram"); + m_ExplosionEffectProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); + m_ExplosionEffectProgram->AddShader(std::shared_ptr(new GeometryShader("Shaders/ExplosionEffect.geom.glsl"))); + m_ExplosionEffectProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlus.frag.glsl"))); + m_ExplosionEffectProgram->Compile(); + m_ExplosionEffectProgram->Link(); } void DrawFinalPass::Draw(RenderScene& scene) @@ -27,39 +34,88 @@ void DrawFinalPass::Draw(RenderScene& scene) GLERROR("DrawFinalPass::Draw: Pre"); DrawFinalPassState state; - m_ForwardPlusProgram->Bind(); - GLuint shaderHandle = m_ForwardPlusProgram->GetHandle(); - - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO()); - - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); - glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); + GLuint shaderHandle; + //TODO: Render: Add code for more jobs than modeljobs. for (auto &job : scene.ForwardJobs) { - auto modelJob = std::dynamic_pointer_cast(job); - if(modelJob) { - //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); - if(modelJob->DiffuseTexture != nullptr) { + auto explosionEffectJob = std::dynamic_pointer_cast(job); + if (explosionEffectJob) { + m_ExplosionEffectProgram->Bind(); + shaderHandle = m_ExplosionEffectProgram->GetHandle(); //--- + + GLERROR("DrawFinalPass::ExplosionEffect: ENDsdufhsdilfuh"); + + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(explosionEffectJob->Matrix)); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(explosionEffectJob->Color)); + glUniform3fv(glGetUniformLocation(shaderHandle, "ExplosionOrigin"), 1, glm::value_ptr(explosionEffectJob->ExplosionOrigin)); + glUniform1f(glGetUniformLocation(shaderHandle, "TimeSinceDeath"), explosionEffectJob->TimeSinceDeath); + glUniform1f(glGetUniformLocation(shaderHandle, "ExplosionDuration"), explosionEffectJob->ExplosionDuration); + glUniform4fv(glGetUniformLocation(shaderHandle, "EndColor"), 1, glm::value_ptr(explosionEffectJob->EndColor)); + glUniform1i(glGetUniformLocation(shaderHandle, "Randomness"), explosionEffectJob->Randomness); + glUniform1fv(glGetUniformLocation(shaderHandle, "RandomNumbers"), 50, explosionEffectJob->RandomNumbers.data()); + glUniform1f(glGetUniformLocation(shaderHandle, "RandomnessScalar"), explosionEffectJob->RandomnessScalar); + glUniform2fv(glGetUniformLocation(shaderHandle, "Velocity"), 1, glm::value_ptr(explosionEffectJob->Velocity)); + glUniform1i(glGetUniformLocation(shaderHandle, "ColorByDistance"), explosionEffectJob->ColorByDistance); + glUniform1i(glGetUniformLocation(shaderHandle, "ExponentialAccelaration"), explosionEffectJob->ExponentialAccelaration); + GLERROR("DrawFinalPass::ExplosionEffect: asdasdasdasdasdasd"); + + //TODO: Renderer: bättre textur felhantering samt fler texturer stöd + if (explosionEffectJob->DiffuseTexture != nullptr) { glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); + glBindTexture(GL_TEXTURE_2D, explosionEffectJob->DiffuseTexture->m_Texture); } else { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); } - - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); - + GLERROR("DrawFinalPass::ExplosionEffect: END1"); + glBindVertexArray(explosionEffectJob->Model->VAO); + GLERROR("DrawFinalPass::ExplosionEffect: END2"); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, explosionEffectJob->Model->ElementBuffer); + GLERROR("DrawFinalPass::ExplosionEffect: END3"); + glDrawElementsBaseVertex(GL_TRIANGLES, explosionEffectJob->EndIndex - explosionEffectJob->StartIndex + 1, GL_UNSIGNED_INT, 0, explosionEffectJob->StartIndex); + GLERROR("DrawFinalPass::ExplosionEffect: END"); + m_ExplosionEffectProgram->Unbind(); continue; + } else { + auto modelJob = std::dynamic_pointer_cast(job); + if (modelJob) { + m_ForwardPlusProgram->Bind(); + shaderHandle = m_ForwardPlusProgram->GetHandle(); + + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightCullingPass->LightIndexSSBO()); + + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); + + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + + if (modelJob->DiffuseTexture != nullptr) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + } + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + GLERROR("DrawFinalPass::Model: END"); + m_ForwardPlusProgram->Unbind(); + continue; + } } + } GLERROR("DrawFinalPass::Draw: END"); diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index b3ff4b49..9686f3cf 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -21,11 +21,11 @@ void DrawScenePass::InitializeShaderPrograms() m_BasicForwardProgram->Compile(); m_BasicForwardProgram->Link(); m_ExplosionEffectProgram = ResourceManager::Load("#ExplosionEffectProgram"); - m_ExplosionEffectProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ExplosionEffect.vert.glsl"))); + /* m_ExplosionEffectProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ExplosionEffect.vert.glsl"))); m_ExplosionEffectProgram->AddShader(std::shared_ptr(new GeometryShader("Shaders/ExplosionEffect.geom.glsl"))); m_ExplosionEffectProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ExplosionEffect.frag.glsl"))); m_ExplosionEffectProgram->Compile(); - m_ExplosionEffectProgram->Link(); + m_ExplosionEffectProgram->Link();*/ } void DrawScenePass::Draw(RenderScene& scene) @@ -55,7 +55,7 @@ void DrawScenePass::Draw(RenderScene& scene) //glUniform1f(glGetUniformLocation(ShaderHandle, "ObjectRadius"), explosionEffectJob->ObjectRadius); glUniform4fv(glGetUniformLocation(ShaderHandle, "EndColor"), 1, glm::value_ptr(explosionEffectJob->EndColor)); glUniform1i(glGetUniformLocation(ShaderHandle, "Randomness"), explosionEffectJob->Randomness); - glUniform1fv(glGetUniformLocation(ShaderHandle, "RandomNumbers"), 20, explosionEffectJob->RandomNumbers.data()); + glUniform1fv(glGetUniformLocation(ShaderHandle, "RandomNumbers"), 50, explosionEffectJob->RandomNumbers.data()); glUniform1f(glGetUniformLocation(ShaderHandle, "RandomnessScalar"), explosionEffectJob->RandomnessScalar); glUniform2fv(glGetUniformLocation(ShaderHandle, "Velocity"), 1, glm::value_ptr(explosionEffectJob->Velocity)); glUniform1i(glGetUniformLocation(ShaderHandle, "ColorByDistance"), explosionEffectJob->ColorByDistance);