Browse Source

Building the DBG stage

Panagiotis Christopoulos Charitos 13 years ago
parent
commit
ebbeef0fef

+ 7 - 0
include/anki/renderer/Dbg.h

@@ -3,6 +3,8 @@
 
 #include "anki/renderer/RenderingPass.h"
 #include "anki/gl/Fbo.h"
+#include <memory>
+#include "anki/renderer/Drawer.h"
 
 namespace anki {
 
@@ -14,11 +16,16 @@ public:
 		: SwitchableRenderingPass(r_)
 	{}
 	
+	~Dbg();
+
 	void init(const RendererInitializer& initializer);
 	void run();
 
 private:
 	Fbo fbo;
+	std::unique_ptr<DebugDrawer> drawer;
+	// Have it as ptr because the constructor calls opengl
+	std::unique_ptr<SceneDebugDrawer> sceneDrawer;
 };
 
 } // end namespace

+ 1 - 0
include/anki/renderer/Drawer.h

@@ -18,6 +18,7 @@ class DebugDrawer
 {
 public:
 	DebugDrawer();
+	~DebugDrawer();
 
 	void drawGrid();
 	void drawSphere(float radius, int complexity = 4);

+ 14 - 6
include/anki/scene/Scene.h

@@ -62,13 +62,21 @@ public:
 		mainCam = cam;
 	}
 
-	Types<SceneNode>::ConstRange getAllNodes() const
+	Types<SceneNode>::ConstIterator getAllNodesBegin() const
 	{
-		return Types<SceneNode>::ConstRange(nodes.begin(), nodes.end());
+		return nodes.begin();
 	}
-	Types<SceneNode>::MutableRange getAllNodes()
+	Types<SceneNode>::Iterator getAllNodesBegin()
 	{
-		return Types<SceneNode>::MutableRange(nodes.begin(), nodes.end());
+		return nodes.begin();
+	}
+	Types<SceneNode>::ConstIterator getAllNodesEnd() const
+	{
+		return nodes.end();
+	}
+	Types<SceneNode>::Iterator getAllNodesEnd()
+	{
+		return nodes.end();
 	}
 
 	const VisibilityInfo& getVisibilityInfo() const
@@ -92,8 +100,8 @@ public:
 private:
 	Types<SceneNode>::Container nodes;
 	Types<SceneNode>::NameToItemMap nameToNode;
-	Vec3 ambientCol; ///< The global ambient color
-	Camera* mainCam;
+	Vec3 ambientCol = Vec3(1.0); ///< The global ambient color
+	Camera* mainCam = nullptr;
 	VisibilityTester vtester;
 	VisibilityInfo vinfo;
 

+ 28 - 2
src/renderer/Dbg.cpp

@@ -1,8 +1,14 @@
 #include "anki/renderer/Dbg.h"
 #include "anki/renderer/Renderer.h"
+#include "anki/resource/ShaderProgramResource.h"
+#include "anki/scene/Scene.h"
 
 namespace anki {
 
+//==============================================================================
+Dbg::~Dbg()
+{}
+
 //==============================================================================
 void Dbg::init(const Renderer::Initializer& initializer)
 {
@@ -11,13 +17,18 @@ void Dbg::init(const Renderer::Initializer& initializer)
 	try
 	{
 		fbo.create();
-		fbo.setColorAttachments({&r->getPps().getPostPassFai()});
+		//fbo.setColorAttachments({&r->getPps().getPostPassFai()});
+		fbo.setColorAttachments({&r->getMs().getDiffuseFai()});
 		fbo.setOtherAttachment(GL_DEPTH_ATTACHMENT, r->getMs().getDepthFai());
+		ANKI_ASSERT(fbo.isComplete());
 	}
 	catch(std::exception& e)
 	{
 		throw ANKI_EXCEPTION("Cannot create debug FBO") << e;
 	}
+
+	drawer.reset(new DebugDrawer);
+	sceneDrawer.reset(new SceneDebugDrawer(drawer.get()));
 }
 
 //==============================================================================
@@ -28,7 +39,22 @@ void Dbg::run()
 		return;
 	}
 
-	/// TODO
+	Scene& scene = r->getScene();
+
+	fbo.bind();
+
+	drawer->drawGrid();
+
+	for(auto it = scene.getAllNodesBegin(); it != scene.getAllNodesEnd(); it++)
+	{
+		SceneNode* node = *it;
+		if(!node->getSpatial())
+		{
+			continue;
+		}
+
+		sceneDrawer->draw(*node);
+	}
 }
 
 } // end namespace

+ 5 - 0
src/renderer/Drawer.cpp

@@ -17,6 +17,10 @@ namespace anki {
 // DebugDrawer                                                                 =
 //==============================================================================
 
+//==============================================================================
+DebugDrawer::~DebugDrawer()
+{}
+
 //==============================================================================
 DebugDrawer::DebugDrawer()
 {
@@ -208,6 +212,7 @@ void DebugDrawer::end()
 	colorsVbo.write(&colors[0], 0, sizeof(Vec3) * pointIndex);
 
 	Mat4 pmv = vpMat * modelMat;
+	sProg->bind();
 	sProg->findUniformVariableByName("modelViewProjectionMat")->set(pmv);
 
 	vao.bind();

+ 2 - 1
src/scene/VisibilityTester.cpp

@@ -17,8 +17,9 @@ void VisibilityTester::test(Frustumable& cam, Scene& scene,
 	vinfo.renderables.clear();
 	vinfo.lights.clear();
 
-	for(SceneNode* node : scene.getAllNodes())
+	for(auto it = scene.getAllNodesBegin(); it != scene.getAllNodesEnd(); it++)
 	{
+		SceneNode* node = *it;
 		Spatial* sp = node->getSpatial();
 
 		if(!sp)