Browse Source

Fixing bugs

Panagiotis Christopoulos Charitos 15 years ago
parent
commit
40e2ec0d20

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


+ 3 - 4
src/Main.cpp

@@ -161,10 +161,9 @@ void init()
 	app->getScene().skybox.load(skybox_fnames);*/
 
 	// horse
-	//horse = new ModelNode();
-	//horse->init("meshes/horse/horse.mdl");
-	//horse->init("models/head/head.mesh");
-	//horse->setLocalTransform(Transform(Vec3(-2, 0, 1), Mat3::getIdentity(), 1.0));
+	horse = new ModelNode();
+	horse->init("meshes/horse/horse.mdl");
+	horse->setLocalTransform(Transform(Vec3(-2, 0, 1), Mat3::getIdentity(), 1.0));
 
 	return;
 

+ 4 - 1
src/Resources/Core/RsrcPtr.h

@@ -49,7 +49,10 @@ template<typename Type>
 RsrcPtr<Type>::RsrcPtr(const RsrcPtr& a):
 	p(a.p)
 {
-	++p->referenceCounter;
+	if(p)
+	{
+		++p->referenceCounter;
+	}
 }
 
 

+ 5 - 6
src/Resources/Material.cpp

@@ -208,7 +208,7 @@ void Material::load(const char* filename)
   		std::string prefix;
 
   		parseCustomShader(msGenericDefines, customMsSProgTree.get(), source, prefix);
-  		std::string shaderFilename = ShaderProg::createSrcCodeToCache("shaders/MsGeneric.glsl",
+  		std::string shaderFilename = ShaderProg::createSrcCodeToCache("shaders/MsMpGeneric.glsl",
   		                                                              source.c_str(), prefix.c_str());
   		shaderProg.loadRsrc(shaderFilename.c_str());
 		}
@@ -303,8 +303,7 @@ void Material::load(const char* filename)
 					throw EXCEPTION("The variable \"" + varName + "\" is not an active uniform");
 				}
 
-				//userDefinedVars.push_back(new UserDefinedUniVar); // create new var
-  			//UserDefinedUniVar& var = userDefinedVars.back();
+				const ptree& valueTree = userDefinedVarTree.get_child("value");
 
 				const ShaderProg::UniVar& uni = *shaderProg->findUniVar(varName.c_str());
 
@@ -314,11 +313,11 @@ void Material::load(const char* filename)
 					// texture
 					case GL_SAMPLER_2D:
 						userDefinedVars.push_back(new UserDefinedUniVar(uni,
-						                                                userDefinedVarTree.get<std::string>("texture").c_str()));
+						                                                valueTree.get<std::string>("texture").c_str()));
 						break;
 						// float
 					case GL_FLOAT:
-						userDefinedVars.push_back(new UserDefinedUniVar(uni, PropertyTree::getFloat(userDefinedVarTree)));
+						userDefinedVars.push_back(new UserDefinedUniVar(uni, PropertyTree::getFloat(valueTree)));
 						break;
 						// vec2
 					case GL_FLOAT_VEC2:
@@ -326,7 +325,7 @@ void Material::load(const char* filename)
 						break;
 						// vec3
 					case GL_FLOAT_VEC3:
-						userDefinedVars.push_back(new UserDefinedUniVar(uni, PropertyTree::getVec3(userDefinedVarTree)));
+						userDefinedVars.push_back(new UserDefinedUniVar(uni, PropertyTree::getVec3(valueTree)));
 						break;
 						// vec4
 					case GL_FLOAT_VEC4:

+ 13 - 17
src/Resources/Material.h

@@ -121,6 +121,11 @@ class Material: public Resource
 		/// Class for user defined material variables that will be passes in to the shader
 		class UserDefinedUniVar
 		{
+			PROPERTY_R(float, float_, getFloat)
+			PROPERTY_R(Vec2, vec2, getVec2)
+			PROPERTY_R(Vec3, vec3, getVec3)
+			PROPERTY_R(Vec4, vec4, getVec4)
+
 			public:
 				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const char* texFilename);
 				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, float f);
@@ -132,16 +137,7 @@ class Material: public Resource
 
 			private:
 				const ShaderProg::UniVar& sProgVar;
-
-				/// @name Values
-				/// Unfortunately we cannot use union because of complex classes (Vec2, Vec3 etc)
-				/// @{
 				RsrcPtr<Texture> texture;
-				float float_;
-				Vec2 vec2;
-				Vec3 vec3;
-				Vec4 vec4;
-				/// @}
 		}; // end UserDefinedVar
 
 	//====================================================================================================================
@@ -231,26 +227,26 @@ class Material: public Resource
 //======================================================================================================================
 
 inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, float f):
-	sProgVar(sProgVar),
-	float_ (f)
+	float_ (f),
+	sProgVar(sProgVar)
 {}
 
 
 inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec2& v):
-	sProgVar(sProgVar),
-	vec2(v)
+	vec2(v),
+	sProgVar(sProgVar)
 {}
 
 
 inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec3& v):
-	sProgVar(sProgVar),
-	vec3(v)
+	vec3(v),
+	sProgVar(sProgVar)
 {}
 
 
 inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec4& v):
-	sProgVar(sProgVar),
-	vec4(v)
+	vec4(v),
+	sProgVar(sProgVar)
 {}
 
 

+ 7 - 6
src/Resources/Model.cpp

@@ -28,17 +28,18 @@ void Model::load(const char* filename)
 		ptree pt_;
   	read_xml(filename, pt_);
 
-  	ptree& pt = pt_.get_child("model");
+  	const ptree& pt = pt_.get_child("model");
 
   	// subModels
-  	BOOST_FOREACH(ptree::value_type& v, pt.get_child("subModels"))
+  	BOOST_FOREACH(const ptree::value_type& v, pt.get_child("subModels"))
   	{
   		const std::string& mesh = v.second.get<std::string>("mesh");
   		const std::string& material = v.second.get<std::string>("material");
   		const std::string& dpMaterial = v.second.get<std::string>("dpMaterial");
 
-  		subModels.push_back(SubModel());
-  		subModels.back().load(mesh.c_str(), material.c_str(), dpMaterial.c_str());
+  		SubModel* sub = new SubModel();
+  		subModels.push_back(sub);
+  		sub->load(mesh.c_str(), material.c_str(), dpMaterial.c_str());
   	}
 
   	// skeleton
@@ -49,10 +50,10 @@ void Model::load(const char* filename)
   	}
 
   	// Anims
-  	boost::optional<ptree&> skelAnimsTree = pt.get_child_optional("skelAnims");
+  	boost::optional<const ptree&> skelAnimsTree = pt.get_child_optional("skelAnims");
   	if(skelAnimsTree)
   	{
-  		BOOST_FOREACH(ptree::value_type& v, skelAnimsTree.get())
+  		BOOST_FOREACH(const ptree::value_type& v, skelAnimsTree.get())
   		{
   			if(v.first != "skelAnim")
   			{

+ 3 - 2
src/Resources/Model.h

@@ -1,6 +1,7 @@
 #ifndef MODEL_H
 #define MODEL_H
 
+#include <boost/ptr_container/ptr_vector.hpp>
 #include "Resource.h"
 #include "RsrcPtr.h"
 #include "Object.h"
@@ -85,7 +86,7 @@ class Model: public Resource
 
 		/// @name Accessors
 		/// @{
-		const Vec<SubModel>& getSubModels() const {return subModels;}
+		const boost::ptr_vector<SubModel>& getSubModels() const {return subModels;}
 		const Skeleton& getSkeleton() const;
 		const Vec<RsrcPtr<SkelAnim> >& getSkelAnims() const {return skelAnims;}
 		/// @}
@@ -93,7 +94,7 @@ class Model: public Resource
 		bool hasSkeleton() const {return skeleton.get() != NULL;}
 
 	private:
-		Vec<SubModel> subModels; ///< The vector of SubModel
+		boost::ptr_vector<SubModel> subModels; ///< The vector of SubModel
 		RsrcPtr<Skeleton> skeleton; ///< The skeleton. It can be empty
 		Vec<RsrcPtr<SkelAnim> > skelAnims; ///< The standard skeleton animations
 };

+ 2 - 2
unit-tests/Resources/Material.ut.cpp

@@ -29,7 +29,7 @@ TEST(MaterialTests, Test)
 	{
 		RsrcPtr<Material> mtl;
 		EXPECT_NO_THROW(mtl.loadRsrc("unit-tests/data/complex.mtl"));
-		EXPECT_EQ(mtl.getUserDefinedVars().size(), 6);
-		EXPECT_EQ(mtl.getUserDefinedVars()[3]
+		EXPECT_EQ(mtl->getUserDefinedVars().size(), 6);
+		EXPECT_EQ(mtl->getUserDefinedVars()[3].getVec3(), Vec3(1.0, 2.0, -0.8));
 	}
 }

+ 1 - 1
unit-tests/data/complex.mtl

@@ -36,7 +36,7 @@
 		<userDefinedVar>
 			<name>specularCol</name>
 			<value>
-				<vec3><x>1.0</x><y>1.0</y><z>-0.8</z></vec3>
+				<vec3><x>1.0</x><y>2.0</y><z>-0.8</z></vec3>
 			</value>
 		</userDefinedVar>
 	

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