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"
47 RenderableSolidAABB m_aabb_solid;
48 RenderableWireframeAABB m_aabb_wire;
50 NullModel() : m_aabb_local(Vector3(0, 0, 0), Vector3(8, 8, 8)), m_aabb_solid(m_aabb_local),
51 m_aabb_wire(m_aabb_local)
53 m_state = GlobalShaderCache().capture("");
58 GlobalShaderCache().release("");
61 VolumeIntersectionValue intersectVolume(const VolumeTest &volume, const Matrix4 &localToWorld) const
63 return volume.TestAABB(m_aabb_local, localToWorld);
66 const AABB &localAABB() const
71 void renderSolid(Renderer &renderer, const VolumeTest &volume, const Matrix4 &localToWorld) const
73 renderer.SetState(m_state, Renderer::eFullMaterials);
74 renderer.addRenderable(m_aabb_solid, localToWorld);
77 void renderWireframe(Renderer &renderer, const VolumeTest &volume, const Matrix4 &localToWorld) const
79 renderer.addRenderable(m_aabb_wire, localToWorld);
82 void testSelect(Selector &selector, SelectionTest &test, const Matrix4 &localToWorld)
84 test.BeginMesh(localToWorld);
86 SelectionIntersection best;
87 aabb_testselect(m_aabb_local, test, best);
89 selector.addIntersection(best);
94 class NullModelInstance : public scene::Instance, public Renderable, public SelectionTestable {
96 InstanceTypeCastTable m_casts;
100 InstanceContainedCast<NullModelInstance, Bounded>::install(m_casts);
101 InstanceContainedCast<NullModelInstance, Cullable>::install(m_casts);
102 InstanceStaticCast<NullModelInstance, Renderable>::install(m_casts);
103 InstanceStaticCast<NullModelInstance, SelectionTestable>::install(m_casts);
106 InstanceTypeCastTable &get()
112 NullModel &m_nullmodel;
115 typedef LazyStatic<TypeCasts> StaticTypeCasts;
117 Bounded &get(NullType<Bounded>)
122 Cullable &get(NullType<Cullable>)
127 NullModelInstance(const scene::Path &path, scene::Instance *parent, NullModel &nullmodel) :
128 Instance(path, parent, this, StaticTypeCasts::instance().get()),
129 m_nullmodel(nullmodel)
133 void renderSolid(Renderer &renderer, const VolumeTest &volume) const
135 m_nullmodel.renderSolid(renderer, volume, Instance::localToWorld());
138 void renderWireframe(Renderer &renderer, const VolumeTest &volume) const
140 m_nullmodel.renderWireframe(renderer, volume, Instance::localToWorld());
143 void testSelect(Selector &selector, SelectionTest &test)
145 m_nullmodel.testSelect(selector, test, Instance::localToWorld());
149 class NullModelNode : public scene::Node::Symbiot, public scene::Instantiable {
151 NodeTypeCastTable m_casts;
155 NodeStaticCast<NullModelNode, scene::Instantiable>::install(m_casts);
158 NodeTypeCastTable &get()
166 InstanceSet m_instances;
167 NullModel m_nullmodel;
170 typedef LazyStatic<TypeCasts> StaticTypeCasts;
172 NullModelNode() : m_node(this, this, StaticTypeCasts::instance().get())
174 m_node.m_isRoot = true;
187 scene::Instance *create(const scene::Path &path, scene::Instance *parent)
189 return new NullModelInstance(path, parent, m_nullmodel);
192 void forEachInstance(const scene::Instantiable::Visitor &visitor)
194 m_instances.forEachInstance(visitor);
197 void insert(scene::Instantiable::Observer *observer, const scene::Path &path, scene::Instance *instance)
199 m_instances.insert(observer, path, instance);
202 scene::Instance *erase(scene::Instantiable::Observer *observer, const scene::Path &path)
204 return m_instances.erase(observer, path);
208 NodeSmartReference NewNullModel()
210 return NodeSmartReference((new NullModelNode)->node());
213 void NullModel_construct()
217 void NullModel_destroy()