reman3/Rayman_X/cpa/Appli/ModExp/ModObject.cpp

174 lines
3.7 KiB
C++

#include "StdAfx.h"
#include ".\modobject.h"
CModObject::CModObject(INode *_node, TimeValue _time)
{
m_ValidObj = false;
ObjectState os = _node->EvalWorldState(_time);
TriObject *triObject = (TriObject *)os.obj->ConvertToType(_time, triObjectClassID);
Mesh &mesh = triObject->GetMesh();
m_mesh = &mesh;
Mtl* material = _node->GetMtl();
m_nbrVrtx = 0;
if (material == NULL)
{
assert(0);
return;
}
m_nbrIds = material->NumSubMtls();
m_nbrFaces = mesh.getNumFaces();
assert(m_nbrFaces < 65530);
assert(mesh.getNumVerts() < 65530);
if ((m_nbrIds == 0) ||
(m_nbrFaces == 0) ||
(mesh.getNumVerts() == 0))
{
assert(0);
return;
}
strcpy(m_name,_node->GetName());
for (int i = 0; i < m_nbrIds; i++)
{
Mtl* sub = material->GetSubMtl(i);
if (sub)
{
CModElem * elem;
elem = new CModElem(sub->GetName(), sub);
m_elements.push_back(elem);
}
}
// test with & without
m_mesh->buildNormals();
for (int i = 0; i < m_nbrFaces; i++) {
Face face = mesh.faces[i];
TVFace tvFace = mesh.tvFace[i];
unsigned long UV0, UV1, UV2, V0,V1,V2;
MtlID elemIdx = face.getMatID();
UV0 = AddUV(elemIdx, mesh.tVerts[tvFace.t[0]].x, mesh.tVerts[tvFace.t[0]].y);
UV1 = AddUV(elemIdx, mesh.tVerts[tvFace.t[1]].x, mesh.tVerts[tvFace.t[1]].y);
UV2 = AddUV(elemIdx, mesh.tVerts[tvFace.t[2]].x, mesh.tVerts[tvFace.t[2]].y);
V0 = AddVerxt(face.v[0]);
V1 = AddVerxt(face.v[1]);
V2 = AddVerxt(face.v[2]);
Point3 FaceNormal = m_mesh->getFaceNormal(i);
//FaceNormal.Normalize();
if ((V0 != V1) &&
(V0 != V2) &&
(V2 != V1))
{
AddFace(elemIdx, V0, V1, V2, UV0, UV1, UV2, FaceNormal.x, FaceNormal.y, FaceNormal.z);
}
}
m_nbrVrtx = (unsigned long)m_Vertxs.size();
m_ValidObj = true;
}
unsigned long CModObject::AddVerxt(DWORD _index)
{
Point3 vert;
Point3 norm;
vert = m_mesh->verts[_index];
norm = m_mesh->getRVert(_index).rn.getNormal();
CVrtx myVect(vert.x,vert.y,vert.z,norm.x,norm.y,norm.z);
std::vector <CVrtx>::iterator Iter;
unsigned long i = 0;
for ( Iter = m_Vertxs.begin( ); Iter != m_Vertxs.end( ); Iter++ )
{
if (*Iter == myVect)
return i;
i++;
}
m_Vertxs.push_back(myVect);
return i;
}
CModObject::~CModObject(void)
{
std::vector <CModElem*>::iterator Iter;
for ( Iter = m_elements.begin( ); Iter != m_elements.end( ); Iter++ )
{
delete *Iter;
}
m_elements.clear();
m_Vertxs.clear();
}
CModElem::CModElem(char* _name, Mtl* _material)
{
strcpy(m_name,_name);
m_material = _material;
}
bool CVrtx::operator==(const CVrtx& rSrc) const{
if( (abs(x - rSrc.x) < 0.001) &&
(abs(y - rSrc.y) < 0.001) &&
(abs(z - rSrc.z) < 0.001) )
return true;
else
return false;
}
void CModObject::AddFace(MtlID _ElemIndex,
unsigned long _i, unsigned long _j, unsigned long _k,
unsigned long _iUV, unsigned long _jUV, unsigned long _kUV,
float _nx, float _ny, float _nz)
{
m_elements[_ElemIndex]->m_Faces.push_back(CFace(_i,_j,_k, _iUV, _jUV, _kUV, _nx, _ny, _nz));
}
unsigned long CModObject::AddUV(MtlID _ElemIndex, float _u, float _v)
{
unsigned long i = 0;
CModElem * elem = m_elements[_ElemIndex];
std::vector <CUV>::iterator IterUV;
for (IterUV = elem->m_UVs.begin(); IterUV < elem->m_UVs.end(); IterUV ++)
{
if (*IterUV == CUV(_u,_v))
return i;
i++;
}
elem->m_UVs.push_back(CUV(_u,_v));
return i;
}
CFace::CFace(unsigned long _I,unsigned long _J,unsigned long _K,
unsigned long _IUV,unsigned long _JUV,unsigned long _KUV,
float _nx, float _ny, float _nz)
{
I=_I; J=_J; K=_K;
IUV=_IUV; JUV=_JUV; KUV=_KUV;
nx = _nx; ny = _ny; nz = _nz;
}
bool CUV::operator==(const CUV& rSrc) const
{
if( (U == rSrc.U) &&
(V == rSrc.V))
return true;
else
return false;
}
CUV::CUV(float _U,float _V)
{
U=_U; V=_V;
}