www.pudn.com > zfxcengine-0.1.0.zip > ceMesh.cpp


// $Id: ceMesh.cpp,v 1.2 2005/09/22 16:45:45 kimmi Exp $ 
//////////////////////////////////////////////////////////////////////////////// 
// 
//  Module:     Core 
//  File:       ceMesh.cpp 
//  Created:    25.10.2004 21:00:37 
//  Author:     Enrico 
//	Licence:    See licence file in root 
//  Last Mod:	$Id: ceMesh.cpp,v 1.2 2005/09/22 16:45:45 kimmi Exp $ 
// 
//////////////////////////////////////////////////////////////////////////////// 
#include "Geometry/ceMesh.h" 
#include "Core/ceDebug.h" 
#include "Core/ceMemManager.h" 
#include "Core/ceResourceManager.h" 
 
namespace ZFXCE { 
	//------------------------------------------------------------------------------ 
	ceMesh::ceMesh() 
	{ 
		// TODO: add submeshes for all different primitive type 
		this->m_PrimType= CE_RS_PRIM_TRIANGLES; 
		m_bUpdate = true; 
		m_uiSize = 0; 
		m_pResTypeName = NULL; 
		m_pResTypeName = new char[6]; 
		ce_assert (NULL != m_pResTypeName); 
		strncpy(m_pResTypeName, "ceMesh", 6); 
		m_pScratchFile = NULL; 
	} 
	//------------------------------------------------------------------------------ 
	ceMesh::~ceMesh() 
	{ 
		Release(); 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::Release() 
	{ 
		PUSH_FUNCTION; 
 
		m_Vertices.clear(); 
		for(INT i=0; i < CE_RS_TEXUNITMAX; i++) 
			m_TexCoords[i].clear(); 
		m_Normals.clear(); 
 
		for (UINT m=0; m < m_LinkedMeshes.size(); ++m) 
			delete m_LinkedMeshes[m]; 
			 
		m_LinkedMeshes.clear(); 
		m_uiSize = 0; 
		m_bUpdate = true; 
		delete [] m_pResTypeName; 
		 
		m_pResTypeName = NULL; 
	} 
	//------------------------------------------------------------------------------ 
/*	DWORD ceMesh::GetSize() 
	{ 
		if (m_bUpdate) { 
			// XXX: Evil! <- Under win donīt compile 
			//m_uiSize = ((const ceMesh*) this)->GetSize(); 
			return (DWORD) 0; 
		} 
		 
		m_bUpdate = FALSE; 
		 
		return m_uiSize; 
	}*/ 
	//------------------------------------------------------------------------------ 
	size_t ceMesh::GetSize() 
	{ 
		PUSH_FUNCTION; 
 
		const size_t sV3 = sizeof(ceVec3f); 
		size_t s = m_Vertices.size() * sV3; 
		s += m_Normals.size() * sV3; 
		s += m_LinkedMeshes.size() * sizeof(ceMesh); 
		for (UINT t=0; t < CE_RS_TEXUNITMAX; ++t)  
			s += m_TexCoords[t].size() * sizeof(ceVec2f); 
		m_uiSize =(UINT) s; 
		 
		return s; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::Load() 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (NULL != m_pResMgr); 
		if (NULL == m_pScratchFile) { 
			m_pResMgr->Load(this); 
		} 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::Unload() 
	{ 
		PUSH_FUNCTION; 
		 
		ce_assert (NULL != m_pResMgr); 
		if (NULL == m_pScratchFile) { 
			 
		} 
	} 
	//------------------------------------------------------------------------------ 
	bool ceMesh::IsLoaded() const 
	{ 
		PUSH_FUNCTION; 
		 
		return true; 
	} 
	//------------------------------------------------------------------------------ 
	std::vector ceMesh::GetVertices() const 
	{ 
		PUSH_FUNCTION; 
		 
		return m_Vertices; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetVertices(std::vector vVertices) 
	{ 
		PUSH_FUNCTION; 
		 
		m_Vertices = vVertices; 
	} 
	//------------------------------------------------------------------------------ 
	std::vector &ceMesh::GetFaces() 
	{ 
		PUSH_FUNCTION; 
 
		return m_Faces; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetFaces(std::vector vFaces) 
	{ 
		PUSH_FUNCTION; 
 
		m_Faces = vFaces; 
	} 
	//------------------------------------------------------------------------------ 
	std::vector &ceMesh::GetTexCoords(UINT n) 
	{ 
		PUSH_FUNCTION; 
		 
		ce_assert (n < 0 || n >= CE_RS_TEXUNITMAX); 
		return m_TexCoords[n]; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetTexCoords(const UINT uiIndex, std::vector vTexCoords) 
	{ 
		PUSH_FUNCTION; 
		 
		ce_assert (uiIndex > CE_RS_TEXUNITMAX); 
		m_TexCoords[uiIndex] = vTexCoords; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetTexCoordsByName(const std::string strName,  
		std::vector v) 
	{ 
		PUSH_FUNCTION; 
 
		vector::iterator it; 
		int i=0; 
		for (it = m_TextureNames.begin(); it != m_TextureNames.end(); ++it) { 
			if ((*it) == strName) { 
				m_TexCoords[i] = v; 
				return; 
			} 
			++i; 
		} 
		m_TextureNames.push_back(strName); 
		m_TexCoords[m_TextureNames.size()-1] = v; 
	} 
	//------------------------------------------------------------------------------ 
	vector &ceMesh::GetTextureNames() 
	{ 
		PUSH_FUNCTION; 
		return m_TextureNames; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetTextureNames(std::vector vTextureNames) 
	{ 
		PUSH_FUNCTION; 
		m_TextureNames = vTextureNames; 
	} 
	//------------------------------------------------------------------------------ 
	std::vector &ceMesh::GetNormals() 
	{ 
		PUSH_FUNCTION; 
 
		return m_Normals; 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetNormals(std::vector vNormals) 
	{ 
		PUSH_FUNCTION; 
 
		m_Normals = vNormals; 
	} 
	//------------------------------------------------------------------------------ 
	size_t ceMesh::GetNLinkedMeshes() 
	{ 
		return m_LinkedMeshes.size(); 
	} 
	//------------------------------------------------------------------------------ 
	ceMesh* ceMesh::GetLinkedMesh(UINT nr) 
	{ 
		if(nr < 0 || nr >= m_LinkedMeshes.size() ) 
			return NULL; 
 
		return m_LinkedMeshes[nr]; 
	} 
	//------------------------------------------------------------------------------ 
	std::string ceMesh::GetTexture(UINT nr) 
	{ 
		if (nr < 0 || nr > CE_RS_TEXUNITMAX) 
			return "none"; 
 
		return "none"; 
	} 
	//------------------------------------------------------------------------------ 
	bool ceMesh::CalculateLOD(UINT MaxIndices) 
	{ 
		PUSH_FUNCTION; 
	 
		return false; 
	} 
	//------------------------------------------------------------------------------ 
	bool ceMesh::Optimize()  
	{ 
		PUSH_FUNCTION; 
		 
		// TODO 
		return false; 
	} 
	//------------------------------------------------------------------------------ 
	std::string ceMesh::GetName() 
	{ 
		PUSH_FUNCTION; 
	 
		return "XXX: ceMesh::GetName() not implemented."; 
	} 
	//------------------------------------------------------------------------------ 
	bool ceMesh::CalculateNormals() 
	{ 
		PUSH_FUNCTION; 
		// TODO 
 
		return false; 
	} 
	//------------------------------------------------------------------------------ 
	std::vector &ceMesh::GetTTangents() 
	{ 
		PUSH_FUNCTION; 
		// TODO 
		ce_assert ( false && "Not yet implemented"); 
		// XXX: memleak 
		return *(new std::vector()); 
	} 
	//------------------------------------------------------------------------------ 
	bool ceMesh::CalculateTangents() 
	{ 
		PUSH_FUNCTION; 
		// TODO 
 
		return false; 
	} 
	//------------------------------------------------------------------------------ 
	std::vector &ceMesh::GetSTangents() 
	{ 
		PUSH_FUNCTION; 
		 
		ce_assert ( false && "Not yet implemented"); 
		// XXX: memleak 
		return *(new std::vector()); 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::SetTTangents(std::vector vTangents) 
	{ 
		PUSH_FUNCTION; 
 
		// TODO: Add managed tangents 
	} 
	//------------------------------------------------------------------------------ 
	void ceMesh::Dump() 
	{ 
		PUSH_FUNCTION; 
 
		cout << "Name : " << m_Name << endl; 
		cout << "Whole size         : " << (UINT) GetSize() << endl;; 
		cout << "Number of vertices : " << (UINT) m_Vertices.size() << endl; 
		cout << "Number of indices  : " << (UINT) m_vIndices.size() << endl; 
		cout << "Number of normals  : " << (UINT) m_Normals.size() << endl; 
		cout << "Number of textures : " << (UINT) m_TextureNames.size() << endl; 
		cout << "Number of faces    : " << (UINT) m_Faces.size() << endl;	 
		cout << "Number of Colors   : " << (UINT) m_Colors.size() << endl; 
	} 
	//------------------------------------------------------------------------------ 
 
} // Namespace ZFXCE