forked from organicmaps/organicmaps
identifying Shaders by numerical identifiers, not by strings.
This commit is contained in:
parent
e7e4138cc7
commit
79670bcd5a
3 changed files with 36 additions and 25 deletions
|
@ -166,7 +166,7 @@ namespace graphics
|
|||
|
||||
gl::RenderContext * rc = static_cast<gl::RenderContext*>(renderContext());
|
||||
ProgramManager * pm = rc->programManager();
|
||||
shared_ptr<Program> prg = pm->getProgram("basic", "noalphatest");
|
||||
shared_ptr<Program> prg = pm->getProgram(EVxTextured, EFrgNoAlphaTest);
|
||||
|
||||
prg->setParam(ESemModelView, rc->matrix(EModelView));
|
||||
prg->setParam(ESemProjection, rc->matrix(EProjection));
|
||||
|
@ -410,7 +410,7 @@ namespace graphics
|
|||
/// Applying program
|
||||
gl::RenderContext * rc = static_cast<gl::RenderContext*>(renderContext());
|
||||
ProgramManager * pm = rc->programManager();
|
||||
shared_ptr<Program> prg = pm->getProgram("basic", "alphatest");
|
||||
shared_ptr<Program> prg = pm->getProgram(EVxTextured, EFrgAlphaTest);
|
||||
|
||||
prg->setParam(ESemModelView, rc->matrix(EModelView));
|
||||
prg->setParam(ESemProjection, rc->matrix(EProjection));
|
||||
|
@ -435,7 +435,7 @@ namespace graphics
|
|||
/// Applying program
|
||||
gl::RenderContext * rc = static_cast<gl::RenderContext*>(renderContext());
|
||||
ProgramManager * pm = rc->programManager();
|
||||
shared_ptr<Program> prg = pm->getProgram("basic", "noalphatest");
|
||||
shared_ptr<Program> prg = pm->getProgram(EVxTextured, EFrgNoAlphaTest);
|
||||
|
||||
prg->setParam(ESemModelView, rc->matrix(EModelView));
|
||||
prg->setParam(ESemProjection, rc->matrix(EProjection));
|
||||
|
@ -480,7 +480,7 @@ namespace graphics
|
|||
/// Applying program
|
||||
gl::RenderContext * rc = static_cast<gl::RenderContext*>(renderContext());
|
||||
ProgramManager * pm = rc->programManager();
|
||||
shared_ptr<Program> prg = pm->getProgram("sharp", "alphatest");
|
||||
shared_ptr<Program> prg = pm->getProgram(EVxSharp, EFrgAlphaTest);
|
||||
|
||||
prg->setParam(ESemModelView, rc->matrix(EModelView));
|
||||
prg->setParam(ESemProjection, rc->matrix(EProjection));
|
||||
|
|
|
@ -5,6 +5,7 @@ namespace graphics
|
|||
{
|
||||
namespace gl
|
||||
{
|
||||
|
||||
#if defined(OMIM_GL_ES)
|
||||
#define PRECISION "lowp"
|
||||
#else
|
||||
|
@ -26,7 +27,7 @@ namespace graphics
|
|||
" TexCoordOut0 = TexCoord0;\n"
|
||||
"}\n";
|
||||
|
||||
m_vxShaders["basic"].reset(new Shader(vxSrc, EVertexShader));
|
||||
m_vxShaders[EVxTextured].reset(new Shader(vxSrc, EVertexShader));
|
||||
|
||||
/// Sharp Vertex Shader Source
|
||||
|
||||
|
@ -42,7 +43,7 @@ namespace graphics
|
|||
" TexCoordOut0 = TexCoord0;\n"
|
||||
"}\n";
|
||||
|
||||
m_vxShaders["sharp"].reset(new Shader(sharpVxSrc, EVertexShader));
|
||||
m_vxShaders[EVxSharp].reset(new Shader(sharpVxSrc, EVertexShader));
|
||||
|
||||
/// Fragment Shader with alphaTest
|
||||
|
||||
|
@ -55,7 +56,7 @@ namespace graphics
|
|||
" discard;\n"
|
||||
"}\n";
|
||||
|
||||
m_frgShaders["alphatest"].reset(new Shader(alphaTestFrgSrc, EFragmentShader));
|
||||
m_frgShaders[EFrgAlphaTest].reset(new Shader(alphaTestFrgSrc, EFragmentShader));
|
||||
|
||||
/// Fragment shader without alphaTest
|
||||
|
||||
|
@ -65,29 +66,27 @@ namespace graphics
|
|||
"void main(void) {\n"
|
||||
" gl_FragColor = texture2D(Sampler0, TexCoordOut0);\n"
|
||||
"}\n";
|
||||
m_frgShaders["noalphatest"].reset(new Shader(noAlphaTestFrgSrc, EFragmentShader));
|
||||
m_frgShaders[EFrgNoAlphaTest].reset(new Shader(noAlphaTestFrgSrc, EFragmentShader));
|
||||
|
||||
getProgram("basic", "alphatest");
|
||||
getProgram("basic", "noalphatest");
|
||||
getProgram(EVxTextured, EFrgAlphaTest);
|
||||
getProgram(EVxTextured, EFrgNoAlphaTest);
|
||||
|
||||
getProgram("sharp", "alphatest");
|
||||
getProgram("sharp", "noalphatest");
|
||||
getProgram(EVxSharp, EFrgAlphaTest);
|
||||
getProgram(EVxSharp, EFrgNoAlphaTest);
|
||||
}
|
||||
|
||||
shared_ptr<Program> const ProgramManager::getProgram(char const * vxName,
|
||||
char const * frgName)
|
||||
shared_ptr<Program> const ProgramManager::getProgram(EVxType vxType,
|
||||
EFrgType frgType)
|
||||
{
|
||||
string prgName(string(vxName) + ":" + frgName);
|
||||
pair<EVxType, EFrgType> key(vxType, frgType);
|
||||
|
||||
map<string, shared_ptr<Program> >::const_iterator it = m_programs.find(prgName);
|
||||
map<pair<EVxType, EFrgType>, shared_ptr<Program> >::const_iterator it = m_programs.find(key);
|
||||
if (it != m_programs.end())
|
||||
return it->second;
|
||||
|
||||
shared_ptr<Program> program(new Program(m_vxShaders[vxName], m_frgShaders[frgName]));
|
||||
shared_ptr<Program> program(new Program(m_vxShaders[vxType], m_frgShaders[frgType]));
|
||||
|
||||
m_programs[prgName] = program;
|
||||
|
||||
LOG(LINFO, (this, ", ", vxName, ", ", frgName, ", ", program));
|
||||
m_programs[key] = program;
|
||||
|
||||
return program;
|
||||
}
|
||||
|
|
|
@ -11,20 +11,32 @@ namespace graphics
|
|||
{
|
||||
namespace gl
|
||||
{
|
||||
enum EVxType
|
||||
{
|
||||
EVxTextured,
|
||||
EVxSharp
|
||||
};
|
||||
|
||||
enum EFrgType
|
||||
{
|
||||
EFrgAlphaTest,
|
||||
EFrgNoAlphaTest
|
||||
};
|
||||
|
||||
class ProgramManager
|
||||
{
|
||||
private:
|
||||
|
||||
map<string, shared_ptr<Shader> > m_vxShaders;
|
||||
map<string, shared_ptr<Shader> > m_frgShaders;
|
||||
map<string, shared_ptr<Program> > m_programs;
|
||||
map<EVxType, shared_ptr<Shader> > m_vxShaders;
|
||||
map<EFrgType, shared_ptr<Shader> > m_frgShaders;
|
||||
map<pair<EVxType, EFrgType> , shared_ptr<Program> > m_programs;
|
||||
|
||||
public:
|
||||
|
||||
ProgramManager();
|
||||
|
||||
shared_ptr<Program> const getProgram(char const * vxName,
|
||||
char const * frgName);
|
||||
shared_ptr<Program> const getProgram(EVxType vxType,
|
||||
EFrgType frgType);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue