forked from organicmaps/organicmaps
added quick fix for drawing straight texts and POI's sharp, while other elements are drawn as-is to prevent antialiased paths from being distorted.
This commit is contained in:
parent
76bd72b5e1
commit
99d5a73336
10 changed files with 108 additions and 11 deletions
|
@ -98,6 +98,8 @@ namespace yg
|
|||
void (OPENGL_CALLING_CONVENTION * glBindRenderbufferFn) (GLenum target, GLuint renderbuffer);
|
||||
void (OPENGL_CALLING_CONVENTION * glRenderbufferStorageFn) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
|
||||
|
||||
void (OPENGL_CALLING_CONVENTION * glUseSharpGeometryFn)(GLboolean flag);
|
||||
|
||||
void (OPENGL_CALLING_CONVENTION * glBlendFuncSeparateFn) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
|
||||
|
||||
bool g_hasContext = true;
|
||||
|
|
|
@ -77,6 +77,10 @@ namespace yg
|
|||
extern void (OPENGL_CALLING_CONVENTION * glNormalPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
||||
extern void (OPENGL_CALLING_CONVENTION * glTexCoordPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
||||
|
||||
/// this is a quickfix for sharpness of straight texts and symbols.
|
||||
/// should be refactored to something more consistent.
|
||||
extern void (OPENGL_CALLING_CONVENTION * glUseSharpGeometryFn) (GLboolean flag);
|
||||
|
||||
extern const GLenum GL_VERTEX_ARRAY_MWM;
|
||||
extern const GLenum GL_TEXTURE_COORD_ARRAY_MWM;
|
||||
extern const GLenum GL_NORMAL_ARRAY_MWM;
|
||||
|
|
|
@ -51,6 +51,9 @@ namespace yg
|
|||
glNormalPointer(type, stride, pointer);
|
||||
}
|
||||
|
||||
void glUseSharpGeometryImpl(GLboolean)
|
||||
{}
|
||||
|
||||
void InitExtensions()
|
||||
{
|
||||
DumpGLInformation();
|
||||
|
@ -63,6 +66,7 @@ namespace yg
|
|||
glTexCoordPointerFn = &glTexCoordPointer;
|
||||
glNormalPointerFn = &glNormalPointerImpl;
|
||||
glEnableClientStateFn = &glEnableClientState;
|
||||
glUseSharpGeometryFn = &glUseSharpGeometryImpl;
|
||||
|
||||
glMatrixModeFn = &glMatrixMode;
|
||||
glLoadIdentityFn = &glLoadIdentity;
|
||||
|
|
|
@ -47,6 +47,9 @@ namespace yg
|
|||
glNormalPointer(type, stride, pointer);
|
||||
}
|
||||
|
||||
void glUseSharpGeometryImpl(GLboolean)
|
||||
{}
|
||||
|
||||
void InitExtensions()
|
||||
{
|
||||
DumpGLInformation();
|
||||
|
@ -60,6 +63,8 @@ namespace yg
|
|||
glEnableClientStateFn = &glEnableClientState;
|
||||
glNormalPointerFn = &glNormalPointerImpl;
|
||||
|
||||
glUseSharpGeometryFn = &glUseSharpGeometryImpl;
|
||||
|
||||
glMatrixModeFn = &glMatrixMode;
|
||||
glLoadIdentityFn = &glLoadIdentity;
|
||||
glLoadMatrixfFn = &glLoadMatrixf;
|
||||
|
|
|
@ -45,6 +45,7 @@ namespace yg
|
|||
glTexCoordPointerFn = &glsl::glTexCoordPointer;
|
||||
glNormalPointerFn = &glsl::glNormalPointer;
|
||||
glEnableClientStateFn = &glsl::glEnableClientState;
|
||||
glUseSharpGeometryFn = &glsl::glUseSharpGeometry;
|
||||
|
||||
glMatrixModeFn = &glsl::glMatrixMode;
|
||||
glLoadIdentityFn = &glsl::glLoadIdentity;
|
||||
|
|
|
@ -39,6 +39,7 @@ namespace yg
|
|||
glNormalPointerFn = &glsl::glNormalPointer;
|
||||
glTexCoordPointerFn = &glsl::glTexCoordPointer;
|
||||
glEnableClientStateFn = &glsl::glEnableClientState;
|
||||
glUseSharpGeometryFn = &glsl::glUseSharpGeometry;
|
||||
|
||||
glMatrixModeFn = &glsl::glMatrixMode;
|
||||
glLoadIdentityFn = &glsl::glLoadIdentity;
|
||||
|
|
|
@ -31,6 +31,20 @@ namespace yg
|
|||
/// Vertex Shader Source
|
||||
|
||||
static const char g_vxSrc[] =
|
||||
"attribute vec4 Position;\n"
|
||||
"attribute vec2 Normal;\n"
|
||||
"attribute vec2 TexCoordIn;\n"
|
||||
"uniform mat4 ProjM;\n"
|
||||
"uniform mat4 ModelViewM;\n"
|
||||
"varying vec2 TexCoordOut;\n"
|
||||
"void main(void) {\n"
|
||||
" gl_Position = (vec4(Normal, 0.0, 0.0) + Position * ModelViewM) * ProjM;\n"
|
||||
" TexCoordOut = TexCoordIn;\n"
|
||||
"}\n";
|
||||
|
||||
/// Sharp Vertex Shader Source
|
||||
|
||||
static const char g_sharpVxSrc[] =
|
||||
"attribute vec4 Position;\n"
|
||||
"attribute vec2 Normal;\n"
|
||||
"attribute vec2 TexCoordIn;\n"
|
||||
|
@ -158,13 +172,34 @@ namespace yg
|
|||
Program m_noAlphaTestProgram;
|
||||
Program m_alphaTestProgram;
|
||||
|
||||
Program m_noAlphaTestSharpProgram;
|
||||
Program m_alphaTestSharpProgram;
|
||||
|
||||
/// currently bound GLSL program
|
||||
Program * m_currentProgram;
|
||||
|
||||
GLuint m_vertexShader;
|
||||
GLuint m_vxShader;
|
||||
GLuint m_sharpVxShader;
|
||||
GLuint m_noAlphaTestFrgSh;
|
||||
GLuint m_alphaTestFrgSh;
|
||||
|
||||
GLboolean m_useAlphaTest;
|
||||
GLboolean m_useSharpGeometry;
|
||||
|
||||
Program * selectCurrentProgram()
|
||||
{
|
||||
if (m_useAlphaTest)
|
||||
if (m_useSharpGeometry)
|
||||
return &m_alphaTestSharpProgram;
|
||||
else
|
||||
return &m_alphaTestProgram;
|
||||
else
|
||||
if (m_useSharpGeometry)
|
||||
return &m_noAlphaTestSharpProgram;
|
||||
else
|
||||
return &m_noAlphaTestProgram;
|
||||
}
|
||||
|
||||
void setCurrentProgram(Program * program)
|
||||
{
|
||||
if (m_currentProgram != program)
|
||||
|
@ -202,20 +237,28 @@ namespace yg
|
|||
|
||||
ThreadData()
|
||||
: m_matrixMode(-1),
|
||||
m_vertexShader(0),
|
||||
m_vxShader(0),
|
||||
m_sharpVxShader(0),
|
||||
m_noAlphaTestFrgSh(0),
|
||||
m_alphaTestFrgSh(0)
|
||||
m_alphaTestFrgSh(0),
|
||||
m_useAlphaTest(false),
|
||||
m_useSharpGeometry(false)
|
||||
{}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
m_vertexShader = loadShader(g_vxSrc, GL_VERTEX_SHADER);
|
||||
m_vxShader = loadShader(g_vxSrc, GL_VERTEX_SHADER);
|
||||
m_sharpVxShader = loadShader(g_sharpVxSrc, GL_VERTEX_SHADER);
|
||||
|
||||
m_noAlphaTestFrgSh = loadShader(g_noAlphaTestFrgSrc, GL_FRAGMENT_SHADER);
|
||||
m_alphaTestFrgSh = loadShader(g_alphaTestFrgSrc, GL_FRAGMENT_SHADER);
|
||||
|
||||
/// creating program
|
||||
m_alphaTestProgram.createProgram(m_vertexShader, m_alphaTestFrgSh);
|
||||
m_noAlphaTestProgram.createProgram(m_vertexShader, m_noAlphaTestFrgSh);
|
||||
m_alphaTestProgram.createProgram(m_vxShader, m_alphaTestFrgSh);
|
||||
m_noAlphaTestProgram.createProgram(m_vxShader, m_noAlphaTestFrgSh);
|
||||
|
||||
m_alphaTestSharpProgram.createProgram(m_sharpVxShader, m_alphaTestFrgSh);
|
||||
m_noAlphaTestSharpProgram.createProgram(m_sharpVxShader, m_noAlphaTestFrgSh);
|
||||
|
||||
m_alphaTestProgram.attachProjection("ProjM");
|
||||
m_alphaTestProgram.attachModelView("ModelViewM");
|
||||
|
@ -224,6 +267,13 @@ namespace yg
|
|||
m_alphaTestProgram.attachTexCoord("TexCoordIn");
|
||||
m_alphaTestProgram.attachNormal("Normal");
|
||||
|
||||
m_alphaTestSharpProgram.attachProjection("ProjM");
|
||||
m_alphaTestSharpProgram.attachModelView("ModelViewM");
|
||||
m_alphaTestSharpProgram.attachTexture("Texture");
|
||||
m_alphaTestSharpProgram.attachPosition("Position");
|
||||
m_alphaTestSharpProgram.attachTexCoord("TexCoordIn");
|
||||
m_alphaTestSharpProgram.attachNormal("Normal");
|
||||
|
||||
m_noAlphaTestProgram.attachProjection("ProjM");
|
||||
m_noAlphaTestProgram.attachModelView("ModelViewM");
|
||||
m_noAlphaTestProgram.attachTexture("Texture");
|
||||
|
@ -231,8 +281,14 @@ namespace yg
|
|||
m_noAlphaTestProgram.attachTexCoord("TexCoordIn");
|
||||
m_noAlphaTestProgram.attachNormal("Normal");
|
||||
|
||||
m_currentProgram = &m_noAlphaTestProgram;
|
||||
m_currentProgram->apply();
|
||||
m_noAlphaTestSharpProgram.attachProjection("ProjM");
|
||||
m_noAlphaTestSharpProgram.attachModelView("ModelViewM");
|
||||
m_noAlphaTestSharpProgram.attachTexture("Texture");
|
||||
m_noAlphaTestSharpProgram.attachPosition("Position");
|
||||
m_noAlphaTestSharpProgram.attachTexCoord("TexCoordIn");
|
||||
m_noAlphaTestSharpProgram.attachNormal("Normal");
|
||||
|
||||
selectCurrentProgram()->apply();
|
||||
}
|
||||
|
||||
void Finalize()
|
||||
|
@ -242,7 +298,13 @@ namespace yg
|
|||
if (yg::gl::g_hasContext)
|
||||
::glDeleteProgram(m_noAlphaTestProgram.m_program);
|
||||
if (yg::gl::g_hasContext)
|
||||
::glDeleteShader(m_vertexShader);
|
||||
::glDeleteProgram(m_alphaTestSharpProgram.m_program);
|
||||
if (yg::gl::g_hasContext)
|
||||
::glDeleteProgram(m_noAlphaTestSharpProgram.m_program);
|
||||
if (yg::gl::g_hasContext)
|
||||
::glDeleteShader(m_vxShader);
|
||||
if (yg::gl::g_hasContext)
|
||||
::glDeleteShader(m_sharpVxShader);
|
||||
if (yg::gl::g_hasContext)
|
||||
::glDeleteShader(m_noAlphaTestFrgSh);
|
||||
if (yg::gl::g_hasContext)
|
||||
|
@ -258,7 +320,7 @@ namespace yg
|
|||
if (cap == GL_ALPHA_TEST_MWM)
|
||||
{
|
||||
ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()];
|
||||
threadData.setCurrentProgram(&threadData.m_alphaTestProgram);
|
||||
threadData.m_useAlphaTest = true;
|
||||
}
|
||||
else
|
||||
::glEnable(cap);
|
||||
|
@ -269,7 +331,7 @@ namespace yg
|
|||
if (cap == GL_ALPHA_TEST_MWM)
|
||||
{
|
||||
ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()];
|
||||
threadData.setCurrentProgram(&threadData.m_noAlphaTestProgram);
|
||||
threadData.m_useAlphaTest = false;
|
||||
}
|
||||
else
|
||||
::glDisable(cap);
|
||||
|
@ -323,6 +385,12 @@ namespace yg
|
|||
};
|
||||
}
|
||||
|
||||
void glUseSharpGeometry(GLboolean flag)
|
||||
{
|
||||
ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()];
|
||||
threadData.m_useSharpGeometry = flag;
|
||||
}
|
||||
|
||||
void glMatrixMode(GLenum mode)
|
||||
{
|
||||
ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()];
|
||||
|
@ -370,6 +438,8 @@ namespace yg
|
|||
math::Matrix<float, 4, 4> const & projM = threadData.m_matrices[GL_PROJECTION_MWM];
|
||||
math::Matrix<float, 4, 4> const & modelViewM = threadData.m_matrices[GL_MODELVIEW_MWM];
|
||||
|
||||
threadData.setCurrentProgram(threadData.selectCurrentProgram());
|
||||
|
||||
// applying shader parameters
|
||||
OGLCHECK(::glUniformMatrix4fv(threadData.m_currentProgram->m_projectionUniform, 1, 0, &projM(0, 0)));
|
||||
OGLCHECK(::glUniformMatrix4fv(threadData.m_currentProgram->m_modelViewUniform, 1, 0, &modelViewM(0, 0)));
|
||||
|
|
|
@ -22,6 +22,8 @@ namespace yg
|
|||
void glLoadIdentity();
|
||||
void glLoadMatrixf(GLfloat const * data);
|
||||
void glMatrixMode(GLenum mode);
|
||||
|
||||
void glUseSharpGeometry(GLboolean flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -302,6 +302,12 @@ namespace yg
|
|||
return false;
|
||||
}
|
||||
|
||||
void Renderer::setPixelPrecision(bool flag)
|
||||
{
|
||||
flush();
|
||||
glUseSharpGeometryFn(flag);
|
||||
}
|
||||
|
||||
void Renderer::flush()
|
||||
{}
|
||||
}
|
||||
|
|
|
@ -158,6 +158,8 @@ namespace yg
|
|||
void setEnvironment(core::CommandsQueue::Environment const * env);
|
||||
bool isCancelled() const;
|
||||
|
||||
void setPixelPrecision(bool flag);
|
||||
|
||||
virtual void flush();
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue