diff --git a/yg/internal/opengl.cpp b/yg/internal/opengl.cpp index 7f599f26e1..688856ae67 100644 --- a/yg/internal/opengl.cpp +++ b/yg/internal/opengl.cpp @@ -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; diff --git a/yg/internal/opengl.hpp b/yg/internal/opengl.hpp index 7324f17a29..293e1a16a0 100644 --- a/yg/internal/opengl.hpp +++ b/yg/internal/opengl.hpp @@ -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; diff --git a/yg/internal/opengl_es.cpp b/yg/internal/opengl_es.cpp index 91a9d285a2..9e2641fb11 100644 --- a/yg/internal/opengl_es.cpp +++ b/yg/internal/opengl_es.cpp @@ -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; diff --git a/yg/internal/opengl_ext.cpp b/yg/internal/opengl_ext.cpp index d563e95d65..0538edc487 100644 --- a/yg/internal/opengl_ext.cpp +++ b/yg/internal/opengl_ext.cpp @@ -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; diff --git a/yg/internal/opengl_glsl_es2.cpp b/yg/internal/opengl_glsl_es2.cpp index 7cac5023fb..625bd3b658 100644 --- a/yg/internal/opengl_glsl_es2.cpp +++ b/yg/internal/opengl_glsl_es2.cpp @@ -45,6 +45,7 @@ namespace yg glTexCoordPointerFn = &glsl::glTexCoordPointer; glNormalPointerFn = &glsl::glNormalPointer; glEnableClientStateFn = &glsl::glEnableClientState; + glUseSharpGeometryFn = &glsl::glUseSharpGeometry; glMatrixModeFn = &glsl::glMatrixMode; glLoadIdentityFn = &glsl::glLoadIdentity; diff --git a/yg/internal/opengl_glsl_ext.cpp b/yg/internal/opengl_glsl_ext.cpp index aaa8c5995f..8d27a8b46d 100644 --- a/yg/internal/opengl_glsl_ext.cpp +++ b/yg/internal/opengl_glsl_ext.cpp @@ -39,6 +39,7 @@ namespace yg glNormalPointerFn = &glsl::glNormalPointer; glTexCoordPointerFn = &glsl::glTexCoordPointer; glEnableClientStateFn = &glsl::glEnableClientState; + glUseSharpGeometryFn = &glsl::glUseSharpGeometry; glMatrixModeFn = &glsl::glMatrixMode; glLoadIdentityFn = &glsl::glLoadIdentity; diff --git a/yg/internal/opengl_glsl_impl.cpp b/yg/internal/opengl_glsl_impl.cpp index a17581bb42..e1d02b481b 100644 --- a/yg/internal/opengl_glsl_impl.cpp +++ b/yg/internal/opengl_glsl_impl.cpp @@ -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 const & projM = threadData.m_matrices[GL_PROJECTION_MWM]; math::Matrix 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))); diff --git a/yg/internal/opengl_glsl_impl.hpp b/yg/internal/opengl_glsl_impl.hpp index dfc186d0e8..fab3f4524f 100644 --- a/yg/internal/opengl_glsl_impl.hpp +++ b/yg/internal/opengl_glsl_impl.hpp @@ -22,6 +22,8 @@ namespace yg void glLoadIdentity(); void glLoadMatrixf(GLfloat const * data); void glMatrixMode(GLenum mode); + + void glUseSharpGeometry(GLboolean flag); } } } diff --git a/yg/renderer.cpp b/yg/renderer.cpp index 2f815b28e9..ecd516d7bf 100644 --- a/yg/renderer.cpp +++ b/yg/renderer.cpp @@ -302,6 +302,12 @@ namespace yg return false; } + void Renderer::setPixelPrecision(bool flag) + { + flush(); + glUseSharpGeometryFn(flag); + } + void Renderer::flush() {} } diff --git a/yg/renderer.hpp b/yg/renderer.hpp index a9c8de38d2..babeab9615 100644 --- a/yg/renderer.hpp +++ b/yg/renderer.hpp @@ -158,6 +158,8 @@ namespace yg void setEnvironment(core::CommandsQueue::Environment const * env); bool isCancelled() const; + void setPixelPrecision(bool flag); + virtual void flush(); }; }