Bläddra i källkod

Allocator and some sector work

Panagiotis Christopoulos Charitos 13 år sedan
förälder
incheckning
c185456541
4 ändrade filer med 95 tillägg och 21 borttagningar
  1. 4 1
      include/anki/scene/Octree.h
  2. 36 17
      include/anki/scene/Sector.h
  3. 5 2
      src/scene/Octree.cpp
  4. 50 1
      src/scene/Sector.cpp

+ 4 - 1
include/anki/scene/Octree.h

@@ -4,6 +4,7 @@
 #include "anki/collision/Aabb.h"
 #include "anki/util/Vector.h"
 #include "anki/util/Array.h"
+#include "anki/scene/Common.h"
 #include <memory>
 
 namespace anki {
@@ -81,7 +82,8 @@ private:
 class Octree
 {
 public:
-	Octree(const Aabb& aabb, U8 maxDepth, F32 looseness = 1.5);
+	Octree(const SceneAllocator<U8>& alloc, const Aabb& aabb, U8 maxDepth, 
+		F32 looseness = 1.5);
 
 	/// @name Accessors
 	/// @{
@@ -107,6 +109,7 @@ public:
 	void doVisibilityTests(Frustumable& fr);
 
 private:
+	SceneAllocator<U8> alloc;
 	U maxDepth;
 	F32 looseness;
 	OctreeNode root;

+ 36 - 17
include/anki/scene/Sector.h

@@ -5,37 +5,56 @@
 
 namespace anki {
 
+// Forward
 class SceneNode;
 class Sector;
 
-/// Portal
-class Portal
+/// 2 way Portal
+struct Portal
 {
-private:
 	Array<Sector*, 2> sectors;
+
+	Portal();
 };
 
-/// A sector
-class Sector
+/// A sector. It consists of an octree and some portals
+struct Sector
 {
-public:
-	Sector(const Aabb& box)
-		: octree(box, 3)
-	{}
+	Octree octree;
+	SceneVector<Portal*> portals;
 
-	const Octree& getOctree() const
-	{
-		return octree;
-	}
-	Octree& getOctree()
+	/// Default constructor
+	Sector(const SceneAllocator<U8>& alloc, const Aabb& box);
+
+	/// Called when a node was moved or a change in shape happened
+	Bool placeSceneNode(SceneNode* sp);
+
+	const Aabb& getAabb() const
 	{
-		return octree;
+		return octree.getRoot().getAabb();
 	}
+};
 
-	bool placeSceneNode(SceneNode* sp);
+/// Sector group. This is supposed to represent the whole sceene
+class SectorGroup
+{
+public:
+	/// Default constructor
+	SectorGroup(const SceneAllocator<U8>& alloc);
+
+	/// Destructor
+	~SectorGroup();
+
+	/// Called when a node was moved or a change in shape happened. The node 
+	/// must be Spatial
+	///
+	/// @return false if scene node is out of all sectors.
+	Bool placeSceneNode(SceneNode* sp);
 
 private:
-	Octree octree;
+	SceneAllocator<U8> alloc; ///< Keep a copy of the scene allocator
+	SceneVector<Sector*> sectors;
+	SceneVector<Portal*> portals;
 };
 
 } // end namespace anki

+ 5 - 2
src/scene/Octree.cpp

@@ -52,8 +52,11 @@ void OctreeNode::removeSceneNode(SceneNode* sn)
 //==============================================================================
 
 //==============================================================================
-Octree::Octree(const Aabb& aabb, U8 maxDepth_, F32 looseness_)
-	: maxDepth(maxDepth_ < 1 ? 1 : maxDepth_), looseness(looseness_),
+Octree::Octree(const SceneAllocator<U8>& alloc_, const Aabb& aabb, 
+	U8 maxDepth_, F32 looseness_)
+	:	alloc(alloc_), 
+		maxDepth(maxDepth_ < 1 ? 1 : maxDepth_), 
+		looseness(looseness_),
 		root(aabb, nullptr)
 {}
 

+ 50 - 1
src/scene/Sector.cpp

@@ -6,7 +6,26 @@
 namespace anki {
 
 //==============================================================================
-bool Sector::placeSceneNode(SceneNode* sn)
+// Portal                                                                      =
+//==============================================================================
+
+//==============================================================================
+Portal::Portal()
+{
+	sectors[0] = sectors[1] = nullptr;
+}
+
+//==============================================================================
+// Sector                                                                      =
+//==============================================================================
+
+//==============================================================================
+Sector::Sector(const SceneAllocator<U8>& alloc_, const Aabb& box)
+	: octree(alloc_, box, 3), portals(alloc_)
+{}
+
+//==============================================================================
+Bool Sector::placeSceneNode(SceneNode* sn)
 {
 	// XXX Optimize
 
@@ -20,4 +39,34 @@ bool Sector::placeSceneNode(SceneNode* sn)
 	return true;
 }
 
+//==============================================================================
+// Sector                                                                      =
+//==============================================================================
+
+//==============================================================================
+SectorGroup::SectorGroup(const SceneAllocator<U8>& alloc_)
+	: alloc(alloc_)
+{}
+
+//==============================================================================
+SectorGroup::~SectorGroup()
+{
+	for(Sector* sector : sectors)
+	{
+		ANKI_DELETE(sector, alloc);
+	}
+
+	for(Portal* portal : portals)
+	{
+		ANKI_DELETE(portal, alloc);
+	}
+}
+
+//==============================================================================
+Bool SectorGroup::placeSceneNode(SceneNode* sp)
+{
+	// XXX
+	return false;
+}
+
 } // end namespace anki