-/*\r
-BobToolz plugin for GtkRadiant\r
-Copyright (C) 2001 Gordon Biggans\r
-\r
-This library is free software; you can redistribute it and/or\r
-modify it under the terms of the GNU Lesser General Public\r
-License as published by the Free Software Foundation; either\r
-version 2.1 of the License, or (at your option) any later version.\r
-\r
-This library is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
-Lesser General Public License for more details.\r
-\r
-You should have received a copy of the GNU Lesser General Public\r
-License along with this library; if not, write to the Free Software\r
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
-*/\r
-\r
-// BobView.cpp: implementation of the DVisDrawer class.\r
-//\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-#include "StdAfx.h"\r
-#include "DPoint.h"\r
-#include "DVisDrawer.h"\r
-#include "misc.h"\r
-#include "funchandlers.h"\r
-\r
-//////////////////////////////////////////////////////////////////////\r
-// Construction/Destruction\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-DVisDrawer::DVisDrawer()\r
-{\r
- refCount = 1;\r
- m_bHooked = FALSE;\r
- m_list = NULL;\r
-}\r
-\r
-DVisDrawer::~DVisDrawer()\r
-{\r
- if(m_bHooked)\r
- UnRegister();\r
-\r
- g_VisView = NULL;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////\r
-// Implementation\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-void DVisDrawer::Draw2D(VIEWTYPE vt)\r
-{\r
- if(!m_list)\r
- return;\r
-\r
- g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);\r
-\r
- g_QglTable.m_pfn_qglDisable(GL_BLEND);\r
- g_QglTable.m_pfn_qglDisable(GL_LINE_SMOOTH);\r
-\r
- g_QglTable.m_pfn_qglPushMatrix();\r
- \r
- switch(vt)\r
- {\r
- case XY:\r
- break;\r
- case XZ:\r
- g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);\r
- break;\r
- case YZ:\r
- g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);\r
- g_QglTable.m_pfn_qglRotatef(270.0f, 0.0f, 0.0f, 1.0f);\r
- break;\r
- }\r
-\r
- g_QglTable.m_pfn_qglLineWidth(1.0f);\r
- g_QglTable.m_pfn_qglColor4f(1.0f, 0.0f, 0.0f, 0.5f);\r
-\r
- g_QglTable.m_pfn_qglEnable(GL_BLEND);\r
- g_QglTable.m_pfn_qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r
- g_QglTable.m_pfn_qglDisable(GL_POLYGON_SMOOTH);\r
-\r
- g_QglTable.m_pfn_qglDepthFunc(GL_ALWAYS);\r
-\r
- //bleh\r
- list<DWinding *>::const_iterator l=m_list->begin();\r
-\r
- for(; l != m_list->end(); l++)\r
- {\r
- DWinding* w = *l;\r
-\r
- g_QglTable.m_pfn_qglColor4f(w->clr[0], w->clr[1], w->clr[2], 0.5f);\r
-\r
- g_QglTable.m_pfn_qglBegin(GL_POLYGON);\r
- for(int i = 0; i < w->numpoints; i++) {\r
- g_QglTable.m_pfn_qglVertex3f((w->p[i])[0], (w->p[i])[1], (w->p[i])[2]);\r
- }\r
- g_QglTable.m_pfn_qglEnd();\r
- }\r
-\r
- \r
- g_QglTable.m_pfn_qglPopMatrix();\r
-\r
- g_QglTable.m_pfn_qglPopAttrib();\r
-}\r
-\r
-void DVisDrawer::Draw3D()\r
-{\r
- if(!m_list)\r
- return;\r
-\r
- g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);\r
-\r
- g_QglTable.m_pfn_qglColor4f(1.0, 0.0, 0.0, 0.5f);\r
-\r
-// g_QglTable.m_pfn_qglHint(GL_FOG_HINT, GL_NICEST);\r
- \r
-// g_QglTable.m_pfn_qglDisable(GL_CULL_FACE);\r
- g_QglTable.m_pfn_qglDisable(GL_LINE_SMOOTH);\r
-\r
-// g_QglTable.m_pfn_qglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
-// g_QglTable.m_pfn_qglShadeModel(GL_SMOOTH);\r
-\r
- g_QglTable.m_pfn_qglEnable(GL_BLEND);\r
- g_QglTable.m_pfn_qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r
- g_QglTable.m_pfn_qglDisable(GL_POLYGON_SMOOTH);\r
-\r
- g_QglTable.m_pfn_qglDepthFunc(GL_ALWAYS);\r
-\r
- //bleh\r
- list<DWinding *>::const_iterator l=m_list->begin();\r
-\r
- for(; l != m_list->end(); l++)\r
- {\r
- DWinding* w = *l;\r
-\r
- g_QglTable.m_pfn_qglColor4f(w->clr[0], w->clr[1], w->clr[2], 0.5f);\r
-\r
- g_QglTable.m_pfn_qglBegin(GL_POLYGON);\r
- for(int i = 0; i < w->numpoints; i++) {\r
- g_QglTable.m_pfn_qglVertex3f((w->p[i])[0], (w->p[i])[1], (w->p[i])[2]);\r
- }\r
- g_QglTable.m_pfn_qglEnd();\r
- }\r
-\r
- g_QglTable.m_pfn_qglPopAttrib();\r
-}\r
-\r
-void DVisDrawer::Register()\r
-{\r
- g_QglTable.m_pfnHookGL2DWindow( this );\r
- g_QglTable.m_pfnHookGL3DWindow( this );\r
- m_bHooked = TRUE;\r
-}\r
-\r
-void DVisDrawer::UnRegister()\r
-{\r
- g_QglTable.m_pfnUnHookGL2DWindow( this );\r
- g_QglTable.m_pfnUnHookGL3DWindow( this );\r
- m_bHooked = FALSE;\r
-}\r
-\r
-void DVisDrawer::SetList(std::list<DWinding*> *pointList)\r
-{\r
- if(m_list)\r
- ClearPoints();\r
-\r
- m_list = pointList;\r
-}\r
-\r
-void DVisDrawer::ClearPoints()\r
-{\r
- list<DWinding *>::const_iterator deadPoint=m_list->begin();\r
- for(; deadPoint!=m_list->end(); deadPoint++)\r
- delete *deadPoint;\r
- m_list->clear();\r
-}\r
+/*
+ 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 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
+ */
+
+// BobView.cpp: implementation of the DVisDrawer class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#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"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+DVisDrawer::DVisDrawer(){
+ m_list = NULL;
+
+ constructShaders();
+ GlobalShaderCache().attachRenderable( *this );
+}
+
+DVisDrawer::~DVisDrawer(){
+ GlobalShaderCache().detachRenderable( *this );
+ destroyShaders();
+
+ g_VisView = NULL;
+}
+
+//////////////////////////////////////////////////////////////////////
+// Implementation
+//////////////////////////////////////////////////////////////////////
+const char* g_state_solid = "$bobtoolz/visdrawer/solid";
+const char* g_state_wireframe = "$bobtoolz/visdrawer/wireframe";
+
+void DVisDrawer::constructShaders(){
+ OpenGLState state;
+ GlobalOpenGLStateLibrary().getDefaultState( state );
+ state.m_state = RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_COLOURCHANGE;
+ state.m_linewidth = 1;
+
+ GlobalOpenGLStateLibrary().insert( g_state_wireframe, state );
+
+ GlobalOpenGLStateLibrary().getDefaultState( state );
+ state.m_state = RENDER_FILL | RENDER_BLEND | RENDER_COLOURWRITE | RENDER_COLOURCHANGE | RENDER_SMOOTH | RENDER_DEPTHWRITE;
+
+ GlobalOpenGLStateLibrary().insert( g_state_solid, state );
+
+ m_shader_solid = GlobalShaderCache().capture( g_state_solid );
+ m_shader_wireframe = GlobalShaderCache().capture( g_state_wireframe );
+}
+
+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
+ std::list<DWinding *>::const_iterator l = m_list->begin();
+
+ for (; l != m_list->end(); l++ )
+ {
+ DWinding* w = *l;
+
+ glColor4f( w->clr[0], w->clr[1], w->clr[2], 0.5f );
+
+ 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();
+ }
+}
+
+void DVisDrawer::renderWireframe( Renderer& renderer, const VolumeTest& volume ) const {
+ if ( !m_list ) {
+ return;
+ }
+
+ renderer.SetState( m_shader_wireframe, Renderer::eWireframeOnly );
+
+ renderer.addRenderable( *this, g_matrix4_identity );
+}
+
+void DVisDrawer::renderSolid( Renderer& renderer, const VolumeTest& volume ) const {
+ if ( !m_list ) {
+ return;
+ }
+
+ renderer.SetState( m_shader_solid, Renderer::eWireframeOnly );
+ renderer.SetState( m_shader_solid, Renderer::eFullMaterials );
+
+ renderer.addRenderable( *this, g_matrix4_identity );
+}
+
+void DVisDrawer::SetList( std::list<DWinding*> *pointList ){
+ if ( m_list ) {
+ ClearPoints();
+ }
+
+ m_list = pointList;
+}
+
+void DVisDrawer::ClearPoints(){
+ std::list<DWinding *>::const_iterator deadPoint = m_list->begin();
+ for (; deadPoint != m_list->end(); deadPoint++ )
+ delete *deadPoint;
+ m_list->clear();
+}