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:
rachytski 2012-09-27 18:41:10 +03:00 committed by Alex Zolotarev
parent 76bd72b5e1
commit 99d5a73336
10 changed files with 108 additions and 11 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -45,6 +45,7 @@ namespace yg
glTexCoordPointerFn = &glsl::glTexCoordPointer;
glNormalPointerFn = &glsl::glNormalPointer;
glEnableClientStateFn = &glsl::glEnableClientState;
glUseSharpGeometryFn = &glsl::glUseSharpGeometry;
glMatrixModeFn = &glsl::glMatrixMode;
glLoadIdentityFn = &glsl::glLoadIdentity;

View file

@ -39,6 +39,7 @@ namespace yg
glNormalPointerFn = &glsl::glNormalPointer;
glTexCoordPointerFn = &glsl::glTexCoordPointer;
glEnableClientStateFn = &glsl::glEnableClientState;
glUseSharpGeometryFn = &glsl::glUseSharpGeometry;
glMatrixModeFn = &glsl::glMatrixMode;
glLoadIdentityFn = &glsl::glLoadIdentity;

View file

@ -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)));

View file

@ -22,6 +22,8 @@ namespace yg
void glLoadIdentity();
void glLoadMatrixf(GLfloat const * data);
void glMatrixMode(GLenum mode);
void glUseSharpGeometry(GLboolean flag);
}
}
}

View file

@ -302,6 +302,12 @@ namespace yg
return false;
}
void Renderer::setPixelPrecision(bool flag)
{
flush();
glUseSharpGeometryFn(flag);
}
void Renderer::flush()
{}
}

View file

@ -158,6 +158,8 @@ namespace yg
void setEnvironment(core::CommandsQueue::Environment const * env);
bool isCancelled() const;
void setPixelPrecision(bool flag);
virtual void flush();
};
}