finally fix the multimesh bug!

This commit is contained in:
granzuglia 2006-08-11 11:09:40 +00:00
parent 12e2b13e02
commit f1dc38a271
1 changed files with 237 additions and 21 deletions

View File

@ -4,7 +4,7 @@
//importer for collada's files //importer for collada's files
#include <FCollada.h> #include <FCollada.h>
#include <FUtils/FUStringConversion.h> //#include <FUtils/FUStringConversion.h>
#include <FCDocument/FCDocument.h> #include <FCDocument/FCDocument.h>
#include <FCDocument/FCDLibrary.h> #include <FCDocument/FCDLibrary.h>
#include <FCDocument/FCDGeometry.h> #include <FCDocument/FCDGeometry.h>
@ -58,15 +58,22 @@ public:
static int Open(OpenMeshType& m,const char* filename) static int Open(OpenMeshType& m,const char* filename)
{ {
assert(filename!=0); assert(filename!=0);
FCDocument* doc = new FCDocument(); FCDocument* doc = new FCDocument();
FUStatus st = doc->LoadFromFile(FUStringConversion::ToFString(filename)); FUStatus st = doc->LoadFromFile(FUStringConversion::ToFString(filename));
if (st.IsFailure()) if (st.IsFailure())
{
delete doc;
doc = NULL;
return E_CANTOPEN; return E_CANTOPEN;
}
FCDGeometryLibrary* geolib = doc->GetGeometryLibrary(); FCDGeometryLibrary* geolib = doc->GetGeometryLibrary();
if (geolib->IsEmpty()) return E_NOGEOMETRYLIBRARY; if (geolib->IsEmpty())
{
delete doc;
return E_NOGEOMETRYLIBRARY;
}
size_t n = geolib->GetEntityCount(); size_t n = geolib->GetEntityCount();
std::vector<FCDGeometryMesh*> geomsh(n); std::vector<FCDGeometryMesh*> geomsh(n);
@ -76,6 +83,7 @@ public:
{ {
if (!geolib->GetEntity(ii)->IsMesh()) if (!geolib->GetEntity(ii)->IsMesh())
{ {
delete doc;
return E_NOMESH; return E_NOMESH;
} }
else else
@ -109,7 +117,11 @@ public:
} }
} }
else return E_NOVERTEXPOSITION; else
{
delete doc;
return E_NOVERTEXPOSITION;
}
//a single mesh may be composed by a variable numbers of polygons' subsets //a single mesh may be composed by a variable numbers of polygons' subsets
size_t pol = geomsh[ii]->GetPolygonsCount(); size_t pol = geomsh[ii]->GetPolygonsCount();
@ -119,26 +131,32 @@ public:
{ {
FCDGeometryMesh* tmp = geomsh[ii]; FCDGeometryMesh* tmp = geomsh[ii];
FCDGeometryPolygonsInput* pos = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::POSITION); FCDGeometryPolygonsInput* pos = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::POSITION);
if ((pos == NULL) || (pos->source->GetSourceStride() != 3)) return E_NO3DVERTEXPOSITION; if ((pos == NULL) || (pos->source->GetSourceStride() != 3))
{
delete doc;
return E_NO3DVERTEXPOSITION;
}
//unsigned int hi = pos->indices[1]; //unsigned int hi = pos->indices[1];
FCDGeometryPolygonsInput* norm = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::NORMAL); FCDGeometryPolygonsInput* norm = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::NORMAL);
//unsigned int li = norm->indices[1]; //unsigned int li = norm->indices[1];
FCDGeometryPolygonsInput* text = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::TEXCOORD); FCDGeometryPolygonsInput* text = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::TEXCOORD);
bool isvalidwnorm = (m.HasPerWedgeNormal()) && (norm != NULL) && (norm->source->GetSourceStride() == 3); bool isvalidwnorm = (m.HasPerWedgeNormal()) && (norm != NULL) && (norm->GetSource()->GetSourceStride() == 3);
bool isvalidnorm = (m.HasPerVertexNormal()) && (norm != NULL) && (norm->source->GetSourceStride() == 3); bool isvalidnorm = (m.HasPerVertexNormal()) && (norm != NULL) && (norm->GetSource()->GetSourceStride() == 3);
bool isvalidtext = (HasPerWedgeTexture(m)) && (text != NULL) && (text->source->GetSourceStride() == 2); bool isvalidtext = (HasPerWedgeTexture(m)) && (text != NULL) && (text->GetSource()->GetSourceStride() == 2);
FCDGeometryPolygonsInputList normlist; FCDGeometryPolygonsInputList normlist;
tmp->GetPolygons(pset)->FindInputs(FUDaeGeometryInput::NORMAL,normlist); tmp->GetPolygons(pset)->FindInputs(FUDaeGeometryInput::NORMAL,normlist);
FCDGeometryPolygonsInputList tet; FCDGeometryPolygonsInputList tet;
tmp->GetPolygons(pset)->FindInputs(FUDaeGeometryInput::TEXCOORD,tet); tmp->GetPolygons(pset)->FindInputs(FUDaeGeometryInput::TEXCOORD,tet);
unsigned int offset = m.face.size();
for(unsigned int ind = 0;ind < pos->indices.size();++ind) for(unsigned int ind = 0;ind < pos->indices.size();++ind)
{ {
typename OpenMeshType::FaceIterator fi=vcg::tri::Allocator<OpenMeshType>::AddFaces(m,1); typename OpenMeshType::FaceIterator fi=vcg::tri::Allocator<OpenMeshType>::AddFaces(m,1);
assert(pos->indices[ind] < m.vert.size()); assert(pos->indices[ind] < m.vert.size());
fi->V(0) = &m.vert[pos->indices[ind]]; fi->V(0) = &m.vert[offset + pos->indices[ind]];
size_t dimn = norm->indices.size(); size_t dimn = norm->indices.size();
if (isvalidnorm) if (isvalidnorm)
@ -146,7 +164,7 @@ public:
//assert(norm->indices[ind] * 3 < norm->source->GetSourceData().size()); //assert(norm->indices[ind] * 3 < norm->source->GetSourceData().size());
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]); UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]);
//fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize(); //fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->V(0)->N() += vcg::Point3f(normlist[0]->source->GetSourceData()[(*ls)[ind] * 2],normlist[0]->source->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->source->GetSourceData()[(*ls)[ind] * 2 + 2]); fi->V(0)->N() += vcg::Point3f(normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 2]);
//++fi->V(0)->incidentfaces; //++fi->V(0)->incidentfaces;
} }
@ -156,20 +174,20 @@ public:
{ {
//NON CAMBIARE!!!!E' L'unico modo in cui restituisce gli indici corretti quando c'e' piu' di un insieme con la stessa semantica!! //NON CAMBIARE!!!!E' L'unico modo in cui restituisce gli indici corretti quando c'e' piu' di un insieme con la stessa semantica!!
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]); UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]);
fi->WT(0).t(hh) = vcg::Point2f(tet[hh]->source->GetSourceData()[(*ls)[ind] * 2],tet[hh]->source->GetSourceData()[(*ls)[ind] * 2 + 1]); fi->WT(0).t(hh) = vcg::Point2f(tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2],tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1]);
} }
} }
if (isvalidwnorm) if (isvalidwnorm)
{ {
fi->WN(0) = vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize(); fi->WN(0) = vcg::Point3f(norm->GetSource()->GetSourceData()[norm->indices[ind] * 3],norm->GetSource()->GetSourceData()[norm->indices[ind] * 3 + 1],norm->GetSource()->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->WN(1) = vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind + 1] * 3],norm->source->GetSourceData()[norm->indices[ind + 1] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind + 1] * 3 + 2]).Normalize(); fi->WN(1) = vcg::Point3f(norm->GetSource()->GetSourceData()[norm->indices[ind + 1] * 3],norm->GetSource()->GetSourceData()[norm->indices[ind + 1] * 3 + 1],norm->GetSource()->GetSourceData()[norm->indices[ind + 1] * 3 + 2]).Normalize();
fi->WN(2) = vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind + 2] * 3],norm->source->GetSourceData()[norm->indices[ind + 2] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind + 2] * 3 + 2]).Normalize(); fi->WN(2) = vcg::Point3f(norm->GetSource()->GetSourceData()[norm->indices[ind + 2] * 3],norm->GetSource()->GetSourceData()[norm->indices[ind + 2] * 3 + 1],norm->GetSource()->GetSourceData()[norm->indices[ind + 2] * 3 + 2]).Normalize();
} }
++ind; ++ind;
assert(pos->indices[ind] < m.vert.size()); assert(pos->indices[ind] < m.vert.size());
fi->V(1) = &m.vert[pos->indices[ind]]; fi->V(1) = &m.vert[offset + pos->indices[ind]];
if (isvalidnorm) if (isvalidnorm)
{ {
@ -177,7 +195,7 @@ public:
//fi->V(1)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize(); //fi->V(1)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]); UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]);
//fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize(); //fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->V(1)->N() += vcg::Point3f(normlist[0]->source->GetSourceData()[(*ls)[ind] * 2],normlist[0]->source->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->source->GetSourceData()[(*ls)[ind] * 2 + 2]); fi->V(1)->N() += vcg::Point3f(normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 2]);
//++fi->V(1)->incidentfaces; //++fi->V(1)->incidentfaces;
} }
@ -187,13 +205,13 @@ public:
for(unsigned int hh = 0; hh < tet.size();++hh) for(unsigned int hh = 0; hh < tet.size();++hh)
{ {
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]); UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]);
fi->WT(1).t(hh) = vcg::Point2f(tet[hh]->source->GetSourceData()[(*ls)[ind] * 2],tet[hh]->source->GetSourceData()[(*ls)[ind] * 2 + 1]); fi->WT(1).t(hh) = vcg::Point2f(tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2],tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1]);
} }
} }
++ind; ++ind;
assert(pos->indices[ind] < m.vert.size()); assert(pos->indices[ind] < m.vert.size());
fi->V(2) = &m.vert[pos->indices[ind]]; fi->V(2) = &m.vert[offset + pos->indices[ind]];
if (isvalidnorm) if (isvalidnorm)
{ {
@ -201,7 +219,7 @@ public:
//fi->V(2)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize(); //fi->V(2)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]); UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]);
//fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize(); //fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->V(2)->N() += vcg::Point3f(normlist[0]->source->GetSourceData()[(*ls)[ind] * 2],normlist[0]->source->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->source->GetSourceData()[(*ls)[ind] * 2 + 2]); fi->V(2)->N() += vcg::Point3f(normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 2]);
//++fi->V(2)->incidentfaces; //++fi->V(2)->incidentfaces;
} }
@ -210,7 +228,7 @@ public:
for(unsigned int hh = 0; hh < tet.size();++hh) for(unsigned int hh = 0; hh < tet.size();++hh)
{ {
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]); UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]);
fi->WT(2).t(hh) = vcg::Point2f(tet[hh]->source->GetSourceData()[(*ls)[ind] * 2],tet[hh]->source->GetSourceData()[(*ls)[ind] * 2 + 1]); fi->WT(2).t(hh) = vcg::Point2f(tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2],tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1]);
} }
} }
@ -238,6 +256,204 @@ public:
delete doc; delete doc;
return E_NOERROR; return E_NOERROR;
} }
/*this open function should be used when you want to maintain the Collada's XML tree. If the file will correctly opened
doc argument in the function's signiture will contain the pointer to XML tree otherwise a NULL pointer*/
static int Open(OpenMeshType& m,const char* filename,FCDocument** doc)
{
(*doc) = new FCDocument();
FUStatus st = (*doc)->LoadFromFile(FUStringConversion::ToFString(filename));
if (st.IsFailure())
{
delete *doc;
*doc = NULL;
return E_CANTOPEN;
}
FCDGeometryLibrary* geolib = (*doc)->GetGeometryLibrary();
if (geolib->IsEmpty()) return E_NOGEOMETRYLIBRARY;
size_t n = geolib->GetEntityCount();
std::vector<FCDGeometryMesh*> geomsh(n);
//for any mesh in the collada file
for(unsigned int ii = 0;ii < geomsh.size();++ii)
{
if (!geolib->GetEntity(ii)->IsMesh())
{
delete *doc;
*doc = NULL;
return E_NOMESH;
}
else
{
geomsh[ii] = geolib->GetEntity(ii)->GetMesh();
unsigned int offset = m.vert.size();
if (geomsh[ii]->GetFaceCount() > 0)
{
geomsh[ii]->Triangulate();
size_t dim = geomsh[ii]->GetFaceVertexCount() / geomsh[ii]->GetFaceCount();
assert(dim == 3);
//MyMesh* msh = new MyMesh();
//size_t nattr = geomsh[ii]->GetSourceCount();
//FCDGeometrySourceList& srclst = geomsh[ii]->GetVertexSources();
FCDGeometrySource* src;
if ((src = geomsh[ii]->GetPositionSource()) != NULL)
{
FloatList& flst = src->GetSourceData();
unsigned int str = src->GetSourceStride();
assert(flst.size() % str == 0);
for(unsigned int cont = 0;cont < flst.size();cont += str)
{
OpenMeshType::VertexIterator vi=vcg::tri::Allocator<OpenMeshType>::AddVertices(m,1);
vi->P()= vcg::Point3f(flst[cont],flst[cont + 1],flst[cont + 2]);
vi->N() = vcg::Point3f(0.0,0.0,0.0);
}
}
else
{
delete *doc;
*doc = NULL;
return E_NOVERTEXPOSITION;
}
//a single mesh may be composed by a variable numbers of polygons' subsets
size_t pol = geomsh[ii]->GetPolygonsCount();
//unsigned int offset = m.vert.size();
//for any polygons' subset in a single mesh
for(unsigned int pset = 0; pset < pol;++pset)
{
FCDGeometryMesh* tmp = geomsh[ii];
FCDGeometryPolygonsInput* pos = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::POSITION);
if ((pos == NULL) || (pos->GetSource()->GetSourceStride() != 3))
{
delete *doc;
*doc = NULL;
return E_NO3DVERTEXPOSITION;
}
//unsigned int hi = pos->indices[1];
FCDGeometryPolygonsInput* norm = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::NORMAL);
//unsigned int li = norm->indices[1];
FCDGeometryPolygonsInput* text = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::TEXCOORD);
bool isvalidwnorm = (m.HasPerWedgeNormal()) && (norm != NULL) && (norm->GetSource()->GetSourceStride() == 3);
bool isvalidnorm = (m.HasPerVertexNormal()) && (norm != NULL) && (norm->GetSource()->GetSourceStride() == 3);
bool isvalidtext = (HasPerWedgeTexture(m)) && (text != NULL) && (text->GetSource()->GetSourceStride() == 2);
FCDGeometryPolygonsInputList normlist;
tmp->GetPolygons(pset)->FindInputs(FUDaeGeometryInput::NORMAL,normlist);
FCDGeometryPolygonsInputList tet;
tmp->GetPolygons(pset)->FindInputs(FUDaeGeometryInput::TEXCOORD,tet);
for(unsigned int ind = 0;ind < pos->indices.size();++ind)
{
OpenMeshType::FaceIterator fi=vcg::tri::Allocator<OpenMeshType>::AddFaces(m,1);
assert(offset + pos->indices[ind] < m.vert.size());
fi->V(0) = &m.vert[offset + pos->indices[ind]];
//size_t dimn = norm->indices.size();
if (isvalidnorm)
{
//assert(norm->indices[ind] * 3 < norm->source->GetSourceData().size());
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]);
//fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->V(0)->N() += vcg::Point3f(normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 2]);
//++fi->V(0)->incidentfaces;
}
if (isvalidtext)
{
for(unsigned int hh = 0; hh < tet.size();++hh)
{
//NON CAMBIARE!!!!E' L'unico modo in cui restituisce gli indici corretti quando c'e' piu' di un insieme con la stessa semantica!!
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]);
fi->WT(0).t(hh) = vcg::Point2f(tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2],tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1]);
}
}
if (isvalidwnorm)
{
fi->WN(0) = vcg::Point3f(norm->GetSource()->GetSourceData()[norm->indices[ind] * 3],norm->GetSource()->GetSourceData()[norm->indices[ind] * 3 + 1],norm->GetSource()->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->WN(1) = vcg::Point3f(norm->GetSource()->GetSourceData()[norm->indices[ind + 1] * 3],norm->GetSource()->GetSourceData()[norm->indices[ind + 1] * 3 + 1],norm->GetSource()->GetSourceData()[norm->indices[ind + 1] * 3 + 2]).Normalize();
fi->WN(2) = vcg::Point3f(norm->GetSource()->GetSourceData()[norm->indices[ind + 2] * 3],norm->GetSource()->GetSourceData()[norm->indices[ind + 2] * 3 + 1],norm->GetSource()->GetSourceData()[norm->indices[ind + 2] * 3 + 2]).Normalize();
}
++ind;
assert(offset + pos->indices[ind] < m.vert.size());
fi->V(1) = &m.vert[offset + pos->indices[ind]];
if (isvalidnorm)
{
//assert(norm->indices[ind] * 3 < norm->source->GetSourceData().size());
//fi->V(1)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]);
//fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->V(1)->N() += vcg::Point3f(normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 2]);
//++fi->V(1)->incidentfaces;
}
if (isvalidtext)
{
for(unsigned int hh = 0; hh < tet.size();++hh)
{
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]);
fi->WT(1).t(hh) = vcg::Point2f(tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2],tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1]);
}
}
++ind;
assert(offset + pos->indices[ind] < m.vert.size());
fi->V(2) = &m.vert[offset + pos->indices[ind]];
if (isvalidnorm)
{
//assert(norm->indices[ind] * 3 < norm->source->GetSourceData().size());
//fi->V(2)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(normlist[0]);
//fi->V(0)->N() += vcg::Point3f(norm->source->GetSourceData()[norm->indices[ind] * 3],norm->source->GetSourceData()[norm->indices[ind] * 3 + 1],norm->source->GetSourceData()[norm->indices[ind] * 3 + 2]).Normalize();
fi->V(2)->N() += vcg::Point3f(normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1],normlist[0]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 2]);
//++fi->V(2)->incidentfaces;
}
if (isvalidtext)
{
for(unsigned int hh = 0; hh < tet.size();++hh)
{
UInt32List* ls = tmp->GetPolygons(pset)->FindIndices(tet[hh]);
fi->WT(2).t(hh) = vcg::Point2f(tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2],tet[hh]->GetSource()->GetSourceData()[(*ls)[ind] * 2 + 1]);
}
}
if (isvalidnorm) fi->N() = ((fi->V(1)->P() - fi->V(0)->P()) ^ (fi->V(2)->P() - fi->V(0)->P())).Normalize();
/*FCDGeometryPolygonsInput* posa = tmp->GetPolygons(pset)->FindInput(FUDaeGeometryInput::POSITION);
FloatList& list = posa->source->GetSourceData();
int dim = list.size();
list[0] = -100.0;*/
}
//vm.push_back(msh);
if (isvalidnorm)
{
vcg::tri::UpdateNormals<OpenMeshType>::PerVertexNormalized(m);
/*for(MyMesh::VertexIterator vit = msh->vert.begin(); vit != msh->vert.end();++vit)
vit->N() = (vit->N() / vit->incidentfaces).Normalize();*/
}
}
}
}
}
//doc->WriteToFile("PincoPalla.dae");
return E_NOERROR;
}
}; };
} }