Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*
* HPL1 Engine is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HPL1 Engine is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HPL1 Engine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef HPL_MESH_LOADER_COLLADA_H
#define HPL_MESH_LOADER_COLLADA_H
#include "math/MathTypes.h"
#include "resources/MeshLoader.h"
#include "graphics/VertexBuffer.h"
#include "physics/PhysicsJoint.h"
#include "system/MemoryManager.h"
class TiXmlElement;
namespace hpl {
class cMesh;
class cNode3D;
class iVertexBuffer;
class cBone;
class cAnimation;
class cAnimationTrack;
class cSkeleton;
class cWorld3D;
class cSector;
class cMeshEntity;
class iPhysicsBody;
class cColliderEntity;
class cMeshJoint;
class cSystem;
//////////////////////////////////////////////
// HELP CLASSES
class cColladaImage
{
public:
tString msId;
tString msName;
tString msSource;
};
typedef std::vector<cColladaImage> tColladaImageVec;
//------------------------------------------------
class cColladaTexture
{
public:
tString msId;
tString msName;
tString msImage;
};
typedef std::vector<cColladaTexture> tColladaTextureVec;
//------------------------------------------------
class cColladaMaterial
{
public:
tString msId;
tString msName;
tString msTexture;
cColor mDiffuseColor;
};
typedef std::vector<cColladaMaterial> tColladaMaterialVec;
//------------------------------------------------
class cColladaLight
{
public:
tString msId;
tString msName;
tString msType;
cColor mDiffuseColor;
float mfAngle;
};
typedef std::vector<cColladaLight> tColladaLightVec;
//------------------------------------------------
class cColladaVtxArray
{
public:
cColladaVtxArray() : mbIsInVertex(false){}
tString msId;
tString msType;
bool mbIsInVertex;
tVector3fVec mvArray;
};
typedef std::vector<cColladaVtxArray> tColladaVtxArrayVec;
class cColladaVtxIndex
{
public:
int mlVtx;
int mlNorm;
int mlTex;
};
typedef std::vector<cColladaVtxIndex> tColladaVtxIndexVec;
//------------------------------------------------
class cColladaExtraVtx
{
public:
cColladaExtraVtx(int alVtx,int alNorm,int alTex,int alNewVtx)
{
mlVtx = alVtx;
mlNorm = alNorm;
mlTex = alTex;
mlNewVtx = alNewVtx;
}
cColladaExtraVtx(){}
int mlVtx;
int mlNorm;
int mlTex;
int mlNewVtx;
bool Equals(const cColladaVtxIndex& aData)
{
if(mlVtx == aData.mlVtx && mlNorm == aData.mlNorm && mlTex == aData.mlTex)
{
return true;
}
return false;
}
};
typedef std::list<cColladaExtraVtx> tColladaExtraVtxList;
typedef tColladaExtraVtxList::iterator tColladaExtraVtxListIt;
typedef std::vector<tColladaExtraVtxList> tColladaExtraVtxListVec;
//------------------------------------------------
class cColladaGeometry
{
public:
cColladaGeometry() : mlPosArrayIdx(-1),mlNormArrayIdx(-1),mlTexArrayIdx(-1),
mlPosIdxNum(-1),mlNormIdxNum(-1),mlTexIdxNum(-1) {}
void Clear()
{
mvIndices.clear();
for(int i=0; i<(int)mvArrayVec.size();i++)
{
mvArrayVec[i].mvArray.clear();
}
/*mvVertexVec.clear();
mvIndexVec.clear();
mvExtraVtxVec.clear();*/
}
tString msId;
tString msName;
tVertexVec mvVertexVec;
tUIntVec mvIndexVec;
tColladaExtraVtxListVec mvExtraVtxVec;
tFloatVec mvTangents;
tString msMaterial;
//THe following are ONLY used when loading from a geometry element.!!
tColladaVtxArrayVec mvArrayVec;
tColladaVtxIndexVec mvIndices;
int mlPosIdxNum; //The position in the triangle element
int mlNormIdxNum; //for eternal use only
int mlTexIdxNum;
int mlPosArrayIdx; //The index for array containing positions
int mlNormArrayIdx; //The index for array containing normals
int mlTexArrayIdx; //The index for array containing texcoords
};
typedef std::vector<cColladaGeometry> tColladaGeometryVec;
//------------------------------------------------
class cColladaJointPair
{
public:
cColladaJointPair(){}
cColladaJointPair(int alJoint, int alWeight)
{
mlJoint = alJoint;
mlWeight = alWeight;
}
int mlJoint;
int mlWeight;
};
typedef std::list<cColladaJointPair> tColladaJointPairList;
typedef tColladaJointPairList::iterator tColladaJointPairListIt;
typedef std::vector<tColladaJointPairList> tColladaJointPairListVec;
class cColladaController
{
public:
cColladaController() : mlJointPairIdx(-1), mlWeightPairIdx(-1){}
tString msTarget;
tString msId;
cMatrixf m_mtxBindShapeMatrix;
int mlJointPairIdx;
int mlWeightPairIdx;
tStringVec mvJoints;
tFloatVec mvWeights;
tMatrixfVec mvMatrices;
tColladaJointPairListVec mvPairs;
};
typedef std::vector<cColladaController> tColladaControllerVec;
//------------------------------------------------
class cColladaChannel
{
public:
tString msId;
tString msTarget;
tString msSource;
};
typedef std::vector<cColladaChannel> tColladaChannelVec;
class cColladaSampler
{
public:
tString msId;
tString msTimeArray;
tString msValueArray;
tString msTarget;
};
typedef std::vector<cColladaSampler> tColladaSamplerVec;
class cColladaAnimSource
{
public:
tString msId;
tFloatVec mvValues;
};
typedef std::vector<cColladaAnimSource> tColladaAnimSourceVec;
class cColladaAnimation
{
public:
tString msId;
//tString msName;
tString msTargetNode;
tColladaChannelVec mvChannels;
tColladaSamplerVec mvSamplers;
tColladaAnimSourceVec mvSources;
tFloatVec* GetSourceVec(const tString& asId)
{
for(size_t i=0; i< mvSources.size(); i++)
{
if(mvSources[i].msId == asId)
{
return &mvSources[i].mvValues;
}
}
return NULL;
}
};
typedef std::vector<cColladaAnimation> tColladaAnimationVec;
//------------------------------------------------
class cColladaTransform
{
public:
tString msSid;
tString msType;
tFloatVec mvValues;
};
typedef std::list<cColladaTransform> tColladaTransformList;
typedef tColladaTransformList::iterator tColladaTransformListIt;
class cColladaNode;
typedef std::list<cColladaNode*> tColladaNodeList;
typedef tColladaNodeList::iterator tColladaNodeListIt;
class cColladaNode
{
public:
cColladaNode() : mlCount(0), pParent(NULL), mvScale(1,1,1) {}
tString msId;
tString msName;
tString msType;
tString msSource;
bool mbSourceIsFile;
cMatrixf m_mtxTransform;
cMatrixf m_mtxWorldTransform;
cColladaNode *pParent;
cVector3f mvScale;
int mlCount;
tColladaNodeList mlstChildren;
tColladaTransformList mlstTransforms;
/*void DeleteChildren()
{
STLDeleteAll(mlstChildren);
}*/
cColladaNode* CreateChild()
{
cColladaNode *pNode = hplNew( cColladaNode, () );
mlstChildren.push_back(pNode);
pNode->pParent = this;
return pNode;
}
cColladaTransform* GetTransform(const tString &asSid)
{
tColladaTransformListIt it = mlstTransforms.begin();
for(; it != mlstTransforms.end(); it++)
{
cColladaTransform &Trans = *it;
if(Trans.msSid == asSid)
{
return &Trans;
}
}
return NULL;
}
};
class cColladaScene
{
public:
cColladaScene()
{
mRoot.m_mtxTransform = cMatrixf::Identity;
mRoot.m_mtxWorldTransform = cMatrixf::Identity;
mfDeltaTime =0;
}
~cColladaScene()
{
//mRoot.DeleteChildren();
STLDeleteAll(mlstNodes);
}
void ResetNodes()
{
STLDeleteAll(mlstNodes);
mRoot.mlstChildren.clear();
}
cColladaNode* GetNode(const tString asId)
{
tColladaNodeListIt it = mlstNodes.begin();
for(; it != mlstNodes.end();++it)
{
cColladaNode *pNode = *it;
if(pNode->msId == asId || pNode->msName == asId)
{
return pNode;
}
}
return NULL;
}
cColladaNode* GetNodeFromSource(const tString asSource)
{
tColladaNodeListIt it = mlstNodes.begin();
for(; it != mlstNodes.end();++it)
{
cColladaNode *pNode = *it;
if(pNode->msSource == asSource)
{
return pNode;
}
}
return NULL;
}
float mfStartTime;
float mfEndTime;
float mfDeltaTime;
cColladaNode mRoot;
tColladaNodeList mlstNodes;
};
//------------------------------------------------
class cMeshLoaderCollada : public iMeshLoader
{
public:
cMeshLoaderCollada(iLowLevelGraphics *apLowLevelGraphics);
~cMeshLoaderCollada();
cMesh* LoadMesh(const tString& asFile, tMeshLoadFlag aFlags);
bool SaveMesh(cMesh* apMesh,const tString& asFile){return false;}
cWorld3D* LoadWorld(const tString& asFile, cScene* apScene,tWorldLoadFlag aFlags);
cAnimation* LoadAnimation(const tString& asFile);
bool IsSupported(const tString asFileType);
void AddSupportedTypes(tStringVec* avFileTypes);
private:
bool mbZToY;
tWorldLoadFlag mFlags;
tString GetParentName(cColladaNode *apNode, tColladaGeometryVec *apColladaGeometries);
void CreateMeshJoint(cMeshJoint* apJoint,ePhysicsJointType aJointType,cBoundingVolume &aBV,
tStringVec &avStrings,cColladaNode* apNode,cColladaScene &aColladaScene,
tColladaGeometryVec &avColladaGeom);
void CreateHierarchyNodes(cMesh *apMesh, cNode3D* mpParentNode,
cColladaNode* apColladaNode,
tColladaGeometryVec &avColladaGeom);
cColladaGeometry* GetGeometry(const tString& asId, tColladaGeometryVec &avGeomVec);
cColladaLight* GetLight(const tString& asId, tColladaLightVec &avLightVec);
cMeshEntity* CreateStaticMeshEntity(cColladaNode* apNode, cWorld3D *apWorld,
cColladaGeometry *apGeom,bool abInRoomGroup,
tColladaMaterialVec &avColladaMaterials,
tColladaTextureVec &avColladaTextures,
tColladaImageVec &avColladaImages);
cColliderEntity* CreateStaticCollider(cColladaNode* apNode, cWorld3D *apWorld,
cColladaGeometry *apGeom,
tColladaMaterialVec &avColladaMaterials,
tColladaTextureVec &avColladaTextures,
tColladaImageVec &avColladaImages,
bool abCharacterCollider);
void AddSceneObjects(cColladaNode* apNode, cWorld3D *apWorld,
tColladaGeometryVec &avColladaGeometries,tColladaLightVec &avColladaLights,
tColladaMaterialVec &avColladaMaterials, tColladaTextureVec &avColladaTextures,
tColladaImageVec &avColladaImages,cColladaScene *apColladaScene);
void AddSectorChildren(cColladaNode* apNode, tString asSector, cWorld3D *apWorld,
tColladaGeometryVec &avColladaGeometries,tColladaLightVec &avColladaLights,
tColladaMaterialVec &avColladaMaterials,tColladaTextureVec &avColladaTextures,
tColladaImageVec &avColladaImages);
cAnimationTrack* CreateAnimTrack(cAnimation *apAnimation , cSkeleton *apSkeleton,
cColladaAnimation &aAnim, cColladaScene *apScene);
void CalcLocalMatrixRec(cBone* apBone, cMatrixf a_mtxParentGlobal, int alDepth);
void CreateSkeletonBone(cColladaNode* apColladaNode, cBone* apParentBone);
iVertexBuffer *CreateVertexBuffer(cColladaGeometry & aGeometry,
eVertexBufferUsageType aUsageType);
//tColladaExtraVtxListVec &vExtraVtxVec);
bool FillStructures(const tString &asFile,
tColladaImageVec *apColladaImageVec,
tColladaTextureVec *apColladaTextureVec,
tColladaMaterialVec *apColladaMaterialVec,
tColladaLightVec *apColladaLightVec,
tColladaGeometryVec *apColladaGeometryVec,
tColladaControllerVec *apColladaControllerVec,
tColladaAnimationVec *apColladaAnimVec,
cColladaScene *apColladaScene,
bool abCache);
bool SaveStructures(const tString &asFile,
tColladaImageVec *apColladaImageVec,
tColladaTextureVec *apColladaTextureVec,
tColladaMaterialVec *apColladaMaterialVec,
tColladaLightVec *apColladaLightVec,
tColladaGeometryVec *apColladaGeometryVec,
tColladaControllerVec *apColladaControllerVec,
tColladaAnimationVec *apColladaAnimVec,
cColladaScene *apColladaScene);
bool LoadStructures(const tString &asFile,
tColladaImageVec *apColladaImageVec,
tColladaTextureVec *apColladaTextureVec,
tColladaMaterialVec *apColladaMaterialVec,
tColladaLightVec *apColladaLightVec,
tColladaGeometryVec *apColladaGeometryVec,
tColladaControllerVec *apColladaControllerVec,
tColladaAnimationVec *apColladaAnimVec,
cColladaScene *apColladaScene);
void LoadColladaScene(TiXmlElement* apRootElem,cColladaNode *apParentNode, cColladaScene *apScene,
tColladaLightVec *apColladaLightVec);
void LoadAnimations(TiXmlElement* apRootElem, tColladaAnimationVec &avAnimations,
cColladaScene *apColladaScene);
void LoadImages(TiXmlElement* apRootElem, tColladaImageVec &avColladaImageVec);
void LoadTextures(TiXmlElement* apRootElem, tColladaTextureVec &avColladaTextureVec);
void LoadMaterials(TiXmlElement* apRootElem, tColladaMaterialVec &avColladaMaterialVec);
void LoadLights(TiXmlElement* apRootElem, tColladaLightVec &avColladaLightVec);
void LoadGeometry(TiXmlElement* apRootElem, tColladaGeometryVec &avColladaGeometryVec, cColladaScene *apColladaScene);
void LoadVertexData(TiXmlElement* apSourceElem, tVector3fVec &avVtxVec);
void LoadControllers(TiXmlElement* apRootElem, tColladaControllerVec &avColladaControllerVec,
tColladaGeometryVec *apColladaGeometryVec);
void LoadJointData(TiXmlElement* apSourceElem, cColladaController &aController);
//Helpers
void SplitVertices(cColladaGeometry &aGeometry,tColladaExtraVtxListVec &avExtraVtxVec,
tVertexVec &avVertexVec, tUIntVec &avIndexVec);
void FillVertexVec(const char* apChars,tVector3fVec &avVtxVec, int alElements, int alVtxCount);
tString GetTopString(const tString asPath);
tString GetMaterialTextureFile(const tString &asMaterial, tColladaMaterialVec &avColladaMaterialVec,
tColladaTextureVec &avColladaTextureVec,
tColladaImageVec &avColladaImageVec);
cVector3f GetVectorPos(const cVector3f &avVec);
cVector3f GetVectorPosFromPtr(float *apVec);
cVector3f GetVectorScaleFromPtr(float *apVec);
};
};
#endif // HPL_MESH_LOADER_COLLADA_H