Procházet zdrojové kódy

- Refactoring
- Material

Panagiotis Christopoulos Charitos před 15 roky
rodič
revize
891cacf564

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 1
build/debug/Makefile


+ 1 - 1
src/Renderer/Drawers/SceneDrawer.cpp

@@ -12,7 +12,7 @@
 // setupShaderProg                                                                                                     =
 //======================================================================================================================
 void SceneDrawer::setupShaderProg(const Material& mtl, const Transform& nodeWorldTransform, const Camera& cam,
-		                              const Renderer& r)
+                                  const Renderer& r)
 {
 	uint textureUnit = 0;
 

+ 18 - 16
src/Resources/Material.cpp → src/Resources/Material/Material.cpp

@@ -14,16 +14,16 @@
 //======================================================================================================================
 // Statics                                                                                                             =
 //======================================================================================================================
-Material::StdVarNameAndGlDataTypePair Material::stdAttribVarInfos[SAV_NUM] =
-{
+boost::array<Material::StdVarNameAndGlDataTypePair, Material::SAV_NUM> Material::stdAttribVarInfos =
+{{
 	{"position", GL_FLOAT_VEC3},
 	{"tangent", GL_FLOAT_VEC4},
 	{"normal", GL_FLOAT_VEC3},
 	{"texCoords", GL_FLOAT_VEC2}
-};
+}};
 
-Material::StdVarNameAndGlDataTypePair Material::stdUniVarInfos[SUV_NUM] =
-{
+boost::array<Material::StdVarNameAndGlDataTypePair, Material::SUV_NUM> Material::stdUniVarInfos =
+{{
 	{"modelMat", GL_FLOAT_MAT4},
 	{"viewMat", GL_FLOAT_MAT4},
 	{"projectionMat", GL_FLOAT_MAT4},
@@ -40,9 +40,9 @@ Material::StdVarNameAndGlDataTypePair Material::stdUniVarInfos[SUV_NUM] =
 	{"ppsPostPassFai", GL_SAMPLER_2D},
 	{"rendererSize", GL_FLOAT_VEC2},
 	{"sceneAmbientColor", GL_FLOAT_VEC3}
-};
+}};
 
-Material::PreprocDefines Material::msGenericDefines [] =
+Material::PreprocDefines Material::msGenericDefines[] =
 {
 	{"DIFFUSE_MAPPING", 'd'},
 	{"NORMAL_MAPPING", 'n'},
@@ -53,7 +53,7 @@ Material::PreprocDefines Material::msGenericDefines [] =
 	{NULL, NULL}
 };
 
-Material::PreprocDefines Material::dpGenericDefines [] =
+Material::PreprocDefines Material::dpGenericDefines[] =
 {
 	{"ALPHA_TESTING", 'a'},
 	{NULL, NULL}
@@ -281,11 +281,13 @@ void Material::load(const char* filename)
 							}
 							else if(fai.get() == "ppsPrePassFai")
 							{
-								userDefinedVars.push_back(new MtlUserDefinedVar(uni, MtlUserDefinedVar::PPS_PRE_PASS_FAI));
+								userDefinedVars.push_back(new MtlUserDefinedVar(uni,
+								                                                MtlUserDefinedVar::PPS_PRE_PASS_FAI));
 							}
 							else if(fai.get() == "ppsPostPassFai")
 							{
-								userDefinedVars.push_back(new MtlUserDefinedVar(uni, MtlUserDefinedVar::PPS_POST_PASS_FAI));
+								userDefinedVars.push_back(new MtlUserDefinedVar(uni,
+								                                                MtlUserDefinedVar::PPS_POST_PASS_FAI));
 							}
 							else
 							{
@@ -303,15 +305,15 @@ void Material::load(const char* filename)
 					case GL_FLOAT:
 						userDefinedVars.push_back(new MtlUserDefinedVar(uni, PropertyTree::getFloat(valueTree)));
 						break;
-						// vec2
+					// vec2
 					case GL_FLOAT_VEC2:
 						userDefinedVars.push_back(new MtlUserDefinedVar(uni, PropertyTree::getVec2(valueTree)));
 						break;
-						// vec3
+					// vec3
 					case GL_FLOAT_VEC3:
 						userDefinedVars.push_back(new MtlUserDefinedVar(uni, PropertyTree::getVec3(valueTree)));
 						break;
-						// vec4
+					// vec4
 					case GL_FLOAT_VEC4:
 						userDefinedVars.push_back(new MtlUserDefinedVar(uni, PropertyTree::getVec4(valueTree)));
 						break;
@@ -339,7 +341,7 @@ void Material::initStdShaderVars()
 	}
 
 	// the attributes
-	for(uint i=0; i<SAV_NUM; i++)
+	for(uint i = 0; i < SAV_NUM; i++)
 	{
 		// if the var is not in the sProg then... bye
 		if(!shaderProg->attribVarExists(stdAttribVarInfos[i].varName))
@@ -360,7 +362,7 @@ void Material::initStdShaderVars()
 	}
 
 	// the uniforms
-	for(uint i=0; i<SUV_NUM; i++)
+	for(uint i = 0; i < SUV_NUM; i++)
 	{
 		// if the var is not in the sProg then... bye
 		if(!shaderProg->uniVarExists(stdUniVarInfos[i].varName))
@@ -421,7 +423,7 @@ void Material::parseCustomShader(const PreprocDefines defines[], const boost::pr
 		}
 
 		source += "#define " + define + "\n";
-    prefix.push_back(def->prefix);
+		prefix.push_back(def->prefix);
 	}
 
 	std::sort(prefix.begin(), prefix.end());

+ 30 - 29
src/Resources/Material.h → src/Resources/Material/Material.h

@@ -3,6 +3,7 @@
 
 #include <boost/ptr_container/ptr_vector.hpp>
 #include <boost/property_tree/ptree_fwd.hpp>
+#include <boost/array.hpp>
 #include "Math.h"
 #include "ShaderProg.h"
 #include "RsrcPtr.h"
@@ -68,9 +69,9 @@
 /// @endcode
 class Material
 {
-	//====================================================================================================================
-	// Nested                                                                                                            =
-	//====================================================================================================================
+	//==================================================================================================================
+	// Nested                                                                                                          =
+	//==================================================================================================================
 	public:
 		/// Standard attribute variables that are acceptable inside the @ref ShaderProg
 		enum StdAttribVars
@@ -112,23 +113,9 @@ class Material
 			SUV_NUM ///< The number of standard uniform variables
 		};
 
-	//====================================================================================================================
-	// 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                                                                                                            =
-	//====================================================================================================================
+	//==================================================================================================================
+	// Public                                                                                                          =
+	//==================================================================================================================
 	public:
 		/// Initialize with default values
 		Material();
@@ -141,7 +128,13 @@ class Material
 		const SProgAttribVar* getStdAttribVar(StdAttribVars id) const {return stdAttribVars[id];}
 		const SProgUniVar* getStdUniVar(StdUniVars id) const {return stdUniVars[id];}
 		const ShaderProg& getShaderProg() const {return *shaderProg.get();}
-		const boost::ptr_vector<MtlUserDefinedVar>& getUserDefinedVars() const {return userDefinedVars;}
+		GETTER_R(bool, castsShadow, isShadowCaster)
+		GETTER_R(bool, blendingStage, renderInBlendingStage)
+		GETTER_R(int, blendingSfactor, getBlendingSfactor)
+		GETTER_R(int, blendingDfactor, getBlendingDfactor)
+		GETTER_R(bool, depthTesting, isDepthTestingEnabled)
+		GETTER_R(bool, wireframe, isWireframeEnabled)
+		GETTER_R(boost::ptr_vector<MtlUserDefinedVar>, userDefinedVars, getUserDefinedVars)
 		/// @}
 
 		/// @return Return true if the shader has references to texture coordinates
@@ -149,9 +142,9 @@ class Material
 
 		bool isBlendingEnabled() const {return blendingSfactor != GL_ONE || blendingDfactor != GL_ZERO;}
 
-	//====================================================================================================================
-	// Private                                                                                                           =
-	//====================================================================================================================
+	//==================================================================================================================
+	// Private                                                                                                         =
+	//==================================================================================================================
 	private:
 		/// A simple pair-like structure
 		struct PreprocDefines
@@ -167,14 +160,22 @@ class Material
 			GLenum dataType; ///< aka GL data type
 		};
 
+		bool castsShadow; ///< Used in depth passes of shadowmapping and not in other depth passes like EarlyZ
+		/// The entities with blending are being rendered in blending stage and those without in material stage
+		bool blendingStage;
+		int blendingSfactor; ///< Default GL_ONE
+		int blendingDfactor; ///< Default GL_ZERO
+		bool depthTesting;
+		bool wireframe;
+		boost::ptr_vector<MtlUserDefinedVar> userDefinedVars;
+
 		static PreprocDefines msGenericDefines[]; ///< Material stage defines accepted in MsGeneric.glsl
 		static PreprocDefines dpGenericDefines[]; ///< Depth pass defines accepted in DpGeneric.glsl
-		static StdVarNameAndGlDataTypePair stdAttribVarInfos[SAV_NUM];
-		static StdVarNameAndGlDataTypePair stdUniVarInfos[SUV_NUM];
-		const SProgAttribVar* stdAttribVars[SAV_NUM];
-		const SProgUniVar* stdUniVars[SUV_NUM];
+		static boost::array<StdVarNameAndGlDataTypePair, SAV_NUM> stdAttribVarInfos;
+		static boost::array<StdVarNameAndGlDataTypePair, SUV_NUM> stdUniVarInfos;
+		boost::array<const SProgAttribVar*, SAV_NUM> stdAttribVars;
+		boost::array<const SProgUniVar*, SUV_NUM> stdUniVars;
 		RsrcPtr<ShaderProg> shaderProg; ///< The most important aspect of materials
-		boost::ptr_vector<MtlUserDefinedVar> userDefinedVars;
 
 		/// The func sweeps all the variables of the shader program to find standard shader program variables. It
 		/// updates the stdAttribVars and stdUniVars arrays.

+ 2 - 1
src/Resources/MtlUserDefinedVar.cpp → src/Resources/Material/MtlUserDefinedVar.cpp

@@ -8,5 +8,6 @@
 MtlUserDefinedVar::MtlUserDefinedVar(const SProgUniVar& sProgVar, const char* texFilename):
 	sProgVar(sProgVar)
 {
-	texture.loadRsrc(texFilename);
+	ASSERT(sProgVar.getGlDataType() == GL_SAMPLER_2D);
+	data.texture.loadRsrc(texFilename);
 }

+ 44 - 19
src/Resources/MtlUserDefinedVar.h → src/Resources/Material/MtlUserDefinedVar.h

@@ -1,6 +1,7 @@
 #ifndef MTL_USER_DEFINED_VAR_H
 #define MTL_USER_DEFINED_VAR_H
 
+#include <boost/variant.hpp>
 #include "Properties.h"
 #include "Math.h"
 #include "SProgUniVar.h"
@@ -23,13 +24,9 @@ class MtlUserDefinedVar
 			PPS_POST_PASS_FAI ///< Use it anywhere
 		};
 
-	PROPERTY_R(float, float_, getFloat)
-	PROPERTY_R(Vec2, vec2, getVec2)
-	PROPERTY_R(Vec3, vec3, getVec3)
-	PROPERTY_R(Vec4, vec4, getVec4)
-	PROPERTY_R(Fai, fai, getFai)
+		/// The data union
+		typedef boost::variant<float, Vec2, Vec3, Vec4, RsrcPtr<Texture>, Fai> DataVariant;
 
-	public:
 		MtlUserDefinedVar(const SProgUniVar& sProgVar, const char* texFilename);
 		MtlUserDefinedVar(const SProgUniVar& sProgVar, Fai fai);
 		MtlUserDefinedVar(const SProgUniVar& sProgVar, float f);
@@ -37,43 +34,71 @@ class MtlUserDefinedVar
 		MtlUserDefinedVar(const SProgUniVar& sProgVar, const Vec3& v);
 		MtlUserDefinedVar(const SProgUniVar& sProgVar, const Vec4& v);
 
+		/// @name Accessors
+		/// @{
 		const SProgUniVar& getUniVar() const {return sProgVar;}
-		const Texture* getTexture() const {return texture.get();}
+		const Texture* getTexture() const {return data.texture.get();}
+		GETTER_R(float, data.float_, getFloat)
+		GETTER_R(Vec2, data.vec2, getVec2)
+		GETTER_R(Vec3, data.vec3, getVec3)
+		GETTER_R(Vec4, data.vec4, getVec4)
+		GETTER_R(Fai, data.fai, getFai)
+		/// @}
 
 	private:
-		const SProgUniVar& sProgVar;
-		RsrcPtr<Texture> texture;
+		/// @note If you change this change the runtime as well
+		struct
+		{
+			RsrcPtr<Texture> texture;
+			float float_;
+			Vec2 vec2;
+			Vec3 vec3;
+			Vec4 vec4;
+			Fai fai;
+		} data;
+
+		const SProgUniVar& sProgVar; ///< Know the other resource
 };
 
 
 inline MtlUserDefinedVar::MtlUserDefinedVar(const SProgUniVar& sProgVar, Fai fai_):
-	fai(fai_),
 	sProgVar(sProgVar)
-{}
+{
+	ASSERT(sProgVar.getGlDataType() == GL_SAMPLER_2D);
+	data.fai = fai_;
+}
 
 
 inline MtlUserDefinedVar::MtlUserDefinedVar(const SProgUniVar& sProgVar, float f):
-	float_(f),
 	sProgVar(sProgVar)
-{}
+{
+	ASSERT(sProgVar.getGlDataType() == GL_FLOAT);
+	data.float_ = f;
+}
 
 
 inline MtlUserDefinedVar::MtlUserDefinedVar(const SProgUniVar& sProgVar, const Vec2& v):
-	vec2(v),
 	sProgVar(sProgVar)
-{}
+{
+	ASSERT(sProgVar.getGlDataType() == GL_FLOAT_VEC2);
+	data.vec2 = v;
+}
 
 
 inline MtlUserDefinedVar::MtlUserDefinedVar(const SProgUniVar& sProgVar, const Vec3& v):
-	vec3(v),
 	sProgVar(sProgVar)
-{}
+{
+	ASSERT(sProgVar.getGlDataType() == GL_FLOAT_VEC3);
+	data.vec3 = v;
+}
 
 
 inline MtlUserDefinedVar::MtlUserDefinedVar(const SProgUniVar& sProgVar, const Vec4& v):
-	vec4(v),
 	sProgVar(sProgVar)
-{}
+{
+	ASSERT(sProgVar.getGlDataType() == GL_FLOAT_VEC4);
+	data.vec4 = v;
+}
 
 
 #endif

+ 0 - 0
src/Resources/Mesh.cpp → src/Resources/Mesh/Mesh.cpp


+ 0 - 0
src/Resources/Mesh.h → src/Resources/Mesh/Mesh.h


+ 0 - 0
src/Resources/Helpers/MeshData.cpp → src/Resources/Mesh/MeshData.cpp


+ 0 - 0
src/Resources/Helpers/MeshData.h → src/Resources/Mesh/MeshData.h


+ 0 - 0
src/Resources/Model.cpp → src/Resources/Model/Model.cpp


+ 0 - 0
src/Resources/Model.h → src/Resources/Model/Model.h


+ 0 - 0
src/Resources/ModelPatch.cpp → src/Resources/Model/ModelPatch.cpp


+ 0 - 0
src/Resources/ModelPatch.h → src/Resources/Model/ModelPatch.h


+ 0 - 0
src/Resources/SProgAttribVar.h → src/Resources/ShaderProg/SProgAttribVar.h


+ 0 - 0
src/Resources/SProgUniVar.cpp → src/Resources/ShaderProg/SProgUniVar.cpp


+ 0 - 0
src/Resources/SProgUniVar.h → src/Resources/ShaderProg/SProgUniVar.h


+ 0 - 0
src/Resources/SProgVar.h → src/Resources/ShaderProg/SProgVar.h


+ 0 - 0
src/Resources/Helpers/ShaderPrePreprocessor.cpp → src/Resources/ShaderProg/ShaderPrePreprocessor.cpp


+ 0 - 0
src/Resources/Helpers/ShaderPrePreprocessor.h → src/Resources/ShaderProg/ShaderPrePreprocessor.h


+ 0 - 0
src/Resources/ShaderProg.cpp → src/Resources/ShaderProg/ShaderProg.cpp


+ 0 - 0
src/Resources/ShaderProg.h → src/Resources/ShaderProg/ShaderProg.h


+ 0 - 0
src/Resources/Helpers/Image.cpp → src/Resources/Texture/Image.cpp


+ 0 - 0
src/Resources/Helpers/Image.h → src/Resources/Texture/Image.h


+ 0 - 0
src/Resources/Texture.cpp → src/Resources/Texture/Texture.cpp


+ 0 - 0
src/Resources/Texture.h → src/Resources/Texture/Texture.h


+ 25 - 0
src/Scene/MaterialRuntime.cpp

@@ -0,0 +1,25 @@
+#include "MaterialRuntime.h"
+
+
+//======================================================================================================================
+// Constructor                                                                                                         =
+//======================================================================================================================
+MtlUserDefinedVarRuntime::MtlUserDefinedVarRuntime(const MtlUserDefinedVar& rsrc_):
+	rsrc(rsrc_)
+{
+	switch(rsrc.getUniVar().getGlDataType())
+	{
+		case GL_FLOAT:
+			break;
+		case GL_FLOAT_VEC2:
+			break;
+		case GL_FLOAT_VEC3:
+			break;
+		case GL_FLOAT_VEC4:
+			break;
+		case GL_SAMPLER_2D:
+			break;
+		default:
+			ASSERT(0);
+	}
+}

+ 29 - 0
src/Scene/MaterialRuntime.h

@@ -1,12 +1,41 @@
 #ifndef MATERIAL_RUNTIME_H
 #define MATERIAL_RUNTIME_H
 
+#include "MtlUserDefinedVar.h"
+
+
+/// @todo
+class MtlUserDefinedVarRuntime
+{
+	public:
+		MtlUserDefinedVarRuntime(const MtlUserDefinedVar& rsrc);
+
+		/// @name Accessors
+		/// @{
+		const MtlUserDefinedVar& getMtlUserDefinedVar() const {return rsrc;}
+		/// @}
+
+	private:
+		struct
+		{
+			float float_;
+			Vec2 vec2;
+			Vec3 vec3;
+			Vec4 vec4;
+		} data;
+
+		const MtlUserDefinedVar& rsrc;
+};
+
 
 /// @todo
 class MaterialRuntime
 {
 	public:
+		//MaterialRuntime
+
 	private:
+
 };
 
 

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů