Duplicate singleton code for abstract/non abstract cases
This commit is contained in:
parent
366439bdd0
commit
14e3ccd059
@ -110,7 +110,7 @@ struct custom_unroll_args<N, List...>
|
|||||||
template<typename Shader, enum E_VERTEX_TYPE VertexType, int ...List, typename... TupleType>
|
template<typename Shader, enum E_VERTEX_TYPE VertexType, int ...List, typename... TupleType>
|
||||||
void renderMeshes1stPass(const std::vector<std::pair<GLuint, bool> > &TexUnits, std::vector<std::tuple<TupleType...> > &meshes)
|
void renderMeshes1stPass(const std::vector<std::pair<GLuint, bool> > &TexUnits, std::vector<std::tuple<TupleType...> > &meshes)
|
||||||
{
|
{
|
||||||
glUseProgram(Shader::template getInstance<Shader>()->Program);
|
glUseProgram(Shader::getInstance()->Program);
|
||||||
glBindVertexArray(getVAO(VertexType));
|
glBindVertexArray(getVAO(VertexType));
|
||||||
for (unsigned i = 0; i < meshes.size(); i++)
|
for (unsigned i = 0; i < meshes.size(); i++)
|
||||||
{
|
{
|
||||||
@ -129,7 +129,7 @@ void renderMeshes1stPass(const std::vector<std::pair<GLuint, bool> > &TexUnits,
|
|||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
custom_unroll_args<List...>::template exec(Shader::template getInstance<Shader>(), meshes[i]);
|
custom_unroll_args<List...>::template exec(Shader::getInstance(), meshes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,21 +161,21 @@ void IrrDriver::renderSolidFirstPass()
|
|||||||
|
|
||||||
{
|
{
|
||||||
ScopedGPUTimer Timer(getGPUTimer(Q_SOLID_PASS1));
|
ScopedGPUTimer Timer(getGPUTimer(Q_SOLID_PASS1));
|
||||||
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex, true } }, ListMatDefault::Arguments);
|
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance()->TU_tex, true } }, ListMatDefault::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex, true } }, ListMatSphereMap::Arguments);
|
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance()->TU_tex, true } }, ListMatSphereMap::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex, true } }, ListMatUnlit::Arguments);
|
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance()->TU_tex, true } }, ListMatUnlit::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_2TCOORDS, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex, true } }, ListMatDetails::Arguments);
|
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_2TCOORDS, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance()->TU_tex, true } }, ListMatDetails::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_2TCOORDS, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex, true } }, ListMatSplatting::Arguments);
|
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_2TCOORDS, 2, 1>({ { MeshShader::ObjectPass1Shader::getInstance()->TU_tex, true } }, ListMatSplatting::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::ObjectRefPass1Shader, video::EVT_STANDARD, 3, 2, 1>({ { MeshShader::ObjectRefPass1Shader::getInstance<MeshShader::ObjectRefPass1Shader>()->TU_tex, true } }, ListMatAlphaRef::Arguments);
|
renderMeshes1stPass<MeshShader::ObjectRefPass1Shader, video::EVT_STANDARD, 3, 2, 1>({ { MeshShader::ObjectRefPass1Shader::getInstance()->TU_tex, true } }, ListMatAlphaRef::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::GrassPass1Shader, video::EVT_STANDARD, 3, 2, 1>({ { MeshShader::GrassPass1Shader::getInstance<MeshShader::GrassPass1Shader>()->TU_tex, true } }, ListMatGrass::Arguments);
|
renderMeshes1stPass<MeshShader::GrassPass1Shader, video::EVT_STANDARD, 3, 2, 1>({ { MeshShader::GrassPass1Shader::getInstance()->TU_tex, true } }, ListMatGrass::Arguments);
|
||||||
renderMeshes1stPass<MeshShader::NormalMapShader, video::EVT_TANGENTS, 2, 1>({ { MeshShader::NormalMapShader::getInstance<MeshShader::NormalMapShader>()->TU_glossy, true }, { MeshShader::NormalMapShader::getInstance<MeshShader::NormalMapShader>()->TU_normalmap, false } }, ListMatNormalMap::Arguments);
|
renderMeshes1stPass<MeshShader::NormalMapShader, video::EVT_TANGENTS, 2, 1>({ { MeshShader::NormalMapShader::getInstance()->TU_glossy, true }, { MeshShader::NormalMapShader::getInstance()->TU_normalmap, false } }, ListMatNormalMap::Arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Shader, enum E_VERTEX_TYPE VertexType, int...List, typename... TupleType>
|
template<typename Shader, enum E_VERTEX_TYPE VertexType, int...List, typename... TupleType>
|
||||||
void renderMeshes2ndPass(const std::vector<std::pair<GLuint, bool> > &TexUnits, std::vector<std::tuple<TupleType...> > &meshes)
|
void renderMeshes2ndPass(const std::vector<std::pair<GLuint, bool> > &TexUnits, std::vector<std::tuple<TupleType...> > &meshes)
|
||||||
{
|
{
|
||||||
glUseProgram(Shader::template getInstance<Shader>()->Program);
|
glUseProgram(Shader::getInstance()->Program);
|
||||||
glBindVertexArray(getVAO(VertexType));
|
glBindVertexArray(getVAO(VertexType));
|
||||||
for (unsigned i = 0; i < meshes.size(); i++)
|
for (unsigned i = 0; i < meshes.size(); i++)
|
||||||
{
|
{
|
||||||
@ -205,7 +205,7 @@ void renderMeshes2ndPass(const std::vector<std::pair<GLuint, bool> > &TexUnits,
|
|||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
custom_unroll_args<List...>::template exec(Shader::template getInstance<Shader>(), meshes[i]);
|
custom_unroll_args<List...>::template exec(Shader::getInstance(), meshes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,14 +240,14 @@ void IrrDriver::renderSolidSecondPass()
|
|||||||
|
|
||||||
m_scene_manager->drawAll(scene::ESNRP_SOLID);
|
m_scene_manager->drawAll(scene::ESNRP_SOLID);
|
||||||
|
|
||||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_STANDARD, 4, 3, 1>({ { MeshShader::ObjectPass2Shader::getInstance<MeshShader::ObjectPass2Shader>()->TU_Albedo, true } }, ListMatDefault::Arguments);
|
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_STANDARD, 4, 3, 1>({ { MeshShader::ObjectPass2Shader::getInstance()->TU_Albedo, true } }, ListMatDefault::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::ObjectRefPass2Shader, video::EVT_STANDARD, 4, 3, 1 >({ { MeshShader::ObjectRefPass2Shader::getInstance<MeshShader::ObjectRefPass2Shader>()->TU_Albedo, true } }, ListMatAlphaRef::Arguments);
|
renderMeshes2ndPass<MeshShader::ObjectRefPass2Shader, video::EVT_STANDARD, 4, 3, 1 >({ { MeshShader::ObjectRefPass2Shader::getInstance()->TU_Albedo, true } }, ListMatAlphaRef::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::SphereMapShader, video::EVT_STANDARD, 4, 2, 1>({ { MeshShader::SphereMapShader::getInstance<MeshShader::SphereMapShader>()->TU_tex, true } }, ListMatSphereMap::Arguments);
|
renderMeshes2ndPass<MeshShader::SphereMapShader, video::EVT_STANDARD, 4, 2, 1>({ { MeshShader::SphereMapShader::getInstance()->TU_tex, true } }, ListMatSphereMap::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::DetailledObjectPass2Shader, video::EVT_2TCOORDS, 4, 1>({ { MeshShader::DetailledObjectPass2Shader::getInstance<MeshShader::DetailledObjectPass2Shader>()->TU_Albedo, true }, { MeshShader::DetailledObjectPass2Shader::getInstance<MeshShader::DetailledObjectPass2Shader>()->TU_detail, true } }, ListMatDetails::Arguments);
|
renderMeshes2ndPass<MeshShader::DetailledObjectPass2Shader, video::EVT_2TCOORDS, 4, 1>({ { MeshShader::DetailledObjectPass2Shader::getInstance()->TU_Albedo, true }, { MeshShader::DetailledObjectPass2Shader::getInstance()->TU_detail, true } }, ListMatDetails::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::GrassPass2Shader, video::EVT_STANDARD, 4, 3, 1>({ { MeshShader::GrassPass2Shader::getInstance<MeshShader::GrassPass2Shader>()->TU_Albedo, true } }, ListMatGrass::Arguments);
|
renderMeshes2ndPass<MeshShader::GrassPass2Shader, video::EVT_STANDARD, 4, 3, 1>({ { MeshShader::GrassPass2Shader::getInstance()->TU_Albedo, true } }, ListMatGrass::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::ObjectUnlitShader, video::EVT_STANDARD, 1>({ { MeshShader::ObjectUnlitShader::getInstance<MeshShader::ObjectUnlitShader>()->TU_tex, true } }, ListMatUnlit::Arguments);
|
renderMeshes2ndPass<MeshShader::ObjectUnlitShader, video::EVT_STANDARD, 1>({ { MeshShader::ObjectUnlitShader::getInstance()->TU_tex, true } }, ListMatUnlit::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::SplattingShader, video::EVT_2TCOORDS, 3, 1>({ { 8, true }, { MeshShader::SplattingShader::getInstance<MeshShader::SplattingShader>()->TU_tex_layout, false }, { MeshShader::SplattingShader::getInstance<MeshShader::SplattingShader>()->TU_tex_detail0, true }, { MeshShader::SplattingShader::getInstance<MeshShader::SplattingShader>()->TU_tex_detail1, true }, { MeshShader::SplattingShader::getInstance<MeshShader::SplattingShader>()->TU_tex_detail2, true }, { MeshShader::SplattingShader::getInstance<MeshShader::SplattingShader>()->TU_tex_detail3, true } }, ListMatSplatting::Arguments);
|
renderMeshes2ndPass<MeshShader::SplattingShader, video::EVT_2TCOORDS, 3, 1>({ { 8, true }, { MeshShader::SplattingShader::getInstance()->TU_tex_layout, false }, { MeshShader::SplattingShader::getInstance()->TU_tex_detail0, true }, { MeshShader::SplattingShader::getInstance()->TU_tex_detail1, true }, { MeshShader::SplattingShader::getInstance()->TU_tex_detail2, true }, { MeshShader::SplattingShader::getInstance()->TU_tex_detail3, true } }, ListMatSplatting::Arguments);
|
||||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_TANGENTS, 4, 3, 1>({ { MeshShader::ObjectPass2Shader::getInstance<MeshShader::ObjectPass2Shader>()->TU_Albedo, true } }, ListMatNormalMap::Arguments);
|
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_TANGENTS, 4, 3, 1>({ { MeshShader::ObjectPass2Shader::getInstance()->TU_Albedo, true } }, ListMatNormalMap::Arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,16 +274,16 @@ void IrrDriver::renderTransparent()
|
|||||||
if (World::getWorld() && World::getWorld()->isFogEnabled())
|
if (World::getWorld() && World::getWorld()->isFogEnabled())
|
||||||
{
|
{
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
renderMeshes2ndPass<MeshShader::TransparentFogShader, video::EVT_STANDARD, 8, 7, 6, 5, 4, 3, 2, 1>({ { MeshShader::TransparentFogShader::getInstance<MeshShader::TransparentFogShader>()->TU_tex, true } }, ListBlendTransparentFog::Arguments);
|
renderMeshes2ndPass<MeshShader::TransparentFogShader, video::EVT_STANDARD, 8, 7, 6, 5, 4, 3, 2, 1>({ { MeshShader::TransparentFogShader::getInstance()->TU_tex, true } }, ListBlendTransparentFog::Arguments);
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
glBlendFunc(GL_ONE, GL_ONE);
|
||||||
renderMeshes2ndPass<MeshShader::TransparentFogShader, video::EVT_STANDARD, 8, 7, 6, 5, 4, 3, 2, 1>({ { MeshShader::TransparentFogShader::getInstance<MeshShader::TransparentFogShader>()->TU_tex, true } }, ListAdditiveTransparentFog::Arguments);
|
renderMeshes2ndPass<MeshShader::TransparentFogShader, video::EVT_STANDARD, 8, 7, 6, 5, 4, 3, 2, 1>({ { MeshShader::TransparentFogShader::getInstance()->TU_tex, true } }, ListAdditiveTransparentFog::Arguments);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
renderMeshes2ndPass<MeshShader::TransparentShader, video::EVT_STANDARD, 2, 1>({ { MeshShader::TransparentShader::getInstance<MeshShader::TransparentShader>()->TU_tex, true } }, ListBlendTransparent::Arguments);
|
renderMeshes2ndPass<MeshShader::TransparentShader, video::EVT_STANDARD, 2, 1>({ { MeshShader::TransparentShader::getInstance()->TU_tex, true } }, ListBlendTransparent::Arguments);
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
glBlendFunc(GL_ONE, GL_ONE);
|
||||||
renderMeshes2ndPass<MeshShader::TransparentShader, video::EVT_STANDARD, 2, 1>({ { MeshShader::TransparentShader::getInstance<MeshShader::TransparentShader>()->TU_tex, true } }, ListAdditiveTransparent::Arguments);
|
renderMeshes2ndPass<MeshShader::TransparentShader, video::EVT_STANDARD, 2, 1>({ { MeshShader::TransparentShader::getInstance()->TU_tex, true } }, ListAdditiveTransparent::Arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!UserConfigParams::m_dynamic_lights)
|
if (!UserConfigParams::m_dynamic_lights)
|
||||||
|
@ -218,7 +218,7 @@ void STKMeshSceneNode::render()
|
|||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
if (update_each_frame)
|
if (update_each_frame)
|
||||||
updatevbo();
|
updatevbo();
|
||||||
glUseProgram(MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->Program);
|
glUseProgram(MeshShader::ObjectPass1Shader::getInstance()->Program);
|
||||||
// Only untextured
|
// Only untextured
|
||||||
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
||||||
{
|
{
|
||||||
@ -282,7 +282,7 @@ void STKMeshSceneNode::render()
|
|||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
if (!spareWhiteTex)
|
if (!spareWhiteTex)
|
||||||
spareWhiteTex = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
spareWhiteTex = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||||
glUseProgram(MeshShader::ObjectPass2Shader::getInstance<MeshShader::ObjectPass2Shader>()->Program);
|
glUseProgram(MeshShader::ObjectPass2Shader::getInstance()->Program);
|
||||||
// Only untextured
|
// Only untextured
|
||||||
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
||||||
{
|
{
|
||||||
@ -292,8 +292,8 @@ void STKMeshSceneNode::render()
|
|||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
size_t count = mesh.IndexCount;
|
||||||
|
|
||||||
setTexture(MeshShader::ObjectPass2Shader::getInstance<MeshShader::ObjectPass2Shader>()->TU_Albedo, getTextureGLuint(spareWhiteTex), GL_NEAREST, GL_NEAREST, false);
|
setTexture(MeshShader::ObjectPass2Shader::getInstance()->TU_Albedo, getTextureGLuint(spareWhiteTex), GL_NEAREST, GL_NEAREST, false);
|
||||||
MeshShader::ObjectPass2Shader::getInstance<MeshShader::ObjectPass2Shader>()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
MeshShader::ObjectPass2Shader::getInstance()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||||
assert(mesh.vao);
|
assert(mesh.vao);
|
||||||
glBindVertexArray(mesh.vao);
|
glBindVertexArray(mesh.vao);
|
||||||
glDrawElements(ptype, count, itype, 0);
|
glDrawElements(ptype, count, itype, 0);
|
||||||
@ -331,7 +331,7 @@ void STKMeshSceneNode::render()
|
|||||||
|
|
||||||
if (World::getWorld() && World::getWorld()->isFogEnabled())
|
if (World::getWorld() && World::getWorld()->isFogEnabled())
|
||||||
{
|
{
|
||||||
glUseProgram(MeshShader::TransparentFogShader::getInstance<MeshShader::TransparentFogShader>()->Program);
|
glUseProgram(MeshShader::TransparentFogShader::getInstance()->Program);
|
||||||
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
||||||
{
|
{
|
||||||
GLMesh &mesh = GLmeshes[i];
|
GLMesh &mesh = GLmeshes[i];
|
||||||
@ -355,8 +355,8 @@ void STKMeshSceneNode::render()
|
|||||||
tmpcol.getBlue() / 255.0f);
|
tmpcol.getBlue() / 255.0f);
|
||||||
|
|
||||||
compressTexture(mesh.textures[0], true);
|
compressTexture(mesh.textures[0], true);
|
||||||
setTexture(MeshShader::TransparentFogShader::getInstance<MeshShader::TransparentFogShader>()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
setTexture(MeshShader::TransparentFogShader::getInstance()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||||
MeshShader::TransparentFogShader::getInstance<MeshShader::TransparentFogShader>()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix, fogmax, startH, endH, start, end, col);
|
MeshShader::TransparentFogShader::getInstance()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix, fogmax, startH, endH, start, end, col);
|
||||||
|
|
||||||
assert(mesh.vao);
|
assert(mesh.vao);
|
||||||
glBindVertexArray(mesh.vao);
|
glBindVertexArray(mesh.vao);
|
||||||
@ -366,7 +366,7 @@ void STKMeshSceneNode::render()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glUseProgram(MeshShader::TransparentShader::getInstance<MeshShader::TransparentShader>()->Program);
|
glUseProgram(MeshShader::TransparentShader::getInstance()->Program);
|
||||||
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
for (unsigned i = 0; i < GLmeshes.size(); i++)
|
||||||
{
|
{
|
||||||
irr_driver->IncreaseObjectCount();
|
irr_driver->IncreaseObjectCount();
|
||||||
@ -376,9 +376,9 @@ void STKMeshSceneNode::render()
|
|||||||
size_t count = mesh.IndexCount;
|
size_t count = mesh.IndexCount;
|
||||||
|
|
||||||
compressTexture(mesh.textures[0], true);
|
compressTexture(mesh.textures[0], true);
|
||||||
setTexture(MeshShader::TransparentShader::getInstance<MeshShader::TransparentShader>()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
setTexture(MeshShader::TransparentShader::getInstance()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||||
|
|
||||||
MeshShader::TransparentShader::getInstance<MeshShader::TransparentShader>()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix);
|
MeshShader::TransparentShader::getInstance()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix);
|
||||||
assert(mesh.vao);
|
assert(mesh.vao);
|
||||||
glBindVertexArray(mesh.vao);
|
glBindVertexArray(mesh.vao);
|
||||||
glDrawElements(ptype, count, itype, 0);
|
glDrawElements(ptype, count, itype, 0);
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
class ClientNetworkManager : public NetworkManager
|
class ClientNetworkManager : public NetworkManager
|
||||||
{
|
{
|
||||||
friend class Singleton<NetworkManager>;
|
friend class AbstractSingleton<NetworkManager>;
|
||||||
public:
|
public:
|
||||||
/*! \brief Get the instance.
|
/*! \brief Get the instance.
|
||||||
* This is a utility function to avoid passing templates parameters
|
* This is a utility function to avoid passing templates parameters
|
||||||
@ -38,7 +38,7 @@ class ClientNetworkManager : public NetworkManager
|
|||||||
*/
|
*/
|
||||||
static ClientNetworkManager* getInstance()
|
static ClientNetworkManager* getInstance()
|
||||||
{
|
{
|
||||||
return Singleton<NetworkManager>::getInstance<ClientNetworkManager>();
|
return AbstractSingleton<NetworkManager>::getInstance<ClientNetworkManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Initializes network.
|
/*! \brief Initializes network.
|
||||||
|
@ -33,9 +33,9 @@
|
|||||||
/** \class NetworkInterface
|
/** \class NetworkInterface
|
||||||
* \ingroup network
|
* \ingroup network
|
||||||
*/
|
*/
|
||||||
class NetworkInterface : public Singleton<NetworkInterface>
|
class NetworkInterface : public AbstractSingleton<NetworkInterface>
|
||||||
{
|
{
|
||||||
friend class Singleton<NetworkInterface>;
|
friend class AbstractSingleton<NetworkInterface>;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/*! \brief Used to init the network.
|
/*! \brief Used to init the network.
|
||||||
|
@ -43,9 +43,9 @@
|
|||||||
* Here are defined some functions that will be specifically implemented by
|
* Here are defined some functions that will be specifically implemented by
|
||||||
* the ServerNetworkManager and the ClientNetworkManager.
|
* the ServerNetworkManager and the ClientNetworkManager.
|
||||||
*/
|
*/
|
||||||
class NetworkManager : public Singleton<NetworkManager>
|
class NetworkManager : public AbstractSingleton<NetworkManager>
|
||||||
{
|
{
|
||||||
friend class Singleton<NetworkManager>;
|
friend class AbstractSingleton<NetworkManager>;
|
||||||
public:
|
public:
|
||||||
/** \brief Function to start the Network Manager (start threads) */
|
/** \brief Function to start the Network Manager (start threads) */
|
||||||
virtual void run();
|
virtual void run();
|
||||||
|
@ -34,9 +34,9 @@ class Item;
|
|||||||
/*! \brief Manages the world updates during an online game
|
/*! \brief Manages the world updates during an online game
|
||||||
* This function's update is to be called instead of the normal World update
|
* This function's update is to be called instead of the normal World update
|
||||||
*/
|
*/
|
||||||
class NetworkWorld : public Singleton<NetworkWorld>
|
class NetworkWorld : public AbstractSingleton<NetworkWorld>
|
||||||
{
|
{
|
||||||
friend class Singleton<NetworkWorld>;
|
friend class AbstractSingleton<NetworkWorld>;
|
||||||
public:
|
public:
|
||||||
void update(float dt);
|
void update(float dt);
|
||||||
|
|
||||||
|
@ -102,9 +102,9 @@ typedef struct EventProcessingInfo
|
|||||||
* frames per second. Then, the management of protocols is thread-safe: any
|
* frames per second. Then, the management of protocols is thread-safe: any
|
||||||
* object can start/pause/stop protocols whithout problems.
|
* object can start/pause/stop protocols whithout problems.
|
||||||
*/
|
*/
|
||||||
class ProtocolManager : public Singleton<ProtocolManager>
|
class ProtocolManager : public AbstractSingleton<ProtocolManager>
|
||||||
{
|
{
|
||||||
friend class Singleton<ProtocolManager>;
|
friend class AbstractSingleton<ProtocolManager>;
|
||||||
friend void* protocolManagerAsynchronousUpdate(void* data);
|
friend void* protocolManagerAsynchronousUpdate(void* data);
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -27,11 +27,11 @@
|
|||||||
|
|
||||||
class ServerNetworkManager : public NetworkManager
|
class ServerNetworkManager : public NetworkManager
|
||||||
{
|
{
|
||||||
friend class Singleton<NetworkManager>;
|
friend class AbstractSingleton<NetworkManager>;
|
||||||
public:
|
public:
|
||||||
static ServerNetworkManager* getInstance()
|
static ServerNetworkManager* getInstance()
|
||||||
{
|
{
|
||||||
return Singleton<NetworkManager>::getInstance<ServerNetworkManager>();
|
return AbstractSingleton<NetworkManager>::getInstance<ServerNetworkManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void run();
|
virtual void run();
|
||||||
|
@ -31,13 +31,13 @@
|
|||||||
* classes.
|
* classes.
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class Singleton
|
class AbstractSingleton
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
/*! \brief Constructor */
|
/*! \brief Constructor */
|
||||||
Singleton () { m_singleton = NULL; }
|
AbstractSingleton() { m_singleton = NULL; }
|
||||||
/*! \brief Destructor */
|
/*! \brief Destructor */
|
||||||
virtual ~Singleton ()
|
virtual ~AbstractSingleton()
|
||||||
{
|
{
|
||||||
Log::info("Singleton", "Destroyed singleton.");
|
Log::info("Singleton", "Destroyed singleton.");
|
||||||
}
|
}
|
||||||
@ -80,6 +80,44 @@ class Singleton
|
|||||||
static T *m_singleton;
|
static T *m_singleton;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T> T *AbstractSingleton<T>::m_singleton = NULL;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class Singleton
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
/*! \brief Constructor */
|
||||||
|
Singleton() { m_singleton = NULL; }
|
||||||
|
/*! \brief Destructor */
|
||||||
|
virtual ~Singleton()
|
||||||
|
{
|
||||||
|
Log::info("Singleton", "Destroyed singleton.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*! \brief Used to get the instance. */
|
||||||
|
static T *getInstance()
|
||||||
|
{
|
||||||
|
if (m_singleton == NULL)
|
||||||
|
m_singleton = new T;
|
||||||
|
return m_singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Used to kill the singleton, if needed. */
|
||||||
|
static void kill()
|
||||||
|
{
|
||||||
|
if (m_singleton)
|
||||||
|
{
|
||||||
|
delete m_singleton;
|
||||||
|
m_singleton = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static T *m_singleton;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T> T *Singleton<T>::m_singleton = NULL;
|
template <typename T> T *Singleton<T>::m_singleton = NULL;
|
||||||
|
|
||||||
|
|
||||||
#endif // SINGLETON_HPP
|
#endif // SINGLETON_HPP
|
||||||
|
Loading…
x
Reference in New Issue
Block a user