diff --git a/apps/nexus/nxsedit.cpp b/apps/nexus/nxsedit.cpp index e2812906..2c4e6785 100644 --- a/apps/nexus/nxsedit.cpp +++ b/apps/nexus/nxsedit.cpp @@ -249,7 +249,7 @@ int main(int argc, char *argv[]) { } for(unsigned int patch = 0; patch < nexus.index.size(); patch++) { - Nexus::Entry &src_entry = nexus.index[patch]; + Nexus::PatchInfo &src_entry = nexus.index[patch]; Patch src_patch = nexus.GetPatch(patch); Border src_border = nexus.GetBorder(patch); @@ -258,14 +258,14 @@ int main(int argc, char *argv[]) { if(add_strip) { ComputeTriStrip(src_patch.nf, src_patch.FaceBegin(), strip); assert(strip.size() < 32767); - out.AddPatch(src_entry.nvert, strip.size(), src_entry.border_size); + out.AddPatch(src_entry.nvert, strip.size(), src_border.Available()); } else - out.AddPatch(src_entry.nvert, src_entry.nface, src_entry.border_size); + out.AddPatch(src_entry.nvert, src_entry.nface, src_border.Available()); - Nexus::Entry &dst_entry = out.index[patch]; + Nexus::PatchInfo &dst_entry = out.index[patch]; Patch dst_patch = out.GetPatch(patch); - Border dst_border = out.GetBorder(patch); + //copy vertices: //no clustering @@ -296,7 +296,17 @@ int main(int argc, char *argv[]) { dst_entry.error = src_entry.error; //adding borders. - dst_entry.border_used = src_entry.border_used; + //Check border is ok: + for(unsigned int i = 0; i < src_border.Size(); i++) { + Link &link = src_border[i]; + if(link.IsNull()) continue; + if(link.end_patch > nexus.index.size()) { + cerr << "Link endp: " << link.end_patch << endl; + } + } + Border dst_border = out.GetBorder(patch); + out.borders.ResizeBorder(patch, src_border.Size()); + // dst_entry.border_used = src_entry.border_used; memcpy(dst_border.Start(), src_border.Start(), src_border.Size() * sizeof(Link)); } diff --git a/apps/nexus/patch.cpp b/apps/nexus/patch.cpp index b822ef80..968ab12b 100644 --- a/apps/nexus/patch.cpp +++ b/apps/nexus/patch.cpp @@ -6,7 +6,7 @@ void pad(unsigned int &size) { while(size&0x3) size++; } -Patch::Patch(Signature signature, Chunk *s, +Patch::Patch(Signature signature, char *s, unsigned short nvert, unsigned short nface): start(s) { Init(signature, nvert, nface); @@ -71,9 +71,10 @@ void Patch::Init(Signature signature, unsigned int Patch::ChunkSize(Signature signature, unsigned short nvert, - unsigned short nface) { + unsigned short nface, + unsigned int chunk_size) { unsigned int size = ByteSize(signature, nvert, nface); - size = (size/sizeof(Chunk) + 1); + size = (size/chunk_size + 1); return size; } diff --git a/apps/nexus/patch.h b/apps/nexus/patch.h index 7c82f5c4..d8fee324 100644 --- a/apps/nexus/patch.h +++ b/apps/nexus/patch.h @@ -2,7 +2,8 @@ #define NXS_PATCH_H #include -#include +#include + namespace nxs { enum Signature { NXS_FACES = 0x00000001, @@ -18,15 +19,12 @@ enum Signature { NXS_FACES = 0x00000001, NXS_DATA64 = 0x00080000, NXS_COMPRESSED = 0x10000000}; -struct Chunk { - unsigned char p[4096]; -}; class Patch { public: - Patch(Signature signature, Chunk *s, + Patch(Signature signature, char *s, unsigned short nv, unsigned short nf); void Init(Signature signature, unsigned short nv, unsigned short nf); @@ -45,14 +43,15 @@ class Patch { static unsigned int ChunkSize(Signature signature, unsigned short nvert, - unsigned short nface); + unsigned short nface, + unsigned int chunk_size); static unsigned int ByteSize(Signature signature, unsigned short nvert, unsigned short nface); - Chunk *start; + char *start; unsigned short nv; unsigned short nf; diff --git a/apps/nexus/vfile.h b/apps/nexus/vfile.h index f652b7e3..c507bb0d 100644 --- a/apps/nexus/vfile.h +++ b/apps/nexus/vfile.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.12 2004/10/04 16:49:54 ponchio +Daily backup. Preparing for compression. + Revision 1.11 2004/10/01 16:00:12 ponchio Added include @@ -170,7 +173,7 @@ template class VFile: public File { void Resize(unsigned int elem) { Flush(); - File::Resize(elem * sizeof(T)); + File::Redim(elem * sizeof(T)); n_elements = elem; } diff --git a/apps/nexus/voronoichain.cpp b/apps/nexus/voronoichain.cpp index ad8dbff5..8776309e 100644 --- a/apps/nexus/voronoichain.cpp +++ b/apps/nexus/voronoichain.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.8 2004/10/04 16:49:54 ponchio +Daily backup. Preparing for compression. + Revision 1.7 2004/10/01 16:54:57 ponchio Daily backup. @@ -324,11 +327,9 @@ void VoronoiChain::BuildLevel(Nexus &nexus, unsigned int offset, float scaling, int steps) { unsigned int totface = 0; unsigned int totvert = 0; - unsigned int totbord = 0; for(unsigned int idx = offset; idx < nexus.index.size(); idx++) { totface += nexus.index[idx].nface; totvert += nexus.index[idx].nvert; - totbord += nexus.index[idx].border_size; } diff --git a/apps/nexus/voronoinxs.cpp b/apps/nexus/voronoinxs.cpp index 711ef833..67968934 100644 --- a/apps/nexus/voronoinxs.cpp +++ b/apps/nexus/voronoinxs.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.8 2004/10/06 16:40:47 ponchio +Fixed degenerate faces. + Revision 1.7 2004/10/04 16:49:54 ponchio Daily backup. Preparing for compression. @@ -104,7 +107,7 @@ void NexusSplit(Nexus &nexus, VoronoiChain &vchain, void ReverseHistory(vector &history); - +void TestBorders(Nexus &nexus); int main(int argc, char *argv[]) { @@ -240,7 +243,7 @@ int main(int argc, char *argv[]) { //insert vertices and remap faces, prepare borders NexusFill(crude, nexus, vert_remap, border_remap); - NexusFixBorder(nexus, border_remap); + // NexusFixBorder(nexus, border_remap); //filling history Nexus::Update update; @@ -295,7 +298,6 @@ int main(int argc, char *argv[]) { NexusSplit(nexus, vchain, level, newvert, newface, newbord, update, error); - level_history.push_back(update); } @@ -322,6 +324,7 @@ int main(int argc, char *argv[]) { nexus.history.push_back(update); ReverseHistory(nexus.history); + TestBorders(nexus); //Clean up: nexus.Close(); @@ -408,9 +411,10 @@ void NexusSplit(Nexus &nexus, VoronoiChain &vchain, //lets allocate space for(c = vert_count.begin(); c != vert_count.end(); c++) { unsigned int cell = (*c).first; + //TODO detect best parameter below. unsigned int patch_idx = nexus.AddPatch(vert_count[cell], face_count[cell], - 3 * bord_count[cell]); + 6 * bord_count[cell]); //why double border space? because at next level //we will need to add those borders... @@ -446,8 +450,6 @@ void NexusSplit(Nexus &nexus, VoronoiChain &vchain, faces[i] = v_remap[f_remap[i]]; } - if(patch_idx == 68) - cerr << "68 bord: " << bord_count[cell] << endl; //borders last vector bords; @@ -455,47 +457,45 @@ void NexusSplit(Nexus &nexus, VoronoiChain &vchain, //for every esternal link we must update external patches! for(unsigned int i = 0; i < newbord.size(); i++) { Link link = newbord[i]; + assert(!link.IsNull()); if(v_remap[link.start_vert] == -1) continue; link.start_vert = v_remap[link.start_vert]; bords.push_back(link); - Nexus::Entry &rentry = nexus.index[link.end_patch]; - //TODO if !true reallocate borders. Border rborder = nexus.GetBorder(link.end_patch); - if(rentry.border_used >= rentry.border_size) { - cerr << "patch: " << link.end_patch << endl; - cerr << "used: " << rentry.border_used << endl; - cerr << "size: " << rentry.border_size << endl; - unsigned int start = nexus.borders.Size(); - nexus.borders.Resize(nexus.borders.Size() + 2 * rentry.border_size); - Link *tmp = new Link[rentry.border_size]; - memcpy(tmp, &rborder[0], sizeof(Link) * rentry.border_size); - rentry.border_start = start; - rentry.border_size *= 2; + + unsigned int pos = rborder.Size(); + if(nexus.borders.ResizeBorder(link.end_patch, pos+1)) { rborder = nexus.GetBorder(link.end_patch); - memcpy(&rborder[0], tmp, sizeof(Link) * rentry.border_used); - delete []tmp; } - assert(rentry.border_used < rentry.border_size); + + assert(rborder.Size() < rborder.Available()); + assert(rborder.Available() > pos); - - Link &newlink = rborder[rentry.border_used++]; + Link newlink; newlink.start_vert = link.end_vert; newlink.end_vert = link.start_vert; newlink.end_patch = patch_idx; + rborder[pos] = newlink; } //process internal borders; //TODO higly inefficient!!! map::iterator t; for(t = vert_count.begin(); t != vert_count.end(); t++) { - if(cell == (*t).first) continue; - vector &vremapclose = vert_remap[(*t).first]; + unsigned int rcell = (*t).first; + if(cell == rcell) continue; + + assert(cells2patches.count(rcell)); + unsigned int rpatch = cells2patches[rcell]; + assert(rpatch < nexus.index.size()); + + vector &vremapclose = vert_remap[rcell]; for(unsigned int i = 0; i < newvert.size(); i++) { if(v_remap[i] != -1 && vremapclose[i] != -1) { Link link; - link.end_patch = cells2patches[(*t).first]; + link.end_patch = rpatch; link.start_vert = v_remap[i]; link.end_vert = vremapclose[i]; bords.push_back(link); @@ -504,7 +504,7 @@ void NexusSplit(Nexus &nexus, VoronoiChain &vchain, } - Nexus::Entry &entry = nexus.index[patch_idx]; + Nexus::PatchInfo &entry = nexus.index[patch_idx]; entry.error = error; Patch patch = nexus.GetPatch(patch_idx); @@ -519,8 +519,13 @@ void NexusSplit(Nexus &nexus, VoronoiChain &vchain, } Border border = nexus.GetBorder(patch_idx); + assert(border.Available() >= bords.size()); + if(nexus.borders.ResizeBorder(patch_idx, bords.size())) { + border = nexus.GetBorder(patch_idx); + } memcpy(&(border[0]), &(bords[0]), bords.size() * sizeof(Link)); - entry.border_used = bords.size(); + + // TestBorders(nexus); } } @@ -530,3 +535,23 @@ void ReverseHistory(vector &history) { for(i = history.begin(); i != history.end(); i++) swap((*i).erased, (*i).created); } + +void TestBorders(Nexus &nexus) { + //check border correctnes + nexus.borders.Flush(); + for(unsigned int i = 0; i < nexus.index.size(); i++) { + Border border = nexus.GetBorder(i); + for(unsigned int k = 0; k < border.Size(); k++) { + Link &link = border[k]; + if(link.IsNull()) continue; + if(link.end_patch >= nexus.index.size()) { + cerr << "Patch: " << i << endl; + cerr << "Bsize: " << border.Size() << endl; + cerr << "Bava: " << border.Available() << endl; + cerr << "K: " << k << endl; + cerr << "end: " << link.end_patch << endl; + } + assert(link.end_patch < nexus.index.size()); + } + } +}