Pārlūkot izejas kodu

The material will calculate the uniform properties. Don't query GL

Panagiotis Christopoulos Charitos 11 gadi atpakaļ
vecāks
revīzija
7e1b25830e

+ 14 - 0
include/anki/resource/Material.h

@@ -19,6 +19,7 @@ namespace anki {
 // Forward
 // Forward
 class XmlElement;
 class XmlElement;
 class MaterialProgramCreator;
 class MaterialProgramCreator;
+class MaterialProgramCreatorInputVariable;
 
 
 template<typename T>
 template<typename T>
 class MaterialVariableTemplate;
 class MaterialVariableTemplate;
@@ -97,6 +98,13 @@ public:
 		return m_instanced;
 		return m_instanced;
 	}
 	}
 
 
+	void setUniformBufferInfo(U16 offset, U16 arrayStride, U16 matrixStride)
+	{
+		m_offset = offset;
+		m_arrayStride = arrayStride;
+		m_matrixStride = matrixStride;
+	}
+
 private:
 private:
 	/// Keep one program variable here for easy access of the common
 	/// Keep one program variable here for easy access of the common
 	/// variable stuff like name or GL data type etc
 	/// variable stuff like name or GL data type etc
@@ -173,6 +181,12 @@ public:
 		return m_data.getSize() > 0;
 		return m_data.getSize() > 0;
 	}
 	}
 
 
+	static MaterialVariableTemplate* _newInstance(
+		const GlProgramVariable& glvar, 
+		const MaterialProgramCreatorInputVariable& in,
+		ResourceAllocator<U8> alloc, 
+		TempResourceAllocator<U8> talloc);
+
 private:
 private:
 	ResourceDArray<TData> m_data;
 	ResourceDArray<TData> m_data;
 };
 };

+ 81 - 75
include/anki/resource/MaterialProgramCreator.h

@@ -15,6 +15,86 @@ namespace anki {
 // Forward
 // Forward
 class XmlElement;
 class XmlElement;
 
 
+/// XXX
+class MaterialProgramCreatorInputVariable: public NonCopyable
+{
+public:
+	using MPString = TempResourceString; 
+	using MPStringList = StringListBase<TempResourceAllocator<char>>;
+
+	TempResourceAllocator<U8> m_alloc;
+	MPString m_name;
+	MPString m_type;
+	MPStringList m_value;
+	Bool8 m_constant = false;
+	U16 m_arraySize = 0;
+	Bool8 m_instanced = false;
+
+	MPString m_line;
+	GLbitfield m_shaderDefinedMask = 0; ///< Defined in
+	GLbitfield m_shaderReferencedMask = 0; ///< Referenced by
+	Bool8 m_inBlock = true;
+
+	I16 m_binding = -1; ///< Texture unit
+	I32 m_offset = -1; ///< Offset inside the UBO
+	I32 m_arrayStride = -1;
+	/// Identifying the stride between columns of a column-major matrix or 
+	/// rows of a row-major matrix
+	I32 m_matrixStride = -1;
+
+	MaterialProgramCreatorInputVariable()
+	{}
+
+	MaterialProgramCreatorInputVariable(MaterialProgramCreatorInputVariable&& b)
+	{
+		move(b);
+	}
+
+	~MaterialProgramCreatorInputVariable()
+	{
+		m_name.destroy(m_alloc);
+		m_type.destroy(m_alloc);
+		m_value.destroy(m_alloc);
+		m_line.destroy(m_alloc);
+	}
+
+	MaterialProgramCreatorInputVariable& operator=(
+		MaterialProgramCreatorInputVariable&& b)
+	{
+		move(b);
+		return *this;
+	}
+
+	void move(MaterialProgramCreatorInputVariable& b)
+	{
+		m_alloc = std::move(b.m_alloc);
+		m_name = std::move(b.m_name);
+		m_type = std::move(b.m_type);
+		m_value = std::move(b.m_value);
+		m_constant = b.m_constant;
+		m_arraySize = b.m_arraySize;
+		m_instanced = b.m_instanced;
+		m_line = std::move(b.m_line);
+		m_shaderDefinedMask = b.m_shaderDefinedMask;
+		m_shaderReferencedMask = b.m_shaderReferencedMask;
+		m_inBlock = b.m_inBlock;
+		m_binding = b.m_binding;
+		m_offset = b.m_offset;
+		m_arrayStride = b.m_arrayStride;
+		m_matrixStride = b.m_matrixStride;
+	}
+
+	Bool duplicate(const MaterialProgramCreatorInputVariable& b) const
+	{
+		return b.m_name == m_name
+			&& b.m_type == m_type
+			&& b.m_value == m_value
+			&& b.m_constant == m_constant
+			&& b.m_arraySize == m_arraySize
+			&& b.m_instanced == m_instanced;
+	}
+};
+
 /// Creator of shader programs. This class parses between
 /// Creator of shader programs. This class parses between
 /// @code <shaderProgams></shaderPrograms> @endcode located inside a 
 /// @code <shaderProgams></shaderPrograms> @endcode located inside a 
 /// @code <material></material> @endcode and creates the source of a custom 
 /// @code <material></material> @endcode and creates the source of a custom 
@@ -27,81 +107,7 @@ class MaterialProgramCreator
 public:
 public:
 	using MPString = TempResourceString; 
 	using MPString = TempResourceString; 
 	using MPStringList = StringListBase<TempResourceAllocator<char>>;
 	using MPStringList = StringListBase<TempResourceAllocator<char>>;
-
-	class Input: public NonCopyable
-	{
-	public:
-		TempResourceAllocator<U8> m_alloc;
-		MPString m_name;
-		MPString m_type;
-		MPStringList m_value;
-		Bool8 m_constant = false;
-		U16 m_arraySize = 0;
-		Bool8 m_instanced = false;
-
-		MPString m_line;
-		GLbitfield m_shaderDefinedMask = 0; ///< Defined in
-		GLbitfield m_shaderReferencedMask = 0; ///< Referenced by
-		Bool8 m_inBlock = true;
-
-		I16 m_binding = -1; ///< Texture unit
-		I32 m_offset = -1; ///< Offset inside the UBO
-		I32 m_arrayStride = -1;
-		/// Identifying the stride between columns of a column-major matrix or 
-		/// rows of a row-major matrix
-		I32 m_matrixStride = -1;
-
-		Input()
-		{}
-
-		Input(Input&& b)
-		{
-			move(b);
-		}
-
-		~Input()
-		{
-			m_name.destroy(m_alloc);
-			m_type.destroy(m_alloc);
-			m_value.destroy(m_alloc);
-			m_line.destroy(m_alloc);
-		}
-
-		Input& operator=(Input&& b)
-		{
-			move(b);
-			return *this;
-		}
-
-		void move(Input& b)
-		{
-			m_alloc = std::move(b.m_alloc);
-			m_name = std::move(b.m_name);
-			m_type = std::move(b.m_type);
-			m_value = std::move(b.m_value);
-			m_constant = b.m_constant;
-			m_arraySize = b.m_arraySize;
-			m_instanced = b.m_instanced;
-			m_line = std::move(b.m_line);
-			m_shaderDefinedMask = b.m_shaderDefinedMask;
-			m_shaderReferencedMask = b.m_shaderReferencedMask;
-			m_inBlock = b.m_inBlock;
-			m_binding = b.m_binding;
-			m_offset = b.m_offset;
-			m_arrayStride = b.m_arrayStride;
-			m_matrixStride = b.m_matrixStride;
-		}
-
-		Bool duplicate(const Input& b) const
-		{
-			return b.m_name == m_name
-				&& b.m_type == m_type
-				&& b.m_value == m_value
-				&& b.m_constant == m_constant
-				&& b.m_arraySize == m_arraySize
-				&& b.m_instanced == m_instanced;
-		}
-	};
+	using Input = MaterialProgramCreatorInputVariable;
 
 
 	explicit MaterialProgramCreator(TempResourceAllocator<U8>& alloc);
 	explicit MaterialProgramCreator(TempResourceAllocator<U8>& alloc);
 
 

+ 56 - 57
src/resource/Material.cpp

@@ -24,11 +24,58 @@ namespace anki {
 //==============================================================================
 //==============================================================================
 
 
 //==============================================================================
 //==============================================================================
-/// Create an numeric material variable
+/// Given a string that defines blending return the GLenum
+static GLenum blendToEnum(const CString& str)
+{
+// Dont make idiotic mistakes
+#define TXT_AND_ENUM(x) \
+	if(str == #x) \
+	{ \
+		return x; \
+	}
+
+	TXT_AND_ENUM(GL_ZERO)
+	TXT_AND_ENUM(GL_ONE)
+	TXT_AND_ENUM(GL_DST_COLOR)
+	TXT_AND_ENUM(GL_ONE_MINUS_DST_COLOR)
+	TXT_AND_ENUM(GL_SRC_ALPHA)
+	TXT_AND_ENUM(GL_ONE_MINUS_SRC_ALPHA)
+	TXT_AND_ENUM(GL_DST_ALPHA)
+	TXT_AND_ENUM(GL_ONE_MINUS_DST_ALPHA)
+	TXT_AND_ENUM(GL_SRC_ALPHA_SATURATE)
+	TXT_AND_ENUM(GL_SRC_COLOR)
+	TXT_AND_ENUM(GL_ONE_MINUS_SRC_COLOR);
+	ANKI_LOGE("Incorrect blend enum");
+	return 0;
+
+#undef TXT_AND_ENUM
+}
+
+//==============================================================================
+// MaterialVariable                                                            =
+//==============================================================================
+
+//==============================================================================
+MaterialVariable::~MaterialVariable()
+{}
+
+//==============================================================================
+CString MaterialVariable::getName() const
+{
+	return m_progVar->getName();
+}
+
+//==============================================================================
+U32 MaterialVariable::getArraySize() const
+{
+	return m_progVar->getArraySize();
+}
+
+//==============================================================================
 template<typename T>
 template<typename T>
-static MaterialVariable* newMaterialVariable(
+MaterialVariableTemplate<T>* MaterialVariableTemplate<T>::_newInstance(
 	const GlProgramVariable& glvar, const MaterialProgramCreator::Input& in,
 	const GlProgramVariable& glvar, const MaterialProgramCreator::Input& in,
-	ResourceAllocator<U8>& alloc, TempResourceAllocator<U8>& talloc)
+	ResourceAllocator<U8> alloc, TempResourceAllocator<U8> talloc)
 {
 {
 	MaterialVariableTemplate<T>* out = nullptr;
 	MaterialVariableTemplate<T>* out = nullptr;
 
 
@@ -88,54 +135,6 @@ static MaterialVariable* newMaterialVariable(
 	return out;
 	return out;
 }
 }
 
 
-//==============================================================================
-/// Given a string that defines blending return the GLenum
-static GLenum blendToEnum(const CString& str)
-{
-// Dont make idiotic mistakes
-#define TXT_AND_ENUM(x) \
-	if(str == #x) \
-	{ \
-		return x; \
-	}
-
-	TXT_AND_ENUM(GL_ZERO)
-	TXT_AND_ENUM(GL_ONE)
-	TXT_AND_ENUM(GL_DST_COLOR)
-	TXT_AND_ENUM(GL_ONE_MINUS_DST_COLOR)
-	TXT_AND_ENUM(GL_SRC_ALPHA)
-	TXT_AND_ENUM(GL_ONE_MINUS_SRC_ALPHA)
-	TXT_AND_ENUM(GL_DST_ALPHA)
-	TXT_AND_ENUM(GL_ONE_MINUS_DST_ALPHA)
-	TXT_AND_ENUM(GL_SRC_ALPHA_SATURATE)
-	TXT_AND_ENUM(GL_SRC_COLOR)
-	TXT_AND_ENUM(GL_ONE_MINUS_SRC_COLOR);
-	ANKI_LOGE("Incorrect blend enum");
-	return 0;
-
-#undef TXT_AND_ENUM
-}
-
-//==============================================================================
-// MaterialVariable                                                            =
-//==============================================================================
-
-//==============================================================================
-MaterialVariable::~MaterialVariable()
-{}
-
-//==============================================================================
-CString MaterialVariable::getName() const
-{
-	return m_progVar->getName();
-}
-
-//==============================================================================
-U32 MaterialVariable::getArraySize() const
-{
-	return m_progVar->getArraySize();
-}
-
 //==============================================================================
 //==============================================================================
 // Material                                                                    =
 // Material                                                                    =
 //==============================================================================
 //==============================================================================
@@ -672,32 +671,32 @@ Error Material::populateVariables(const MaterialProgramCreator& loader)
 			break;
 			break;
 		// F32
 		// F32
 		case GL_FLOAT:
 		case GL_FLOAT:
-			mtlvar = newMaterialVariable<F32>(*glvar, in,
+			mtlvar = MaterialVariableTemplate<F32>::_newInstance(*glvar, in,
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 			break;
 			break;
 		// vec2
 		// vec2
 		case GL_FLOAT_VEC2:
 		case GL_FLOAT_VEC2:
-			mtlvar = newMaterialVariable<Vec2>(*glvar, in,
+			mtlvar = MaterialVariableTemplate<Vec2>::_newInstance(*glvar, in,
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 			break;
 			break;
 		// vec3
 		// vec3
 		case GL_FLOAT_VEC3:
 		case GL_FLOAT_VEC3:
-			mtlvar = newMaterialVariable<Vec3>(*glvar, in,
+			mtlvar = MaterialVariableTemplate<Vec3>::_newInstance(*glvar, in,
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 			break;
 			break;
 		// vec4
 		// vec4
 		case GL_FLOAT_VEC4:
 		case GL_FLOAT_VEC4:
-			mtlvar = newMaterialVariable<Vec4>(*glvar, in,
+			mtlvar = MaterialVariableTemplate<Vec4>::_newInstance(*glvar, in,
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 			break;
 			break;
 		// mat3
 		// mat3
 		case GL_FLOAT_MAT3:
 		case GL_FLOAT_MAT3:
-			mtlvar = newMaterialVariable<Mat3>(*glvar, in,
+			mtlvar = MaterialVariableTemplate<Mat3>::_newInstance(*glvar, in,
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 			break;
 			break;
 		// mat4
 		// mat4
 		case GL_FLOAT_MAT4:
 		case GL_FLOAT_MAT4:
-			mtlvar = newMaterialVariable<Mat4>(*glvar, in,
+			mtlvar = MaterialVariableTemplate<Mat4>::_newInstance(*glvar, in,
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 				m_resources->_getAllocator(), m_resources->_getTempAllocator());
 			break;
 			break;
 		// default is error
 		// default is error