Browse Source

Optimizing

Panagiotis Christopoulos Charitos 13 years ago
parent
commit
935a864e43
3 changed files with 48 additions and 12 deletions
  1. 7 0
      include/anki/gl/ShaderProgram.h
  2. 23 6
      include/anki/scene/Camera.h
  3. 18 6
      src/renderer/Drawer.cpp

+ 7 - 0
include/anki/gl/ShaderProgram.h

@@ -167,6 +167,13 @@ public:
 	{}
 };
 
+/// Uniform shader block
+class ShaderProgramUniformBlock
+{
+private:
+	std::vector<ShaderProgramUniformVariable> uniforms;
+};
+
 /// Shader program object
 ///
 /// Shader program. Combines. Every shader program consist of one OpenGL ID, a 

+ 23 - 6
include/anki/scene/Camera.h

@@ -59,6 +59,11 @@ public:
 		return viewMat;
 	}
 
+	const Mat4& getViewProjectionMatrix() const
+	{
+		return viewProjectionMat;
+	}
+
 	/// Needed by the renderer
 	virtual float getNear() const = 0;
 	/// Needed by the renderer
@@ -107,10 +112,16 @@ protected:
 		viewMat = Mat4(getWorldTransform().getInverse());
 	}
 
-private:
-	Mat4 viewMat = Mat4::getIdentity();
+	void updateViewProjectionMatrix()
+	{
+		viewProjectionMat = projectionMat * viewMat;
+	}
 
+private:
 	CameraType type;
+
+	Mat4 viewMat = Mat4::getIdentity();
+	Mat4 viewProjectionMat = Mat4::getIdentity();
 };
 
 /// Perspective camera
@@ -149,12 +160,14 @@ public:
 	/// @{
 
 	/// Overrides Movable::moveUpdate(). This does:
-	/// - Update view matrix
-	/// - Update frustum
+	/// @li Update view matrix
+	/// @li Update view-projection matrix
+	/// @li Update frustum
 	void movableUpdate()
 	{
 		Movable::movableUpdate();
 		updateViewMatrix();
+		updateViewProjectionMatrix();
 		frustum.setTransform(getWorldTransform());
 	}
 	/// @}
@@ -168,6 +181,7 @@ public:
 	{
 		projectionMat = frustum.calculateProjectionMatrix();
 		invProjectionMat = projectionMat.getInverse();
+		updateViewProjectionMatrix();
 	}
 	/// @}
 
@@ -218,12 +232,14 @@ public:
 	/// @{
 
 	/// Overrides Movable::moveUpdate(). This does:
-	/// - Update view matrix
-	/// - Update frustum
+	/// @li Update view matrix
+	/// @li Update view-projection matrix
+	/// @li Update frustum
 	void movableUpdate()
 	{
 		Movable::movableUpdate();
 		updateViewMatrix();
+		updateViewProjectionMatrix();
 		frustum.setTransform(getWorldTransform());
 	}
 	/// @}
@@ -237,6 +253,7 @@ public:
 	{
 		projectionMat = frustum.calculateProjectionMatrix();
 		invProjectionMat = projectionMat.getInverse();
+		updateViewProjectionMatrix();
 	}
 	/// @}
 

+ 18 - 6
src/renderer/Drawer.cpp

@@ -592,20 +592,22 @@ struct SetupMaterialVariableVisitor
 
 		// Sanity check
 		//
-		if(!mv.getInitialized() && mprop.getBuildinId() == BT_NO_BUILDIN)
+		/*if(!mv.getInitialized() && mprop.getBuildinId() == BT_NO_BUILDIN)
 		{
 			ANKI_LOGW("Material variable no building and not initialized: "
 				<< mv.getName());
-		}
+		}*/
 
 		// Set uniform
 		//
 		const Transform* rwtrf = renderable->getRenderableWorldTransform();
 
 		Mat4 mMat = (rwtrf) ? Mat4(*rwtrf) : Mat4::getIdentity();
-		Mat4 vpMat = cam->getProjectionMatrix() * cam->getViewMatrix();
+		const Mat4& vpMat = cam->getViewProjectionMatrix();
 		Mat4 mvpMat = vpMat * mMat;
-		Mat4 mvMat = mMat * cam->getViewMatrix();
+
+		Mat4 mvMat;
+		bool mvMatCalculated = false; // Opt
 
 		switch(mprop.getBuildinId())
 		{
@@ -616,9 +618,19 @@ struct SetupMaterialVariableVisitor
 			uni->set(mvpMat);
 			break;
 		case BI_MODEL_VIEW_MATRIX:
+			if(!mvMatCalculated)
+			{
+				mvMat = mMat * cam->getViewMatrix();
+				mvMatCalculated = true;
+			}
 			uni->set(mvMat);
 			break;
 		case BI_NORMAL_MATRIX:
+			if(!mvMatCalculated)
+			{
+				mvMat = mMat * cam->getViewMatrix();
+				mvMatCalculated = true;
+			}
 			uni->set(mvMat.getRotationPart());
 			break;
 		}
@@ -674,7 +686,7 @@ void RenderableDrawer::render(const Camera& cam, uint pass,
 	setupShaderProg(key, cam, renderable);
 
 	// Render
-	uint indecesNum = 
+	uint32_t indecesNum =
 		renderable.getModelPatchBase().getIndecesNumber(0);
 
 	const Vao& vao = renderable.getModelPatchBase().getVao(key);
@@ -684,4 +696,4 @@ void RenderableDrawer::render(const Camera& cam, uint pass,
 	vao.unbind();
 }
 
-}  // namespace anki
+}  // end namespace anki