/* 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 #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::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 *pointList) { if(m_list) ClearPoints(); m_list = pointList; } void DVisDrawer::ClearPoints() { std::list::const_iterator deadPoint=m_list->begin(); for(; deadPoint!=m_list->end(); deadPoint++) delete *deadPoint; m_list->clear(); }