cleaning (a bit more).

This commit is contained in:
Federico Ponchio 2005-02-20 19:49:44 +00:00
parent 80ddbed065
commit 0ccff41441
6 changed files with 97 additions and 100 deletions

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.10 2005/02/20 18:07:00 ponchio
cleaning.
Revision 1.9 2005/02/20 00:43:23 ponchio Revision 1.9 2005/02/20 00:43:23 ponchio
Less memory x extraction. (removed frags) Less memory x extraction. (removed frags)
@ -106,13 +109,12 @@ void Extraction::Init() {
bool cancoarse = true; bool cancoarse = true;
Node::iterator n; Node::iterator n;
for(n = node.out_begin(); n != node.out_end(); n++) { for(n = node.out_begin; n != node.out_end; n++) {
if(!Visited((*n).node)) { if(!Visited((*n).node)) {
float maxerror = -1; float maxerror = -1;
Link &link = *n; Link &link = *n;
for(Link::iterator k = link.begin(); k != link.end(); k++) { for(unsigned int patch = link.begin; patch != link.end; patch++) {
unsigned int patch = k;
Entry &entry = (*mt)[patch]; Entry &entry = (*mt)[patch];
bool visible; bool visible;
@ -232,7 +234,7 @@ void Extraction::Update(NexusMt *_mt) {
if(Visited(hnode.node)) { if(Visited(hnode.node)) {
bool recursive = false; bool recursive = false;
Node::iterator i; Node::iterator i;
for(i = hnode.node->out_begin(); i != hnode.node->out_end(); i++) { for(i = hnode.node->out_begin; i != hnode.node->out_end; i++) {
Node *child = (*i).node; Node *child = (*i).node;
if(Visited(child)) recursive = true; if(Visited(child)) recursive = true;
} }
@ -258,9 +260,9 @@ void Extraction::Update(NexusMt *_mt) {
Node *node = hnode.node; Node *node = hnode.node;
front.pop_back(); front.pop_back();
Node::iterator l; Node::iterator l;
for(l = node->out_begin(); l != node->out_end(); l++) { for(l = node->out_begin; l != node->out_end; l++) {
Link &link = (*l); Link &link = (*l);
for(Link::iterator k = link.begin(); k != link.end(); k++) { for(unsigned int k = link.begin; k != link.end; k++) {
selected.push_back(Item(k, i)); selected.push_back(Item(k, i));
errors[k] = i; errors[k] = i;
} }
@ -270,10 +272,10 @@ void Extraction::Update(NexusMt *_mt) {
HeapNode hnode = back.back(); HeapNode hnode = back.back();
Node *node = hnode.node; Node *node = hnode.node;
back.pop_back(); back.pop_back();
Node::iterator l;
for(l = node->in_begin(); l != node->in_end(); l++) { for(Node::iterator l = node->in_begin; l != node->in_end; l++) {
Link &link = (*l); Link &link = (*l);
for(Link::iterator k = link.begin(); k != link.end(); k++) { for(unsigned int k = link.begin; k != link.end; k++) {
selected.push_back(Item(k, i)); selected.push_back(Item(k, i));
errors[k] = i; errors[k] = i;
} }
@ -284,10 +286,9 @@ void Extraction::Update(NexusMt *_mt) {
float Extraction::GetRefineError(Node *node) { float Extraction::GetRefineError(Node *node) {
float maxerror = -1; float maxerror = -1;
Node::iterator i; for(Node::iterator i = node->in_begin; i != node->in_end; i++) {
for(i = node->in_begin(); i != node->in_end(); i++) {
Link &link = *i; Link &link = *i;
for(Link::iterator p = link.begin(); p != link.end(); p++) { for(unsigned int p = link.begin; p != link.end; p++) {
Entry &entry = (*mt)[p]; Entry &entry = (*mt)[p];
bool visible; bool visible;
float error = metric->GetError(entry, visible); float error = metric->GetError(entry, visible);
@ -303,8 +304,7 @@ bool Extraction::Refine(HeapNode hnode) {
Node *node = hnode.node; Node *node = hnode.node;
//recursively refine parent if applicable. //recursively refine parent if applicable.
Node::iterator i; for(Node::iterator i = node->in_begin; i != node->in_end; i++) {
for(i = node->in_begin(); i != node->in_end(); i++) {
Node *parent = (*i).node; Node *parent = (*i).node;
if(!Visited(parent)) { if(!Visited(parent)) {
//Here i use parent refine error!!! //Here i use parent refine error!!!
@ -343,7 +343,7 @@ bool Extraction::Refine(HeapNode hnode) {
//now add to the front children (unless sink node) //now add to the front children (unless sink node)
for(i = node->out_begin(); i != node->out_end(); i++) { for(Node::iterator i = node->out_begin; i != node->out_end; i++) {
Link &link = *i; Link &link = *i;
if(link.node == sink) continue; if(link.node == sink) continue;
float maxerror = GetRefineError(link.node); float maxerror = GetRefineError(link.node);
@ -363,8 +363,7 @@ bool Extraction::Coarse(HeapNode hnode) {
Node *node = hnode.node; Node *node = hnode.node;
//recursively coarse children if applicable. //recursively coarse children if applicable.
Node::iterator i; for(Node::iterator i = node->out_begin; i != node->out_end; i++) {
for(i = node->out_begin(); i != node->out_end(); i++) {
Node *child = (*i).node; Node *child = (*i).node;
float error = GetRefineError(child); float error = GetRefineError(child);
HeapNode hchild(child, error); HeapNode hchild(child, error);
@ -385,7 +384,7 @@ bool Extraction::Coarse(HeapNode hnode) {
SetVisited(node, false); SetVisited(node, false);
//now add to the back parents (unless root node) //now add to the back parents (unless root node)
for(i = node->in_begin(); i != node->in_end(); i++) { for(Node::iterator i = node->in_begin; i != node->in_end; i++) {
Link &link = *i; Link &link = *i;
if(link.node == root) continue; if(link.node == root) continue;
float maxerror = GetRefineError(link.node); float maxerror = GetRefineError(link.node);
@ -409,11 +408,11 @@ void Extraction::Select() {
Node &node = nodes[i]; Node &node = nodes[i];
Node::iterator n; Node::iterator n;
for(n = node.out_begin(); n != node.out_end(); n++) { for(n = node.out_begin; n != node.out_end; n++) {
unsigned int n_out = (*n).node - root; unsigned int n_out = (*n).node - root;
if(!visited[n_out]) { if(!visited[n_out]) {
Link &link = *n; Link &link = *n;
for(Link::iterator p= link.begin(); p != link.end(); p++) { for(unsigned int p = link.begin; p != link.end; p++) {
selected.push_back(Item(p, 0)); selected.push_back(Item(p, 0));
errors[p] = 0.0f; errors[p] = 0.0f;
} }
@ -427,8 +426,7 @@ void Extraction::Visit(Node *node) {
SetVisited(node, true); SetVisited(node, true);
Node::iterator i; for(Node::iterator i = node->in_begin; i != node->in_end; i++) {
for(i = node->in_begin(); i != node->in_end(); i++) {
if(Visited((*i).node)) continue; if(Visited((*i).node)) continue;
Visit((*i).node); Visit((*i).node);
} }
@ -439,10 +437,10 @@ void Extraction::Visit(Node *node) {
draw_used += cost.draw; draw_used += cost.draw;
disk_used += cost.disk; disk_used += cost.disk;
for(i = node->out_begin(); i != node->out_end(); i++) { for(Node::iterator i = node->out_begin; i != node->out_end; i++) {
float maxerror = -1; float maxerror = -1;
Link &link = *i; Link &link = *i;
for(Link::iterator p = link.begin(); p != link.end(); p++) { for(unsigned int p = link.begin; p != link.end; p++) {
Entry &entry = (*mt)[p]; Entry &entry = (*mt)[p];
bool visible; bool visible;
float error = metric->GetError(entry, visible); float error = metric->GetError(entry, visible);
@ -467,9 +465,9 @@ bool Extraction::Expand(HeapNode &node) {
void Extraction::Diff(Node *node, Cost &cost) { void Extraction::Diff(Node *node, Cost &cost) {
Node::iterator i; Node::iterator i;
for(i = node->in_begin(); i != node->in_end(); i++) { for(i = node->in_begin; i != node->in_end; i++) {
Link &link = *i; Link &link = *i;
for(Link::iterator p = link.begin(); p != link.end(); p++) { for(unsigned int p = link.begin; p != link.end; p++) {
Entry &entry = (*mt)[p]; Entry &entry = (*mt)[p];
cost.extr -= entry.ram_size; cost.extr -= entry.ram_size;
if(Visible(p)) cost.draw -= entry.ram_size; if(Visible(p)) cost.draw -= entry.ram_size;
@ -479,9 +477,9 @@ void Extraction::Diff(Node *node, Cost &cost) {
} }
} }
for(i = node->out_begin(); i != node->out_end(); i++) { for(i = node->out_begin; i != node->out_end; i++) {
Link &link = *i; Link &link = *i;
for(Link::iterator p = link.begin(); p != link.end(); p++) { for(unsigned int p = link.begin; p != link.end; p++) {
Entry &entry = (*mt)[p]; Entry &entry = (*mt)[p];
cost.extr += entry.ram_size; cost.extr += entry.ram_size;
if(Visible(p)) cost.draw += entry.ram_size; if(Visible(p)) cost.draw += entry.ram_size;

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.9 2005/02/20 00:43:23 ponchio
Less memory x extraction. (removed frags)
Revision 1.8 2005/02/19 17:14:02 ponchio Revision 1.8 2005/02/19 17:14:02 ponchio
History quick by default. History quick by default.
@ -125,10 +128,12 @@ bool History::LoadPointers() {
//now convert integer to pointers //now convert integer to pointers
for(unsigned int i = 0; i < n_nodes(); i++) { for(unsigned int i = 0; i < n_nodes(); i++) {
Node &node = nodes[i]; Node &node = nodes[i];
assert(((unsigned int)node.in_link_begin) <= n_in_links()); assert(((unsigned int)node.in_begin) <= n_in_links());
assert(((unsigned int)node.out_link_begin) <= n_out_links()); assert(((unsigned int)node.out_begin) <= n_out_links());
node.in_link_begin = in_links + (unsigned int)(node.in_link_begin); node.in_begin = in_links + (unsigned int)(node.in_begin);
node.out_link_begin = out_links + (unsigned int)(node.out_link_begin); node.in_end = in_links + (unsigned int)(node.in_end);
node.out_begin = out_links + (unsigned int)(node.out_begin);
node.out_end = out_links + (unsigned int)(node.out_end);
} }
for(unsigned int i = 0; i < n_in_links(); i++) { for(unsigned int i = 0; i < n_in_links(); i++) {
@ -156,8 +161,10 @@ char *History::SaveQuick(unsigned int &_size) {
assert(buffer); assert(buffer);
for(unsigned int i = 0; i < n_nodes(); i++) { for(unsigned int i = 0; i < n_nodes(); i++) {
Node &node = nodes[i]; Node &node = nodes[i];
node.in_link_begin = (Link *)(node.in_link_begin - in_links); node.in_begin = (Link *)(node.in_begin - in_links);
node.out_link_begin = (Link *)(node.out_link_begin - out_links); node.in_end = (Link *)(node.in_end - in_links);
node.out_begin = (Link *)(node.out_begin - out_links);
node.out_end = (Link *)(node.out_end - out_links);
} }
for(unsigned int i = 0; i < n_in_links(); i++) { for(unsigned int i = 0; i < n_in_links(); i++) {
@ -247,13 +254,13 @@ bool History::UpdatesToQuick(Nexus &nexus) {
Link inlink; Link inlink;
inlink.node = (Node *)floor_node; inlink.node = (Node *)floor_node;
inlink.frag_begin = tmp_frags.size(); inlink.begin = tmp_frags.size();
inlink.frag_size = cells.size(); inlink.end = inlink.begin + cells.size();
Link outlink; Link outlink;
outlink.node = (Node *)current_node; outlink.node = (Node *)current_node;
outlink.frag_begin = tmp_frags.size(); outlink.begin = tmp_frags.size();
outlink.frag_size = cells.size(); outlink.end = outlink.begin + cells.size();
//Fill it with erased cells. //Fill it with erased cells.
vector<unsigned int>::iterator k; vector<unsigned int>::iterator k;
@ -271,8 +278,10 @@ bool History::UpdatesToQuick(Nexus &nexus) {
for(k = node_outlinks.begin(); k != node_outlinks.end(); k++) { for(k = node_outlinks.begin(); k != node_outlinks.end(); k++) {
unsigned int inode = (*k).first; unsigned int inode = (*k).first;
vector<Link> &links = (*k).second; vector<Link> &links = (*k).second;
tmp_nodes[inode].out_link_begin = (Link *)(tmp_out_links.size()); tmp_nodes[inode].out_begin = (Link *)(tmp_out_links.size());
tmp_nodes[inode].out_link_size = links.size(); tmp_nodes[inode].out_end = (Link *)(tmp_out_links.size() + links.size());
// tmp_nodes[inode].out_link_begin = (Link *)(tmp_out_links.size());
// tmp_nodes[inode].out_link_size = links.size();
for(unsigned int i = 0; i < links.size(); i++) for(unsigned int i = 0; i < links.size(); i++)
tmp_out_links.push_back(links[i]); tmp_out_links.push_back(links[i]);
@ -281,8 +290,10 @@ bool History::UpdatesToQuick(Nexus &nexus) {
for(k = node_inlinks.begin(); k != node_inlinks.end(); k++) { for(k = node_inlinks.begin(); k != node_inlinks.end(); k++) {
unsigned int inode = (*k).first; unsigned int inode = (*k).first;
vector<Link> &links = (*k).second; vector<Link> &links = (*k).second;
tmp_nodes[inode].in_link_begin = (Link *)(tmp_in_links.size()); // tmp_nodes[inode].in_link_begin = (Link *)(tmp_in_links.size());
tmp_nodes[inode].in_link_size = links.size(); // tmp_nodes[inode].in_link_size = links.size();
tmp_nodes[inode].in_begin = (Link *)(tmp_in_links.size());
tmp_nodes[inode].in_end = (Link *)(tmp_in_links.size() + links.size());
for(unsigned int i = 0; i < links.size(); i++) for(unsigned int i = 0; i < links.size(); i++)
tmp_in_links.push_back(links[i]); tmp_in_links.push_back(links[i]);
@ -358,17 +369,15 @@ void History::BuildLevels(vector<int> &levels) {
Node::iterator l; Node::iterator l;
unsigned int current = 0; unsigned int current = 0;
if(node != nodes) { //not root if(node != nodes) { //not root
Link *inlink = node->in_begin(); Link *inlink = node->in_begin;
unsigned int p = (inlink->begin()); unsigned int p = inlink->begin;
assert(p < levels.size()); assert(p < levels.size());
assert(p >= 0); assert(p >= 0);
current = levels[p]+1; current = levels[p]+1;
} }
for(l = node->out_begin(); l != node->out_end(); l++) { for(l = node->out_begin; l != node->out_end; l++) {
Link &link = *l; Link &link = *l;
Link::iterator c; for(unsigned int p = link.begin; p != link.end; p++) {
for(c = link.begin(); c != link.end(); c++) {
unsigned int p = c;
while(p >= levels.size()) levels.push_back(-1); while(p >= levels.size()) levels.push_back(-1);
levels[p] = current; levels[p] = current;
} }

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.6 2005/02/20 00:43:23 ponchio
Less memory x extraction. (removed frags)
Revision 1.5 2005/02/19 16:22:45 ponchio Revision 1.5 2005/02/19 16:22:45 ponchio
Minor changes (visited and Cell) Minor changes (visited and Cell)
@ -57,49 +60,26 @@ namespace nxs {
std::vector<unsigned int> created; std::vector<unsigned int> created;
}; };
// struct Cell {
// unsigned int patch;
// float error;
// };
struct Node; struct Node;
struct Link { struct Link {
Node *node; Node *node;
unsigned int begin; //begin patch of the fragment
unsigned int end; //end patch of the fragment
//TODO move to frag_begin frag_end (instead of frag_size)
//and test speed... before so maybe also for node
typedef unsigned int iterator; typedef unsigned int iterator;
iterator begin() { return frag_begin; } unsigned int size() { return end - begin; }
iterator end() { return frag_begin + frag_size; }
unsigned int size() { return frag_size; }
unsigned int frag_begin;
unsigned int frag_size;
}; };
struct Node { struct Node {
typedef Link *iterator; typedef Link *iterator;
Link *in_begin, *in_end;
iterator in_begin() { return in_link_begin; } Link *out_begin, *out_end;
iterator in_end() { return in_link_begin + in_link_size; }
unsigned int size() { return in_link_size; }
iterator out_begin() { return out_link_begin; }
iterator out_end() { return out_link_begin + out_link_size; }
unsigned int out_size() { return out_link_size; }
Link *in_link_begin;
unsigned int in_link_size;
Link *out_link_begin;
unsigned int out_link_size;
}; };
Node *nodes; Node *nodes;
Link *in_links; Link *in_links;
Link *out_links; Link *out_links;
//TODO this list is really not necessary if we order our cells
// unsigned int *frags;
std::vector<Update> updates; std::vector<Update> updates;
@ -132,11 +112,10 @@ namespace nxs {
int &n_nodes() { return ((int *)buffer)[1]; } int &n_nodes() { return ((int *)buffer)[1]; }
int &n_in_links() { return ((int *)buffer)[2]; } int &n_in_links() { return ((int *)buffer)[2]; }
int &n_out_links() { return ((int *)buffer)[3]; } int &n_out_links() { return ((int *)buffer)[3]; }
// int &n_frags() { return ((int *)buffer)[4]; }
typedef Node *iterator; // typedef Node *iterator;
iterator begin() { return nodes; } // iterator begin() { return nodes; }
iterator end() { return nodes + n_nodes(); } // iterator end() { return nodes + n_nodes(); }
protected: protected:
unsigned int size; unsigned int size;
char *buffer; char *buffer;

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.6 2005/02/20 18:07:01 ponchio
cleaning.
Revision 1.5 2005/02/19 16:22:45 ponchio Revision 1.5 2005/02/19 16:22:45 ponchio
Minor changes (visited and Cell) Minor changes (visited and Cell)
@ -76,7 +79,10 @@ namespace nxs {
if(culling) { if(culling) {
float remote = frustum.Remoteness(sph.Center(), sph.Radius()); float remote = frustum.Remoteness(sph.Center(), sph.Radius());
if(remote > 0) { if(remote > 0) {
visible = false; //TODO remoteness is bugged when the sphere is really close
//FIX it!
if(frustum.IsOutside(sph.Center(), sph.Radius()))
visible = false;
error /= remote; error /= remote;
} else if(entry.cone.Backface(sph, frustum.ViewPoint())) { } else if(entry.cone.Backface(sph, frustum.ViewPoint())) {
visible = false; visible = false;

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.34 2005/02/20 18:07:01 ponchio
cleaning.
Revision 1.33 2005/02/20 00:43:23 ponchio Revision 1.33 2005/02/20 00:43:23 ponchio
Less memory x extraction. (removed frags) Less memory x extraction. (removed frags)
@ -257,8 +260,11 @@ void NexusMt::Draw(unsigned int cell, DrawContest &contest) {
if(signature.vnorm && contest.attrs & DrawContest::NORMAL) { if(signature.vnorm && contest.attrs & DrawContest::NORMAL) {
assert(signature.vnorm == Encodings::SHORT4); // assert(signature.vnorm == Encodings::SHORT4);
glNormalPointer(GL_SHORT, 8, nstart); if(signature.vnorm == Encodings::SHORT4)
glNormalPointer(GL_SHORT, 8, nstart);
else
glNormalPointer(GL_FLOAT, 0, nstart);
} }

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.23 2005/02/20 18:07:01 ponchio
cleaning.
Revision 1.22 2005/02/20 00:43:24 ponchio Revision 1.22 2005/02/20 00:43:24 ponchio
Less memory x extraction. (removed frags) Less memory x extraction. (removed frags)
@ -582,16 +585,16 @@ void printInfo(Nexus &nexus, bool verbose, bool dump_history) {
} }
meandist /= nexus.size() -1; meandist /= nexus.size() -1;
cout << "\n\tCompressed: " << nexus.IsCompressed() cout << "\n\tCompressed: " << nexus.IsCompressed()
<< "\n\tStripped: " << "\n\tStripped : "
<< (int)(nexus.signature.face == Signature::STRIPS) << (int)(nexus.signature.face == Signature::STRIPS)
<< "\n\tColor : " << (int)(nexus.signature.vcolor !=0) << "\n\tColor : " << (int)(nexus.signature.vcolor)
<< "\n\tNormal : " << (int)((nexus.signature.vnorm) !=0) << "\n\tNormal : " << (int)(nexus.signature.vnorm)
<< "\n\tTexture : " << (int)((nexus.signature.vtext) !=0) << "\n\tTexture : " << (int)(nexus.signature.vtext)
<< "\n\tData : " << (int)((nexus.signature.vdata) !=0) << "\n\tData : " << (int)(nexus.signature.vdata)
<< "\n\n\tVertices: " << nexus.totvert << "\n\n\tVertices: " << nexus.totvert
<< "\tFaces: " << nexus.totface << "\tFaces : " << nexus.totface
<< "\tPatches: " << nexus.size() << "\tPatches : " << nexus.size()
<< "\n\tSphere: " << "\n\tSphere : "
<< nexus.sphere.Center()[0] << " " << nexus.sphere.Center()[0] << " "
<< nexus.sphere.Center()[1] << " " << nexus.sphere.Center()[1] << " "
<< nexus.sphere.Center()[2] << " R: " << nexus.sphere.Center()[2] << " R: "
@ -604,21 +607,17 @@ void printInfo(Nexus &nexus, bool verbose, bool dump_history) {
cout << "Quick format\n"; cout << "Quick format\n";
for(unsigned int i = 0; i < nexus.history.n_nodes(); i++) { for(unsigned int i = 0; i < nexus.history.n_nodes(); i++) {
cout << "Node: " << i << " out: "; cout << "Node: " << i << " out: ";
History::History::Node node = nexus.history.nodes[i]; History::Node node = nexus.history.nodes[i];
for(History::Node::iterator l = node.out_begin(); for(History::Link *l = node.out_begin; l != node.out_end; l++) {
l != node.out_end(); l++) {
cout << "."; cout << ".";
History::Link &link = *l; for(unsigned int p = l->begin; p != l->end; p++) {
for(History::Link::iterator p = link.begin(); p != link.end(); p++) {
cout << p << " "; cout << p << " ";
} }
} }
cout << " in: "; cout << " in: ";
for(History::Node::iterator j = node.in_begin(); for(History::Link *j = node.in_begin; j != node.in_end; j++) {
j != node.in_end(); j++) {
cout << "."; cout << ".";
History::Link &link = *j; for(unsigned int p = j->begin; p != j->end; p++) {
for(History::Link::iterator p = link.begin(); p != link.end(); p++) {
cout << p << " "; cout << p << " ";
} }
} }