Modified templates in draw_tools to make them more generic and removed duplicated code

This commit is contained in:
Elderme
2015-10-18 19:20:05 +02:00
parent 73c0b010ff
commit 236d90c36d
2 changed files with 25 additions and 90 deletions

View File

@@ -23,25 +23,6 @@
#include "graphics/stk_mesh.hpp"
// ----------------------------------------------------------------------------
/** Draw a mesh using specified shader (require OpenGL 3.2)
* \param mesh The mesh to draw
* \param args The shader uniforms values
*/
template<typename S, typename...Uniforms>
void draw(const GLMesh *mesh, Uniforms... args)
{
irr_driver->IncreaseObjectCount(); //TODO: move somewhere else
S::getInstance()->setUniforms(args...);
glDrawElementsBaseVertex(mesh->PrimitiveType,
(int)mesh->IndexCount,
mesh->IndexType,
(GLvoid *)mesh->vaoOffset,
(int)mesh->vaoBaseVertex);
} // draw
// ----------------------------------------------------------------------------
/** Variadic template to draw a mesh (using OpenGL 3.2 function)
* with per mesh custom uniforms.*/
@@ -53,9 +34,8 @@ template<int n, int...list>
struct CustomUnrollArgs<n, list...>
{
/** Draw a mesh using specified shader (require OpenGL 3.2)
* \param cascade The cascade shadow map index
* \param t First tuple element is the mesh to draw, next elements are uniforms values
* \param args The shader uniforms values
* \param t First tuple element is the mesh to draw, next elements are per mesh uniforms values
* \param args Shader other uniforms values
*/
template<typename S,
typename ...TupleTypes,
@@ -66,36 +46,6 @@ struct CustomUnrollArgs<n, list...>
CustomUnrollArgs<list...>::template drawMesh<S>(t, STK::tuple_get<n>(t), args...);
} // drawMesh
// ----------------------------------------------------------------------------
/** Draw shadow mesh using specified shader (require OpenGL 3.2)
* \param t First tuple element is the mesh to draw, next elements are uniforms values
* \param args The shader uniforms values
*/
template<typename S,
typename ...TupleTypes,
typename ...Args>
static void drawShadow(unsigned cascade,
const STK::Tuple<TupleTypes...> &t,
Args... args)
{
CustomUnrollArgs<list...>::template drawShadow<S>(cascade, t, STK::tuple_get<n>(t), args...);
} // drawShadow
// ----------------------------------------------------------------------------
/** Draw mesh reflective shadow map using specified shader (require OpenGL 3.2)
* \param rsm_matrix The reflective shadow map matrix
* \param t First tuple element is the mesh to draw, next elements are uniforms values
* \param args The shader uniforms values
*/
template<typename S,
typename ...TupleTypes,
typename ...Args>
static void drawReflectiveShadowMap(const irr::core::matrix4 &rsm_matrix,
const STK::Tuple<TupleTypes...> &t,
Args... args)
{
CustomUnrollArgs<list...>::template drawReflectiveShadowMap<S>(rsm_matrix, t, STK::tuple_get<n>(t), args...);
} // drawReflectiveShadowMap
}; // CustomUnrollArgs
// ----------------------------------------------------------------------------
@@ -109,30 +59,15 @@ struct CustomUnrollArgs<>
static void drawMesh(const STK::Tuple<TupleTypes...> &t,
Args... args)
{
draw<S>(STK::tuple_get<0>(t), args...);
irr_driver->IncreaseObjectCount(); //TODO: move somewhere else
GLMesh *mesh = STK::tuple_get<0>(t);
S::getInstance()->setUniforms(args...);
glDrawElementsBaseVertex(mesh->PrimitiveType,
(int)mesh->IndexCount,
mesh->IndexType,
(GLvoid *)mesh->vaoOffset,
(int)mesh->vaoBaseVertex);
} // drawMesh
// ----------------------------------------------------------------------------
template<typename S,
typename ...TupleTypes,
typename ...Args>
static void drawShadow(unsigned cascade,
const STK::Tuple<TupleTypes...> &t,
Args... args)
{
draw<S>(STK::tuple_get<0>(t), cascade, args...);
} // drawShadow
// ----------------------------------------------------------------------------
template<typename S,
typename ...TupleTypes,
typename ...Args>
static void drawReflectiveShadowMap(const irr::core::matrix4 &rsm_matrix,
const STK::Tuple<TupleTypes...> &t,
Args... args)
{
draw<S>(STK::tuple_get<0>(t), rsm_matrix, args...);
} // drawReflectiveShadowMap
}; // CustomUnrollArgs

View File

@@ -168,7 +168,7 @@ public:
}; // InstancedObjectRefPass2Shader
// ============================================================================
class ShadowShader : public TextureShader<ShadowShader, 0, int, core::matrix4>
class ShadowShader : public TextureShader<ShadowShader, 0, core::matrix4, int>
{
public:
ShadowShader()
@@ -187,7 +187,7 @@ public:
GL_GEOMETRY_SHADER, "shadow.geom",
GL_FRAGMENT_SHADER, "shadow.frag");
}
assignUniforms("layer", "ModelMatrix");
assignUniforms("ModelMatrix", "layer");
} // ShadowShader
}; // ShadowShader
@@ -229,7 +229,7 @@ public:
loadProgram(OBJECT, GL_VERTEX_SHADER, "rsm.vert",
GL_FRAGMENT_SHADER, "rsm.frag");
assignUniforms("RSMMatrix", "ModelMatrix", "TextureMatrix");
assignUniforms("ModelMatrix", "TextureMatrix", "RSMMatrix");
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
} // CRSMShader
}; // CRSMShader
@@ -245,7 +245,7 @@ public:
loadProgram(OBJECT, GL_VERTEX_SHADER, "rsm.vert",
GL_FRAGMENT_SHADER, "splatting_rsm.frag");
assignUniforms("RSMMatrix", "ModelMatrix");
assignUniforms("ModelMatrix", "RSMMatrix");
assignSamplerNames(0, "tex_layout", ST_TRILINEAR_ANISOTROPIC_FILTERED,
1, "tex_detail0", ST_TRILINEAR_ANISOTROPIC_FILTERED,
2, "tex_detail1", ST_TRILINEAR_ANISOTROPIC_FILTERED,
@@ -417,7 +417,7 @@ public:
// ============================================================================
class RefShadowShader : public TextureShader<RefShadowShader, 1,
int, core::matrix4>
core::matrix4, int>
{
public:
RefShadowShader()
@@ -436,7 +436,7 @@ public:
GL_GEOMETRY_SHADER, "shadow.geom",
GL_FRAGMENT_SHADER, "shadowref.frag");
}
assignUniforms("layer", "ModelMatrix");
assignUniforms("ModelMatrix", "layer");
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
} // RefShadowShader
}; // RefShadowShader
@@ -667,8 +667,8 @@ public:
}; // InstancedGrassPass1Shader
// ============================================================================
class GrassShadowShader : public TextureShader<GrassShadowShader, 1, int, core::matrix4,
core::vector3df>
class GrassShadowShader : public TextureShader<GrassShadowShader, 1, core::matrix4,
core::vector3df, int>
{
public:
GrassShadowShader()
@@ -687,14 +687,14 @@ public:
GL_GEOMETRY_SHADER, "shadow.geom",
GL_FRAGMENT_SHADER, "instanced_shadowref.frag");
}
assignUniforms("layer", "ModelMatrix", "windDir");
assignUniforms("ModelMatrix", "windDir", "layer"); //TODO: check if order is correct
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
} // GrassShadowShader
}; // GrassShadowShader
// ============================================================================
class InstancedGrassShadowShader : public TextureShader<InstancedGrassShadowShader, 1,
int, core::vector3df>
core::vector3df, int>
{
public:
InstancedGrassShadowShader()
@@ -717,7 +717,7 @@ public:
}
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
assignUniforms("layer", "windDir");
assignUniforms("windDir", "layer");
} // InstancedGrassShadowShader
}; // InstancedGrassShadowShader
@@ -1555,7 +1555,7 @@ void renderShadow(unsigned cascade)
HandleExpander<typename T::ShadowPassShader>::template Expand(mesh->TextureHandles, T::ShadowTextures);
else
TexExpander<typename T::ShadowPassShader>::template ExpandTex(*mesh, T::ShadowTextures);
CustomUnrollArgs<List...>::template drawShadow<typename T::ShadowPassShader>(cascade, t.at(i));
CustomUnrollArgs<List...>::template drawMesh<typename T::ShadowPassShader>(t.at(i), cascade);
} // for i
} // renderShadow
@@ -1573,7 +1573,7 @@ void renderInstancedShadow(unsigned cascade, Args ...args)
TexExpander<typename T::InstancedShadowPassShader>::template
ExpandTex(*mesh, T::ShadowTextures);
T::InstancedShadowPassShader::getInstance()->setUniforms(cascade, args...);
T::InstancedShadowPassShader::getInstance()->setUniforms(args..., cascade);
size_t tmp = ShadowPassCmd::getInstance()->Offset[cascade][T::MaterialType] + i;
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT,
(const void*)((tmp)
@@ -1591,7 +1591,7 @@ static void multidrawShadow(unsigned i, Args ...args)
InstanceTypeShadow));
if (ShadowPassCmd::getInstance()->Size[i][T::MaterialType])
{
T::InstancedShadowPassShader::getInstance()->setUniforms(i, args...);
T::InstancedShadowPassShader::getInstance()->setUniforms(args..., i);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT,
(const void*)(ShadowPassCmd::getInstance()->Offset[i][T::MaterialType]
* sizeof(DrawElementsIndirectCommand)),
@@ -1703,7 +1703,7 @@ void drawRSM(const core::matrix4 & rsm_matrix)
HandleExpander<typename T::RSMShader>::template Expand(mesh->TextureHandles, T::RSMTextures);
else
TexExpander<typename T::RSMShader>::template ExpandTex(*mesh, T::RSMTextures);
CustomUnrollArgs<Selector...>::template drawReflectiveShadowMap<typename T::RSMShader>(rsm_matrix, t.at(i));
CustomUnrollArgs<Selector...>::template drawMesh<typename T::RSMShader>(t.at(i), rsm_matrix);
}
} // drawRSM