Panagiotis Christopoulos Charitos 15 роки тому
батько
коміт
66b33721c7

+ 4 - 3
build/debug/Makefile

@@ -227,7 +227,8 @@ Main.o: ../../src/Main.cpp ../../src/Input/Input.h \
  ../../src/Renderer/MainRenderer.h ../../src/Renderer/Renderer.h \
  ../../src/Physics/DebugDrawer.h ../../src/Physics/RigidBody.h \
  ../../src/Scripting/ScriptingEngine.h ../../src/Core/StdinListener.h \
- ../../src/Core/Messaging.h ../../src/Core/App.h
+ ../../src/Core/Messaging.h ../../src/Core/App.h \
+ ../../src/Scene/ModelNode.h
 	@echo Compiling ../../src/Main.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Main.cpp -o Main.o
 
@@ -1311,7 +1312,7 @@ Ms.o: ../../src/Renderer/Ms.cpp ../../src/Renderer/Ms.h \
  ../../src/Scene/Camera.h ../../src/Collision/Collision.h \
  ../../src/Collision/Plane.h ../../src/Collision/CollisionShape.h \
  ../../src/Collision/Sphere.h ../../src/Scene/SceneNode.h \
- ../../src/Renderer/Ez.h
+ ../../src/Renderer/Ez.h ../../src/Scene/ModelNode.h
 	@echo Compiling ../../src/Renderer/Ms.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer/Ms.cpp -o Ms.o
 
@@ -3893,7 +3894,7 @@ Scene.o: ../../src/Scene/Scene.cpp ../../src/Util/Exception.h \
  ../../src/Resources/Texture.h ../../src/Scene/Controllers/Controller.h \
  ../../src/Resources/Material.h ../../src/Resources/ShaderProg.h \
  ../../src/Scene/ParticleEmitter.h ../../src/Scene/GhostNode.h \
- ../../src/Resources/ParticleEmitterProps.h
+ ../../src/Resources/ParticleEmitterProps.h ../../src/Scene/ModelNode.h
 	@echo Compiling ../../src/Scene/Scene.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Scene/Scene.cpp -o Scene.o
 

+ 4 - 25
src/Renderer/Renderer.cpp

@@ -10,6 +10,7 @@
 #include "Mesh.h"
 
 
+
 //======================================================================================================================
 // Constructor                                                                                                         =
 //======================================================================================================================
@@ -249,32 +250,10 @@ void Renderer::setupMaterial(const Material& mtl, const SceneNode& sceneNode, co
 	//
 	// set user defined vars
 	//
-	for(uint i=0; i<mtl.getUserDefinedVars().size(); i++)
+	boost::ptr_vector<Material::UserDefinedUniVar>::const_iterator it = mtl.getUserDefinedVars().begin();
+	for(; it !=  mtl.getUserDefinedVars().end(); it++)
 	{
-		const Material::UserDefinedUniVar* udv = &mtl.getUserDefinedVars()[i];
-		switch(udv->sProgVar->getGlDataType())
-		{
-			// texture
-			case GL_SAMPLER_2D:
-				udv->sProgVar->setTexture(*udv->value.texture, textureUnit++);
-				break;
-			// float
-			case GL_FLOAT:
-				udv->sProgVar->setFloat(udv->value.float_);
-				break;
-			// vec2
-			case GL_FLOAT_VEC2:
-				udv->sProgVar->setVec2(&udv->value.vec2);
-				break;
-			// vec3
-			case GL_FLOAT_VEC3:
-				udv->sProgVar->setVec3(&udv->value.vec3);
-				break;
-			// vec4
-			case GL_FLOAT_VEC4:
-				udv->sProgVar->setVec4(&udv->value.vec4);
-				break;
-		}
+		(*it).set(textureUnit);
 	}
 
 	ON_GL_FAIL_THROW_EXCEPTION();

+ 52 - 10
src/Resources/Material.cpp

@@ -13,6 +13,47 @@
 #include "PropertyTree.h"
 
 
+//======================================================================================================================
+// Constructor                                                                                                         =
+//======================================================================================================================
+Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const char* texFilename):
+	sProgVar(sProgVar)
+{
+	texture.loadRsrc(texFilename);
+}
+
+
+//======================================================================================================================
+// set                                                                                                                 =
+//======================================================================================================================
+void Material::UserDefinedUniVar::set(uint& textureUnit) const
+{
+	switch(sProgVar.getGlDataType())
+	{
+		// texture
+		case GL_SAMPLER_2D:
+			sProgVar.setTexture(*texture, textureUnit++);
+			break;
+		// float
+		case GL_FLOAT:
+			sProgVar.setFloat(float_);
+			break;
+		// vec2
+		case GL_FLOAT_VEC2:
+			sProgVar.setVec2(&vec2);
+			break;
+		// vec3
+		case GL_FLOAT_VEC3:
+			sProgVar.setVec3(&vec3);
+			break;
+		// vec4
+		case GL_FLOAT_VEC4:
+			sProgVar.setVec4(&vec4);
+			break;
+	}
+}
+
+
 //======================================================================================================================
 // Statics                                                                                                             =
 //======================================================================================================================
@@ -253,11 +294,8 @@ void Material::load(const char* filename)
   				throw EXCEPTION("Expected userDefinedVar and not " + v.first);
   			}
 
-  			const ptree& userDefinedVar = v.second;
-  			std::string varName = userDefinedVar.get<std::string>("name");
-
-  			userDefinedVars.push_back(new UserDefinedUniVar); // create new var
-  			UserDefinedUniVar& var = userDefinedVars.back();
+  			const ptree& userDefinedVarTree = v.second;
+  			std::string varName = userDefinedVarTree.get<std::string>("name");
 
 				// check if the uniform exists
 				if(!shaderProg->uniVarExists(varName.c_str()))
@@ -265,18 +303,22 @@ void Material::load(const char* filename)
 					throw EXCEPTION("The variable \"" + varName + "\" is not an active uniform");
 				}
 
-				var.sProgVar = shaderProg->findUniVar(varName.c_str());
+				//userDefinedVars.push_back(new UserDefinedUniVar); // create new var
+  			//UserDefinedUniVar& var = userDefinedVars.back();
+
+				const ShaderProg::UniVar& uni = *shaderProg->findUniVar(varName.c_str());
 
 				// read the values
-				switch(var.sProgVar->getGlDataType())
+				switch(uni.getGlDataType())
 				{
 					// texture
 					case GL_SAMPLER_2D:
-						var.value.texture.loadRsrc(userDefinedVar.get<std::string>("texture").c_str());
+						userDefinedVars.push_back(new UserDefinedUniVar(uni,
+						                                                userDefinedVarTree.get<std::string>("texture").c_str()));
 						break;
 						// float
 					case GL_FLOAT:
-						var.value.float_ = PropertyTree::getFloat(userDefinedVar);
+						userDefinedVars.push_back(new UserDefinedUniVar(uni, PropertyTree::getFloat(userDefinedVarTree)));
 						break;
 						// vec2
 					case GL_FLOAT_VEC2:
@@ -284,7 +326,7 @@ void Material::load(const char* filename)
 						break;
 						// vec3
 					case GL_FLOAT_VEC3:
-						var.value.vec3 = PropertyTree::getVec3(userDefinedVar);
+						userDefinedVars.push_back(new UserDefinedUniVar(uni, PropertyTree::getVec3(userDefinedVarTree)));
 						break;
 						// vec4
 					case GL_FLOAT_VEC4:

+ 45 - 8
src/Resources/Material.h

@@ -119,20 +119,29 @@ class Material: public Resource
 		};
 
 		/// Class for user defined material variables that will be passes in to the shader
-		struct UserDefinedUniVar
+		class UserDefinedUniVar
 		{
-			/// Unfortunately we cannot use union because of complex classes (Vec2, Vec3 etc)
-			struct Value
-			{
+			public:
+				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const char* texFilename);
+				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, float f);
+				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec2& v);
+				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec3& v);
+				UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec4& v);
+
+				void set(uint& textureUnit) const;
+
+			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;
-			};
-
-			Value value;
-			const ShaderProg::UniVar* sProgVar;
+				/// @}
 		}; // end UserDefinedVar
 
 	//====================================================================================================================
@@ -217,4 +226,32 @@ class Material: public Resource
 };
 
 
+//======================================================================================================================
+// Inlines                                                                                                             =
+//======================================================================================================================
+
+inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, float f):
+	sProgVar(sProgVar),
+	float_ (f)
+{}
+
+
+inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec2& v):
+	sProgVar(sProgVar),
+	vec2(v)
+{}
+
+
+inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec3& v):
+	sProgVar(sProgVar),
+	vec3(v)
+{}
+
+
+inline Material::UserDefinedUniVar::UserDefinedUniVar(const ShaderProg::UniVar& sProgVar, const Vec4& v):
+	sProgVar(sProgVar),
+	vec4(v)
+{}
+
+
 #endif

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

@@ -29,5 +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]
 	}
 }

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

@@ -20,7 +20,7 @@
 		</userDefinedVar>
 	
 		<userDefinedVar>
-			<name>meshes/horse/horse.norm.png</name>
+			<name>normalMap</name>
 			<value>
 				<texture>meshes/horse/horse.norm.png</texture>
 			</value>
@@ -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>1.0</y><z>-0.8</z></vec3>
 			</value>
 		</userDefinedVar>