فهرست منبع

Prepearing material for UBOs

Panagiotis Christopoulos Charitos 13 سال پیش
والد
کامیت
fc70256165
2فایلهای تغییر یافته به همراه59 افزوده شده و 77 حذف شده
  1. 16 18
      include/anki/resource/Material.h
  2. 43 59
      src/resource/Material.cpp

+ 16 - 18
include/anki/resource/Material.h

@@ -9,6 +9,7 @@
 #include "anki/util/Visitor.h"
 #include "anki/util/NonCopyable.h"
 #include "anki/gl/Ogl.h"
+#include <memory>
 
 namespace anki {
 
@@ -19,7 +20,7 @@ class XmlElement;
 class MaterialShaderProgramCreator;
 
 /// Material variable base. Its a visitable
-typedef Visitable<float, Vec2, Vec3, Vec4, Mat3, Mat4, TextureResourcePointer> 
+typedef Visitable<F32, Vec2, Vec3, Vec4, Mat3, Mat4, TextureResourcePointer> 
 	MateriaVariableVisitable;
 
 // Forward
@@ -42,9 +43,7 @@ public:
 	/// @{
 	MaterialVariable(
 		const char* shaderProgVarName,
-		PassLevelToShaderProgramHashMap& sProgs,
-		Bool init_)
-		: initialized(init_)
+		PassLevelToShaderProgramHashMap& sProgs)
 	{
 		init(shaderProgVarName, sProgs);
 	}
@@ -84,17 +83,11 @@ public:
 	/// Get the name of all the shader program variables
 	const std::string& getName() const;
 
-	Bool getInitialized() const
-	{
-		return initialized;
-	}
+	/// If false then it should be buildin
+	virtual Bool hasValue() const = 0;
 	/// @}
 
 private:
-	/// If not initialized then there is no value given in the XML so it is
-	/// probably build in and the renderer should set the value on the shader
-	/// program setup
-	Bool initialized;
 	PassLevelToShaderProgramUniformVariableHashMap sProgVars;
 
 	/// Keep one ShaderProgramVariable here for easy access of the common
@@ -106,7 +99,7 @@ private:
 		PassLevelToShaderProgramHashMap& shaderProgsArr);
 };
 
-/// XXX
+/// Material variable with data. A complete type
 template<typename Data>
 class MaterialVariableTemplate: public MaterialVariable
 {
@@ -115,13 +108,10 @@ public:
 	/// @{
 	MaterialVariableTemplate(
 		const char* shaderProgVarName,
-		PassLevelToShaderProgramHashMap& sProgs,
-		const Data& val,
-		Bool init_)
-		: MaterialVariable(shaderProgVarName, sProgs, init_)
+		PassLevelToShaderProgramHashMap& sProgs)
+		: MaterialVariable(shaderProgVarName, sProgs)
 	{
 		setupVisitable(&data);
-		data = val;
 	}
 
 	~MaterialVariableTemplate()
@@ -132,17 +122,25 @@ public:
 	/// @{
 	const Data& get() const
 	{
+		ANKI_ASSERT(data.get() != nullptr);
 		return data;
 	}
 
 	void set(const Data& x)
 	{
 		data = x;
+		dataSet = true;
 	}
 	/// @}
 
+	Bool hasValue() const
+	{
+		return dataSet;
+	}
+
 private:
 	Data data;
+	Bool dataSet = false;
 };
 
 /// Contains a few properties that other classes may use. For an explanation of

+ 43 - 59
src/resource/Material.cpp

@@ -344,54 +344,44 @@ void Material::populateVariables(const MaterialShaderProgramCreator& mspc)
 
 		MaterialVariable* v = nullptr;
 		const char* n = name.c_str(); // Var name
-		// Has value?
-		if(inpvar->value.size() == 0)
-		{
-			// Probably buildin
 
-			switch(dataType)
-			{
-			// sampler2D
-			case GL_SAMPLER_2D:
-				v = new MaterialVariableTemplate<TextureResourcePointer>(
-					n, eSProgs, TextureResourcePointer(), false);
-				break;
-			// float
-			case GL_FLOAT:
-				v = new MaterialVariableTemplate<float>(n, eSProgs,
-					float(), false);
-				break;
-			// vec2
-			case GL_FLOAT_VEC2:
-				v = new MaterialVariableTemplate<Vec2>(n, eSProgs,
-					Vec2(), false);
-				break;
-			// vec3
-			case GL_FLOAT_VEC3:
-				v = new MaterialVariableTemplate<Vec3>(n, eSProgs,
-					Vec3(), false);
-				break;
-			// vec4
-			case GL_FLOAT_VEC4:
-				v = new MaterialVariableTemplate<Vec4>(n, eSProgs,
-					Vec4(), false);
-				break;
-			// mat3
-			case GL_FLOAT_MAT3:
-				v = new MaterialVariableTemplate<Mat3>(n, eSProgs,
-					Mat3(), false);
-				break;
-			// mat4
-			case GL_FLOAT_MAT4:
-				v = new MaterialVariableTemplate<Mat4>(n, eSProgs,
-					Mat4(), false);
-				break;
-			// default is error
-			default:
-				ANKI_ASSERT(0);
-			}
+		switch(dataType)
+		{
+		// sampler2D
+		case GL_SAMPLER_2D:
+			v = new MaterialVariableTemplate<TextureResourcePointer>(
+				n, eSProgs);
+			break;
+		// F32
+		case GL_FLOAT:
+			v = new MaterialVariableTemplate<F32>(n, eSProgs);
+			break;
+		// vec2
+		case GL_FLOAT_VEC2:
+			v = new MaterialVariableTemplate<Vec2>(n, eSProgs);
+			break;
+		// vec3
+		case GL_FLOAT_VEC3:
+			v = new MaterialVariableTemplate<Vec3>(n, eSProgs);
+			break;
+		// vec4
+		case GL_FLOAT_VEC4:
+			v = new MaterialVariableTemplate<Vec4>(n, eSProgs);
+			break;
+		// mat3
+		case GL_FLOAT_MAT3:
+			v = new MaterialVariableTemplate<Mat3>(n, eSProgs);
+			break;
+		// mat4
+		case GL_FLOAT_MAT4:
+			v = new MaterialVariableTemplate<Mat4>(n, eSProgs);
+			break;
+		// default is error
+		default:
+			ANKI_ASSERT(0);
 		}
-		else
+
+		if(inpvar->value.size() != 0)
 		{
 			const StringList& value = inpvar->value;
 
@@ -400,29 +390,23 @@ void Material::populateVariables(const MaterialShaderProgramCreator& mspc)
 			{
 			// sampler2D
 			case GL_SAMPLER_2D:
-				v = new MaterialVariableTemplate<TextureResourcePointer>(
-					n, eSProgs,
-					TextureResourcePointer(value[0].c_str()), true);
+				v->setValue(TextureResourcePointer(value[0].c_str()));
 				break;
-			// float
+			// F32
 			case GL_FLOAT:
-				v = new MaterialVariableTemplate<float>(n, eSProgs,
-					std::stof(value[0].c_str()), true);
+				v->setValue(std::stof(value[0]));
 				break;
 			// vec2
 			case GL_FLOAT_VEC2:
-				v = new MaterialVariableTemplate<Vec2>(n, eSProgs,
-					setMathType<Vec2, 2>(value), true);
+				v->setValue(setMathType<Vec2, 2>(value));
 				break;
 			// vec3
 			case GL_FLOAT_VEC3:
-				v = new MaterialVariableTemplate<Vec3>(n, eSProgs,
-					setMathType<Vec3, 3>(value), true);
+				v->setValue(setMathType<Vec3, 3>(value));
 				break;
 			// vec4
 			case GL_FLOAT_VEC4:
-				v = new MaterialVariableTemplate<Vec4>(n, eSProgs,
-					setMathType<Vec4, 4>(value), true);
+				v->setValue(setMathType<Vec4, 4>(value));
 				break;
 			// default is error
 			default:
@@ -435,4 +419,4 @@ void Material::populateVariables(const MaterialShaderProgramCreator& mspc)
 	}
 }
 
-} // end namespace
+} // end namespace anki