]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bobtoolz/DVisDrawer.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / bobtoolz / DVisDrawer.cpp
index c03a9262b950ff2c375b53f83df87f3a62755712..3699a4775bf6c20ece19b6c59cab06420f83a508 100644 (file)
@@ -1,29 +1,37 @@
 /*
-BobToolz plugin for GtkRadiant
-Copyright (C) 2001 Gordon Biggans
+   BobToolz plugin for GtkRadiant
+   Copyright (C) 2001 Gordon Biggans
 
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
 
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
 
 // BobView.cpp: implementation of the DVisDrawer class.
 //
 //////////////////////////////////////////////////////////////////////
 
-#include "StdAfx.h"
-#include "DPoint.h"
 #include "DVisDrawer.h"
+
+#include "iglrender.h"
+#include "math/matrix.h"
+
+#include <list>
+#include "str.h"
+
+#include "DPoint.h"
+#include "DWinding.h"
+
 #include "misc.h"
 #include "funchandlers.h"
 
@@ -33,147 +41,108 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 DVisDrawer::DVisDrawer()
 {
-       refCount = 1;
-       m_bHooked = FALSE;
-       m_list = NULL;
+    m_list = NULL;
+
+    constructShaders();
+    GlobalShaderCache().attachRenderable(*this);
 }
 
 DVisDrawer::~DVisDrawer()
 {
-       if(m_bHooked)
-               UnRegister();
+    GlobalShaderCache().detachRenderable(*this);
+    destroyShaders();
 
-       g_VisView = NULL;
+    g_VisView = NULL;
 }
 
 //////////////////////////////////////////////////////////////////////
 // Implementation
 //////////////////////////////////////////////////////////////////////
+const char *g_state_solid = "$bobtoolz/visdrawer/solid";
+const char *g_state_wireframe = "$bobtoolz/visdrawer/wireframe";
 
-void DVisDrawer::Draw2D(VIEWTYPE vt)
+void DVisDrawer::constructShaders()
 {
-       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);
-
-       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);
-
-       //bleh
-       list<DWinding *>::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);
-
-               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();
-       }
-
-       
-       g_QglTable.m_pfn_qglPopMatrix();
-
-       g_QglTable.m_pfn_qglPopAttrib();
-}
+    OpenGLState state;
+    GlobalOpenGLStateLibrary().getDefaultState(state);
+    state.m_state = RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_COLOURCHANGE;
+    state.m_linewidth = 1;
 
-void DVisDrawer::Draw3D()
-{
-       if(!m_list)
-               return;
+    GlobalOpenGLStateLibrary().insert(g_state_wireframe, state);
 
-       g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
+    GlobalOpenGLStateLibrary().getDefaultState(state);
+    state.m_state =
+            RENDER_FILL | RENDER_BLEND | RENDER_COLOURWRITE | RENDER_COLOURCHANGE | RENDER_SMOOTH | RENDER_DEPTHWRITE;
 
-       g_QglTable.m_pfn_qglColor4f(1.0, 0.0, 0.0, 0.5f);
+    GlobalOpenGLStateLibrary().insert(g_state_solid, state);
 
-//     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);
+    m_shader_solid = GlobalShaderCache().capture(g_state_solid);
+    m_shader_wireframe = GlobalShaderCache().capture(g_state_wireframe);
+}
 
-//     g_QglTable.m_pfn_qglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-//     g_QglTable.m_pfn_qglShadeModel(GL_SMOOTH);
+void DVisDrawer::destroyShaders()
+{
+    GlobalShaderCache().release(g_state_solid);
+    GlobalShaderCache().release(g_state_wireframe);
+    GlobalOpenGLStateLibrary().erase(g_state_solid);
+    GlobalOpenGLStateLibrary().erase(g_state_wireframe);
+}
 
-       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);
+void DVisDrawer::render(RenderStateFlags state) const
+{
+    //bleh
+    std::list<DWinding *>::const_iterator l = m_list->begin();
 
-       g_QglTable.m_pfn_qglDepthFunc(GL_ALWAYS);
+    for (; l != m_list->end(); l++) {
+        DWinding *w = *l;
 
-       //bleh
-       list<DWinding *>::const_iterator l=m_list->begin();
+        glColor4f(w->clr[0], w->clr[1], w->clr[2], 0.5f);
 
-       for(; l != m_list->end(); l++)
-       {
-               DWinding* w = *l;
+        glBegin(GL_POLYGON);
+        for (int i = 0; i < w->numpoints; i++) {
+            glVertex3f((w->p[i])[0], (w->p[i])[1], (w->p[i])[2]);
+        }
+        glEnd();
+    }
+}
 
-               g_QglTable.m_pfn_qglColor4f(w->clr[0], w->clr[1], w->clr[2], 0.5f);
+void DVisDrawer::renderWireframe(Renderer &renderer, const VolumeTest &volume) const
+{
+    if (!m_list) {
+        return;
+    }
 
-               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();
-       }
+    renderer.SetState(m_shader_wireframe, Renderer::eWireframeOnly);
 
-       g_QglTable.m_pfn_qglPopAttrib();
+    renderer.addRenderable(*this, g_matrix4_identity);
 }
 
-void DVisDrawer::Register()
+void DVisDrawer::renderSolid(Renderer &renderer, const VolumeTest &volume) const
 {
-       g_QglTable.m_pfnHookGL2DWindow( this );
-       g_QglTable.m_pfnHookGL3DWindow( this );
-       m_bHooked = TRUE;
-}
+    if (!m_list) {
+        return;
+    }
 
-void DVisDrawer::UnRegister()
-{
-       g_QglTable.m_pfnUnHookGL2DWindow( this );
-       g_QglTable.m_pfnUnHookGL3DWindow( this );
-       m_bHooked = FALSE;
+    renderer.SetState(m_shader_solid, Renderer::eWireframeOnly);
+    renderer.SetState(m_shader_solid, Renderer::eFullMaterials);
+
+    renderer.addRenderable(*this, g_matrix4_identity);
 }
 
-void DVisDrawer::SetList(list<DWinding*> *pointList)
+void DVisDrawer::SetList(std::list<DWinding *> *pointList)
 {
-       if(m_list)
-               ClearPoints();
+    if (m_list) {
+        ClearPoints();
+    }
 
-       m_list = pointList;
+    m_list = pointList;
 }
 
 void DVisDrawer::ClearPoints()
 {
-  list<DWinding *>::const_iterator deadPoint=m_list->begin();
-       for(; deadPoint!=m_list->end(); deadPoint++)
-               delete *deadPoint;
-       m_list->clear();
+    std::list<DWinding *>::const_iterator deadPoint = m_list->begin();
+    for (; deadPoint != m_list->end(); deadPoint++) {
+        delete *deadPoint;
+    }
+    m_list->clear();
 }