Bladeren bron

- Adding unit tests
- Writing Ms loop

Panagiotis Christopoulos Charitos 15 jaren geleden
bovenliggende
commit
bdba583099

File diff suppressed because it is too large
+ 1 - 2
build/debug/Makefile


+ 2 - 4
src/Math/MathFuncs.inl.h

@@ -19,15 +19,13 @@ inline void mathSanityChecks()
 // 1/sqrt(f)
 inline float invSqrt(float f)
 {
+	float fhalf = 0.5 * f;
 	#if defined(PLATFORM_WIN)
-		float fhalf = 0.5*f;
 		int i = *(int*)&f;
 		i = 0x5F3759DF - (i>>1);
 		f = *(float*)&i;
 		f *= 1.5 - fhalf*f*f;
-		return f;
 	#elif defined(PLATFORM_LINUX)
-		float fhalf = 0.5*f;
 		asm
 		(
 			"mov %1, %%eax;"
@@ -40,10 +38,10 @@ inline float invSqrt(float f)
 			:"%eax", "%ebx"
 		);
 		f *= 1.5 - fhalf*f*f;
-		return f;
 	#else
 		#error "See file"
 	#endif
+	return f;
 }
 
 

+ 6 - 18
src/Renderer/Ms.cpp

@@ -4,6 +4,7 @@
 #include "Scene.h"
 #include "Camera.h"
 #include "Ez.h"
+#include "ModelNode.h"
 
 
 //======================================================================================================================
@@ -69,8 +70,6 @@ void Ms::init(const RendererInitializer& initializer)
 //======================================================================================================================
 void Ms::run()
 {
-	const Camera& cam = r.getCamera();
-
 	if(ez->isEnabled())
 	{
 		ez->run();
@@ -97,23 +96,12 @@ void Ms::run()
 	}
 
 	// render the meshes
-	/// @todo Uncomment
-	/*for(Vec<MeshNode*>::iterator it=app->getScene().meshNodes.begin(); it!=app->getScene().meshNodes.end(); it++)
+	for(Vec<ModelNode*>::const_iterator it = app->getScene().modelNodes.begin();
+			it != app->getScene().modelNodes.end(); ++it)
 	{
-		MeshNode* meshNode = (*it);
-		if(meshNode->mesh->material.get() == NULL)
-		{
-			throw EXCEPTION("Mesh \"" + meshNode->mesh->getRsrcName() + "\" doesnt have material");
-		}
-
-		if(meshNode->mesh->material->renderInBlendingStage())
-		{
-			continue;
-		}
-
-		r.setupMaterial(*meshNode->mesh->material, *meshNode, cam);
-		meshNode->render();
-	}*/
+		const ModelNode& md = *(*it);
+		r.renderModelNode(md, r.getCamera(), Renderer::MNRT_NORMAL);
+	}
 
 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // the rendering above fucks the polygon mode
 

+ 1 - 2
src/Renderer/Renderer.cpp

@@ -304,8 +304,7 @@ void Renderer::renderModelNode(const ModelNode& modelNode, const Camera& cam, Mo
 		}
 
 		// Material
-		const SceneNode* sceneNode = &modelNode;
-		setupMaterial(*mtl, *sceneNode, cam);
+		setupMaterial(*mtl, modelNode, cam);
 
 		// Render
 		if(modelNode.hasSkeleton())

+ 1 - 1
src/Renderer/Renderer.h

@@ -101,7 +101,7 @@ class Renderer: public Object
 
 
 		/// Render ModelNode. The method sets up the shader and renders the geometry
-		void renderModelNode(const ModelNode& modelNod, const Camera& cam, ModelNodeRenderType type) const;
+		void renderModelNode(const ModelNode& modelNode, const Camera& cam, ModelNodeRenderType type) const;
 
 		/// Draws a quad. Actually it draws 2 triangles because OpenGL will no longer support quads
 		/// @param vertCoordsAttribLoc The attribute location of the vertex positions

+ 11 - 10
src/Resources/Material.cpp

@@ -13,10 +13,6 @@
 #include "PropertyTree.h"
 
 
-/// Customized THROW_EXCEPTION
-#define MTL_EXCEPTION(x) EXCEPTION("Material \"" + getRsrcPath() + getRsrcName() + "\": " + x)
-
-
 //======================================================================================================================
 // Statics                                                                                                             =
 //======================================================================================================================
@@ -250,8 +246,13 @@ void Material::load(const char* filename)
   	boost::optional<const ptree&> userDefinedVarsTree = pt.get_child_optional("userDefinedVars");
   	if(userDefinedVarsTree)
   	{
-  		BOOST_FOREACH(const ptree::value_type& v, userDefinedVarsTree.get().get_child("userDefinedVar"))
+  		BOOST_FOREACH(const ptree::value_type& v, userDefinedVarsTree.get())
 			{
+  			if(v.first != "userDefinedVar")
+  			{
+  				throw EXCEPTION("Expected userDefinedVar and not " + v.first);
+  			}
+
   			const ptree& userDefinedVar = v.second;
   			std::string varName = userDefinedVar.get<std::string>("name");
 
@@ -310,7 +311,7 @@ void Material::initStdShaderVars()
 	// sanity checks
 	if(!shaderProg.get())
 	{
-		throw MTL_EXCEPTION("Without shader is like cake without sugar (missing SHADER_PROG)");
+		throw EXCEPTION("Material without shader program is like cake without sugar");
 	}
 
 	// the attributes
@@ -329,8 +330,8 @@ void Material::initStdShaderVars()
 		// check if the shader has different GL data type from that it suppose to have
 		if(stdAttribVars[i]->getGlDataType() != stdAttribVarInfos[i].dataType)
 		{
-			throw MTL_EXCEPTION("The \"" + stdAttribVarInfos[i].varName +
-			                    "\" attribute var has incorrect GL data type from the expected");
+			throw EXCEPTION("The \"" + stdAttribVarInfos[i].varName +
+			                "\" attribute var has incorrect GL data type from the expected");
 		}
 	}
 
@@ -350,8 +351,8 @@ void Material::initStdShaderVars()
 		// check if the shader has different GL data type from that it suppose to have
 		if(stdUniVars[i]->getGlDataType() != stdUniVarInfos[i].dataType)
 		{
-			throw MTL_EXCEPTION("The \"" + stdUniVarInfos[i].varName +
-			                    "\" uniform var has incorrect GL data type from the expected");
+			throw EXCEPTION("The \"" + stdUniVarInfos[i].varName +
+			                "\" uniform var has incorrect GL data type from the expected");
 		}
 	}
 }

+ 19 - 12
src/Resources/Material.h

@@ -68,17 +68,6 @@
 /// @endcode
 class Material: public Resource
 {
-	/// Used in depth passes of shadowmapping and not in other depth passes like EarlyZ
-	PROPERTY_R(bool, castsShadow, isShadowCaster)
-
-	/// The entities with blending are being rendered in blending stage and those without in material stage
-	PROPERTY_R(bool, blendingStage, renderInBlendingStage)
-
-	PROPERTY_R(int, blendingSfactor, getBlendingSfactor) ///< Default GL_ONE
-	PROPERTY_R(int, blendingDfactor, getBlendingDfactor) ///< Default GL_ZERO
-	PROPERTY_R(bool, depthTesting, isDepthTestingEnabled)
-	PROPERTY_R(bool, wireframe, isWireframeEnabled)
-
 	//====================================================================================================================
 	// Nested                                                                                                            =
 	//====================================================================================================================
@@ -146,6 +135,20 @@ class Material: public Resource
 			const ShaderProg::UniVar* sProgVar;
 		}; // end UserDefinedVar
 
+	//====================================================================================================================
+	// Properties                                                                                                        =
+	//====================================================================================================================
+	/// Used in depth passes of shadowmapping and not in other depth passes like EarlyZ
+	PROPERTY_R(bool, castsShadow, isShadowCaster)
+
+	/// The entities with blending are being rendered in blending stage and those without in material stage
+	PROPERTY_R(bool, blendingStage, renderInBlendingStage)
+
+	PROPERTY_R(int, blendingSfactor, getBlendingSfactor) ///< Default GL_ONE
+	PROPERTY_R(int, blendingDfactor, getBlendingDfactor) ///< Default GL_ZERO
+	PROPERTY_R(bool, depthTesting, isDepthTestingEnabled)
+	PROPERTY_R(bool, wireframe, isWireframeEnabled)
+
 	//====================================================================================================================
 	// Public                                                                                                            =
 	//====================================================================================================================
@@ -204,7 +207,11 @@ class Material: public Resource
 		/// @exception Exception
 		void initStdShaderVars();
 
-		/// @todo
+		/// Parse for a custom shader
+		/// @param[in] defines The acceptable defines array
+		/// @param[in] pt The property tree. Its not the root tree
+		/// @param[out] source The source to feed to ShaderProg::createSrcCodeToCache
+		/// @param[out] prefix The prefix of file to feed to ShaderProg::createSrcCodeToCache
 		static void parseCustomShader(const PreprocDefines defines[], const boost::property_tree::ptree& pt,
 		                              std::string& source, std::string& prefix);
 };

+ 17 - 23
src/Resources/Model.cpp

@@ -14,19 +14,16 @@
 #define BUFFER_OFFSET(i) ((char *)NULL + (i))
 
 
-#define MDL_EXCEPTION(x) EXCEPTION("Model \"" + filename + "\": " + x)
-
-
 //======================================================================================================================
 // load                                                                                                                =
 //======================================================================================================================
 void Model::load(const char* filename)
 {
-	//
-	// Load
-	//
 	try
   {
+		//
+		// Load
+		//
 		using namespace boost::property_tree;
 		ptree pt_;
   	read_xml(filename, pt_);
@@ -46,34 +43,31 @@ void Model::load(const char* filename)
 
   	// skeleton
   	boost::optional<std::string> skelName = pt.get_optional<std::string>("skeleton");
-  	if(skelName.is_initialized())
+  	if(skelName)
   	{
   		skeleton.loadRsrc(skelName.get().c_str());
   	}
 
-
-  	boost::optional<ptree&> skelAnims_ = pt.get_child_optional("skelAnims");
-  	if(skelAnims_.is_initialized())
+  	// Anims
+  	boost::optional<ptree&> skelAnimsTree = pt.get_child_optional("skelAnims");
+  	if(skelAnimsTree)
   	{
-  		BOOST_FOREACH(ptree::value_type& v, skelAnims_.get())
+  		BOOST_FOREACH(ptree::value_type& v, skelAnimsTree.get())
   		{
+  			if(v.first != "skelAnim")
+  			{
+  				throw EXCEPTION("Expected skelAnim and no " + v.first);
+  			}
+
   			const std::string& name = v.second.data();
   			skelAnims.push_back(RsrcPtr<SkelAnim>());
 				skelAnims.back().loadRsrc(name.c_str());
   		}
   	}
-	}
-	catch(std::exception& e)
-	{
-		throw MDL_EXCEPTION(e.what());
-	}
 
-
-	//
-	// Sanity checks
-	//
-	try
-	{
+  	//
+  	// Sanity checks
+  	//
 		if(skelAnims.size() > 0 && !hasSkeleton())
 		{
 			throw EXCEPTION("You have skeleton animations but no skeleton");
@@ -107,7 +101,7 @@ void Model::load(const char* filename)
 	}
 	catch(std::exception& e)
 	{
-		throw MDL_EXCEPTION(e.what());
+		throw EXCEPTION("Model \"" + filename + "\": " + e.what());
 	}
 }
 

+ 7 - 0
src/Scene/Scene.cpp

@@ -6,6 +6,7 @@
 #include "Controller.h"
 #include "Material.h"
 #include "ParticleEmitter.h"
+#include "ModelNode.h"
 
 
 //======================================================================================================================
@@ -39,6 +40,9 @@ void Scene::registerNode(SceneNode* node)
 		case SceneNode::SNT_PARTICLE_EMITTER:
 			putBackNode(particleEmitters, static_cast<ParticleEmitter*>(node));
 			break;
+		case SceneNode::SNT_MODEL:
+			putBackNode(modelNodes, static_cast<ModelNode*>(node));
+			break;
 	};
 }
 
@@ -61,6 +65,9 @@ void Scene::unregisterNode(SceneNode* node)
 		case SceneNode::SNT_PARTICLE_EMITTER:
 			eraseNode(particleEmitters, static_cast<ParticleEmitter*>(node));
 			break;
+		case SceneNode::SNT_MODEL:
+			eraseNode(modelNodes, static_cast<ModelNode*>(node));
+			break;
 	};
 }
 

+ 3 - 1
src/Scene/Scene.h

@@ -12,6 +12,7 @@ class Light;
 class Camera;
 class Controller;
 class ParticleEmitter;
+class ModelNode;
 
 
 /// The Scene contains all the dynamic entities
@@ -30,8 +31,9 @@ class Scene: public Object
 		Container<SceneNode> nodes;
 		Container<Light> lights;
 		Container<Camera> cameras;
-		Container<Controller> controllers;
 		Container<ParticleEmitter> particleEmitters;
+		Container<ModelNode> modelNodes;
+		Container<Controller> controllers;
 		Skybox skybox; /// @todo to be removed
 
 		// The funcs

+ 5 - 0
unit-tests/Resources/Material.ut.cpp

@@ -21,4 +21,9 @@ TEST(MaterialTests, Test)
 		EXPECT_EQ(mtl->getBlendingDfactor(), GL_SRC_ALPHA);
 		EXPECT_EQ(mtl->isBlendingEnabled(), true);
 	}
+	
+	{
+		RsrcPtr<Material> mtl;
+		EXPECT_THROW(mtl.loadRsrc("unit-tests/data/bool_err.mtl"));
+	}
 }

+ 10 - 0
unit-tests/data/bool_err.mtl

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<material>
+	<shaderProg>
+		<file>shaders/MsGeneric.glsl</file>
+	</shaderProg>
+	
+	<blendingStage>error</blendingStage>
+</material>
+

Some files were not shown because too many files changed in this diff