Try to factorize using tuple
This commit is contained in:
parent
feda837de8
commit
c2f7c14fdb
@ -585,14 +585,20 @@ void IrrDriver::renderSolidFirstPass()
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Shader>
|
||||
void apply(std::tuple<GLMesh *, core::matrix4, core::matrix4> arg)
|
||||
{
|
||||
draw<Shader>(*std::get<0>(arg), std::get<1>(arg), std::get<2>(arg));
|
||||
}
|
||||
|
||||
template<typename Shader, enum E_VERTEX_TYPE VertexType>
|
||||
void renderMeshes2ndPass(std::vector<GLMesh *> &meshes, const std::vector<core::matrix4> &MVPMatrixes)
|
||||
void renderMeshes2ndPass(std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > &meshes)
|
||||
{
|
||||
glUseProgram(Shader::Program);
|
||||
glBindVertexArray(getVAO(VertexType));
|
||||
for (unsigned i = 0; i < meshes.size(); i++)
|
||||
{
|
||||
GLMesh &mesh = *meshes[i];
|
||||
GLMesh &mesh = *(std::get<0>(meshes[i]));
|
||||
if (!mesh.textures[0])
|
||||
mesh.textures[0] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
if (mesh.VAOType != VertexType)
|
||||
@ -614,7 +620,7 @@ void renderMeshes2ndPass(std::vector<GLMesh *> &meshes, const std::vector<core::
|
||||
GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||
}
|
||||
draw<Shader>(mesh, MVPMatrixes[i], mesh.TextureMatrix);
|
||||
apply<Shader>(meshes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -640,7 +646,9 @@ void IrrDriver::renderSolidSecondPass()
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
glDisable(GL_BLEND);
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::reset();
|
||||
ListDefaultStandardSM::Arguments.clear();
|
||||
ListDefaultTangentSM::Arguments.clear();
|
||||
ListAlphaRefSM::Arguments.clear();
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::reset();
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::reset();
|
||||
GroupedSM<SM_SPHEREMAP>::reset();
|
||||
@ -656,9 +664,9 @@ void IrrDriver::renderSolidSecondPass()
|
||||
|
||||
m_scene_manager->drawAll(scene::ESNRP_SOLID);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_STANDARD>(GroupedSM<SM_DEFAULT_STANDARD>::MeshSet, GroupedSM<SM_DEFAULT_STANDARD>::MVPSet);
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_TANGENTS>(GroupedSM<SM_DEFAULT_TANGENT>::MeshSet, GroupedSM<SM_DEFAULT_TANGENT>::MVPSet);
|
||||
renderMeshes2ndPass<MeshShader::ObjectRefPass2Shader, video::EVT_STANDARD>(GroupedSM<SM_ALPHA_REF_TEXTURE>::MeshSet, GroupedSM<SM_ALPHA_REF_TEXTURE>::MVPSet);
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_STANDARD>(ListDefaultStandardSM::Arguments);
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_TANGENTS>(ListDefaultTangentSM::Arguments);
|
||||
renderMeshes2ndPass<MeshShader::ObjectRefPass2Shader, video::EVT_STANDARD>(ListAlphaRefSM::Arguments);
|
||||
|
||||
glUseProgram(MeshShader::SphereMapShader::Program);
|
||||
glBindVertexArray(getVAO(EVT_STANDARD));
|
||||
|
@ -175,25 +175,13 @@ void STKAnimatedMesh::render()
|
||||
|
||||
GLMesh* mesh;
|
||||
for_in(mesh, ShadedMesh[SM_DEFAULT_STANDARD])
|
||||
{
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::MeshSet.push_back(mesh);
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::MVPSet.push_back(AbsoluteTransformation);
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::TIMVSet.push_back(invmodel);
|
||||
}
|
||||
ListDefaultStandardSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix));
|
||||
|
||||
for_in(mesh, ShadedMesh[SM_DEFAULT_TANGENT])
|
||||
{
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::MeshSet.push_back(mesh);
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::MVPSet.push_back(AbsoluteTransformation);
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::TIMVSet.push_back(invmodel);
|
||||
}
|
||||
ListDefaultTangentSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix));
|
||||
|
||||
for_in(mesh, ShadedMesh[SM_ALPHA_REF_TEXTURE])
|
||||
{
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::MeshSet.push_back(mesh);
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::MVPSet.push_back(AbsoluteTransformation);
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::TIMVSet.push_back(invmodel);
|
||||
}
|
||||
ListAlphaRefSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix));
|
||||
|
||||
for_in (mesh, ShadedMesh[SM_UNLIT])
|
||||
{
|
||||
|
@ -519,3 +519,6 @@ void initvaostate(GLMesh &mesh, TransparentMaterial TranspMat)
|
||||
mesh.vao = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
|
||||
}
|
||||
|
||||
std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > ListDefaultStandardSM::Arguments;
|
||||
std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > ListDefaultTangentSM::Arguments;
|
||||
std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > ListAlphaRefSM::Arguments;
|
@ -8,6 +8,7 @@
|
||||
#include <IMesh.h>
|
||||
#include "../lib/irrlicht/source/Irrlicht/CMeshSceneNode.h"
|
||||
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
enum GeometricMaterial
|
||||
@ -108,6 +109,24 @@ void draw(const GLMesh &mesh, uniforms... Args)
|
||||
void drawGrassPass1(const GLMesh &mesh, const core::matrix4 & ModelViewProjectionMatrix, const core::matrix4 &TransposeInverseModelView, core::vector3df windDir);
|
||||
|
||||
// Pass 2 shader (ie shaders that outputs final color)
|
||||
class ListDefaultStandardSM
|
||||
{
|
||||
public:
|
||||
static std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListDefaultTangentSM
|
||||
{
|
||||
public:
|
||||
static std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListAlphaRefSM
|
||||
{
|
||||
public:
|
||||
static std::vector<std::tuple<GLMesh *, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
template<enum ShadedMaterial T>
|
||||
class GroupedSM
|
||||
{
|
||||
|
@ -348,25 +348,13 @@ void STKMeshSceneNode::render()
|
||||
|
||||
GLMesh* mesh;
|
||||
for_in(mesh, ShadedMesh[SM_DEFAULT_STANDARD])
|
||||
{
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::MeshSet.push_back(mesh);
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::MVPSet.push_back(AbsoluteTransformation);
|
||||
GroupedSM<SM_DEFAULT_STANDARD>::TIMVSet.push_back(invmodel);
|
||||
}
|
||||
ListDefaultStandardSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix));
|
||||
|
||||
for_in(mesh, ShadedMesh[SM_DEFAULT_TANGENT])
|
||||
{
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::MeshSet.push_back(mesh);
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::MVPSet.push_back(AbsoluteTransformation);
|
||||
GroupedSM<SM_DEFAULT_TANGENT>::TIMVSet.push_back(invmodel);
|
||||
}
|
||||
ListDefaultTangentSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix));
|
||||
|
||||
for_in(mesh, ShadedMesh[SM_ALPHA_REF_TEXTURE])
|
||||
{
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::MeshSet.push_back(mesh);
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::MVPSet.push_back(AbsoluteTransformation);
|
||||
GroupedSM<SM_ALPHA_REF_TEXTURE>::TIMVSet.push_back(invmodel);
|
||||
}
|
||||
ListAlphaRefSM::Arguments.push_back(std::make_tuple(mesh, AbsoluteTransformation, mesh->TextureMatrix));
|
||||
|
||||
for_in(mesh, ShadedMesh[SM_SPHEREMAP])
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user