فهرست منبع

Transform feedback hardware skinning WIP

Panagiotis Christopoulos Charitos 15 سال پیش
والد
کامیت
12ca6fb717
5فایلهای تغییر یافته به همراه68 افزوده شده و 184 حذف شده
  1. 0 1
      build/debug/Makefile
  2. 9 127
      src/Resources/Model.cpp
  3. 8 42
      src/Resources/Model.h
  4. 43 0
      src/Resources/ModelPatch.cpp
  5. 8 14
      src/Resources/ModelPatch.h

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1
build/debug/Makefile


+ 9 - 127
src/Resources/Model.cpp

@@ -38,15 +38,15 @@ void Model::load(const char* filename)
   		skeleton.loadRsrc(skelName.get().c_str());
   	}
 
-  	// subModels
-  	BOOST_FOREACH(const ptree::value_type& v, pt.get_child("subModels"))
+  	// modelPatches
+  	BOOST_FOREACH(const ptree::value_type& v, pt.get_child("modelPatches"))
   	{
   		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");
 
-  		SubModel* sub = new SubModel();
-  		subModels.push_back(sub);
+  		ModelPatch* sub = new ModelPatch();
+  		modelPatches.push_back(sub);
   		sub->load(mesh.c_str(), material.c_str(), dpMaterial.c_str());
   	}
 
@@ -80,23 +80,18 @@ void Model::load(const char* filename)
 			// Bone number problem
 			if(skelAnims[i]->bones.size() != skeleton->bones.size())
 			{
-				throw EXCEPTION("SkelAnim \"" + skelAnims[i]->getRsrcName() + "\" and Skeleton \"" +
+				throw EXCEPTION("Skeleton animation \"" + skelAnims[i]->getRsrcName() + "\" and skeleton \"" +
 				                skeleton->getRsrcName() + "\" dont have equal bone count");
 			}
 		}
 
-		for(uint i = 0; i < subModels.size(); i++)
+		if(hasSkeleton())
 		{
-			if(hasSkeleton())
+			for(uint i = 0; i < modelPatches.size(); i++)
 			{
-				if(!subModels[i].hasHwSkinning())
+				if(!modelPatches[i].supportsHardwareSkinning())
 				{
-					throw EXCEPTION("SubModel " + boost::lexical_cast<std::string>(i) + " material does not have HW skinning");
-				}
-
-				if(!subModels[i].hasHwSkinning())
-				{
-					throw EXCEPTION("SubModel " + boost::lexical_cast<std::string>(i) + " DP material does not have HW skinning");
+					throw EXCEPTION("Mesh " + modelPatches[i].getMesh().getRsrcName() + " does not support HW skinning");
 				}
 			}
 		}
@@ -106,116 +101,3 @@ void Model::load(const char* filename)
 		throw EXCEPTION("Model \"" + filename + "\": " + e.what());
 	}
 }
-
-
-//======================================================================================================================
-// hasHwSkinning                                                                                                       =
-//======================================================================================================================
-bool Model::SubModel::hasHwSkinning() const
-{
-	return material->hasHwSkinning();
-}
-
-
-//======================================================================================================================
-// load                                                                                                                =
-//======================================================================================================================
-void Model::SubModel::load(const char* meshFName, const char* mtlFName, const char* dpMtlFName)
-{
-	//
-	// Load
-	//
-	mesh.loadRsrc(meshFName);
-	material.loadRsrc(mtlFName);
-	dpMaterial.loadRsrc(dpMtlFName);
-
-	//
-	// Sanity checks
-	//
-	#define EXCEPTION_INCOMPATIBLE_RSRCS(x, y) \
-		EXCEPTION("Resource \"" + x->getRsrcName() + "\" and \"" + y->getRsrcName() + "\" are incompatible")
-
-	// if mtl needs tex coords then mesh should have
-	if(material->hasTexCoords() && !mesh->hasTexCoords())
-	{
-		throw EXCEPTION_INCOMPATIBLE_RSRCS(material, mesh);
-	}
-
-	if(dpMaterial->hasTexCoords() && !mesh->hasTexCoords())
-	{
-		throw EXCEPTION_INCOMPATIBLE_RSRCS(dpMaterial, mesh);
-	}
-
-	// if mtl needs weights then mesh should have
-	if(material->hasHwSkinning() && !mesh->hasVertWeights())
-	{
-		throw EXCEPTION_INCOMPATIBLE_RSRCS(material, mesh);
-	}
-
-	if(dpMaterial->hasHwSkinning() && !mesh->hasVertWeights())
-	{
-		throw EXCEPTION_INCOMPATIBLE_RSRCS(dpMaterial, mesh);
-	}
-
-	//
-	// VAOs
-	//
-	createVao(*material, *mesh, vao);
-	createVao(*dpMaterial, *mesh, dpVao);
-}
-
-
-//======================================================================================================================
-// createVao                                                                                                           =
-//======================================================================================================================
-void Model::SubModel::createVao(const Material& mtl, const Mesh& mesh, Vao& vao)
-{
-	vao.create();
-
-	if(mtl.getStdAttribVar(Material::SAV_POSITION) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_POSITIONS), *mtl.getStdAttribVar(Material::SAV_POSITION),
-		                         3, GL_FLOAT, GL_FALSE, 0, NULL);
-	}
-
-	if(mtl.getStdAttribVar(Material::SAV_NORMAL) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_NORMALS), *mtl.getStdAttribVar(Material::SAV_NORMAL),
-		                         3, GL_FLOAT, GL_FALSE, 0, NULL);
-	}
-
-	if(mtl.getStdAttribVar(Material::SAV_TANGENT) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_TANGENTS), *mtl.getStdAttribVar(Material::SAV_TANGENT),
-		                         4, GL_FLOAT, GL_FALSE, 0, NULL);
-	}
-
-	if(mtl.getStdAttribVar(Material::SAV_TEX_COORDS) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_TEX_COORDS), *mtl.getStdAttribVar(Material::SAV_TEX_COORDS),
-		                         2, GL_FLOAT, GL_FALSE, 0, NULL);
-	}
-
-	if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONES_NUM) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS),
-		                         *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONES_NUM), 1,
-		                         GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(0));
-	}
-
-	if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONE_IDS) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS),
-		                         *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONE_IDS), 4,
-		                         GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(4));
-	}
-
-	if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_WEIGHTS) != NULL)
-	{
-		vao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS),
-		                         *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_WEIGHTS), 4,
-		                         GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(20));
-	}
-
-	vao.attachElementArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_INDECES));
-}

+ 8 - 42
src/Resources/Model.h

@@ -6,6 +6,7 @@
 #include "RsrcPtr.h"
 #include "Object.h"
 #include "Vao.h"
+#include "ModelPatch.h"
 
 
 class Mesh;
@@ -20,15 +21,15 @@ class Scanner;
 /// XML file format:
 /// @code
 /// <model>
-/// 	<subModels>
-/// 		<subModel>
+/// 	<modelPatches>
+/// 		<modelPatch>
 /// 			<mesh>path/to/mesh.mesh</mesh>
 /// 			<material>path/to/material.mtl</material>
 /// 			<dpMaterial>path/to/dp.mtl</dpMaterial>
-/// 		</subModel>
+/// 		</modelPatch>
 /// 		...
-/// 		<subModel>...</subModel>
-/// 	</subModels>
+/// 		<modelPatch>...</modelPatch>
+/// 	</modelPatches>
 /// 	<skeleton>path/to/skeleton.skel</skeleton>
 /// 	<skelAnims>
 /// 		<skelAnim>path/to/anim0.sanim</skelAnim>
@@ -45,48 +46,13 @@ class Scanner;
 class Model: public Resource
 {
 	public:
-		/// This is basically a container around mesh and materials. It also has the VAOs.
-		class SubModel
-		{
-			public:
-				SubModel(){}
-
-				/// Load the resources
-				void load(const char* meshFName, const char* mtlFName, const char* dpMtlFName);
-
-				/// Creates a VAO for an individual SubModel
-				/// @param[in] material Needed for the shader program uniform variables
-				/// @param[in] mesh For providing the VBOs
-				/// @param[in,out] subModel For setting a parent to the vao
-				/// @param[out] vao The output
-				static void createVao(const Material& material, const Mesh& mesh, Vao& vao);
-
-				/// @name Accessors
-				/// @{
-				const Mesh& getMesh() const {return *mesh;}
-				const Material& getMaterial() const {return *material;}
-				const Material& getDpMaterial() const {return *dpMaterial;}
-				const Vao& getVao() const {return vao;}
-				const Vao& getDpVao() const {return dpVao;}
-				/// @}
-
-				bool hasHwSkinning() const;
-
-			private:
-				RsrcPtr<Mesh> mesh; ///< The geometry
-				RsrcPtr<Material> material; ///< Material for MS and BS
-				RsrcPtr<Material> dpMaterial; ///< Material for depth passes
-				Vao vao; ///< Normal VAO for MS and BS
-				Vao dpVao; ///< Depth pass VAO for SM and EarlyZ
-		};
-
 		Model(): Resource(RT_MODEL) {}
 
 		void load(const char* filename);
 
 		/// @name Accessors
 		/// @{
-		const boost::ptr_vector<SubModel>& getSubModels() const {return subModels;}
+		const boost::ptr_vector<ModelPatch>& getModelPatches() const {return modelPatches;}
 		const Skeleton& getSkeleton() const;
 		const Vec<RsrcPtr<SkelAnim> >& getSkelAnims() const {return skelAnims;}
 		/// @}
@@ -94,7 +60,7 @@ class Model: public Resource
 		bool hasSkeleton() const {return skeleton.get() != NULL;}
 
 	private:
-		boost::ptr_vector<SubModel> subModels; ///< The vector of SubModel
+		boost::ptr_vector<ModelPatch> modelPatches; ///< The vector of SubModel
 		RsrcPtr<Skeleton> skeleton; ///< The skeleton. It can be empty
 		Vec<RsrcPtr<SkelAnim> > skelAnims; ///< The standard skeleton animations
 };

+ 43 - 0
src/Resources/ModelPatch.cpp

@@ -0,0 +1,43 @@
+#include "ModelPatch.h"
+#include "Mesh.h"
+#include "Material.h"
+
+
+//======================================================================================================================
+// supportsHardwareSkinning                                                                                            =
+//======================================================================================================================
+bool ModelPatch::supportsHardwareSkinning() const
+{
+	return mesh->hasVertWeights();
+}
+
+
+//======================================================================================================================
+// load                                                                                                                =
+//======================================================================================================================
+void ModelPatch::load(const char* meshFName, const char* mtlFName, const char* dpMtlFName)
+{
+	//
+	// Load
+	//
+	mesh.loadRsrc(meshFName);
+	material.loadRsrc(mtlFName);
+	dpMaterial.loadRsrc(dpMtlFName);
+
+	//
+	// Sanity checks
+	//
+	#define EXCEPTION_INCOMPATIBLE_RSRCS(x, y) \
+		EXCEPTION("Resource \"" + x->getRsrcName() + "\" and \"" + y->getRsrcName() + "\" are incompatible")
+
+	// if mtl needs tex coords then mesh should have
+	if(material->hasTexCoords() && !mesh->hasTexCoords())
+	{
+		throw EXCEPTION_INCOMPATIBLE_RSRCS(material, mesh);
+	}
+
+	if(dpMaterial->hasTexCoords() && !mesh->hasTexCoords())
+	{
+		throw EXCEPTION_INCOMPATIBLE_RSRCS(dpMaterial, mesh);
+	}
+}

+ 8 - 14
src/Resources/ModelPatch.h

@@ -1,40 +1,34 @@
 #ifndef MODEL_PATCH_H
 #define MODEL_PATCH_H
 
-#include ""
+#include "RsrcPtr.h"
 
 
-/// A part of the Model
+class Mesh;
+class Material;
+
+
+/// Its one part of the many used in the Model class. Its basically a container
 class ModelPatch
 {
 	public:
 		/// Load the resources
 		void load(const char* meshFName, const char* mtlFName, const char* dpMtlFName);
 
-		/// Creates a VAO for an individual ModelPatch
-		/// @param[in] material Needed for the shader program uniform variables
-		/// @param[in] mesh For providing the VBOs
-		/// @param[in,out] subModel For setting a parent to the vao
-		/// @param[out] vao The output
-		static void createVao(const Material& material, const Mesh& mesh, Vao& vao);
-
 		/// @name Accessors
 		/// @{
 		const Mesh& getMesh() const {return *mesh;}
 		const Material& getMaterial() const {return *material;}
 		const Material& getDpMaterial() const {return *dpMaterial;}
-		const Vao& getVao() const {return vao;}
-		const Vao& getDpVao() const {return dpVao;}
 		/// @}
 
-		bool hasHwSkinning() const;
+		bool supportsHardwareSkinning() const;
 
 	private:
 		RsrcPtr<Mesh> mesh; ///< The geometry
 		RsrcPtr<Material> material; ///< Material for MS and BS
 		RsrcPtr<Material> dpMaterial; ///< Material for depth passes
-		Vao vao; ///< Normal VAO for MS and BS
-		Vao dpVao; ///< Depth pass VAO for SM and EarlyZ
 };
 
+
 #endif

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است