From 23a1b08efe1a8e29e8874da2f1db4b904b7f860c Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Oct 2016 15:40:40 +0800 Subject: [PATCH] Allow normal map karts to be used in ghost race Also split ghost karts out of additive shader, so fixed issues like "drivers are facing backwards", "water in abyss affects ghost karts" Todo: maybe transparency depend on current track color? --- data/shaders/ghost_karts.frag | 19 +++++++++++++++++++ src/graphics/render_geometry.cpp | 20 +++++++++++++++----- src/graphics/shaders.cpp | 9 +++++++++ src/graphics/shaders.hpp | 8 ++++++++ src/graphics/stk_animated_mesh.cpp | 5 ++++- src/graphics/stk_mesh.hpp | 14 ++++++++++++++ src/graphics/stk_mesh_scene_node.cpp | 7 ++++--- src/graphics/stk_scene_manager.cpp | 6 ++++++ 8 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 data/shaders/ghost_karts.frag diff --git a/data/shaders/ghost_karts.frag b/data/shaders/ghost_karts.frag new file mode 100644 index 000000000..18b707682 --- /dev/null +++ b/data/shaders/ghost_karts.frag @@ -0,0 +1,19 @@ +#ifdef Use_Bindless_Texture +layout(bindless_sampler) uniform sampler2D tex; +#else +uniform sampler2D tex; +#endif + +in vec2 uv; +in vec4 color; +out vec4 FragColor; + +void main() +{ + vec4 Color = texture(tex, uv); +#ifdef Use_Bindless_Texture + Color.xyz = pow(Color.xyz, vec3(2.2)); +#endif + Color.xyz *= pow(color.xyz, vec3(2.2)); + FragColor = vec4(Color.rgb * 0.5, 0.5); +} diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp index 9b642b936..b8c8da5d5 100644 --- a/src/graphics/render_geometry.cpp +++ b/src/graphics/render_geometry.cpp @@ -1555,14 +1555,24 @@ static video::ITexture *displaceTex = 0; // ---------------------------------------------------------------------------- void IrrDriver::renderTransparent() { - glEnable(GL_DEPTH_TEST); - glDepthMask(GL_FALSE); - glEnable(GL_BLEND); - glBlendEquation(GL_FUNC_ADD); - glDisable(GL_CULL_FACE); irr_driver->setPhase(TRANSPARENT_PASS); + glEnable(GL_DEPTH_TEST); + glDepthMask(GL_TRUE); + glEnable(GL_BLEND); + glBlendEquation(GL_FUNC_ADD); + glEnable(GL_CULL_FACE); + renderTransparenPass( + TexUnits(RenderGeometry::TexUnit(0, true)), + ListGhostKart::getInstance()); + + renderTransparenPass( + TexUnits(RenderGeometry::TexUnit(0, true)), + ListGhostKartTangents::getInstance()); + + glDepthMask(GL_FALSE); + glDisable(GL_CULL_FACE); for (unsigned i = 0; i < ImmediateDrawList::getInstance()->size(); i++) ImmediateDrawList::getInstance()->at(i)->render(); diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index 9a2f69ae4..9b5fca4ba 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -369,6 +369,15 @@ Shaders::TransparentShader::TransparentShader() assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); } // TransparentShader +// ============================================================================ +Shaders::GhostKartsShader::GhostKartsShader() +{ + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "ghost_karts.frag"); + assignUniforms("ModelMatrix", "TextureMatrix"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); +} // GhostKartsShader + // ============================================================================ Shaders::TransparentFogShader::TransparentFogShader() { diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index 19699a0df..44e629c55 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -126,6 +126,14 @@ public: TransparentShader(); }; // TransparentShader + // ======================================================================== + class GhostKartsShader : public TextureShader + { + public: + GhostKartsShader(); + }; // TransparentShader + // ======================================================================== class TransparentFogShader : public TextureShaderisTransparent()) { - TransparentMesh[TM_ADDITIVE].push_back(&mesh); + if (mesh.VAOType == video::EVT_TANGENTS) + TransparentMesh[TM_GHOST_KART_TANGENTS].push_back(&mesh); + else + TransparentMesh[TM_GHOST_KART].push_back(&mesh); } else { diff --git a/src/graphics/stk_mesh.hpp b/src/graphics/stk_mesh.hpp index 2248baaeb..f5df8c9b1 100644 --- a/src/graphics/stk_mesh.hpp +++ b/src/graphics/stk_mesh.hpp @@ -37,6 +37,8 @@ enum TransparentMaterial TM_DEFAULT, TM_ADDITIVE, TM_DISPLACEMENT, + TM_GHOST_KART, + TM_GHOST_KART_TANGENTS, TM_COUNT }; // TransparentMaterial @@ -206,6 +208,18 @@ class ListAdditiveTransparent : public MiscList {}; +// ---------------------------------------------------------------------------- +class ListGhostKart : public MiscList +{}; + +// ---------------------------------------------------------------------------- +class ListGhostKartTangents : public MiscList +{}; + // ---------------------------------------------------------------------------- class ListBlendTransparentFog : public MiscListgetMaterialFor(mb->getMaterial().getTexture(0), mb); if (mesh.m_render_info != NULL && mesh.m_render_info->isTransparent()) { - if (!immediate_draw) - TransparentMesh[TM_ADDITIVE].push_back(&mesh); + assert(!immediate_draw); + if (mesh.VAOType == video::EVT_TANGENTS) + TransparentMesh[TM_GHOST_KART_TANGENTS].push_back(&mesh); else - additive = true; + TransparentMesh[TM_GHOST_KART].push_back(&mesh); } else if (rnd->isTransparent()) { diff --git a/src/graphics/stk_scene_manager.cpp b/src/graphics/stk_scene_manager.cpp index 898539c9a..29a9fbdd6 100644 --- a/src/graphics/stk_scene_manager.cpp +++ b/src/graphics/stk_scene_manager.cpp @@ -344,6 +344,10 @@ handleSTKCommon(scene::ISceneNode *Node, std::vector *Immed for (GLMesh *mesh : node->TransparentMesh[TM_ADDITIVE]) pushVector(ListAdditiveTransparent::getInstance(), mesh, Node->getAbsoluteTransformation(), mesh->TextureMatrix); } + for (GLMesh *mesh : node->TransparentMesh[TM_GHOST_KART]) + pushVector(ListGhostKart::getInstance(), mesh, Node->getAbsoluteTransformation(), mesh->TextureMatrix); + for (GLMesh *mesh : node->TransparentMesh[TM_GHOST_KART_TANGENTS]) + pushVector(ListGhostKartTangents::getInstance(), mesh, Node->getAbsoluteTransformation(), mesh->TextureMatrix); for (GLMesh *mesh : node->TransparentMesh[TM_DISPLACEMENT]) pushVector(ListDisplacement::getInstance(), mesh, Node->getAbsoluteTransformation()); @@ -606,6 +610,8 @@ void IrrDriver::PrepareDrawCalls(scene::ICameraSceneNode *camnode) windDir = getWindDir(); ListBlendTransparent::getInstance()->clear(); ListAdditiveTransparent::getInstance()->clear(); + ListGhostKart::getInstance()->clear(); + ListGhostKartTangents::getInstance()->clear(); ListBlendTransparentFog::getInstance()->clear(); ListAdditiveTransparentFog::getInstance()->clear(); ListDisplacement::getInstance()->clear();