Working version (maybe)

This commit is contained in:
Federico Ponchio 2004-10-08 15:12:04 +00:00
parent fde19dc655
commit 1922c54dc5
6 changed files with 86 additions and 47 deletions

View File

@ -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));
}

View File

@ -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;
}

View File

@ -2,7 +2,8 @@
#define NXS_PATCH_H
#include <vcg/space/point3.h>
#include <iostream>
#include <vcg/space/sphere3.h>
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;

View File

@ -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 <assert.h>
@ -170,7 +173,7 @@ template <class T> class VFile: public File {
void Resize(unsigned int elem) {
Flush();
File::Resize(elem * sizeof(T));
File::Redim(elem * sizeof(T));
n_elements = elem;
}

View File

@ -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;
}

View File

@ -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<Nexus::Update> &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<Link> 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<unsigned int, unsigned int >::iterator t;
for(t = vert_count.begin(); t != vert_count.end(); t++) {
if(cell == (*t).first) continue;
vector<int> &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<int> &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<Nexus::Update> &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());
}
}
}