diff --git a/apps/nexus/mfhash.cpp b/apps/nexus/mfhash.cpp index debe5895..a6de8ad5 100644 --- a/apps/nexus/mfhash.cpp +++ b/apps/nexus/mfhash.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.2 2004/07/01 21:34:04 ponchio +Rehash bug. + Revision 1.1 2004/06/24 14:32:45 ponchio Moved from wrap/nexus @@ -68,8 +71,9 @@ void MFHash::Resize(unsigned int n) { FILE *fp = tmpfile(); unsigned int count = 0; for(unsigned int i = 0; i < buffer.Size(); i++) { - if(!buffer[i].Empty()) { - fwrite(&buffer[i], sizeof(Bucket), 1, fp); + Bucket &bucket = buffer[i]; + if(!bucket.Empty()) { + fwrite(&bucket, sizeof(Bucket), 1, fp); ++count; } } @@ -92,11 +96,13 @@ void MFHash::Insert(unsigned int key, unsigned int value, bool rehash) { assert(space > 0); unsigned int hash_size = buffer.Size(); unsigned int j = key % hash_size; - while(!buffer[j].Empty()) { - if(buffer[j].key == key && buffer[j].value == value) //already here + Bucket bucket = buffer[j]; + while(!bucket.Empty()) { + if(bucket.key == key && bucket.value == value) //already here return; j++; if(j >= hash_size) j = 0; + bucket = buffer[j]; } buffer[j] = Bucket(key, value); space--; diff --git a/apps/nexus/mfhash.h b/apps/nexus/mfhash.h index 0b75a74c..e157308d 100644 --- a/apps/nexus/mfhash.h +++ b/apps/nexus/mfhash.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.3 2004/07/02 13:08:43 ponchio +*** empty log message *** + Revision 1.2 2004/07/01 21:34:29 ponchio *** empty log message *** @@ -68,7 +71,8 @@ class MFHash { unsigned int j = key % hash_size; while(!buffer[j].Empty()) { if(buffer[j].key == key) { - container.push_back(buffer[j].value); + //container.push_back(buffer[j].value); + container.insert(buffer[j].value); } j++; if(j >= hash_size) j = 0; diff --git a/apps/nexus/patch.h b/apps/nexus/patch.h index fd0eaf27..e4012395 100644 --- a/apps/nexus/patch.h +++ b/apps/nexus/patch.h @@ -2,7 +2,7 @@ #define NXS_PATCH_H #include - +#include namespace nxs { struct Chunk { @@ -17,14 +17,23 @@ class Patch { unsigned short &VertSize() { return *(unsigned short *)start; } vcg::Point3f *VertBegin() { - return (vcg::Point3f *)(start + 2*sizeof(short)); } + return (vcg::Point3f *)(((char *)start) + 2*sizeof(short)); } unsigned short &FaceSize() { return *(((unsigned short *)start) + 1); } unsigned short *FaceBegin() { - return (unsigned short *)(start + 2*sizeof(short) + + return (unsigned short *)(((char *)start) + 2*sizeof(short) + VertSize() * sizeof(vcg::Point3f)); } + vcg::Point3f &Vert(unsigned int v) { + return VertBegin()[v]; + } + + unsigned short *Face(unsigned int f) { + return FaceBegin() + f * 3; + } + + unsigned int ChunkSize() { return ChunkSize(VertSize(), FaceSize()); } @@ -48,10 +57,10 @@ class Patch { if(size < nface * 3 * sizeof(unsigned int)) size = nface * 3 * sizeof(unsigned int); - size = 2 * sizeof(unsigned short); + size += 2 * sizeof(unsigned short); return size; } - private: + // private: Chunk *start; }; diff --git a/apps/nexus/vert_remap.cpp b/apps/nexus/vert_remap.cpp index 96e58e10..1375986c 100644 --- a/apps/nexus/vert_remap.cpp +++ b/apps/nexus/vert_remap.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.3 2004/07/02 13:01:28 ponchio +Changed file extensions to .rmv, .rmb + Revision 1.2 2004/07/01 21:36:30 ponchio Various debug @@ -54,6 +57,11 @@ bool VertRemap::Load(const std::string &file) { return true; } +void VertRemap::Close() { + all.Close(); + borders.Close(); +} + void VertRemap::Resize(unsigned int n_vert) { all.Resize(n_vert); for(unsigned int i = 0; i < n_vert; i++) diff --git a/apps/nexus/vert_remap.h b/apps/nexus/vert_remap.h index 68ec8819..8f983fd1 100644 --- a/apps/nexus/vert_remap.h +++ b/apps/nexus/vert_remap.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.2 2004/07/02 13:02:00 ponchio +Backup. + Revision 1.1 2004/06/24 14:32:45 ponchio Moved from wrap/nexus @@ -43,8 +46,10 @@ namespace nxs { class VertRemap { public: + ~VertRemap() { Close(); } bool Create(const std::string &file); bool Load(const std::string &file); + void Close(); void Resize(unsigned int n_vert); unsigned int Size(); @@ -56,8 +61,9 @@ class VertRemap { assert(key < Size()); container.clear(); if(all[key] == 0xffffffff) return; - container.push_back(all[key]); - borders.GetValue(key, container); + // container.push_back(all[key]); + borders.GetValues(key, container); + container.insert(all[key]); } VFile all; diff --git a/apps/nexus/vfile.h b/apps/nexus/vfile.h index 1922cd47..4716961a 100644 --- a/apps/nexus/vfile.h +++ b/apps/nexus/vfile.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.4 2004/07/02 13:02:39 ponchio +Added GetRegion, Read and Write + Revision 1.3 2004/07/01 21:36:54 ponchio *** empty log message *** @@ -69,6 +72,7 @@ template class VFile { struct Buffer { unsigned int key; + unsigned int size; //in number of elements T *data; }; @@ -97,7 +101,7 @@ template class VFile { }; VFile(): fp(NULL) {} - ~VFile() { if(fp) Close(); } + ~VFile() { Close(); } bool Create(const std::string &filename, unsigned int _chunk_size = 4096/sizeof(T), unsigned int _queue_size = 1000) { @@ -130,9 +134,11 @@ template class VFile { } void Close() { - Flush(); - fclose(fp); - fp = 0; + if(fp) { + Flush(); + fclose(fp); + fp = NULL; + } } void Flush() { @@ -145,7 +151,7 @@ template class VFile { void FlushBuffer(Buffer buffer) { fseek(fp, buffer.key * chunk_size * sizeof(T), SEEK_SET); - if(chunk_size != fwrite(buffer.data, sizeof(T), chunk_size, fp)) { + if(buffer.size != fwrite(buffer.data, sizeof(T), buffer.size, fp)) { assert(0 && "Could not write"); } delete []buffer.data; @@ -153,6 +159,7 @@ template class VFile { void Resize(unsigned int elem) { assert(fp); + Flush(); if(elem > n_elements) { if(-1 == fseek(fp, elem*sizeof(T) -1, SEEK_SET)) { assert(0 && "Could not resize"); @@ -161,7 +168,6 @@ template class VFile { fwrite(&a, sizeof(unsigned char), 1, fp); } else { //TODO optimize: we do not need flush for buffers over elem. - Flush(); int fd = fileno(fp); ftruncate(fd, elem*sizeof(T)); } @@ -177,13 +183,14 @@ template class VFile { unsigned int chunk = n/chunk_size; unsigned int offset = n - chunk*chunk_size; - assert(offset < chunk_size*sizeof(T)); + assert(offset < chunk_size * sizeof(T)); if(index.count(chunk)) return *((*(index[chunk])).data + offset); if(buffers.size() > queue_size) { Buffer &buffer= buffers.back(); + assert(buffer.key != chunk); FlushBuffer(buffer); index.erase(buffer.key); buffers.pop_back(); @@ -191,17 +198,20 @@ template class VFile { Buffer buffer; buffer.key = chunk; - buffer.data = new T[chunk_size * sizeof(T)]; + buffer.data = new T[chunk_size]; + buffer.size = chunk_size; + if(buffer.size + chunk * chunk_size > n_elements) + buffer.size = n_elements -chunk * chunk_size; + + buffers.push_front(buffer); + index[buffer.key] = buffers.begin(); + if(fseek(fp, chunk * chunk_size * sizeof(T), SEEK_SET)) { assert(0 && "failed to fseek"); return *(buffer.data); } - unsigned int data_size = chunk_size; - if(data_size + chunk * chunk_size > n_elements) - data_size = -chunk * chunk_size + n_elements; - - if(data_size != fread(buffer.data, sizeof(T), data_size, fp)) { + if(buffer.size != fread(buffer.data, sizeof(T), buffer.size, fp)) { if(feof(fp)) { assert(0 && "end of file"); } else { @@ -210,8 +220,6 @@ template class VFile { return (*buffer.data); } - buffers.push_front(buffer); - index[chunk] = buffers.begin(); return *(buffer.data + offset); } @@ -238,17 +246,20 @@ template class VFile { Buffer buffer; buffer.key = chunk; - buffer.data = new T[chunk_size * sizeof(T)*size]; + buffer.data = new T[chunk_size * size]; + buffer.size = chunk_size * size; + if(buffer.size + chunk * chunk_size > n_elements) + buffer.size = -chunk * chunk_size + n_elements; + + buffers.push_front(buffer); + index[chunk] = buffers.begin(); + if(fseek(fp, chunk * chunk_size * sizeof(T), SEEK_SET)) { assert(0 && "failed to fseek"); return buffer.data; } - unsigned int data_size = chunk_size*size; - if(data_size + chunk * chunk_size > n_elements) - data_size = -chunk * chunk_size + n_elements; - - if(data_size != fread(buffer.data, sizeof(T), data_size, fp)) { + if(buffer.size != fread(buffer.data, sizeof(T), buffer.size, fp)) { if(feof(fp)) { assert(0 && "end of file"); } else { @@ -256,9 +267,6 @@ template class VFile { } return buffer.data; } - - buffers.push_front(buffer); - index[chunk] = buffers.begin(); return buffer.data; } diff --git a/apps/nexus/voronoiremap/voronoiremap.cpp b/apps/nexus/voronoiremap/voronoiremap.cpp index a17ff1f8..906fc56f 100644 --- a/apps/nexus/voronoiremap/voronoiremap.cpp +++ b/apps/nexus/voronoiremap/voronoiremap.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.2 2004/07/02 13:09:31 ponchio +Extensions changed. + Revision 1.1 2004/07/01 21:32:18 ponchio Created @@ -80,6 +83,8 @@ int main(int argc, char *argv[]) { return -1; } + cerr << "Verts: " << crude.Vertices() << endl; + cerr << "Faces: " << crude.Faces() << endl; cerr << "Getting optimal radius...\n"; watch.Start(); @@ -95,8 +100,8 @@ int main(int argc, char *argv[]) { crude.vert.End(), crude.GetBox(), target); - for(unsigned int i = 0; i < radius.size(); i++) - cerr << "Radius: " << radius[i] << endl; + // for(unsigned int i = 0; i < radius.size(); i++) + // cerr << "Radius: " << radius[i] << endl; watch.Stop(); cerr << " ...done in " << watch.Elapsed() << " secs\n"; @@ -134,7 +139,7 @@ int main(int argc, char *argv[]) { cerr << "Could not create remap files: " << output << ".frm\n"; return -1; } - face_remap.Resize(crude.face.Size()); + face_remap.Resize(crude.Faces()); PIntersect inter(chain.levels[0], chain.levels[1]); @@ -142,11 +147,9 @@ int main(int argc, char *argv[]) { cerr << "Splitting faces... "; Point3f bari; - for(unsigned int i = 0; i < crude.face.Size(); i++) { + for(unsigned int i = 0; i < crude.Faces(); i++) { bari = crude.GetBari(i); unsigned int patch = inter.Locate(bari); - if(patch > 1000) - cerr << "Patch: " << patch << endl; face_remap[i] = patch; } @@ -166,18 +169,61 @@ int main(int argc, char *argv[]) { cerr << "Splitting vertices... "; - for(unsigned int i = 0; i < crude.face.Size(); i++) { + unsigned int totvert = 0; + for(unsigned int i = 0; i < crude.Faces(); i++) { Crude::Face &face = crude.GetFace(i); unsigned int patch = face_remap[i]; if((i % 10000) == 0) cerr << "inserting: " << i << endl; for(int k = 0; k < 3; k++) { + //DEBUG: + set pp; + vert_remap.GetValues(face[k], pp); + if(!pp.count(patch)) + totvert++; vert_remap.Insert(face[k], patch); } } watch.Stop(); cerr << "done in " << watch.Elapsed() << " secs\n"; + cerr << "Tot vertices: " << totvert << endl; chain.Save(output + ".chn"); + for(unsigned int i = 0; i < vert_remap.all.Size(); i++) { + unsigned int patch = vert_remap.all[i]; + if(patch == 0xffffffff) { + continue; + } + totvert--; + } + int totbord = 0; + VFile &border = vert_remap.borders.buffer; + cerr << "Border space:" << border.Size() << endl; + for(unsigned int i = 0; i < border.Size(); i++) { + MFHash::Bucket &bucket = border[i]; + if(bucket.key == 0xffffffff) continue; + totvert--; + totbord++; + } + cerr << "Borders: " << totbord << endl; + vert_remap.Close(); + + //DEBUG testing if vert_remap.borders works + + /* for(unsigned int i = 0; i < crude.Faces(); i++) { + Crude::Face &face = crude.GetFace(i); + unsigned int patch = face_remap[i]; + for(int k = 0; k < 3; k++) { + set v; + vert_remap.GetValues(face[k], v); + assert(v.size() != 0); + if(!v.count(patch)) { + cerr << "count: " << v.size() << endl; + cerr << "patch " << patch << endl; + } + assert(v.count(patch)); + } + }*/ + return 0; }