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
37 NodeTypeCastTable m_casts;
41 NodeStaticCast<BrushNode, scene::Instantiable>::install(m_casts);
42 NodeStaticCast<BrushNode, scene::Cloneable>::install(m_casts);
43 NodeContainedCast<BrushNode, Snappable>::install(m_casts);
44 NodeContainedCast<BrushNode, TransformNode>::install(m_casts);
45 NodeContainedCast<BrushNode, Brush>::install(m_casts);
46 NodeContainedCast<BrushNode, XMLImporter>::install(m_casts);
47 NodeContainedCast<BrushNode, XMLExporter>::install(m_casts);
48 NodeContainedCast<BrushNode, MapImporter>::install(m_casts);
49 NodeContainedCast<BrushNode, MapExporter>::install(m_casts);
50 NodeContainedCast<BrushNode, Nameable>::install(m_casts);
51 NodeContainedCast<BrushNode, BrushDoom3>::install(m_casts);
53 NodeTypeCastTable& get()
61 InstanceSet m_instances;
63 BrushTokenImporter m_mapImporter;
64 BrushTokenExporter m_mapExporter;
65 BrushXMLImporter m_xmlImporter;
66 BrushXMLExporter m_xmlExporter;
70 typedef LazyStatic<TypeCasts> StaticTypeCasts;
72 Snappable& get(NullType<Snappable>)
76 TransformNode& get(NullType<TransformNode>)
80 Brush& get(NullType<Brush>)
84 XMLImporter& get(NullType<XMLImporter>)
88 XMLExporter& get(NullType<XMLExporter>)
92 MapImporter& get(NullType<MapImporter>)
96 MapExporter& get(NullType<MapExporter>)
100 Nameable& get(NullType<Nameable>)
104 BrushDoom3& get(NullType<BrushDoom3>)
110 m_node(this, this, StaticTypeCasts::instance().get()),
111 m_brush(m_node, InstanceSetEvaluateTransform<BrushInstance>::Caller(m_instances), InstanceSet::BoundsChangedCaller(m_instances)),
112 m_mapImporter(m_brush),
113 m_mapExporter(m_brush),
114 m_xmlImporter(m_brush),
115 m_xmlExporter(m_brush)
118 BrushNode(const BrushNode& other) :
119 scene::Node::Symbiot(other),
120 scene::Instantiable(other),
121 scene::Cloneable(other),
122 m_node(this, this, StaticTypeCasts::instance().get()),
123 m_brush(other.m_brush, m_node, InstanceSetEvaluateTransform<BrushInstance>::Caller(m_instances), InstanceSet::BoundsChangedCaller(m_instances)),
124 m_mapImporter(m_brush),
125 m_mapExporter(m_brush),
126 m_xmlImporter(m_brush),
127 m_xmlExporter(m_brush)
139 scene::Node& clone() const
141 return (new BrushNode(*this))->node();
144 scene::Instance* create(const scene::Path& path, scene::Instance* parent)
146 return new BrushInstance(path, parent, m_brush);
148 void forEachInstance(const scene::Instantiable::Visitor& visitor)
150 m_instances.forEachInstance(visitor);
152 void insert(scene::Instantiable::Observer* observer, const scene::Path& path, scene::Instance* instance)
154 m_instances.insert(observer, path, instance);
156 scene::Instance* erase(scene::Instantiable::Observer* observer, const scene::Path& path)
158 return m_instances.erase(observer, path);
162 inline Brush* Node_getBrush(scene::Node& node)
164 return NodeTypeCast<Brush>::cast(node);