Panagiotis Christopoulos Charitos 14 лет назад
Родитель
Сommit
5bccdde5f8
4 измененных файлов с 136 добавлено и 58 удалено
  1. 2 2
      src/scene/Scene.cpp
  2. 20 54
      src/scene/Scene.h
  3. 112 0
      src/scene/Scene.inl.h
  4. 2 2
      src/script/scene/Scene.cpp

+ 2 - 2
src/scene/Scene.cpp

@@ -44,7 +44,7 @@ void Scene::registerNode(SceneNode* node)
 			putBackNode(lights, static_cast<Light*>(node));
 			break;
 		case SceneNode::SNT_CAMERA:
-			putBackNode(cameras, static_cast<Camera*>(node));
+			putBackNode(cams, static_cast<Camera*>(node));
 			break;
 		case SceneNode::SNT_PARTICLE_EMITTER_NODE:
 			putBackNode(particleEmitterNodes,
@@ -76,7 +76,7 @@ void Scene::unregisterNode(SceneNode* node)
 			eraseNode(lights, static_cast<Light*>(node));
 			break;
 		case SceneNode::SNT_CAMERA:
-			eraseNode(cameras, static_cast<Camera*>(node));
+			eraseNode(cams, static_cast<Camera*>(node));
 			break;
 		case SceneNode::SNT_PARTICLE_EMITTER_NODE:
 			eraseNode(particleEmitterNodes,

+ 20 - 54
src/scene/Scene.h

@@ -1,10 +1,11 @@
 #ifndef SCENE_H
 #define SCENE_H
 
-#include <boost/scoped_ptr.hpp>
 #include "phys/PhysWorld.h"
 #include "util/Assert.h"
 #include "VisibilityTester.h"
+#include <boost/scoped_ptr.hpp>
+#include <boost/range/iterator_range.hpp>
 
 
 class SceneNode;
@@ -21,13 +22,15 @@ class Scene
 {
 	public:
 		/// Typetraits
-		template<typename Type>
+		template<typename T>
 		class Types
 		{
 			public:
-				typedef Vec<Type*> Container;
+				typedef Vec<T*> Container;
 				typedef typename Container::iterator Iterator;
 				typedef typename Container::const_iterator ConstIterator;
+				typedef boost::iterator_range<Iterator> MutableRange;
+				typedef boost::iterator_range<ConstIterator> ConstRange;
 		};
 
 		enum
@@ -59,27 +62,23 @@ class Scene
 
 		const VisibilityTester& getVisibilityTester() const;
 
-		const Types<SceneNode>::Container& getAllNodes() const {return nodes;}
-		Types<SceneNode>::Container& getAllNodes() {return nodes;}
+		Types<SceneNode>::ConstRange getAllNodes() const;
+		Types<SceneNode>::MutableRange getAllNodes();
 
-		const Types<Light>::Container& getLights() const {return lights;}
-		Types<Light>::Container& getLights() {return lights;}
+		Types<Light>::ConstRange getLights() const;
+		Types<Light>::MutableRange getLights();
 
-		const Types<Camera>::Container& getCameras() const {return cameras;}
-		Types<Camera>::Container& getCameras() {return cameras;}
+		Types<Camera>::ConstRange getCameras() const;
+		Types<Camera>::MutableRange getCameras();
 
-		const Types<ParticleEmitterNode>::Container& getParticleEmitterNodes()
-			const {return particleEmitterNodes;}
-		Types<ParticleEmitterNode>::Container& getParticleEmitterNodes()
-			{return particleEmitterNodes;}
+		Types<ParticleEmitterNode>::ConstRange getParticleEmitterNodes() const;
+		Types<ParticleEmitterNode>::MutableRange getParticleEmitterNodes();
 
-		const Types<ModelNode>::Container& getModelNodes() const
-			{return modelNodes;}
-		Types<ModelNode>::Container& getModelNodes() {return modelNodes;}
+		Types<ModelNode>::ConstRange getModelNodes() const;
+		Types<ModelNode>::MutableRange getModelNodes();
 
-		const Types<SkinNode>::Container& getSkinNodes() const
-			{return skinNodes;}
-		Types<SkinNode>::Container& getSkinNodes() {return skinNodes;}
+		Types<SkinNode>::ConstRange getSkinNodes() const;
+		Types<SkinNode>::MutableRange getSkinNodes();
 
 		const Types<Controller>::Container& getControllers() const
 			{return controllers;}
@@ -91,7 +90,7 @@ class Scene
 		/// @{
 		Types<SceneNode>::Container nodes;
 		Types<Light>::Container lights;
-		Types<Camera>::Container cameras;
+		Types<Camera>::Container cams;
 		Types<ParticleEmitterNode>::Container particleEmitterNodes;
 		Types<ModelNode>::Container modelNodes;
 		Types<SkinNode>::Container skinNodes;
@@ -113,40 +112,7 @@ class Scene
 };
 
 
-template<typename ContainerType, typename Type>
-inline void Scene::putBackNode(ContainerType& container, Type* x)
-{
-	ASSERT(std::find(container.begin(), container.end(), x) == container.end());
-	container.push_back(x);
-}
-
-
-template<typename ContainerType, typename Type>
-inline void Scene::eraseNode(ContainerType& container, Type* x)
-{
-	typename ContainerType::iterator it =
-		std::find(container.begin(), container.end(), x);
-	ASSERT(it != container.end());
-	container.erase(it);
-}
-
-
-inline PhysWorld& Scene::getPhysPhysWorld()
-{
-	return *physPhysWorld;
-}
-
-
-inline const PhysWorld& Scene::getPhysPhysWorld() const
-{
-	return *physPhysWorld;
-}
-
-
-inline const VisibilityTester& Scene::getVisibilityTester() const
-{
-	return *visibilityTester;
-}
+#include "Scene.inl.h"
 
 
 #endif

+ 112 - 0
src/scene/Scene.inl.h

@@ -0,0 +1,112 @@
+template<typename ContainerType, typename Type>
+inline void Scene::putBackNode(ContainerType& container, Type* x)
+{
+	ASSERT(std::find(container.begin(), container.end(), x) == container.end());
+	container.push_back(x);
+}
+
+
+template<typename ContainerType, typename Type>
+inline void Scene::eraseNode(ContainerType& container, Type* x)
+{
+	typename ContainerType::iterator it =
+		std::find(container.begin(), container.end(), x);
+	ASSERT(it != container.end());
+	container.erase(it);
+}
+
+
+inline PhysWorld& Scene::getPhysPhysWorld()
+{
+	return *physPhysWorld;
+}
+
+
+inline const PhysWorld& Scene::getPhysPhysWorld() const
+{
+	return *physPhysWorld;
+}
+
+
+inline const VisibilityTester& Scene::getVisibilityTester() const
+{
+	return *visibilityTester;
+}
+
+
+inline Scene::Types<SceneNode>::ConstRange Scene::getAllNodes() const
+{
+	return Types<SceneNode>::ConstRange(nodes.begin(), nodes.end());
+}
+
+
+inline Scene::Types<SceneNode>::MutableRange Scene::getAllNodes()
+{
+	return Types<SceneNode>::MutableRange(nodes.begin(), nodes.end());
+}
+
+
+inline Scene::Types<Light>::ConstRange Scene::getLights() const
+{
+	return Types<Light>::ConstRange(lights.begin(), lights.end());
+}
+
+
+inline Scene::Types<Light>::MutableRange Scene::getLights()
+{
+	return Types<Light>::MutableRange(lights.begin(), lights.end());
+}
+
+
+inline Scene::Types<Camera>::ConstRange Scene::getCameras() const
+{
+	return Types<Camera>::ConstRange(cams.begin(), cams.end());
+}
+
+
+inline Scene::Types<Camera>::MutableRange Scene::getCameras()
+{
+	return Types<Camera>::MutableRange(cams.begin(), cams.end());
+}
+
+
+inline Scene::Types<ParticleEmitterNode>::ConstRange
+	Scene::getParticleEmitterNodes() const
+{
+	return Types<ParticleEmitterNode>::ConstRange(
+		particleEmitterNodes.begin(),
+		particleEmitterNodes.end());
+}
+
+
+inline Scene::Types<ParticleEmitterNode>::MutableRange
+	Scene::getParticleEmitterNodes()
+{
+	return Types<ParticleEmitterNode>::MutableRange(
+		particleEmitterNodes.begin(),
+		particleEmitterNodes.end());
+}
+
+
+inline Scene::Types<ModelNode>::ConstRange Scene::getModelNodes() const
+{
+	return Types<ModelNode>::ConstRange(modelNodes.begin(), modelNodes.end());
+}
+
+
+inline Scene::Types<ModelNode>::MutableRange Scene::getModelNodes()
+{
+	return Types<ModelNode>::MutableRange(modelNodes.begin(), modelNodes.end());
+}
+
+
+inline Scene::Types<SkinNode>::ConstRange Scene::getSkinNodes() const
+{
+	return Types<SkinNode>::ConstRange(skinNodes.begin(), skinNodes.end());
+}
+
+
+inline Scene::Types<SkinNode>::MutableRange Scene::getSkinNodes()
+{
+	return Types<SkinNode>::MutableRange(skinNodes.begin(), skinNodes.end());
+}

+ 2 - 2
src/script/scene/Scene.cpp

@@ -15,12 +15,12 @@ WRAP(Scene)
 			Scene::getAmbientColor),
 			return_value_policy<reference_existing_object>())
 
-		.def("getCameras", (Scene::Types<Camera>::Container& (Scene::*)())(&
+		/*.def("getCameras", (Scene::Types<Camera>::Container& (Scene::*)())(&
 			Scene::getCameras),
 			return_value_policy<reference_existing_object>())
 
 		.def("getModelNodes", (Scene::Types<ModelNode>::Container&
 			(Scene::*)())(&Scene::getModelNodes),
-			return_value_policy<reference_existing_object>())
+			return_value_policy<reference_existing_object>())*/
 	;
 }