2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "nullmodel.h"
24 #include "debugging/debugging.h"
26 #include "iscenegraph.h"
28 #include "iselection.h"
31 #include "ireference.h"
34 #include "renderable.h"
35 #include "selectable.h"
37 #include "math/frustum.h"
39 #include "instancelib.h"
40 #include "entitylib.h"
48 RenderableSolidAABB m_aabb_solid;
49 RenderableWireframeAABB m_aabb_wire;
51 NullModel() : m_aabb_local(Vector3(0, 0, 0), Vector3(8, 8, 8)), m_aabb_solid(m_aabb_local), m_aabb_wire(m_aabb_local)
53 m_state = GlobalShaderCache().capture("");
57 GlobalShaderCache().release("");
60 VolumeIntersectionValue intersectVolume(const VolumeTest& volume, const Matrix4& localToWorld) const
62 return volume.TestAABB(m_aabb_local, localToWorld);
65 const AABB& localAABB() const
70 void renderSolid(Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld) const
72 renderer.SetState(m_state, Renderer::eFullMaterials);
73 renderer.addRenderable(m_aabb_solid, localToWorld);
75 void renderWireframe(Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld) const
77 renderer.addRenderable(m_aabb_wire, localToWorld);
80 void testSelect(Selector& selector, SelectionTest& test, const Matrix4& localToWorld)
82 test.BeginMesh(localToWorld);
84 SelectionIntersection best;
85 aabb_testselect(m_aabb_local, test, best);
88 selector.addIntersection(best);
93 class NullModelInstance : public scene::Instance, public Renderable, public SelectionTestable
97 InstanceTypeCastTable m_casts;
101 InstanceContainedCast<NullModelInstance, Bounded>::install(m_casts);
102 InstanceContainedCast<NullModelInstance, Cullable>::install(m_casts);
103 InstanceStaticCast<NullModelInstance, Renderable>::install(m_casts);
104 InstanceStaticCast<NullModelInstance, SelectionTestable>::install(m_casts);
106 InstanceTypeCastTable& get()
112 NullModel& m_nullmodel;
115 typedef LazyStatic<TypeCasts> StaticTypeCasts;
117 Bounded& get(NullType<Bounded>)
121 Cullable& get(NullType<Cullable>)
126 NullModelInstance(const scene::Path& path, scene::Instance* parent, NullModel& nullmodel) :
127 Instance(path, parent, this, StaticTypeCasts::instance().get()),
128 m_nullmodel(nullmodel)
132 void renderSolid(Renderer& renderer, const VolumeTest& volume) const
134 m_nullmodel.renderSolid(renderer, volume, Instance::localToWorld());
136 void renderWireframe(Renderer& renderer, const VolumeTest& volume) const
138 m_nullmodel.renderWireframe(renderer, volume, Instance::localToWorld());
141 void testSelect(Selector& selector, SelectionTest& test)
143 m_nullmodel.testSelect(selector, test, Instance::localToWorld());
147 class NullModelNode : public scene::Node::Symbiot, public scene::Instantiable
151 NodeTypeCastTable m_casts;
155 NodeStaticCast<NullModelNode, scene::Instantiable>::install(m_casts);
157 NodeTypeCastTable& get()
165 InstanceSet m_instances;
166 NullModel m_nullmodel;
169 typedef LazyStatic<TypeCasts> StaticTypeCasts;
171 NullModelNode() : m_node(this, this, StaticTypeCasts::instance().get())
173 m_node.m_isRoot = true;
185 scene::Instance* create(const scene::Path& path, scene::Instance* parent)
187 return new NullModelInstance(path, parent, m_nullmodel);
189 void forEachInstance(const scene::Instantiable::Visitor& visitor)
191 m_instances.forEachInstance(visitor);
193 void insert(scene::Instantiable::Observer* observer, const scene::Path& path, scene::Instance* instance)
195 m_instances.insert(observer, path, instance);
197 scene::Instance* erase(scene::Instantiable::Observer* observer, const scene::Path& path)
199 return m_instances.erase(observer, path);
203 NodeSmartReference NewNullModel()
205 return NodeSmartReference((new NullModelNode)->node());
208 void NullModel_construct()
211 void NullModel_destroy()