X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=contrib%2Fbobtoolz%2FDVisDrawer.cpp;h=9dc37db5f016fa97d92c907ab91da97fcc34aa78;hb=cd6613e5171544b68d4ae70546c90a15c99b22a5;hp=9ea6afdbbc354dca1cf663ad914fd347d66e79f3;hpb=830125fad042fad35dc029b6eb57c8156ad7e176;p=xonotic%2Fnetradiant.git diff --git a/contrib/bobtoolz/DVisDrawer.cpp b/contrib/bobtoolz/DVisDrawer.cpp index 9ea6afdb..9dc37db5 100644 --- a/contrib/bobtoolz/DVisDrawer.cpp +++ b/contrib/bobtoolz/DVisDrawer.cpp @@ -21,9 +21,17 @@ // ////////////////////////////////////////////////////////////////////// -#include "StdAfx.h" -#include "DPoint.h" #include "DVisDrawer.h" + +#include "iglrender.h" +#include "math/matrix.h" + +#include +#include "str.h" + +#include "DPoint.h" +#include "DWinding.h" + #include "misc.h" #include "funchandlers.h" @@ -32,15 +40,15 @@ ////////////////////////////////////////////////////////////////////// DVisDrawer::DVisDrawer(){ - refCount = 1; - m_bHooked = FALSE; m_list = NULL; + + constructShaders(); + GlobalShaderCache().attachRenderable( *this ); } DVisDrawer::~DVisDrawer(){ - if ( m_bHooked ) { - UnRegister(); - } + GlobalShaderCache().detachRenderable( *this ); + destroyShaders(); g_VisView = NULL; } @@ -48,118 +56,73 @@ DVisDrawer::~DVisDrawer(){ ////////////////////////////////////////////////////////////////////// // Implementation ////////////////////////////////////////////////////////////////////// +const char* g_state_solid = "$bobtoolz/visdrawer/solid"; +const char* g_state_wireframe = "$bobtoolz/visdrawer/wireframe"; -void DVisDrawer::Draw2D( VIEWTYPE vt ){ - if ( !m_list ) { - return; - } - - g_QglTable.m_pfn_qglPushAttrib( GL_ALL_ATTRIB_BITS ); - - g_QglTable.m_pfn_qglDisable( GL_BLEND ); - g_QglTable.m_pfn_qglDisable( GL_LINE_SMOOTH ); +void DVisDrawer::constructShaders(){ + OpenGLState state; + GlobalOpenGLStateLibrary().getDefaultState( state ); + state.m_state = RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_COLOURCHANGE; + state.m_linewidth = 1; - g_QglTable.m_pfn_qglPushMatrix(); + GlobalOpenGLStateLibrary().insert( g_state_wireframe, state ); - switch ( vt ) - { - case XY: - break; - case XZ: - g_QglTable.m_pfn_qglRotatef( 270.0f, 1.0f, 0.0f, 0.0f ); - break; - case YZ: - g_QglTable.m_pfn_qglRotatef( 270.0f, 1.0f, 0.0f, 0.0f ); - g_QglTable.m_pfn_qglRotatef( 270.0f, 0.0f, 0.0f, 1.0f ); - break; - } + GlobalOpenGLStateLibrary().getDefaultState( state ); + state.m_state = RENDER_FILL | RENDER_BLEND | RENDER_COLOURWRITE | RENDER_COLOURCHANGE | RENDER_SMOOTH | RENDER_DEPTHWRITE; - g_QglTable.m_pfn_qglLineWidth( 1.0f ); - g_QglTable.m_pfn_qglColor4f( 1.0f, 0.0f, 0.0f, 0.5f ); + GlobalOpenGLStateLibrary().insert( g_state_solid, state ); - g_QglTable.m_pfn_qglEnable( GL_BLEND ); - g_QglTable.m_pfn_qglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - g_QglTable.m_pfn_qglDisable( GL_POLYGON_SMOOTH ); + m_shader_solid = GlobalShaderCache().capture( g_state_solid ); + m_shader_wireframe = GlobalShaderCache().capture( g_state_wireframe ); +} - g_QglTable.m_pfn_qglDepthFunc( GL_ALWAYS ); +void DVisDrawer::destroyShaders(){ + GlobalShaderCache().release( g_state_solid ); + GlobalShaderCache().release( g_state_wireframe ); + GlobalOpenGLStateLibrary().erase( g_state_solid ); + GlobalOpenGLStateLibrary().erase( g_state_wireframe ); +} +void DVisDrawer::render( RenderStateFlags state ) const { //bleh - list::const_iterator l = m_list->begin(); + std::list::const_iterator l = m_list->begin(); for (; l != m_list->end(); l++ ) { DWinding* w = *l; - g_QglTable.m_pfn_qglColor4f( w->clr[0], w->clr[1], w->clr[2], 0.5f ); + glColor4f( w->clr[0], w->clr[1], w->clr[2], 0.5f ); - g_QglTable.m_pfn_qglBegin( GL_POLYGON ); + glBegin( GL_POLYGON ); for ( int i = 0; i < w->numpoints; i++ ) { - g_QglTable.m_pfn_qglVertex3f( ( w->p[i] )[0], ( w->p[i] )[1], ( w->p[i] )[2] ); + glVertex3f( ( w->p[i] )[0], ( w->p[i] )[1], ( w->p[i] )[2] ); } - g_QglTable.m_pfn_qglEnd(); + glEnd(); } - - - g_QglTable.m_pfn_qglPopMatrix(); - - g_QglTable.m_pfn_qglPopAttrib(); } -void DVisDrawer::Draw3D(){ +void DVisDrawer::renderWireframe( Renderer& renderer, const VolumeTest& volume ) const { if ( !m_list ) { return; } - g_QglTable.m_pfn_qglPushAttrib( GL_ALL_ATTRIB_BITS ); + renderer.SetState( m_shader_wireframe, Renderer::eWireframeOnly ); - g_QglTable.m_pfn_qglColor4f( 1.0, 0.0, 0.0, 0.5f ); - -// g_QglTable.m_pfn_qglHint(GL_FOG_HINT, GL_NICEST); - -// g_QglTable.m_pfn_qglDisable(GL_CULL_FACE); - g_QglTable.m_pfn_qglDisable( GL_LINE_SMOOTH ); - -// g_QglTable.m_pfn_qglPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -// g_QglTable.m_pfn_qglShadeModel(GL_SMOOTH); - - g_QglTable.m_pfn_qglEnable( GL_BLEND ); - g_QglTable.m_pfn_qglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - g_QglTable.m_pfn_qglDisable( GL_POLYGON_SMOOTH ); - - g_QglTable.m_pfn_qglDepthFunc( GL_ALWAYS ); - - //bleh - list::const_iterator l = m_list->begin(); - - for (; l != m_list->end(); l++ ) - { - DWinding* w = *l; - - g_QglTable.m_pfn_qglColor4f( w->clr[0], w->clr[1], w->clr[2], 0.5f ); + renderer.addRenderable( *this, g_matrix4_identity ); +} - g_QglTable.m_pfn_qglBegin( GL_POLYGON ); - for ( int i = 0; i < w->numpoints; i++ ) { - g_QglTable.m_pfn_qglVertex3f( ( w->p[i] )[0], ( w->p[i] )[1], ( w->p[i] )[2] ); - } - g_QglTable.m_pfn_qglEnd(); +void DVisDrawer::renderSolid( Renderer& renderer, const VolumeTest& volume ) const { + if ( !m_list ) { + return; } - g_QglTable.m_pfn_qglPopAttrib(); -} - -void DVisDrawer::Register(){ - g_QglTable.m_pfnHookGL2DWindow( this ); - g_QglTable.m_pfnHookGL3DWindow( this ); - m_bHooked = TRUE; -} + renderer.SetState( m_shader_solid, Renderer::eWireframeOnly ); + renderer.SetState( m_shader_solid, Renderer::eFullMaterials ); -void DVisDrawer::UnRegister(){ - g_QglTable.m_pfnUnHookGL2DWindow( this ); - g_QglTable.m_pfnUnHookGL3DWindow( this ); - m_bHooked = FALSE; + renderer.addRenderable( *this, g_matrix4_identity ); } -void DVisDrawer::SetList( list *pointList ){ +void DVisDrawer::SetList( std::list *pointList ){ if ( m_list ) { ClearPoints(); } @@ -168,7 +131,7 @@ void DVisDrawer::SetList( list *pointList ){ } void DVisDrawer::ClearPoints(){ - list::const_iterator deadPoint = m_list->begin(); + std::list::const_iterator deadPoint = m_list->begin(); for (; deadPoint != m_list->end(); deadPoint++ ) delete *deadPoint; m_list->clear();