Просмотр исходного кода

Creating the MeshBase interface

Panagiotis Christopoulos Charitos 14 лет назад
Родитель
Сommit
153e1eedd1
3 измененных файлов с 67 добавлено и 56 удалено
  1. 4 1
      anki/gl/BufferObject.h
  2. 5 5
      anki/resource/Mesh.cpp
  3. 58 50
      anki/resource/Mesh.h

+ 4 - 1
anki/gl/BufferObject.h

@@ -105,7 +105,10 @@ public:
 	void write(void* buff, size_t offset, size_t size);
 	void write(void* buff, size_t offset, size_t size);
 
 
 	/// If created is run successfully it returns true
 	/// If created is run successfully it returns true
-	bool isCreated() const {return glId != 0;}
+	bool isCreated() const
+	{
+		return glId != 0;
+	}
 
 
 private:
 private:
 	uint glId; ///< The OpenGL id of the BO
 	uint glId; ///< The OpenGL id of the BO

+ 5 - 5
anki/resource/Mesh.cpp

@@ -44,19 +44,19 @@ void Mesh::load(const char* filename)
 //==============================================================================
 //==============================================================================
 void Mesh::createVbos(const MeshData& meshData)
 void Mesh::createVbos(const MeshData& meshData)
 {
 {
-	vbos[VBO_VERT_INDECES].create(
+	vbos[VBO_INDICES].create(
 		GL_ELEMENT_ARRAY_BUFFER,
 		GL_ELEMENT_ARRAY_BUFFER,
 		Util::getVectorSizeInBytes(meshData.getVertIndeces()),
 		Util::getVectorSizeInBytes(meshData.getVertIndeces()),
 		&meshData.getVertIndeces()[0],
 		&meshData.getVertIndeces()[0],
 		GL_STATIC_DRAW);
 		GL_STATIC_DRAW);
 
 
-	vbos[VBO_VERT_POSITIONS].create(
+	vbos[VBO_POSITIONS].create(
 		GL_ARRAY_BUFFER,
 		GL_ARRAY_BUFFER,
 		Util::getVectorSizeInBytes(meshData.getVertCoords()),
 		Util::getVectorSizeInBytes(meshData.getVertCoords()),
 		&meshData.getVertCoords()[0],
 		&meshData.getVertCoords()[0],
 		GL_STATIC_DRAW);
 		GL_STATIC_DRAW);
 
 
-	vbos[VBO_VERT_NORMALS].create(
+	vbos[VBO_NORMALS].create(
 		GL_ARRAY_BUFFER,
 		GL_ARRAY_BUFFER,
 		Util::getVectorSizeInBytes(meshData.getVertNormals()),
 		Util::getVectorSizeInBytes(meshData.getVertNormals()),
 		&meshData.getVertNormals()[0],
 		&meshData.getVertNormals()[0],
@@ -64,7 +64,7 @@ void Mesh::createVbos(const MeshData& meshData)
 
 
 	if(meshData.getVertTangents().size() > 1)
 	if(meshData.getVertTangents().size() > 1)
 	{
 	{
-		vbos[VBO_VERT_TANGENTS].create(
+		vbos[VBO_TANGENTS].create(
 			GL_ARRAY_BUFFER,
 			GL_ARRAY_BUFFER,
 			Util::getVectorSizeInBytes(meshData.getVertTangents()),
 			Util::getVectorSizeInBytes(meshData.getVertTangents()),
 			&meshData.getVertTangents()[0],
 			&meshData.getVertTangents()[0],
@@ -82,7 +82,7 @@ void Mesh::createVbos(const MeshData& meshData)
 
 
 	if(meshData.getVertWeights().size() > 1)
 	if(meshData.getVertWeights().size() > 1)
 	{
 	{
-		vbos[VBO_VERT_WEIGHTS].create(
+		vbos[VBO_WEIGHTS].create(
 			GL_ARRAY_BUFFER,
 			GL_ARRAY_BUFFER,
 			Util::getVectorSizeInBytes(meshData.getVertWeights()),
 			Util::getVectorSizeInBytes(meshData.getVertWeights()),
 			&meshData.getVertWeights()[0],
 			&meshData.getVertWeights()[0],

+ 58 - 50
anki/resource/Mesh.h

@@ -3,7 +3,6 @@
 
 
 #include <boost/array.hpp>
 #include <boost/array.hpp>
 #include "anki/math/Math.h"
 #include "anki/math/Math.h"
-#include "anki/resource/Resource.h"
 #include "anki/gl/Vbo.h"
 #include "anki/gl/Vbo.h"
 #include "anki/collision/Obb.h"
 #include "anki/collision/Obb.h"
 
 
@@ -14,29 +13,35 @@ namespace anki {
 class MeshData;
 class MeshData;
 
 
 
 
-/// XXX
+/// This is the interface class for meshes. Its interface because the skin
+/// nodes override it
 class MeshBase
 class MeshBase
 {
 {
 public:
 public:
-	MeshBase()
-	{}
+	enum VboId
+	{
+		VBO_POSITIONS, ///< VBO never empty
+		VBO_NORMALS, ///< VBO never empty
+		VBO_TANGENTS, ///< VBO never empty
+		VBO_TEX_COORDS, ///< VBO may be empty
+		VBO_INDICES, ///< VBO never empty
+		VBO_WEIGHTS, ///< VBO may be empty
+		VBOS_NUMBER
+	};
 
 
 	virtual ~MeshBase()
 	virtual ~MeshBase()
 	{}
 	{}
 
 
 	/// @name Accessors
 	/// @name Accessors
 	/// @{
 	/// @{
-	virtual const Vbo& getPositionsVbo() const = 0;
-	virtual const Vbo& getNormalsVbo() const = 0;
-	virtual const Vbo& getTangentsVbo() const = 0;
-	virtual const Vbo& getTextureCoordsVbo(uint channel) const = 0;
-	virtual const Vbo& getIndecesVbo(uint lod) const = 0;
-	virtual const Vbo& getWeightsVbo() const = 0;
+
+	/// Get a VBO. Its nullptr if it does not exist
+	virtual const Vbo* getVbo(VboId id) const = 0;
 
 
 	virtual uint getTextureChannelsNumber() const = 0;
 	virtual uint getTextureChannelsNumber() const = 0;
 	virtual uint getLodsNumber() const = 0;
 	virtual uint getLodsNumber() const = 0;
 	virtual uint getIndicesNumber(uint lod) const = 0;
 	virtual uint getIndicesNumber(uint lod) const = 0;
-	virtual uint getVertexNumber(uint lod) const = 0;
+	virtual uint getVerticesNumber(uint lod) const = 0;
 	/// @}
 	/// @}
 
 
 	/// @name Ask for geometry properties
 	/// @name Ask for geometry properties
@@ -46,89 +51,92 @@ public:
 		return getTextureChannelsNumber() > 0;
 		return getTextureChannelsNumber() > 0;
 	}
 	}
 
 
-	virtual bool hasWeights() const;
+	bool hasWeights() const
+	{
+		return getVbo(VBO_WEIGHTS) != NULL;
+	}
+
+	bool hasNormalsAndTangents() const
+	{
+		return getVbo(VBO_NORMALS) && getVbo(VBO_TANGENTS);
+	}
 	/// @}
 	/// @}
 };
 };
 
 
 
 
 /// Mesh Resource. It contains the geometry packed in VBOs
 /// Mesh Resource. It contains the geometry packed in VBOs
-class Mesh
+class Mesh: public MeshBase
 {
 {
 public:
 public:
-	/// Used in @ref vbos array
-	enum Vbos
-	{
-		VBO_VERT_POSITIONS, ///< VBO never empty
-		VBO_VERT_NORMALS, ///< VBO never empty
-		VBO_VERT_TANGENTS, ///< VBO never empty
-		VBO_TEX_COORDS, ///< VBO may be empty
-		VBO_VERT_INDECES, ///< VBO never empty
-		VBO_VERT_WEIGHTS, ///< VBO may be empty
-		VBOS_NUM
-	};
+	typedef boost::array<Vbo, VBOS_NUMBER> VbosArray;
 
 
-	typedef boost::array<Vbo, VBOS_NUM> VbosArray;
+	/// @name Constructors
+	/// @{
 
 
-	/// Default constructor
+	/// Default constructor. Do nothing
 	Mesh()
 	Mesh()
 	{}
 	{}
 
 
+	/// Load file
+	Mesh(const char* filename)
+	{
+		load(filename);
+	}
+	/// @}
+
 	/// Does nothing
 	/// Does nothing
 	~Mesh()
 	~Mesh()
 	{}
 	{}
 
 
 	/// @name Accessors
 	/// @name Accessors
 	/// @{
 	/// @{
-	const Vbo& getVbo(Vbos id) const
-	{
-		return vbos[id];
-	}
 
 
-	uint getVertIdsNum() const
+	/// Implements MeshBase::getVbo
+	const Vbo* getVbo(VboId id) const
 	{
 	{
-		return vertIdsNum;
+		return vbos[id].isCreated() ? &vbos[id] : NULL;
 	}
 	}
 
 
-	const Obb& getVisibilityShape() const
+	/// Implements MeshBase::getTextureChannelsNumber
+	uint getTextureChannelsNumber() const
 	{
 	{
-		return visibilityShape;
+		return vbos[VBO_TEX_COORDS].isCreated() ? 1 : 0;
 	}
 	}
 
 
-	uint getVertsNum() const
+	/// Implements MeshBase::getLodsNumber
+	uint getLodsNumber() const
 	{
 	{
-		return vertsNum;
+		return 1;
 	}
 	}
-	/// @}
 
 
-	/// Load from a file
-	void load(const char* filename);
-
-	/// @name Ask for geometry properties
-	/// @{
-	bool hasTexCoords() const
+	/// Implements MeshBase::getIndicesNumber
+	uint getIndicesNumber(uint) const
 	{
 	{
-		return vbos[VBO_TEX_COORDS].isCreated();
+		return vertIdsNum;
 	}
 	}
 
 
-	bool hasVertWeights() const
+	/// Implements MeshBase::getVerticesNumber
+	uint getVerticesNumber(uint) const
 	{
 	{
-		return vbos[VBO_VERT_WEIGHTS].isCreated();
+		return vertsNum;
 	}
 	}
 
 
-	bool hasNormalsAndTangents() const
+	const Obb& getVisibilityShape() const
 	{
 	{
-		return vbos[VBO_VERT_NORMALS].isCreated() &&
-			vbos[VBO_VERT_TANGENTS].isCreated();
+		return visibilityShape;
 	}
 	}
 	/// @}
 	/// @}
 
 
+	/// Load from a file
+	void load(const char* filename);
+
 private:
 private:
 	VbosArray vbos; ///< The vertex buffer objects
 	VbosArray vbos; ///< The vertex buffer objects
 	uint vertIdsNum; ///< The number of vertex IDs
 	uint vertIdsNum; ///< The number of vertex IDs
 	Obb visibilityShape;
 	Obb visibilityShape;
 	uint vertsNum;
 	uint vertsNum;
 
 
-	/// Create the VBOs
+	/// Create the VBOs using the mesh data
 	void createVbos(const MeshData& meshData);
 	void createVbos(const MeshData& meshData);
 };
 };