diff --git a/include/irender.h b/include/irender.h index c5109f6e..962b78e6 100644 --- a/include/irender.h +++ b/include/irender.h @@ -53,8 +53,8 @@ const unsigned int RENDER_TEXTURE = 1 << 18; // glEnable(GL_TEXTURE_2D) const unsigned int RENDER_BUMP = 1 << 19; const unsigned int RENDER_PROGRAM = 1 << 20; const unsigned int RENDER_SCREEN = 1 << 21; -const unsigned int RENDER_TEXT = 1 << 22; -const unsigned int RENDER_OVERRIDE = 1 << 23; +const unsigned int RENDER_TEXT = 1 << 22; // override: globalstate |= RENDER_TEXTURE | RENDER_BLEND | RENDER_FILL +const unsigned int RENDER_OVERRIDE = 1 << 23; // override: globalstate |= RENDER_FILL typedef unsigned int RenderStateFlags; diff --git a/libs/gtkutil/glfont.cpp b/libs/gtkutil/glfont.cpp index 68a24c24..7026d388 100644 --- a/libs/gtkutil/glfont.cpp +++ b/libs/gtkutil/glfont.cpp @@ -26,16 +26,16 @@ #include -void gray_to_texture( const int x_max, const int y_max, const unsigned char *in, unsigned char *out, const unsigned int fontColorR, const unsigned int fontColorG, const unsigned int fontColorB ){ /* normal with shadow */ - int x, y, bitmapIter = 0; +void gray_to_texture( const unsigned int x_max, const unsigned int y_max, const unsigned char *in, unsigned char *out, const unsigned char fontColorR, const unsigned char fontColorG, const unsigned char fontColorB ){ /* normal with shadow */ + unsigned int x, y, bitmapIter = 0; - const unsigned int backgroundColorR = 0; - const unsigned int backgroundColorG = 0; - const unsigned int backgroundColorB = 0; + const unsigned char backgroundColorR = 0; + const unsigned char backgroundColorG = 0; + const unsigned char backgroundColorB = 0; for( y = 0; y < y_max; y++ ) { for( x = 0; x < x_max; x++ ) { - int iter = ( y * x_max + x ) * 4; + const unsigned int iter = ( y * x_max + x ) * 4; if( x == 0 || y == 0 || x == 1 || y == 1 ) { out[iter] = fontColorB; out[iter + 1] = fontColorG; @@ -62,7 +62,7 @@ void gray_to_texture( const int x_max, const int y_max, const unsigned char *in, bitmapIter = 0; for( y = 0; y < y_max; y++ ) { for( x = 0; x < x_max; x++ ) { - int iter = ( y * x_max + x ) * 4; + const unsigned int iter = ( y * x_max + x ) * 4; if( x == 0 || y == 0 || x == ( x_max - 1 ) || y == ( y_max - 1 ) ) { continue; } @@ -75,8 +75,8 @@ void gray_to_texture( const int x_max, const int y_max, const unsigned char *in, } else{ /* Calculate alpha (opacity). */ - float opacityFont = in[bitmapIter] / 255.f; - float opacityBack = out[iter + 3] / 255.f; + const float opacityFont = in[bitmapIter] / 255.f; + const float opacityBack = out[iter + 3] / 255.f; out[iter] = fontColorB * opacityFont + ( 1 - opacityFont ) * backgroundColorB; out[iter + 1] = fontColorG * opacityFont + ( 1 - opacityFont ) * backgroundColorG; out[iter + 2] = fontColorR * opacityFont + ( 1 - opacityFont ) * backgroundColorR; @@ -114,7 +114,7 @@ void printString( const char *s ){ GlobalOpenGL().m_glCallLists( GLsizei( strlen( s ) ), GL_UNSIGNED_BYTE, reinterpret_cast( s ) ); } -void renderString( const char *s, const GLuint& tex, const unsigned int colour[3], int& wid, int& hei ){ +void renderString( const char *s, const GLuint& tex, const unsigned char colour[3], unsigned int& wid, unsigned int& hei ){ if( !m_ft2_context || m_pixelHeight == 0 ){ wid = hei = 0; return; @@ -132,7 +132,7 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 if ( log_rect.width > 0 && log_rect.height > 0 ) { hei = bitmap.rows = PANGO_PIXELS_CEIL( log_rect.height );//m_pixelAscent + m_pixelDescent; wid = bitmap.width = PANGO_PIXELS_CEIL( log_rect.width ); -// globalOutputStream() << width << " " << height << " rendering\n"; +// globalOutputStream() << wid << " " << hei << " rendering\n"; bitmap.pitch = bitmap.width; unsigned char *boo = (unsigned char *) malloc( bitmap.rows * bitmap.width ); memset( boo, 0, bitmap.rows * bitmap.width ); @@ -181,22 +181,21 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 #if 0 if( withfond ){ /* with background rectangle */ - int x_max = wid; - int y_max = hei; - int x, y, bitmapIter = 0; + const unsigned int x_max = wid; + const unsigned int y_max = hei; + unsigned int x, y, bitmapIter = 0; - unsigned int fontColorR = 255; - unsigned int fontColorG = 255; - unsigned int fontColorB = 0; + const unsigned char fontColorR = 255; + const unsigned char fontColorG = 255; + const unsigned char fontColorB = 0; - unsigned int backgroundColorR = 64; - unsigned int backgroundColorG = 64; - unsigned int backgroundColorB = 64; - float opacity; + const unsigned char backgroundColorR = 64; + const unsigned char backgroundColorG = 64; + const unsigned char backgroundColorB = 64; for( y = 0; y < y_max; y++ ) { for( x = 0; x < x_max; x++ ) { - int iter = ( y * x_max + x ) * 4; + const unsigned int iter = ( y * x_max + x ) * 4; if( x == 0 || y == 0 || x == ( x_max - 1 ) || y == ( y_max - 1 ) ) { buf[iter] = backgroundColorB; buf[iter + 1] = backgroundColorG; @@ -213,7 +212,7 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 } else { /* Calculate alpha (opacity). */ - opacity = bitmap.buffer[bitmapIter] / 255.f; + const float opacity = bitmap.buffer[bitmapIter] / 255.f; buf[iter] = fontColorB * opacity + ( 1 - opacity ) * backgroundColorB; buf[iter + 1] = fontColorG * opacity + ( 1 - opacity ) * backgroundColorG; buf[iter + 2] = fontColorR * opacity + ( 1 - opacity ) * backgroundColorR; @@ -224,25 +223,25 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 } } #elif 0 - if( 1 ){ /* normal with shadow */ - int x_max = wid; - int y_max = hei; - int x, y, bitmapIter = 0; + if( 1 ){ /* normal with shadow */ + const unsigned int x_max = wid; + const unsigned int y_max = hei; + unsigned int x, y, bitmapIter = 0; -// unsigned int fontColorR = 255; -// unsigned int fontColorG = 255; -// unsigned int fontColorB = 0; - unsigned int fontColorR = colour[0]; - unsigned int fontColorG = colour[1]; - unsigned int fontColorB = colour[2]; +// unsigned char fontColorR = 255; +// unsigned char fontColorG = 255; +// unsigned char fontColorB = 0; + unsigned char fontColorR = colour[0]; + unsigned char fontColorG = colour[1]; + unsigned char fontColorB = colour[2]; - unsigned int backgroundColorR = 0; - unsigned int backgroundColorG = 0; - unsigned int backgroundColorB = 0; + unsigned char backgroundColorR = 0; + unsigned char backgroundColorG = 0; + unsigned char backgroundColorB = 0; for( y = 0; y < y_max; y++ ) { for( x = 0; x < x_max; x++ ) { - int iter = ( y * x_max + x ) * 4; + const unsigned int iter = ( y * x_max + x ) * 4; if( x == 0 || y == 0 || x == 1 || y == 1 ) { buf[iter] = fontColorB; buf[iter + 1] = fontColorG; @@ -269,7 +268,7 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 bitmapIter = 0; for( y = 0; y < y_max; y++ ) { for( x = 0; x < x_max; x++ ) { - int iter = ( y * x_max + x ) * 4; + const unsigned int iter = ( y * x_max + x ) * 4; if( x == 0 || y == 0 || x == ( x_max - 1 ) || y == ( y_max - 1 ) ) { continue; } @@ -282,8 +281,8 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 } else{ /* Calculate alpha (opacity). */ - float opacityFont = bitmap.buffer[bitmapIter] / 255.f; - float opacityBack = buf[iter + 3] / 255.f; + const float opacityFont = bitmap.buffer[bitmapIter] / 255.f; + const float opacityBack = buf[iter + 3] / 255.f; buf[iter] = fontColorB * opacityFont + ( 1 - opacityFont ) * backgroundColorB; buf[iter + 1] = fontColorG * opacityFont + ( 1 - opacityFont ) * backgroundColorG; buf[iter + 2] = fontColorR * opacityFont + ( 1 - opacityFont ) * backgroundColorR; @@ -295,20 +294,20 @@ void renderString( const char *s, const GLuint& tex, const unsigned int colour[3 } } else{ /* normal */ - int x_max = wid; - int y_max = hei; - int x, y, bitmapIter = 0; + const unsigned int x_max = wid; + const unsigned int y_max = hei; + unsigned int x, y, bitmapIter = 0; -// unsigned int fontColorR = 0; -// unsigned int fontColorG = 255; -// unsigned int fontColorB = 0; - unsigned int fontColorR = colour[0]; - unsigned int fontColorG = colour[1]; - unsigned int fontColorB = colour[2]; +// unsigned char fontColorR = 0; +// unsigned char fontColorG = 255; +// unsigned char fontColorB = 0; + unsigned char fontColorR = colour[0]; + unsigned char fontColorG = colour[1]; + unsigned char fontColorB = colour[2]; for( y = 0; y < y_max; y++ ) { for( x = 0; x < x_max; x++ ) { - int iter = ( y * x_max + x ) * 4; + const unsigned int iter = ( y * x_max + x ) * 4; if( x == 0 || y == 0 || x == ( x_max - 1 ) || y == ( y_max - 1 ) ) { buf[iter] = fontColorB; buf[iter + 1] = fontColorG; diff --git a/libs/gtkutil/glfont.h b/libs/gtkutil/glfont.h index efdde8cf..34998524 100644 --- a/libs/gtkutil/glfont.h +++ b/libs/gtkutil/glfont.h @@ -31,7 +31,7 @@ virtual int getPixelHeight() const = 0; virtual int getPixelAscent() const = 0; virtual int getPixelDescent() const = 0; virtual void printString( const char *s ) = 0; -virtual void renderString( const char *s, const GLuint& tex, const unsigned int colour[3], int& wid, int& hei ) = 0; +virtual void renderString( const char *s, const GLuint& tex, const unsigned char colour[3], unsigned int& wid, unsigned int& hei ) = 0; virtual ~GLFont(){ } }; diff --git a/libs/render.h b/libs/render.h index 335c7c1c..a86baec3 100644 --- a/libs/render.h +++ b/libs/render.h @@ -1256,6 +1256,68 @@ inline void ArbitraryMeshTriangle_sumTangents( ArbitraryMeshVertex& a, Arbitrary reinterpret_cast( c.bitangent ) += t; } + +class RenderTextLabel +{ + unsigned int width; + unsigned int height; +public: + GLuint tex = 0; + Vector2 screenPos; + ~RenderTextLabel(){ + texFree(); + } + void texAlloc( const char* text, const Vector3& color01 ){ + glGenTextures( 1, &tex ); + if( tex > 0 ){ + const BasicVector3 colour = color01 * 255.f; + GlobalOpenGL().m_font->renderString( text, tex, colour.data(), width, height ); + } + } + void texFree(){ + if( tex > 0 ){ + glDeleteTextures( 1, &tex ); + tex = 0; + } + } + void render( unsigned int subTex ) const { + if( tex > 0 ){ + glBindTexture( GL_TEXTURE_2D, tex ); + //Here we draw the texturemaped quads. + //The bitmap that we got from FreeType was not + //oriented quite like we would like it to be, + //so we need to link the texture to the quad + //so that the result will be properly aligned. +#if 0 + const float verts[4][2] = { { screenPos.x(), screenPos.y() }, + { screenPos.x(), screenPos.y() + height + .01f }, + { screenPos.x() + width + .01f, screenPos.y() + height + .01f }, + { screenPos.x() + width + .01f, screenPos.y() } }; + const float coords[4][2] = { { subTex / 3.f, 1 }, + { subTex / 3.f, 0 }, + { ( subTex + 1 ) / 3.f, 0 }, + { ( subTex + 1 ) / 3.f, 1 } }; + glVertexPointer( 2, GL_FLOAT, 0, verts ); + glTexCoordPointer( 2, GL_FLOAT, 0, coords ); + glDrawArrays( GL_QUADS, 0, 4 ); +#else // this is faster :0 + glBegin( GL_QUADS ); + glTexCoord2f( subTex / 3.f, 1 ); + glVertex2f( screenPos.x(), screenPos.y() ); + glTexCoord2f( subTex / 3.f, 0 ); + glVertex2f( screenPos.x(), screenPos.y() + height + .01f ); + glTexCoord2f( ( subTex + 1 ) / 3.f, 0 ); + glVertex2f( screenPos.x() + width + .01f, screenPos.y() + height + .01f ); + glTexCoord2f( ( subTex + 1 ) / 3.f, 1 ); + glVertex2f( screenPos.x() + width + .01f, screenPos.y() ); + glEnd(); +#endif + } + } +}; + + + namespace { /////////////////////////////////////////////////////////////////////////////// // check FBO completeness diff --git a/plugins/entity/namedentity.h b/plugins/entity/namedentity.h index 2ab6dc85..ab0d1760 100644 --- a/plugins/entity/namedentity.h +++ b/plugins/entity/namedentity.h @@ -92,6 +92,7 @@ typedef MemberCaller1 #include "renderable.h" #include "cullable.h" +#include "render.h" class RenderableNamedEntity : public OpenGLRenderable { enum ENameMode{ @@ -103,80 +104,27 @@ class RenderableNamedEntity : public OpenGLRenderable { NamedEntity& m_named; const Vector3& m_position; - GLuint m_tex; - int m_width; - int m_height; - mutable float m_screenPos[2]; - const char* m_exclude; + mutable RenderTextLabel m_label; + const char* const m_exclude; public: typedef Static StaticShader; static Shader* getShader() { return StaticShader::instance(); } RenderableNamedEntity( NamedEntity& named, const Vector3& position, const char* exclude = 0 ) - : m_named( named ), m_position( position ), m_tex( 0 ), m_exclude( exclude ) { - construct_textures( m_named.name() ); + : m_named( named ), m_position( position ), m_exclude( exclude ) { + identifierChanged( m_named.name() ); m_named.attach( IdentifierChangedCaller( *this ) ); } bool excluded_not() const { - return m_tex > 0; - } -private: - void construct_textures( const char* name ){ - if( m_exclude && string_equal( m_exclude, name ) ) - return; - glGenTextures( 1, &m_tex ); - if( m_tex > 0 ) { - unsigned int colour[3]; - colour[0] = static_cast( m_named.color()[0] * 255.f ); - colour[1] = static_cast( m_named.color()[1] * 255.f ); - colour[2] = static_cast( m_named.color()[2] * 255.f ); - GlobalOpenGL().m_font->renderString( name, m_tex, colour, m_width, m_height ); - } - } - void delete_textures(){ - glDeleteTextures( 1, &m_tex ); - m_tex = 0; - } - void setMode( bool selected, bool childSelected ) const{ - if( selected ){ - m_nameMode = eNameSelected; - } - else if( childSelected ){ - m_nameMode = eNameChildSelected; - } - else{ - m_nameMode = eNameNormal; - } + return m_label.tex > 0; } public: void render( RenderStateFlags state ) const { - if( m_tex > 0 ){ - glBindTexture( GL_TEXTURE_2D, m_tex ); - - //Here we draw the texturemaped quads. - //The bitmap that we got from FreeType was not - //oriented quite like we would like it to be, - //so we need to link the texture to the quad - //so that the result will be properly aligned. - glBegin( GL_QUADS ); - float xoffset0 = m_nameMode / 3.f; - float xoffset1 = ( m_nameMode + 1 ) / 3.f; - glTexCoord2f( xoffset0, 1 ); - glVertex2f( m_screenPos[0], m_screenPos[1] ); - glTexCoord2f( xoffset0, 0 ); - glVertex2f( m_screenPos[0], m_screenPos[1] + m_height + .01f ); - glTexCoord2f( xoffset1, 0 ); - glVertex2f( m_screenPos[0] + m_width + .01f, m_screenPos[1] + m_height + .01f ); - glTexCoord2f( xoffset1, 1 ); - glVertex2f( m_screenPos[0] + m_width + .01f, m_screenPos[1] ); - glEnd(); - - glBindTexture( GL_TEXTURE_2D, 0 ); - } + m_label.render( m_nameMode ); } - void render( Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld, bool selected, bool childSelected = false ) const{ - setMode( selected, childSelected ); + void render( Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld, bool selected, bool childSelected = false ) const { + m_nameMode = selected? eNameSelected : childSelected? eNameChildSelected : eNameNormal; if( volume.fill() ){ const Matrix4& viewproj = volume.GetViewMatrix(); @@ -192,16 +140,16 @@ public: matrix4_multiply_by_matrix4( object2screen, localToWorld ); matrix4_transform_vector4( object2screen, position ); // globalOutputStream() << position << " Projection\n"; - position[0] /= position[3]; - position[1] /= position[3]; - position[2] /= position[3]; + position.x() /= position.w(); + position.y() /= position.w(); +// position.z() /= position.w(); // globalOutputStream() << position << " Projection division\n"; matrix4_transform_vector4( volume.GetViewport(), position ); // globalOutputStream() << position << " Viewport\n"; // globalOutputStream() << volume.GetViewport()[0] << " " << volume.GetViewport()[5] << " Viewport size\n"; - m_screenPos[0] = position[0]; - m_screenPos[1] = position[1]; -// globalOutputStream() << m_screenPos[0] << " " << m_screenPos[1] << "\n"; + m_label.screenPos.x() = position.x(); + m_label.screenPos.y() = position.y(); +// globalOutputStream() << m_label.screenPos << "\n"; renderer.PushState(); @@ -216,11 +164,12 @@ public: } ~RenderableNamedEntity(){ m_named.detach( IdentifierChangedCaller( *this ) ); - delete_textures(); } void identifierChanged( const char* value ){ - delete_textures(); - construct_textures( value ); + m_label.texFree(); + if( m_exclude && string_equal( m_exclude, value ) ) + return; + m_label.texAlloc( value, m_named.color() ); } typedef MemberCaller1 IdentifierChangedCaller; }; diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index 64d7fbc1..857c15da 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -748,19 +748,12 @@ void Camera_motionDelta( int x, int y, unsigned int state, void* data ){ #define cam_draw_size_use_tex class CamDrawSize { - GLuint _texs[3]; - int _widths[3]; - int _heights[3]; Vector3 _extents; + RenderTextLabel m_labels[3]; public: CamDrawSize() : _extents( -99.9f, -99.9f, -99.9f ){ - _texs[0] = _texs[1] = _texs[2] = 0; } - ~CamDrawSize(){ - for( std::size_t i = 0; i < 3; ++i ) - freeTex( _texs[i] ); - } - void render( const AABB& bounds, const View view ){ + void render( const AABB& bounds, const View& view ){ setState(); Vector4 points[3] = { Vector4( bounds.origin - g_vector3_axes[1] * bounds.extents - g_vector3_axes[2] * bounds.extents, 1 ), @@ -771,7 +764,7 @@ public: matrix4_transform_vector4( view.GetViewMatrix(), points[i] ); points[i].x() /= points[i].w(); points[i].y() /= points[i].w(); - points[i].z() /= points[i].w(); +// points[i].z() /= points[i].w(); matrix4_transform_vector4( view.GetViewport(), points[i] ); } @@ -779,29 +772,10 @@ public: if( points[i].w() > 0.005f ){ #ifdef cam_draw_size_use_tex updateTex( i, bounds.extents[i] ); - if( _texs[i] > 0 ) { - glBindTexture( GL_TEXTURE_2D, _texs[i] ); - - //Here we draw the texturemaped quads. - //The bitmap that we got from FreeType was not - //oriented quite like we would like it to be, - //so we need to link the texture to the quad - //so that the result will be properly aligned. - glBegin( GL_QUADS ); - const float xoffset0 = 0; - const float xoffset1 = 1.f / 3.f; - glTexCoord2f( xoffset0, 1 ); - glVertex2f( points[i].x(), points[i].y() ); - glTexCoord2f( xoffset0, 0 ); - glVertex2f( points[i].x(), points[i].y() + _heights[i] + .01f ); - glTexCoord2f( xoffset1, 0 ); - glVertex2f( points[i].x() + _widths[i] + .01f, points[i].y() + _heights[i] + .01f ); - glTexCoord2f( xoffset1, 1 ); - glVertex2f( points[i].x() + _widths[i] + .01f, points[i].y() ); - glEnd(); - - glBindTexture( GL_TEXTURE_2D, 0 ); - } + m_labels[i].screenPos.x() = points[i].x(); + m_labels[i].screenPos.y() = points[i].y(); + m_labels[i].render( 0 ); + glBindTexture( GL_TEXTURE_2D, 0 ); #else StringOutputStream stream( 16 ); stream << ( bounds.extents[i] * 2 ); @@ -831,23 +805,11 @@ private: } void updateTex( const std::size_t i, const float extent ){ if( extent != _extents[i] ){ - freeTex( _texs[i] ); _extents[i] = extent; - } - if( 0 == _texs[i] ){ - glGenTextures( 1, &_texs[i] ); - if( _texs[i] > 0 ){ - StringOutputStream stream( 16 ); - stream << ( extent * 2 ); - BasicVector3 colour = getColor( i ) * 255.f; - GlobalOpenGL().m_font->renderString( stream.c_str(), _texs[i], colour.data(), _widths[i], _heights[i] ); - } - } - } - void freeTex( GLuint& tex ){ - if( tex > 0 ){ - glDeleteTextures( 1, &tex ); - tex = 0; + m_labels[i].texFree(); + StringOutputStream stream( 16 ); + stream << ( extent * 2 ); + m_labels[i].texAlloc( stream.c_str(), getColor( i ) ); } } void setState() const { @@ -859,7 +821,7 @@ private: #endif glDisable( GL_DEPTH_TEST ); - glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glEnableClientState( GL_TEXTURE_COORD_ARRAY ); glDisableClientState( GL_NORMAL_ARRAY ); glDisableClientState( GL_COLOR_ARRAY ); #ifdef cam_draw_size_use_tex @@ -2114,7 +2076,7 @@ void CamWnd::Cam_Draw(){ } - unsigned int globalstate = RENDER_DEPTHTEST | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_ALPHATEST | RENDER_BLEND | RENDER_CULLFACE | RENDER_COLOURARRAY | RENDER_OFFSETLINE | RENDER_POLYGONSMOOTH | RENDER_LINESMOOTH | RENDER_FOG | RENDER_COLOURCHANGE | RENDER_TEXT; + unsigned int globalstate = RENDER_DEPTHTEST | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_ALPHATEST | RENDER_BLEND | RENDER_CULLFACE | RENDER_COLOURARRAY | RENDER_OFFSETLINE | RENDER_POLYGONSMOOTH | RENDER_LINESMOOTH | RENDER_FOG | RENDER_COLOURCHANGE; switch ( m_Camera.draw_mode ) { case cd_wire: diff --git a/radiant/renderstate.cpp b/radiant/renderstate.cpp index 6a69d65c..b565cff2 100644 --- a/radiant/renderstate.cpp +++ b/radiant/renderstate.cpp @@ -1314,7 +1314,7 @@ void render( RenderStateFlags globalstate, const Matrix4& modelview, const Matri } debug_string( "end rendering" ); - OpenGLState reset = current; /* popmatrix and reset stuff after RENDER_TEXT */ + OpenGLState reset = current; /* popmatrix after RENDER_TEXT */ reset.m_state = current.m_state & ~RENDER_TEXT; OpenGLState_apply( reset, current, globalstate ); } @@ -1617,7 +1617,10 @@ void OpenGLState_apply( const OpenGLState& self, OpenGLState& current, unsigned count_state(); if ( self.m_state & RENDER_OVERRIDE ) { - globalstate |= RENDER_FILL | RENDER_DEPTHWRITE; + globalstate |= RENDER_FILL; + } + if ( self.m_state & RENDER_TEXT ) { + globalstate |= RENDER_TEXTURE | RENDER_BLEND | RENDER_FILL | RENDER_TEXT; } const unsigned int state = self.m_state & globalstate; @@ -1625,18 +1628,22 @@ void OpenGLState_apply( const OpenGLState& self, OpenGLState& current, unsigned GlobalOpenGL_debugAssertNoErrors(); - if ( delta & ~state & RENDER_TEXT ) { /* disabling in the beginning, so wont override other states */ - if ( GlobalOpenGL().GL_1_3() ) { ///~RENDER_TEXTURE - glActiveTexture( GL_TEXTURE0 ); - glClientActiveTexture( GL_TEXTURE0 ); - } - glDisable( GL_TEXTURE_2D ); - glBindTexture( GL_TEXTURE_2D, 0 ); - - glDisable( GL_BLEND ); ///~RENDER_BLEND - - glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); ///~RENDER_FILL + if ( delta & state & RENDER_TEXT ) { + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + GLint viewprt[4]; + glGetIntegerv( GL_VIEWPORT, viewprt ); + //globalOutputStream() << viewprt[2] << " " << viewprt[3] << "\n"; + glOrtho( 0, viewprt[2], 0, viewprt[3], -100, 100 ); + glTranslated( double( viewprt[2] ) / 2.0, double( viewprt[3] ) / 2.0, 0 ); + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + GlobalOpenGL_debugAssertNoErrors(); + } + else if ( delta & ~state & RENDER_TEXT ) { glMatrixMode( GL_PROJECTION ); glPopMatrix(); glMatrixMode( GL_MODELVIEW ); @@ -1733,8 +1740,8 @@ void OpenGLState_apply( const OpenGLState& self, OpenGLState& current, unsigned if ( GlobalOpenGL().GL_1_3() ) { glActiveTexture( GL_TEXTURE0 ); } - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); - //glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); //uses actual alpha channel, = invis, if qer_trans + empty alpha channel +// glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); +// glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); //uses actual alpha channel, = invis, if qer_trans + empty alpha channel GlobalOpenGL_debugAssertNoErrors(); } else if ( delta & ~state & RENDER_BLEND ) { @@ -1742,7 +1749,7 @@ void OpenGLState_apply( const OpenGLState& self, OpenGLState& current, unsigned if ( GlobalOpenGL().GL_1_3() ) { glActiveTexture( GL_TEXTURE0 ); } - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); +// glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); GlobalOpenGL_debugAssertNoErrors(); } @@ -1855,35 +1862,6 @@ void OpenGLState_apply( const OpenGLState& self, OpenGLState& current, unsigned current.m_alpharef = self.m_alpharef; } - if ( delta & state & RENDER_TEXT ) { /* enabling in the end, so other states can't affect */ - if ( GlobalOpenGL().GL_1_3() ) { ///RENDER_TEXTURE - glActiveTexture( GL_TEXTURE0 ); - glClientActiveTexture( GL_TEXTURE0 ); - } - glEnable( GL_TEXTURE_2D ); - glColor4fv( vector4_to_array( self.m_colour ) ); - - glEnable( GL_BLEND ); ///RENDER_BLEND - //glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); //uses actual alpha channel, = invis, if qer_trans + empty alpha channel - - glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); ///RENDER_FILL - - glMatrixMode( GL_PROJECTION ); - glPushMatrix(); - glLoadIdentity(); - GLint viewprt[4]; - glGetIntegerv( GL_VIEWPORT, viewprt ); - //globalOutputStream() << viewprt[2] << " " << viewprt[3] << "\n"; - glOrtho( 0, viewprt[2], 0, viewprt[3], -100, 100 ); - glTranslated( double( viewprt[2] ) / 2.0, double( viewprt[3] ) / 2.0, 0 ); - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - - GlobalOpenGL_debugAssertNoErrors(); - } - { GLint texture0 = 0; GLint texture1 = 0; @@ -2182,15 +2160,8 @@ void OpenGLShader::construct( const char* name ){ } } if ( string_equal( name + 1, "TEXT" ) ) { - state.m_colour[0] = 1.f; - state.m_colour[1] = 1.f; - state.m_colour[2] = 1.f; - state.m_colour[3] = 1.f; - state.m_state = RENDER_CULLFACE | RENDER_COLOURWRITE /*| RENDER_DEPTHTEST | RENDER_DEPTHWRITE*/ /*| RENDER_FILL | RENDER_TEXTURE | RENDER_BLEND */| RENDER_TEXT; + state.m_state = RENDER_CULLFACE | RENDER_COLOURWRITE | RENDER_FILL | RENDER_TEXTURE | RENDER_BLEND | RENDER_TEXT; state.m_sort = OpenGLState::eSortText; - state.m_blend_src = GL_SRC_ALPHA; - state.m_blend_dst = GL_ONE_MINUS_SRC_ALPHA; - //state.m_depthfunc = GL_LEQUAL; } else if ( string_equal( name + 1, "POINT" ) ) { state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE; @@ -2214,7 +2185,7 @@ void OpenGLShader::construct( const char* name ){ state.m_pointsize = 4; } else if ( string_equal( name + 1, "BIGPOINT" ) ) { - state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_OVERRIDE; + state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE; state.m_sort = OpenGLState::eSortGUI1 + 1; state.m_pointsize = 6; } @@ -2351,15 +2322,15 @@ void OpenGLShader::construct( const char* name ){ #endif // 0 else if ( string_equal( name + 1, "WIRE_OVERLAY" ) ) { #if 0 - state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_DEPTHTEST | RENDER_OVERRIDE; + state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_DEPTHTEST; state.m_sort = OpenGLState::eSortOverlayFirst; #else - state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_DEPTHTEST | RENDER_OVERRIDE; + state.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_DEPTHTEST; state.m_sort = OpenGLState::eSortGUI1; state.m_depthfunc = GL_LEQUAL; OpenGLState& hiddenLine = appendDefaultPass(); - hiddenLine.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_DEPTHTEST | RENDER_OVERRIDE | RENDER_LINESTIPPLE; + hiddenLine.m_state = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_DEPTHTEST | RENDER_LINESTIPPLE; hiddenLine.m_sort = OpenGLState::eSortGUI0; hiddenLine.m_depthfunc = GL_GREATER; #endif diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index 3e127c2d..c53a01d8 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -2309,7 +2309,7 @@ void XYWnd::XY_Draw(){ glLoadMatrixf( reinterpret_cast( &m_modelview ) ); - unsigned int globalstate = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_POLYGONSMOOTH | RENDER_LINESMOOTH | RENDER_TEXT; + unsigned int globalstate = RENDER_COLOURARRAY | RENDER_COLOURWRITE | RENDER_POLYGONSMOOTH | RENDER_LINESMOOTH; if ( !g_xywindow_globals.m_bNoStipple ) { globalstate |= RENDER_LINESTIPPLE; }