diff --git a/apps/nexus/crude2nexus/crude2nexus.cpp b/apps/nexus/crude2nexus/crude2nexus.cpp index d67846f8..9d911a16 100644 --- a/apps/nexus/crude2nexus/crude2nexus.cpp +++ b/apps/nexus/crude2nexus/crude2nexus.cpp @@ -24,10 +24,15 @@ History $Log: not supported by cvs2svn $ +Revision 1.1 2004/07/02 13:03:01 ponchio +Created + ****************************************************************************/ #include #include +#include //DEBUG +#include #include "../nexus.h" #include "../crude.h" @@ -111,6 +116,7 @@ int main(int argc, char *argv[]) { unsigned int totbord = 0; VFile &border = vert_remap.borders.buffer; + cerr << "border: " << border.Size() << endl; for(unsigned int i = 0; i < border.Size(); i++) { MFHash::Bucket &bucket = border[i]; if(bucket.key == 0xffffffff) continue; @@ -150,19 +156,95 @@ int main(int argc, char *argv[]) { //instead of relative indexing for(unsigned int i = 0; i < crude.face.Size(); i++) { Crude::Face &face = crude.face[i]; - unsigned int n = face_remap[i]; - Nexus::Entry &entry = nexus.index[n]; - Patch patch = nexus.GetPatch(n); + unsigned int npatch = face_remap[i]; + + Nexus::Entry &entry = nexus.index[npatch]; + Patch patch = nexus.GetPatch(npatch); if(entry.border_offset == 0) { //first time we find patch entry.border_offset = 0xffffffff; - patch.VertSize() = 0; + patch.VertSize() = patch_verts[npatch]; patch.FaceSize() = 0; } + Crude::Face *faces = (Crude::Face *)patch.VertBegin(); faces[patch.FaceSize()] = face; patch.FaceSize()++; } + //finally for every patch we collect the vertices + //and fill the patch. + for(unsigned int i = 0; i < nexus.index.size(); i++) { + Patch patch = nexus.GetPatch(i); + assert(patch.FaceSize() == patch_faces[i]); + + Nexus::Entry &entry = nexus.index[i]; + + //make a copy of faces (we need to write there :P) + Crude::Face *faces = new Crude::Face[patch_faces[i]]; + memcpy(faces, (Crude::Face *)patch.VertBegin(), + patch.FaceSize() * sizeof(Crude::Face)); + + //collect all vertices we need. + //TODO an hash_map would be faster? + map remap; + for(unsigned int k = 0; k < patch.FaceSize(); k++) { + Crude::Face &face = faces[k]; + + for(int j = 0; j < 3; j++) { + if(!remap.count(face[j])) { + assert(remap.size() < patch.VertSize()); + Point3f &v = crude.vert[face[j]]; + patch.VertBegin()[remap.size()] = v; + entry.sphere.Add(v); + remap[face[j]] = remap.size(); + } + patch.FaceBegin()[k*3 + j] = remap[face[j]]; + } + } + + /* + + + //costruiamo la mappa dei bordi: + border_remap.resize(border_offset + info.nbord); + border_remap_offset.push_back(border_offset); + border_remap_size.push_back(0); + + vector bord; + hash_map::iterator m; + for(m = remap.begin(); m != remap.end(); m++) { + unsigned int abs_vertex = (*m).first; + unsigned short rel_vertex = (*m).second; + vert_remap.getValues(abs_vertex, bord); + if(bord.size() == 0) { + cerr << "EEEEEEEEEKKKKKKK" << endl; + exit(0); + } + if(bord.size() ==1) continue; // non e' un bordo. + BigLink link; + link.abs_vert = abs_vertex; + link.rel_vert = rel_vertex; + + + for(unsigned int j = 0; j < bord.size(); j++) { + if(bord[j] == i) continue; + link.patch = bord[j]; + border_remap.setElement(border_offset++, link); + border_remap_size.back()++; + + } + }*/ + + + + + + delete []faces; + } + for(unsigned int i = 0; i < nexus.index.size(); i++) { + nexus.sphere.Add(nexus.index[i].sphere); + } + nexus.Close(); return 0; }