]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bobtoolz/DTrainDrawer.cpp
Prevent implicit Widget construction
[xonotic/netradiant.git] / contrib / bobtoolz / DTrainDrawer.cpp
index ee4abf4bbd64bec02595a1d4774268ad359ddd51..da7edcc1bd0ee568892cf4f4dc74653d87108027 100644 (file)
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#include "StdAfx.h"
-#include "DPoint.h"
-
 #include "DTrainDrawer.h"
+
+#include <list>
+#include "str.h"
+
+#include "DPoint.h"
+#include "DPlane.h"
+#include "DBrush.h"
 #include "DEPair.h"
+#include "DPatch.h"
+#include "DEntity.h"
 
 #include "misc.h"
 #include "funchandlers.h"
 
+#include "iglrender.h"
+#include "ientity.h"
+#include "math/matrix.h"
+
 #include "dialogs/dialogs-gtk.h"
 
 DTrainDrawer::DTrainDrawer() {
-       refCount = 1;
-       m_bHooked = FALSE;
-       m_bDisplay = FALSE;
+       m_bDisplay = false;
 
        BuildPaths();
+       constructShaders();
+       GlobalShaderCache().attachRenderable( *this );
 }
 
 DTrainDrawer::~DTrainDrawer( void ) {
-       if ( m_bHooked ) {
-               UnRegister();
-       }
+       GlobalShaderCache().detachRenderable( *this );
+       destroyShaders();
 
        ClearPoints();
        ClearSplines();
 }
 
 void DTrainDrawer::ClearSplines() {
-       for ( list<splinePoint_t *>::const_iterator deadSpline = m_splineList.begin(); deadSpline != m_splineList.end(); deadSpline++ ) {
+       for ( std::list<splinePoint_t *>::const_iterator deadSpline = m_splineList.begin(); deadSpline != m_splineList.end(); deadSpline++ ) {
                ( *deadSpline )->m_pointList.clear();
                ( *deadSpline )->m_vertexList.clear();
                delete ( *deadSpline );
@@ -56,25 +65,13 @@ void DTrainDrawer::ClearSplines() {
 }
 
 void DTrainDrawer::ClearPoints() {
-       for ( list<controlPoint_t *>::const_iterator deadPoint = m_pointList.begin(); deadPoint != m_pointList.end(); deadPoint++ ) {
+       for ( std::list<controlPoint_t *>::const_iterator deadPoint = m_pointList.begin(); deadPoint != m_pointList.end(); deadPoint++ ) {
                delete *deadPoint;
        }
 
        m_pointList.clear();
 }
 
-void DTrainDrawer::Register() {
-       g_QglTable.m_pfnHookGL2DWindow( this );
-       g_QglTable.m_pfnHookGL3DWindow( this );
-       m_bHooked = TRUE;
-}
-
-void DTrainDrawer::UnRegister() {
-       g_QglTable.m_pfnUnHookGL2DWindow( this );
-       g_QglTable.m_pfnUnHookGL3DWindow( this );
-       m_bHooked = FALSE;
-}
-
 void CalculateSpline_r( vec3_t* v, int count, vec3_t out, float tension ) {
        vec3_t dist;
 
@@ -100,93 +97,65 @@ void CalculateSpline_r( vec3_t* v, int count, vec3_t out, float tension ) {
        delete[] v2;
 }
 
-void DTrainDrawer::Draw3D() {
-
-       if ( !m_bDisplay ) {
-               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 );
-
-       g_QglTable.m_pfn_qglPushMatrix();
-
-       g_QglTable.m_pfn_qglLineWidth( 2.0f );
-       g_QglTable.m_pfn_qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
-
-       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 );
-
-       for ( list<splinePoint_t* >::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
+void DTrainDrawer::render( RenderStateFlags state ) const {
+       for ( std::list<splinePoint_t* >::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
                splinePoint_t* pSP = ( *sp );
 
-               g_QglTable.m_pfn_qglBegin( GL_LINE_STRIP );
-               for ( list<DPoint >::const_iterator v = pSP->m_vertexList.begin(); v != pSP->m_vertexList.end(); v++ ) {
-                       g_QglTable.m_pfn_qglVertex3fv( ( *v )._pnt );
+               glBegin( GL_LINE_STRIP );
+               for ( std::list<DPoint >::const_iterator v = pSP->m_vertexList.begin(); v != pSP->m_vertexList.end(); v++ ) {
+                       glVertex3fv( ( *v )._pnt );
                }
-               g_QglTable.m_pfn_qglEnd();
+               glEnd();
 
        }
+}
+
+const char* DTrainDrawer_state_wireframe = "$bobtoolz/traindrawer/wireframe";
+const char* DTrainDrawer_state_solid = "$bobtoolz/traindrawer/solid";
+
+void DTrainDrawer::constructShaders(){
+       OpenGLState state;
+       GlobalOpenGLStateLibrary().getDefaultState( state );
+       state.m_state = RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_BLEND;
+       state.m_sort = OpenGLState::eSortOverlayFirst;
+       state.m_linewidth = 1;
+       state.m_colour[0] = 1;
+       state.m_colour[1] = 0;
+       state.m_colour[2] = 0;
+       state.m_colour[3] = 1;
+       state.m_linewidth = 1;
+       GlobalOpenGLStateLibrary().insert( DTrainDrawer_state_wireframe, state );
+
+       state.m_colour[0] = 1;
+       state.m_colour[1] = 1;
+       state.m_colour[2] = 1;
+       state.m_colour[3] = 1;
+       state.m_linewidth = 2;
+       GlobalOpenGLStateLibrary().insert( DTrainDrawer_state_solid, state );
+
+       m_shader_wireframe = GlobalShaderCache().capture( DTrainDrawer_state_wireframe );
+       m_shader_solid = GlobalShaderCache().capture( DTrainDrawer_state_solid );
+}
 
-       g_QglTable.m_pfn_qglPopMatrix();
-       g_QglTable.m_pfn_qglPopAttrib();
+void DTrainDrawer::destroyShaders(){
+       GlobalOpenGLStateLibrary().erase( DTrainDrawer_state_wireframe );
+       GlobalOpenGLStateLibrary().erase( DTrainDrawer_state_solid );
+       GlobalShaderCache().release( DTrainDrawer_state_wireframe );
+       GlobalShaderCache().release( DTrainDrawer_state_solid );
 }
 
-void DTrainDrawer::Draw2D( VIEWTYPE vt ) {
 
+void DTrainDrawer::renderSolid( Renderer& renderer, const VolumeTest& volume ) const {
        if ( !m_bDisplay ) {
                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 );
-
-       g_QglTable.m_pfn_qglPushMatrix();
-
-       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;
-       }
-
-       g_QglTable.m_pfn_qglLineWidth( 1.0f );
-       g_QglTable.m_pfn_qglColor4f( 1.0f, 0.0f, 0.0f, 0.5f );
-
-       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 );
-
-       g_QglTable.m_pfn_qglColor4f( 1.f, 0.f, 0.f, 1.f );
-
-       for ( list<splinePoint_t* >::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
-               splinePoint_t* pSP = ( *sp );
-
-               g_QglTable.m_pfn_qglBegin( GL_LINE_STRIP );
-               for ( list<DPoint >::const_iterator v = pSP->m_vertexList.begin(); v != pSP->m_vertexList.end(); v++ ) {
-                       g_QglTable.m_pfn_qglVertex3fv( ( *v )._pnt );
-               }
-               g_QglTable.m_pfn_qglEnd();
-
-       }
-
-       g_QglTable.m_pfn_qglPopMatrix();
-       g_QglTable.m_pfn_qglPopAttrib();
+       renderer.SetState( m_shader_wireframe, Renderer::eWireframeOnly );
+       renderer.SetState( m_shader_solid, Renderer::eFullMaterials );
+       renderer.addRenderable( *this, g_matrix4_identity );
+}
+void DTrainDrawer::renderWireframe( Renderer& renderer, const VolumeTest& volume ) const {
+       renderSolid( renderer, volume );
 }
 
 void AddSplineControl( const char* control, splinePoint_t* pSP ) {
@@ -196,76 +165,81 @@ void AddSplineControl( const char* control, splinePoint_t* pSP ) {
        pSP->m_pointList.push_front( cp );
 }
 
-void DTrainDrawer::BuildPaths() {
-       int count = g_FuncTable.m_pfnGetEntityCount();
-
-       DEntity e;
+class EntityBuildPaths
+{
+mutable DEntity e;
+DTrainDrawer& drawer;
+public:
+EntityBuildPaths( DTrainDrawer& drawer ) : drawer( drawer ){
+}
+void operator()( scene::Instance& instance ) const {
+       e.ClearEPairs();
+       e.LoadEPairList( Node_getEntity( instance.path().top() ) );
+
+       const char* classname = e.m_Classname.GetBuffer();
+       const char* target;
+       const char* control;
+       const char* targetname;
+       vec3_t vOrigin;
+
+       e.SpawnString( "targetname", NULL, &targetname );
+       e.SpawnVector( "origin", "0 0 0", vOrigin );
+
+       if ( !strcmp( classname, "info_train_spline_main" ) ) {
+               if ( !targetname ) {
+                       globalOutputStream() << "info_train_spline_main with no targetname";
+                       return;
+               }
 
-       for ( int i = 0; i < count; i++ ) {
-               entity_s* ent = (entity_s*)g_FuncTable.m_pfnGetEntityHandle( i );
-               e.ClearEPairs();
-               e.LoadEPairList( *g_EntityTable.m_pfnGetEntityKeyValList( ent ) );
+               e.SpawnString( "target", NULL, &target );
 
-               const char* classname = e.m_Classname.GetBuffer();
-               const char* target;
-               const char* control;
-               const char* targetname;
-               vec3_t vOrigin;
+               if ( !target ) {
+                       drawer.AddControlPoint( targetname, vOrigin );
+               }
+               else {
+                       splinePoint_t* pSP = drawer.AddSplinePoint( targetname, target, vOrigin );
 
-               e.SpawnString( "targetname", NULL, &targetname );
-               e.SpawnVector( "origin", "0 0 0", vOrigin );
+                       e.SpawnString( "control", NULL, &control );
 
-               if ( !strcmp( classname, "info_train_spline_main" ) ) {
-                       if ( !targetname ) {
-                               Sys_Printf( "info_train_spline_main with no targetname" );
-                               return;
-                       }
+                       if ( control ) {
+                               AddSplineControl( control, pSP );
 
-                       e.SpawnString( "target", NULL, &target );
+                               for ( int j = 2;; j++ ) {
+                                       char buffer[16];
+                                       sprintf( buffer, "control%i", j );
 
-                       if ( !target ) {
-                               AddControlPoint( targetname, vOrigin );
-                       }
-                       else {
-                               splinePoint_t* pSP = AddSplinePoint( targetname, target, vOrigin );
-
-                               e.SpawnString( "control", NULL, &control );
+                                       e.SpawnString( buffer, NULL, &control );
+                                       if ( !control ) {
+                                               break;
+                                       }
 
-                               if ( control ) {
                                        AddSplineControl( control, pSP );
-
-                                       for ( int j = 2;; j++ ) {
-                                               char buffer[16];
-                                               sprintf( buffer, "control%i", j );
-
-                                               e.SpawnString( buffer, NULL, &control );
-                                               if ( !control ) {
-                                                       break;
-                                               }
-
-                                               AddSplineControl( control, pSP );
-                                       }
                                }
                        }
                }
-               else if ( !strcmp( classname, "info_train_spline_control" ) ) {
-                       if ( !targetname ) {
-                               Sys_Printf( "info_train_spline_control with no targetname" );
-                               return;
-                       }
-
-                       AddControlPoint( targetname, vOrigin );
+       }
+       else if ( !strcmp( classname, "info_train_spline_control" ) ) {
+               if ( !targetname ) {
+                       globalOutputStream() << "info_train_spline_control with no targetname";
+                       return;
                }
+
+               drawer.AddControlPoint( targetname, vOrigin );
        }
+}
+};
+
+void DTrainDrawer::BuildPaths() {
+       Scene_forEachEntity( EntityBuildPaths( *this ) );
 
-       list<splinePoint_t* >::const_iterator sp;
+       std::list<splinePoint_t* >::const_iterator sp;
        for ( sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
                splinePoint_t* pSP = ( *sp );
 
                controlPoint_t* pTarget = FindControlPoint( pSP->strTarget );
 
                if ( !pTarget ) {
-                       Sys_Printf( "couldn't find target %s", pSP->strTarget );
+                       globalOutputStream() << "couldn't find target " << pSP->strTarget;
                        return;
 //                     continue;
                }
@@ -273,10 +247,10 @@ void DTrainDrawer::BuildPaths() {
                pSP->pTarget = pTarget;
 
 
-               for ( list<controlPoint_t >::iterator cp = pSP->m_pointList.begin(); cp != pSP->m_pointList.end(); cp++ ) {
+               for ( std::list<controlPoint_t >::iterator cp = pSP->m_pointList.begin(); cp != pSP->m_pointList.end(); cp++ ) {
                        controlPoint_t* pControl = FindControlPoint( ( *cp ).strName );
                        if ( !pControl ) {
-                               Sys_Printf( "couldn't find control %s", ( *cp ).strName );
+                               globalOutputStream() << "couldn't find control " << ( *cp ).strName;
                                return;
                        }
 
@@ -284,8 +258,7 @@ void DTrainDrawer::BuildPaths() {
                }
        }
 
-       m_bDisplay = TRUE;
-       Register();
+       m_bDisplay = true;
 
        for ( sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
                splinePoint_t* pSP = ( *sp );
@@ -295,20 +268,20 @@ void DTrainDrawer::BuildPaths() {
                        continue;
                }
 
-               int count = pSP->m_pointList.size() + 2;
+               std::size_t count = pSP->m_pointList.size() + 2;
                vec3_t* v = new vec3_t[count];
 
                VectorCopy( pSP->point.vOrigin, v[0] );
 
                int i = 1;
-               for ( list<controlPoint_t>::reverse_iterator cp = pSP->m_pointList.rbegin(); cp != pSP->m_pointList.rend(); cp++ ) {
+               for ( std::list<controlPoint_t>::reverse_iterator cp = pSP->m_pointList.rbegin(); cp != pSP->m_pointList.rend(); cp++ ) {
                        VectorCopy( ( *cp ).vOrigin, v[i] );
                        i++;
                }
                VectorCopy( pSP->pTarget->vOrigin, v[i] );
 
                for ( float tension = 0.0f; tension <= 1.f; tension += 0.01f ) {
-                       CalculateSpline_r( v, count, out._pnt, tension );
+                       CalculateSpline_r( v, static_cast<int>( count ), out._pnt, tension );
                        pSP->m_vertexList.push_front( out );
                }
 
@@ -318,7 +291,7 @@ void DTrainDrawer::BuildPaths() {
                pSP->m_vertexList.push_front( out );
        }
 
-
+       SceneChangeNotify();
 }
 
 void DTrainDrawer::AddControlPoint( const char* name, vec_t* origin ){
@@ -342,13 +315,13 @@ splinePoint_t* DTrainDrawer::AddSplinePoint( const char* name, const char* targe
 }
 
 controlPoint_t* DTrainDrawer::FindControlPoint( const char* name ){
-       for ( list<controlPoint_t*>::const_iterator cp = m_pointList.begin(); cp != m_pointList.end(); cp++ ) {
+       for ( std::list<controlPoint_t*>::const_iterator cp = m_pointList.begin(); cp != m_pointList.end(); cp++ ) {
                if ( !strcmp( name, ( *cp )->strName ) ) {
                        return ( *cp );
                }
        }
 
-       for ( list<splinePoint_t*>::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
+       for ( std::list<splinePoint_t*>::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++ ) {
                if ( !strcmp( name, ( *sp )->point.strName ) ) {
                        return &( ( *sp )->point );
                }