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 #if !defined( INCLUDED_BRUSHNODE_H )
23 #define INCLUDED_BRUSHNODE_H
25 #include "instancelib.h"
27 #include "brushtokens.h"
31 public scene::Node::Symbiot,
32 public scene::Instantiable,
33 public scene::Cloneable {
35 NodeTypeCastTable m_casts;
39 NodeStaticCast<BrushNode, scene::Instantiable>::install(m_casts);
40 NodeStaticCast<BrushNode, scene::Cloneable>::install(m_casts);
41 NodeContainedCast<BrushNode, Snappable>::install(m_casts);
42 NodeContainedCast<BrushNode, TransformNode>::install(m_casts);
43 NodeContainedCast<BrushNode, Brush>::install(m_casts);
44 NodeContainedCast<BrushNode, XMLImporter>::install(m_casts);
45 NodeContainedCast<BrushNode, XMLExporter>::install(m_casts);
46 NodeContainedCast<BrushNode, MapImporter>::install(m_casts);
47 NodeContainedCast<BrushNode, MapExporter>::install(m_casts);
48 NodeContainedCast<BrushNode, Nameable>::install(m_casts);
49 NodeContainedCast<BrushNode, BrushDoom3>::install(m_casts);
52 NodeTypeCastTable &get()
60 InstanceSet m_instances;
62 BrushTokenImporter m_mapImporter;
63 BrushTokenExporter m_mapExporter;
64 BrushXMLImporter m_xmlImporter;
65 BrushXMLExporter m_xmlExporter;
69 typedef LazyStatic<TypeCasts> StaticTypeCasts;
71 Snappable &get(NullType<Snappable>)
76 TransformNode &get(NullType<TransformNode>)
81 Brush &get(NullType<Brush>)
86 XMLImporter &get(NullType<XMLImporter>)
91 XMLExporter &get(NullType<XMLExporter>)
96 MapImporter &get(NullType<MapImporter>)
101 MapExporter &get(NullType<MapExporter>)
103 return m_mapExporter;
106 Nameable &get(NullType<Nameable>)
111 BrushDoom3 &get(NullType<BrushDoom3>)
117 m_node(this, this, StaticTypeCasts::instance().get()),
118 m_brush(m_node, InstanceSetEvaluateTransform<BrushInstance>::Caller(m_instances),
119 InstanceSet::BoundsChangedCaller(m_instances)),
120 m_mapImporter(m_brush),
121 m_mapExporter(m_brush),
122 m_xmlImporter(m_brush),
123 m_xmlExporter(m_brush)
127 BrushNode(const BrushNode &other) :
128 scene::Node::Symbiot(other),
129 scene::Instantiable(other),
130 scene::Cloneable(other),
131 m_node(this, this, StaticTypeCasts::instance().get()),
132 m_brush(other.m_brush, m_node, InstanceSetEvaluateTransform<BrushInstance>::Caller(m_instances),
133 InstanceSet::BoundsChangedCaller(m_instances)),
134 m_mapImporter(m_brush),
135 m_mapExporter(m_brush),
136 m_xmlImporter(m_brush),
137 m_xmlExporter(m_brush)
151 scene::Node &clone() const
153 return (new BrushNode(*this))->node();
156 scene::Instance *create(const scene::Path &path, scene::Instance *parent)
158 return new BrushInstance(path, parent, m_brush);
161 void forEachInstance(const scene::Instantiable::Visitor &visitor)
163 m_instances.forEachInstance(visitor);
166 void insert(scene::Instantiable::Observer *observer, const scene::Path &path, scene::Instance *instance)
168 m_instances.insert(observer, path, instance);
171 scene::Instance *erase(scene::Instantiable::Observer *observer, const scene::Path &path)
173 return m_instances.erase(observer, path);
177 inline Brush *Node_getBrush(scene::Node &node)
179 return NodeTypeCast<Brush>::cast(node);