Panagiotis Christopoulos Charitos před 14 roky
rodič
revize
c6bc623231

+ 14 - 27
anki/renderer/SceneDbgDrawer.cpp

@@ -1,52 +1,41 @@
 #include "anki/renderer/SceneDbgDrawer.h"
 #include "anki/renderer/Dbg.h"
-#include "anki/scene/Camera.h"
-#include "anki/scene/Light.h"
-#include "anki/scene/ParticleEmitterNode.h"
-#include "anki/scene/SkinNode.h"
-#include "anki/scene/PerspectiveCamera.h"
-#include "anki/scene/OrthographicCamera.h"
 #include "anki/scene/Octree.h"
+#include "anki/scene/Frustumable.h"
+#include "anki/scene/Spatial.h"
 
 
 namespace anki {
 
 
 //==============================================================================
-void SceneDbgDrawer::drawCamera(const Camera& cam) const
+void SceneDbgDrawer::draw(const Frustumable& fr, Dbg& dbg) const
 {
-	switch(cam.getCameraType())
+	const Frustum& fs = fr.getFrustum();
+
+	switch(fs.getFrustumType())
 	{
-		case Camera::CT_PERSPECTIVE:
-		{
-			const PerspectiveCamera& pcam =
-				static_cast<const PerspectiveCamera&>(cam);
-			drawPerspectiveCamera(pcam);
+		case Frustum::FT_PERSPECTIVE:
+			draw(static_cast<const PerspectiveFrustum&>(fs), dbg);
 			break;
-		}
 
-		case Camera::CT_ORTHOGRAPHIC:
-		{
-			const OrthographicCamera& ocam =
-				static_cast<const OrthographicCamera&>(cam);
-			drawOrthographicCamera(ocam);
+		case Frustum::FT_ORTHOGRAPHIC:
+			draw(static_cast<const OrthographicFrustum&>(fs), dbg);
 			break;
-		}
 
 		default:
-			ANKI_ASSERT(false && "WTF?");
+			ANKI_ASSERT(0 && "WTF?");
 			break;
 	}
 }
 
 
 //==============================================================================
-void SceneDbgDrawer::drawPerspectiveCamera(const PerspectiveCamera& cam) const
+void SceneDbgDrawer::draw(const PerspectiveFrustum& pf, Dbg& dbg) const
 {
 	dbg.setColor(Vec4(1.0, 0.0, 1.0, 1.0));
-	dbg.setModelMat(Mat4(cam.getWorldTransform()));
 
-	const float camLen = 1.0;
+	float camLen = pf.getFar();
 	float tmp0 = camLen / tan((Math::PI - cam.getFovX()) * 0.5) + 0.001;
 	float tmp1 = camLen * tan(cam.getFovY() * 0.5) + 0.001;
 
@@ -70,11 +59,9 @@ void SceneDbgDrawer::drawPerspectiveCamera(const PerspectiveCamera& cam) const
 
 
 //==============================================================================
-void SceneDbgDrawer::drawOrthographicCamera(
-	const OrthographicCamera& ocam) const
+void SceneDbgDrawer::draw(const OrthographicFrustum& of) const
 {
 	dbg.setColor(Vec4(0.0, 1.0, 0.0, 1.0));
-	dbg.setModelMat(Mat4(ocam.getWorldTransform()));
 
 	float left = ocam.getLeft();
 	float right = ocam.getRight();

+ 11 - 31
anki/renderer/SceneDbgDrawer.h

@@ -7,12 +7,8 @@
 namespace anki {
 
 
-class Camera;
-class Light;
-class ParticleEmitterNode;
-class SkinNode;
-class PerspectiveCamera;
-class OrthographicCamera;
+class Frustumable;
+class Spatial;
 class Octree;
 class OctreeNode;
 
@@ -22,35 +18,19 @@ class Dbg;
 /// This is a drawer for some scene nodes that need debug
 class SceneDbgDrawer
 {
-	public:
-		/// Constructor
-		SceneDbgDrawer(Dbg& dbg_)
-		:	dbg(dbg_)
-		{}
+public:
+	virtual void draw(const Frustumable& fr, Dbg& dbg) const;
 
-		/// Draw a Camera
-		virtual void drawCamera(const Camera& cam) const;
+	virtual void draw(const Spatial& sp, Dbg& dbg) const;
 
-		/// Draw a Light
-		virtual void drawLight(const Light& light) const;
+	virtual void draw(const Octree& octree, Dbg& dbg) const;
 
-		/// Draw a ParticleEmitterNode
-		virtual void drawParticleEmitter(const ParticleEmitterNode& pe) const;
+	virtual void draw(const OctreeNode& octnode,
+		uint depth, const Octree& octree, Dbg& dbg) const;
 
-		/// Draw a skeleton
-		virtual void drawSkinNodeSkeleton(const SkinNode& pe) const;
-
-		virtual void drawOctree(const Octree& octree) const;
-
-		virtual void drawOctreeNode(const OctreeNode& octnode,
-			uint depth, const Octree& octree) const;
-
-	private:
-		Dbg& dbg; ///< The debug stage
-
-		virtual void drawPerspectiveCamera(const PerspectiveCamera& cam) const;
-		virtual void drawOrthographicCamera(
-			const OrthographicCamera& cam) const;
+private:
+	virtual void draw(const PerspectiveFrustum& cam, Dbg& dbg) const;
+	virtual void draw(const OrthographicFrustum& cam, Dbg& dbg) const;
 };
 
 

+ 4 - 3
anki/scene/Light.cpp

@@ -62,12 +62,13 @@ SpotLight::SpotLight(const char* fmtl,
 	Property<float>& prop = pbase.upCast<Property<float> >();
 	ANKI_CONNECT(&prop, valueChanged, this, updateZFar);
 
-	Property<float>* angProp = new  ReadWriteProperty("angle", 45.0);
+	float dfltAng = 45.0;
+	ReadWriteProperty<float>* angProp =
+		new ReadWriteProperty<float>("angle", dfltAng);
 	addNewProperty(angProp);
 	ANKI_CONNECT(angProp, valueChanged, this, updateFov);
 
-	frustum.setAll(angProg->getValue(), angProg->getValue(), 0.1,
-		prop.getValue());
+	frustum.setAll(dfltAng, dfltAng, 0.1, prop.getValue());
 }
 
 

+ 1 - 1
anki/scene/Light.h

@@ -188,7 +188,7 @@ private:
 
 	void updateZFar(const float& f)
 	{
-		frustum.setZFar(r);
+		frustum.setFar(f);
 	}
 	ANKI_SLOT(updateZFar, const float&)
 

+ 4 - 0
anki/scene/Renderable.h

@@ -12,6 +12,7 @@ namespace anki {
 class ModelPatchBase;
 class Material;
 class MaterialVariable;
+class Light;
 
 
 /// @addtogroup Scene
@@ -67,6 +68,9 @@ public:
 		: flags(RF_NONE)
 	{}
 
+	virtual ~Renderable()
+	{}
+
 	/// Access to VAOs
 	virtual const ModelPatchBase& getModelPatchBase() const = 0;
 

+ 9 - 0
anki/scene/Scene.cpp

@@ -1,4 +1,5 @@
 #include "anki/scene/Scene.h"
+#include "anki/scene/Camera.h"
 #include "anki/util/Exception.h"
 #include "anki/scene/VisibilityTester.h"
 
@@ -44,4 +45,12 @@ void Scene::update(float prevUpdateTime, float crntTime, int frame)
 }
 
 
+//==============================================================================
+void Scene::doVisibilityTests(Camera& cam)
+{
+	Frustumable& f = cam;
+	vtester.test(f, *this, vinfo);
+}
+
+
 } // end namespace

+ 3 - 4
anki/scene/Scene.h

@@ -65,16 +65,15 @@ public:
 
 	void update(float prevUpdateTime, float crntTime, int frame);
 
-	/*void doVisibilityTests(Camera& cam)
-	{
-		//XXX visibilityTester->test(cam);
-	}*/
+	void doVisibilityTests(Camera& cam);
 
 private:
 	Types<SceneNode>::Container nodes;
 	Types<SceneNode>::NameToItemMap nameToNode;
 	Vec3 ambientCol; ///< The global ambient color
 	Camera* mainCam;
+	VisibilityTester vtester;
+	VisibilityInfo vinfo;
 
 	/// Add to a container
 	template<typename T>

+ 3 - 2
anki/scene/SceneNode.cpp

@@ -6,12 +6,13 @@ namespace anki {
 
 
 //==============================================================================
-SceneNode::SceneNode(const char* name, Scene* scene)
+SceneNode::SceneNode(const char* name_, Scene* scene_)
+	: name(name_), scene(scene_)
 {
 	scene->registerNode(this);
 
 	/// Add the first property
-	pmap.addProperty("name", &name, PropertyBase::PF_READ);
+	addNewProperty(new ReadPointerProperty<std::string>("name", &name));
 }
 
 

+ 0 - 14
anki/scene/VisibilityInfo.cpp

@@ -1,14 +0,0 @@
-#include "anki/scene/VisibilityInfo.h"
-
-
-namespace anki {
-
-
-//==============================================================================
-// Destructor                                                                  =
-//==============================================================================
-VisibilityInfo::~VisibilityInfo()
-{}
-
-
-} // end namespace

+ 0 - 78
anki/scene/VisibilityInfo.h

@@ -1,78 +0,0 @@
-#ifndef ANKI_SCENE_VISIBILITY_INFO_H
-#define ANKI_SCENE_VISIBILITY_INFO_H
-
-#include <deque>
-#include <vector>
-
-
-namespace anki {
-
-
-class Renderable;
-class PointLight;
-class SpotLight;
-
-
-/// The class contains scene nodes, categorized by type, that are visible.
-/// The nodes are in separate containers for faster shorting
-class VisibilityInfo
-{
-	public:
-		typedef std::deque<Renderable*> RContainer;
-		typedef std::vector<PointLight*> PLContainer;
-		typedef std::vector<SpotLight*> SLContainer;
-
-		VisibilityInfo() {}
-		~VisibilityInfo();
-
-		/// @name Accessors
-		/// @{
-		const RContainer& getVisibleMsRenderableNodes() const
-		{
-			return msRNodes;
-		}
-		RContainer& getVisibleMsRenderableNodes()
-		{
-			return msRNodes;
-		}
-
-		const RContainer& getVisibleBsRenderableNodes() const
-		{
-			return bsRNodes;
-		}
-		RContainer& getVisibleBsRenderableNodes()
-		{
-			return bsRNodes;
-		}
-
-		const PLContainer& getVisiblePointLights() const
-		{
-			return pLights;
-		}
-		PLContainer& getVisiblePointLights()
-		{
-			return pLights;
-		}
-
-		const SLContainer& getVisibleSpotLights() const
-		{
-			return sLights;
-		}
-		SLContainer& getVisibleSpotLights()
-		{
-			return sLights;
-		}
-		/// @}
-
-	private:
-		RContainer msRNodes;
-		RContainer bsRNodes;
-		PLContainer pLights; ///< Used only for non-light cameras
-		SLContainer sLights; ///< Used only for non-light cameras
-};
-
-
-} // end namespace
-
-
-#endif