Debug, cleaning and optimization.
This commit is contained in:
parent
487f113015
commit
ed2d3c823b
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.6 2005/01/21 17:09:12 ponchio
|
||||||
|
Porting and debug.
|
||||||
|
|
||||||
Revision 1.5 2004/10/08 14:46:26 ponchio
|
Revision 1.5 2004/10/08 14:46:26 ponchio
|
||||||
Working version.
|
Working version.
|
||||||
|
|
||||||
|
@ -77,7 +80,7 @@ class Border {
|
||||||
links(l), used(_used), size(_size), start(0) {}
|
links(l), used(_used), size(_size), start(0) {}
|
||||||
unsigned int Size() { return used; }
|
unsigned int Size() { return used; }
|
||||||
//TODO rename available to capacity.
|
//TODO rename available to capacity.
|
||||||
unsigned int Available() { return size; }
|
unsigned int Capacity() { return size; }
|
||||||
Link &operator[](unsigned int i) { return links[i]; }
|
Link &operator[](unsigned int i) { return links[i]; }
|
||||||
Link *Start() { return links; }
|
Link *Start() { return links; }
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.10 2005/02/08 12:43:03 ponchio
|
||||||
|
Added copyright
|
||||||
|
|
||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
@ -86,6 +89,9 @@ Border &BorderServer::GetBorder(unsigned int border, bool flush) {
|
||||||
index[border] = pqueue.begin();
|
index[border] = pqueue.begin();
|
||||||
} else {
|
} else {
|
||||||
while(flush && ram_used > ram_max) {
|
while(flush && ram_used > ram_max) {
|
||||||
|
if(!pqueue.size()) {
|
||||||
|
cerr << "Ram used: " << ram_used << " ram max: " << ram_max << endl;
|
||||||
|
}
|
||||||
assert(pqueue.size());
|
assert(pqueue.size());
|
||||||
unsigned int to_flush = pqueue.back();
|
unsigned int to_flush = pqueue.back();
|
||||||
pqueue.pop_back();
|
pqueue.pop_back();
|
||||||
|
@ -115,6 +121,8 @@ void BorderServer::ResizeBorder(unsigned int border, unsigned int used) {
|
||||||
unsigned int newstart = Length()/sizeof(Link);
|
unsigned int newstart = Length()/sizeof(Link);
|
||||||
Redim((int64)(newstart + capacity) * (int64)sizeof(Link));
|
Redim((int64)(newstart + capacity) * (int64)sizeof(Link));
|
||||||
Link *newlinks = new Link[capacity];
|
Link *newlinks = new Link[capacity];
|
||||||
|
ram_used += (capacity - entry.size);
|
||||||
|
|
||||||
if(entry.used > 0) {
|
if(entry.used > 0) {
|
||||||
assert(entry.links);
|
assert(entry.links);
|
||||||
memcpy(newlinks, entry.links, entry.used * sizeof(Link));
|
memcpy(newlinks, entry.links, entry.used * sizeof(Link));
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.5 2005/02/08 12:43:03 ponchio
|
||||||
|
Added copyright
|
||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
@ -44,14 +46,6 @@ $Log: not supported by cvs2svn $
|
||||||
|
|
||||||
namespace nxs {
|
namespace nxs {
|
||||||
|
|
||||||
//This should be Border class!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
/*struct BorderEntry {
|
|
||||||
unsigned int start; //granuralita' Link
|
|
||||||
unsigned short size; //in Links //TODO what are this? be clear!
|
|
||||||
unsigned short used; //in Links
|
|
||||||
Link *links;
|
|
||||||
};*/
|
|
||||||
|
|
||||||
class BorderServer: public IndexFile<Border> {
|
class BorderServer: public IndexFile<Border> {
|
||||||
public:
|
public:
|
||||||
BorderServer(): ram_max(1000000), ram_used(0) {}
|
BorderServer(): ram_max(1000000), ram_used(0) {}
|
||||||
|
@ -65,15 +59,9 @@ class BorderServer: public IndexFile<Border> {
|
||||||
Border &GetBorder(unsigned int border, bool flush = true);
|
Border &GetBorder(unsigned int border, bool flush = true);
|
||||||
void ResizeBorder(unsigned int border, unsigned int size);
|
void ResizeBorder(unsigned int border, unsigned int size);
|
||||||
|
|
||||||
/*unsigned int BorderSize(unsigned int i) {
|
|
||||||
return operator[](i).used;
|
|
||||||
}
|
|
||||||
unsigned int BorderCapacity(unsigned int i) {
|
|
||||||
return operator[](i).size;
|
|
||||||
} */
|
|
||||||
protected:
|
|
||||||
unsigned int ram_max;
|
unsigned int ram_max;
|
||||||
unsigned int ram_used;
|
unsigned int ram_used;
|
||||||
|
protected:
|
||||||
std::list<unsigned int> pqueue;
|
std::list<unsigned int> pqueue;
|
||||||
std::map<unsigned int, std::list<unsigned int>::iterator> index;
|
std::map<unsigned int, std::list<unsigned int>::iterator> index;
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.3 2004/11/30 22:50:30 ponchio
|
||||||
|
Level 0.
|
||||||
|
|
||||||
Revision 1.2 2004/07/02 13:08:11 ponchio
|
Revision 1.2 2004/07/02 13:08:11 ponchio
|
||||||
Changed extension to .cri, crv, crf
|
Changed extension to .cri, crv, crf
|
||||||
|
|
||||||
|
@ -36,6 +39,7 @@ Created
|
||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include "crude.h"
|
#include "crude.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.5 2004/11/30 22:50:30 ponchio
|
||||||
|
Level 0.
|
||||||
|
|
||||||
Revision 1.4 2004/07/05 15:49:38 ponchio
|
Revision 1.4 2004/07/05 15:49:38 ponchio
|
||||||
Windows (DevCpp, mingw) port.
|
Windows (DevCpp, mingw) port.
|
||||||
|
|
||||||
|
@ -45,7 +48,7 @@ Created
|
||||||
#ifndef NXS_CRUDE_H
|
#ifndef NXS_CRUDE_H
|
||||||
#define NXS_CRUDE_H
|
#define NXS_CRUDE_H
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vcg/space/point3.h>
|
#include <vcg/space/point3.h>
|
||||||
#include <vcg/space/box3.h>
|
#include <vcg/space/box3.h>
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.8 2005/02/21 20:49:30 ponchio
|
||||||
|
some culling bug.
|
||||||
|
|
||||||
Revision 1.7 2005/02/20 19:49:44 ponchio
|
Revision 1.7 2005/02/20 19:49:44 ponchio
|
||||||
cleaning (a bit more).
|
cleaning (a bit more).
|
||||||
|
|
||||||
|
@ -90,7 +93,7 @@ namespace nxs {
|
||||||
visible = false;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.35 2005/02/20 19:49:44 ponchio
|
||||||
|
cleaning (a bit more).
|
||||||
|
|
||||||
Revision 1.34 2005/02/20 18:07:01 ponchio
|
Revision 1.34 2005/02/20 18:07:01 ponchio
|
||||||
cleaning.
|
cleaning.
|
||||||
|
|
||||||
|
@ -241,8 +244,8 @@ void NexusMt::Draw(unsigned int cell, DrawContest &contest) {
|
||||||
|
|
||||||
fstart = NULL;
|
fstart = NULL;
|
||||||
vstart = NULL;
|
vstart = NULL;
|
||||||
cstart = (char *)(64 * (int)patch.vstartc);
|
cstart = (char *)(patch.vstartc - patch.vstart);
|
||||||
nstart = (char *)(64 * (int)patch.vstartn);
|
nstart = (char *)(patch.vstartn - patch.vstart);
|
||||||
} else {
|
} else {
|
||||||
fstart = (char *)patch.FaceBegin();
|
fstart = (char *)patch.FaceBegin();
|
||||||
vstart = (char *)patch.Vert3fBegin();
|
vstart = (char *)patch.Vert3fBegin();
|
||||||
|
@ -388,7 +391,7 @@ void NexusMt::LoadVbo(Entry &entry) {
|
||||||
vbo_used += size;
|
vbo_used += size;
|
||||||
|
|
||||||
//TODO fix this when we allow data :p
|
//TODO fix this when we allow data :p
|
||||||
size = 64 * (int)patch.vstartd;
|
size = patch.vstartd - patch.vstart;
|
||||||
|
|
||||||
glGenBuffersARB(1, &entry.vbo_array);
|
glGenBuffersARB(1, &entry.vbo_array);
|
||||||
assert(entry.vbo_array);
|
assert(entry.vbo_array);
|
||||||
|
@ -410,7 +413,7 @@ void NexusMt::FlushVbo(Entry &entry) {
|
||||||
|
|
||||||
Patch &patch = *entry.patch;
|
Patch &patch = *entry.patch;
|
||||||
vbo_used -= patch.nf * sizeof(unsigned short);
|
vbo_used -= patch.nf * sizeof(unsigned short);
|
||||||
vbo_used -= sizeof(float) * patch.vstartd;
|
vbo_used -= sizeof(float) * (patch.vstart - patch.vstartd);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Kept for historical reasons.
|
//Kept for historical reasons.
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.22 2005/02/21 17:55:36 ponchio
|
||||||
|
debug debug debug
|
||||||
|
|
||||||
Revision 1.21 2005/02/20 18:07:01 ponchio
|
Revision 1.21 2005/02/20 18:07:01 ponchio
|
||||||
cleaning.
|
cleaning.
|
||||||
|
|
||||||
|
@ -61,62 +64,185 @@ using namespace std;
|
||||||
using namespace nxs;
|
using namespace nxs;
|
||||||
using namespace vcg;
|
using namespace vcg;
|
||||||
|
|
||||||
#include "tristripper/tri_stripper.h"
|
|
||||||
using namespace triangle_stripper;
|
|
||||||
|
|
||||||
|
void nxs::Connect(Nexus &nexus, std::vector< set<unsigned int> > &close,
|
||||||
|
float threshold) {
|
||||||
|
|
||||||
/*void nxs::TightSphere(vcg::Sphere3f &sphere,
|
VPartition grid;
|
||||||
std::vector<vcg::Point3f> &points) {
|
float max_radius = 0;
|
||||||
//test:
|
|
||||||
//assumes radius is ok.... and try to optimize moving center.
|
|
||||||
//TODO using a gradiend descent? really a mess.
|
|
||||||
Point3f center;
|
|
||||||
float radius;
|
|
||||||
Point3f pert[14];
|
|
||||||
while(1) {
|
|
||||||
radius = sphere.Radius();
|
|
||||||
float step = radius/40;
|
|
||||||
pert[0] = Point3f(step, 0, 0);
|
|
||||||
pert[1] = -pert[0];
|
|
||||||
pert[2] = Point3f(0, step, 0);
|
|
||||||
pert[3] = -pert[2];
|
|
||||||
pert[4] = Point3f(0, 0, step);
|
|
||||||
pert[5] = -pert[4];
|
|
||||||
pert[6] = Point3f(step, step, step);
|
|
||||||
pert[7] = Point3f(step, step, -step);
|
|
||||||
pert[8] = Point3f(step, -step, step);
|
|
||||||
pert[9] = Point3f(step, -step, -step);
|
|
||||||
pert[10] = Point3f(-step, step, step);
|
|
||||||
pert[11] = Point3f(-step, step, -step);
|
|
||||||
pert[12] = Point3f(-step, -step, step);
|
|
||||||
pert[13] = Point3f(-step, -step, -step);
|
|
||||||
|
|
||||||
unsigned int best = 14;
|
for(unsigned int patch = 0; patch < nexus.size(); patch++) {
|
||||||
float best_radius = sphere.Radius();
|
Sphere3f &sphere = nexus[patch].sphere;
|
||||||
|
grid.push_back(sphere.Center());
|
||||||
for(unsigned int k = 0; k < 14; k++) {
|
float r = sphere.Radius();
|
||||||
center = sphere.Center() + pert[k];
|
if(r > max_radius) max_radius = r;
|
||||||
radius = 0;
|
|
||||||
for(unsigned int i = 0; i < points.size(); i++) {
|
|
||||||
float r = 1.01 * Distance(center, points[i]);
|
|
||||||
if(r > radius)
|
|
||||||
radius = r;
|
|
||||||
}
|
}
|
||||||
if(radius < best_radius) {
|
grid.Init();
|
||||||
best = k;
|
close.clear();
|
||||||
best_radius = radius;
|
close.resize(nexus.size());
|
||||||
|
|
||||||
|
vector<int> targets;
|
||||||
|
vector<double> dists;
|
||||||
|
for(unsigned int patch = 0; patch < nexus.size(); patch++) {
|
||||||
|
float radius = nexus[patch].sphere.Radius();
|
||||||
|
float max_distance = radius + max_radius + threshold;
|
||||||
|
max_distance *= max_distance;
|
||||||
|
grid.Closest(grid[patch], targets, dists, max_distance);
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < targets.size(); i++) {
|
||||||
|
unsigned int target = targets[i];
|
||||||
|
if(target == patch) continue;
|
||||||
|
float dist = radius + nexus[target].sphere.Radius() + threshold;
|
||||||
|
dist *= dist;
|
||||||
|
if(dist >= dists[i]) {
|
||||||
|
close[patch].insert(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(best == 14) break;
|
|
||||||
sphere.Center() = sphere.Center() + pert[best];
|
|
||||||
sphere.Radius() = best_radius;
|
|
||||||
}
|
}
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
|
//DOUBLECROSS CHECK
|
||||||
|
for(unsigned int patch = 0; patch < nexus.size(); patch++) {
|
||||||
|
set<unsigned int>::iterator i;
|
||||||
|
for(i = close[patch].begin(); i != close[patch].end(); i++) {
|
||||||
|
if(!close[*i].count(patch)) {
|
||||||
|
cerr << "Some problem width sphere intersection. Have alook.\n";
|
||||||
|
cerr << "Meanwhile i fix it.\n";
|
||||||
|
close[*i].insert(patch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void nxs::ComputeNormals(Nexus &nexus) {
|
void nxs::ComputeNormals(Nexus &nexus) {
|
||||||
assert(nexus.signature.vnorm);
|
assert(nexus.signature.vnorm);
|
||||||
|
assert(!nexus.borders.IsReadOnly());
|
||||||
|
|
||||||
|
//first calculate level 0 normals
|
||||||
|
//I load all patches in a fragment
|
||||||
|
//calculate normals
|
||||||
|
//fix external borders getting from level below
|
||||||
|
|
||||||
|
//first try naive approach just load neighborough get normals and
|
||||||
|
//fix border with lower level
|
||||||
|
|
||||||
|
vector<int> levels;
|
||||||
|
nexus.history.BuildLevels(levels);
|
||||||
|
Report report(nexus.size(), 15);
|
||||||
|
|
||||||
|
//TODO check level 0 is the finer onr
|
||||||
|
|
||||||
|
int current_level = 0;
|
||||||
|
while(1) {
|
||||||
|
int count = 0;
|
||||||
|
for(unsigned int p = 0; p < nexus.size(); p++) {
|
||||||
|
if(levels[p] != current_level) continue;
|
||||||
|
count++;
|
||||||
|
report.Step(p);
|
||||||
|
|
||||||
|
Border &border = nexus.GetBorder(p);
|
||||||
|
|
||||||
|
map<unsigned int, vector<Point3f> > normals;
|
||||||
|
normals[p] = vector<Point3f>();
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < border.Size(); i++) {
|
||||||
|
Link &link = border[i];
|
||||||
|
if(levels[link.end_patch] == current_level)
|
||||||
|
normals[link.end_patch] = vector<Point3f>();
|
||||||
|
}
|
||||||
|
map<unsigned int, vector<Point3f> >::iterator k;
|
||||||
|
for(k = normals.begin(); k != normals.end(); k++) {
|
||||||
|
Patch &patch = nexus.GetPatch((*k).first);
|
||||||
|
|
||||||
|
vector<Point3f> &normal = (*k).second;
|
||||||
|
normal.resize(patch.nv, Point3f(0, 0, 0));
|
||||||
|
|
||||||
|
if(nexus.signature.face == Signature::TRIANGLES) {
|
||||||
|
for(unsigned int i = 0; i < patch.nf; i++) {
|
||||||
|
unsigned short *f = patch.Face(i);
|
||||||
|
Point3f &v0 = patch.Vert3f(f[0]);
|
||||||
|
Point3f &v1 = patch.Vert3f(f[1]);
|
||||||
|
Point3f &v2 = patch.Vert3f(f[2]);
|
||||||
|
Point3f norm = (v1 - v0) ^ (v2 - v0);
|
||||||
|
normal[f[0]] += norm;
|
||||||
|
normal[f[1]] += norm;
|
||||||
|
normal[f[2]] += norm;
|
||||||
|
}
|
||||||
|
} else if(nexus.signature.face == Signature::STRIPS) {
|
||||||
|
for(int i = 0; i < patch.nf - 2; i++) {
|
||||||
|
unsigned short *f = patch.FaceBegin() + i;
|
||||||
|
Point3f &v0 = patch.Vert3f(f[0]);
|
||||||
|
Point3f &v1 = patch.Vert3f(f[1]);
|
||||||
|
Point3f &v2 = patch.Vert3f(f[2]);
|
||||||
|
Point3f norm = (v1 - v0) ^ (v2 - v0);
|
||||||
|
if(i%2) norm = -norm;
|
||||||
|
normal[f[0]] += norm;
|
||||||
|
normal[f[1]] += norm;
|
||||||
|
normal[f[2]] += norm;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//now fix borders
|
||||||
|
map<unsigned int, vector<Link> > lowers;
|
||||||
|
for(unsigned int i = 0; i < border.Size(); i++) {
|
||||||
|
Link &link = border[i];
|
||||||
|
if(levels[link.end_patch] == current_level) {
|
||||||
|
//TODO remove these asserts
|
||||||
|
assert(normals[p].size() > link.start_vert);
|
||||||
|
assert(normals.count(link.end_patch));
|
||||||
|
assert(normals[link.end_patch].size() > link.end_vert);
|
||||||
|
normals[p][link.start_vert] += normals[link.end_patch][link.end_vert];
|
||||||
|
} else if (levels[link.end_patch] < current_level) {
|
||||||
|
lowers[link.end_patch].push_back(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
map<unsigned int, vector<Link> >::iterator s;
|
||||||
|
for(s = lowers.begin(); s != lowers.end(); s++) {
|
||||||
|
Patch &patch = nexus.GetPatch((*s).first);
|
||||||
|
for(unsigned int i = 0; i < (*s).second.size(); i++) {
|
||||||
|
Link &link = (*s).second[i];
|
||||||
|
if(nexus.signature.vnorm == Encodings::FLOAT3)
|
||||||
|
normals[p][link.start_vert] =
|
||||||
|
((Point3f *)patch.VNormBegin())[link.end_vert];
|
||||||
|
else if(nexus.signature.vnorm == Encodings::SHORT4) {
|
||||||
|
Point3f &nor = normals[p][link.start_vert];
|
||||||
|
short *n = ((short *)patch.VNormBegin()) + 4*link.end_vert;
|
||||||
|
nor[0] = n[0];
|
||||||
|
nor[1] = n[1];
|
||||||
|
nor[2] = n[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//copy and normalize
|
||||||
|
Patch &patch = nexus.GetPatch(p);
|
||||||
|
Entry &entry = nexus[p];
|
||||||
|
Point3f *norm = (Point3f *)patch.VNormBegin();
|
||||||
|
vector<Point3f> &newnormals = normals[p];
|
||||||
|
assert(newnormals.size() == patch.nv);
|
||||||
|
for(unsigned int i = 0; i < patch.nv; i++) {
|
||||||
|
newnormals[i].Normalize();
|
||||||
|
if(nexus.signature.vnorm == Encodings::SHORT4) {
|
||||||
|
newnormals[i] *= 32766;
|
||||||
|
short *np = ((short *)norm) + 4 * i;
|
||||||
|
np[0] = (short)newnormals[i][0];
|
||||||
|
np[1] = (short)newnormals[i][1];
|
||||||
|
np[2] = (short)newnormals[i][2];
|
||||||
|
np[3] = 0;
|
||||||
|
} else if(nexus.signature.vnorm == Encodings::FLOAT3)
|
||||||
|
norm[i] = newnormals[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(count == 0) break;
|
||||||
|
current_level++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*void nxs::ComputeNormals(Nexus &nexus) {
|
||||||
|
assert(nexus.signature.vnorm);
|
||||||
|
|
||||||
//setting borders readonly:
|
//setting borders readonly:
|
||||||
|
|
||||||
|
@ -254,36 +380,6 @@ void nxs::ComputeNormals(Nexus &nexus) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* set<unsigned int> close;
|
|
||||||
for(unsigned int i = 0; i < border.Size(); i++) {
|
|
||||||
Link &link = border[i];
|
|
||||||
if(link.IsNull()) continue;
|
|
||||||
unsigned int off = tmpb_start[p];
|
|
||||||
Point3f p = tmpb.read(off + i);
|
|
||||||
p += normals[link.start_vert];
|
|
||||||
tmpb.write(off + i, p);
|
|
||||||
// tmpb[off + i] += normals[link.start_vert];
|
|
||||||
close.insert(link.end_patch);
|
|
||||||
}
|
|
||||||
|
|
||||||
set<unsigned int>::iterator k;
|
|
||||||
for(k = close.begin(); k != close.end(); k++) {
|
|
||||||
Border &remote = nexus.GetBorder(*k);
|
|
||||||
unsigned int off = tmpb_start[*k];
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < remote.Size(); i++) {
|
|
||||||
Link &link = remote[i];
|
|
||||||
if(link.IsNull()) continue;
|
|
||||||
if(link.end_patch != p) continue;
|
|
||||||
Point3f p = tmpb.read(off + i);
|
|
||||||
p += normals[link.end_vert];
|
|
||||||
tmpb.write(off + i, p);
|
|
||||||
// tmpb[off + i] += normals[link.end_vert];
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Second step unify normals across borders
|
//Second step unify normals across borders
|
||||||
|
@ -321,60 +417,9 @@ void nxs::ComputeNormals(Nexus &nexus) {
|
||||||
tmpb.Delete();
|
tmpb.Delete();
|
||||||
//TODO remove temporary file.
|
//TODO remove temporary file.
|
||||||
nexus.borders.SetReadOnly(false);
|
nexus.borders.SetReadOnly(false);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
void nxs::ComputeTriStrip(unsigned short nfaces, unsigned short *faces,
|
|
||||||
vector<unsigned short> &strip) {
|
|
||||||
|
|
||||||
|
|
||||||
vector<unsigned int> index;
|
|
||||||
index.resize(nfaces*3);
|
|
||||||
for(int i = 0; i < nfaces*3; i++) {
|
|
||||||
index[i] = faces[i];
|
|
||||||
}
|
|
||||||
int cache_size = 0;
|
|
||||||
tri_stripper stripper(index);
|
|
||||||
stripper.SetCacheSize(cache_size);
|
|
||||||
// = 0 will disable the cache optimizer
|
|
||||||
stripper.SetMinStripSize(0);
|
|
||||||
tri_stripper::primitives_vector primitives;
|
|
||||||
stripper.Strip(&primitives);
|
|
||||||
|
|
||||||
if(primitives.back().m_Indices.size() < 3) {
|
|
||||||
primitives.pop_back();
|
|
||||||
}
|
|
||||||
//TODO spostare questo dentro il ciclo che rimonta le strip.
|
|
||||||
if(primitives.back().m_Type == tri_stripper::PT_Triangles) {
|
|
||||||
tri_stripper::primitives p;
|
|
||||||
p = primitives.back();
|
|
||||||
primitives.pop_back();
|
|
||||||
for(unsigned int i = 0; i < p.m_Indices.size(); i += 3) {
|
|
||||||
tri_stripper::primitives s;
|
|
||||||
s.m_Type = tri_stripper::PT_Triangle_Strip;
|
|
||||||
s.m_Indices.push_back(p.m_Indices[i]);
|
|
||||||
s.m_Indices.push_back(p.m_Indices[i+1]);
|
|
||||||
s.m_Indices.push_back(p.m_Indices[i+2]);
|
|
||||||
primitives.push_back(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < primitives.size(); i++) {
|
|
||||||
tri_stripper::primitives &primitive = primitives[i];
|
|
||||||
assert(primitive.m_Indices.size() != 0);
|
|
||||||
int len = primitive.m_Indices.size();
|
|
||||||
for(int l = 0; l < len; l++)
|
|
||||||
strip.push_back(primitive.m_Indices[l]);
|
|
||||||
|
|
||||||
|
|
||||||
if(i < primitives.size()-1) { //not the last primitive.
|
|
||||||
strip.push_back(primitive.m_Indices[len-1]);
|
|
||||||
//TODO optimize this!
|
|
||||||
if((len%2) == 1) //do not change orientation....
|
|
||||||
strip.push_back(primitive.m_Indices[len-1]);
|
|
||||||
strip.push_back(primitives[i+1].m_Indices[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//TODO why i created this function? wonder...
|
//TODO why i created this function? wonder...
|
||||||
|
@ -415,6 +460,35 @@ void nxs::Reorder(Signature &signature, Patch &patch) {
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
//TODO actually use threshold
|
//TODO actually use threshold
|
||||||
|
|
||||||
|
void nxs::Unify(Nexus &nexus, float threshold) {
|
||||||
|
/* threshold = 0.00001;
|
||||||
|
unsigned int duplicated = 0;
|
||||||
|
unsigned int degenerate = 0;
|
||||||
|
|
||||||
|
for(unsigned int p = 0; p < nexus.size(); p++) {
|
||||||
|
if(levels[p] != current_level) continue;
|
||||||
|
count++;
|
||||||
|
report.Step(p);
|
||||||
|
|
||||||
|
Border &border = nexus.GetBorder(p);
|
||||||
|
|
||||||
|
map<unsigned int, vector<Point3f> > normals;
|
||||||
|
normals[p] = vector<Point3f>();
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < border.Size(); i++) {
|
||||||
|
Link &link = border[i];
|
||||||
|
if(levels[link.end_patch] == current_level)
|
||||||
|
normals[link.end_patch] = vector<Point3f>();
|
||||||
|
}
|
||||||
|
map<unsigned int, vector<Point3f> >::iterator k;
|
||||||
|
for(k = normals.begin(); k != normals.end(); k++) {
|
||||||
|
Patch &patch = nexus.GetPatch((*k).first);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void nxs::Unify(Nexus &nexus, float threshold) {
|
void nxs::Unify(Nexus &nexus, float threshold) {
|
||||||
threshold = 0.001;
|
threshold = 0.001;
|
||||||
//TODO what if colors or normals or strips?
|
//TODO what if colors or normals or strips?
|
||||||
|
@ -551,7 +625,7 @@ void nxs::Unify(Nexus &nexus, float threshold) {
|
||||||
if(degenerate)
|
if(degenerate)
|
||||||
cerr << "Found " << degenerate << " degenerate face while unmifying\n";
|
cerr << "Found " << degenerate << " degenerate face while unmifying\n";
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
void nxs::ZSort(Nexus &nexus, vector<unsigned int> &forward,
|
void nxs::ZSort(Nexus &nexus, vector<unsigned int> &forward,
|
||||||
vector<unsigned int> &backward) {
|
vector<unsigned int> &backward) {
|
||||||
//lets get a bounding box from the sphere:
|
//lets get a bounding box from the sphere:
|
||||||
|
@ -590,3 +664,4 @@ void nxs::ZSort(Nexus &nexus, vector<unsigned int> &forward,
|
||||||
for(unsigned int i = 0; i < backward.size(); i++)
|
for(unsigned int i = 0; i < backward.size(); i++)
|
||||||
backward[forward[i]] = i;
|
backward[forward[i]] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.8 2005/02/21 17:55:36 ponchio
|
||||||
|
debug debug debug
|
||||||
|
|
||||||
Revision 1.7 2005/02/20 18:07:01 ponchio
|
Revision 1.7 2005/02/20 18:07:01 ponchio
|
||||||
cleaning.
|
cleaning.
|
||||||
|
|
||||||
|
@ -42,6 +45,7 @@ Added copyright
|
||||||
#ifndef NXS_ALGO_H
|
#ifndef NXS_ALGO_H
|
||||||
#define NXS_ALGO_H
|
#define NXS_ALGO_H
|
||||||
|
|
||||||
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "patch.h"
|
#include "patch.h"
|
||||||
#include <vcg/space/sphere3.h>
|
#include <vcg/space/sphere3.h>
|
||||||
|
@ -58,10 +62,13 @@ namespace nxs {
|
||||||
bool operator<(const ZEntry &e) const { return pos < e.pos; }
|
bool operator<(const ZEntry &e) const { return pos < e.pos; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//for every patch return close by (sphere intersecting)
|
||||||
|
//threshold is added to the distance to make sure we do not miss anything
|
||||||
|
void Connect(Nexus &nexus, std::vector< std::set<unsigned int> > &close,
|
||||||
|
float threshold);
|
||||||
|
|
||||||
void ComputeNormals(Nexus &nexus);
|
void ComputeNormals(Nexus &nexus);
|
||||||
void ComputeTriStrip(unsigned short nfaces, unsigned short *faces,
|
|
||||||
std::vector<unsigned short> &strip);
|
|
||||||
void Reorder(Signature &signature, nxs::Patch &patch);
|
|
||||||
void Unify(Nexus &nexus, float threshold);
|
void Unify(Nexus &nexus, float threshold);
|
||||||
void ZSort(Nexus &nexus, std::vector<unsigned int> &forward,
|
void ZSort(Nexus &nexus, std::vector<unsigned int> &forward,
|
||||||
std::vector<unsigned int> &backward);
|
std::vector<unsigned int> &backward);
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.20 2005/02/21 17:55:47 ponchio
|
||||||
|
debug debug debug
|
||||||
|
|
||||||
Revision 1.19 2005/02/20 18:07:01 ponchio
|
Revision 1.19 2005/02/20 18:07:01 ponchio
|
||||||
cleaning.
|
cleaning.
|
||||||
|
|
||||||
|
@ -432,7 +435,6 @@ void FourthStep(const string &crudefile, const string &output,
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
nexus.MaxRam() = ram_buffer / nexus.chunk_size;
|
nexus.MaxRam() = ram_buffer / nexus.chunk_size;
|
||||||
//TODO Clear borders in case of failure!
|
|
||||||
|
|
||||||
VFile<unsigned int> vert_remap;
|
VFile<unsigned int> vert_remap;
|
||||||
if(!vert_remap.Load(output + ".rvm", true)) {
|
if(!vert_remap.Load(output + ".rvm", true)) {
|
||||||
|
@ -446,58 +448,36 @@ void FourthStep(const string &crudefile, const string &output,
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*float max_radius = 0;
|
vector<set<unsigned int> > close;
|
||||||
VPartition grid;
|
Connect(nexus, close, 0.0001);
|
||||||
for(int start = 0; start < nexus.size(); start++) {
|
|
||||||
Entry &entry = nexus[start];
|
|
||||||
Sphere3f &sphere = entry.sphere;
|
|
||||||
if(sphere.Radius() > max_radius) max_radius = sphere.Radius();
|
|
||||||
grid.push_back(sphere.Center());
|
|
||||||
}
|
|
||||||
grid.Init();
|
|
||||||
max_radius *= max_radius * 4;
|
|
||||||
vector<int> nears;
|
|
||||||
vector<float> dists; */
|
|
||||||
|
|
||||||
|
|
||||||
Report report(nexus.size());
|
Report report(nexus.size());
|
||||||
|
|
||||||
for(int start = 0; start < nexus.size(); start++) {
|
for(int start = 0; start < nexus.size(); start++) {
|
||||||
report.Step(start);
|
report.Step(start);
|
||||||
Entry &s_entry = nexus[start];
|
// Entry &s_entry = nexus[start];
|
||||||
Sphere3f &sphere = s_entry.sphere;
|
// Sphere3f &sphere = s_entry.sphere;
|
||||||
|
|
||||||
vector<Link> links;
|
vector<Link> links;
|
||||||
#ifdef WIN32
|
|
||||||
hash_map<unsigned int, unsigned short> vremap;
|
|
||||||
#else
|
|
||||||
map<unsigned int, unsigned short> vremap;
|
map<unsigned int, unsigned short> vremap;
|
||||||
#endif
|
|
||||||
for(unsigned int i = 0; i < vert_index[start].size; i++) {
|
for(unsigned int i = 0; i < vert_index[start].size; i++) {
|
||||||
unsigned int global = vert_remap[vert_index[start].offset + i];
|
unsigned int global = vert_remap[vert_index[start].offset + i];
|
||||||
vremap[global] = i;
|
vremap[global] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*unsigned int n_nears = 10;
|
// for(int end = 0; end < nexus.size(); end++) {
|
||||||
while(1) {
|
// if(start == end) continue;
|
||||||
if(n_nears > grid.size()) n_nears = grid.size();
|
set<unsigned int>::iterator t;
|
||||||
grid.Closest(sphere.Center(), n_nears, nears, dists);
|
for(t = close[start].begin(); t != close[start].end(); t++) {
|
||||||
if(dists.back() > max_radius) break;
|
unsigned int end = (*t);
|
||||||
if(n_nears == grid.size()) break;
|
|
||||||
n_nears *= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int n = 0; n < nears.size(); n++) {
|
// Entry &e_entry = nexus[end];
|
||||||
unsigned int end = nears[n]; */
|
// float dist = Distance(s_entry.sphere.Center(), e_entry.sphere.Center());
|
||||||
for(int end = 0; end < nexus.size(); end++) {
|
|
||||||
if(start == end) continue;
|
|
||||||
|
|
||||||
Entry &e_entry = nexus[end];
|
// if(dist > s_entry.sphere.Radius() + e_entry.sphere.Radius()) {
|
||||||
float dist = Distance(s_entry.sphere, e_entry.sphere);
|
// continue;
|
||||||
|
// }
|
||||||
if(dist > s_entry.sphere.Radius() + e_entry.sphere.Radius()) {
|
// assert(close[start].count(end));
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < vert_index[end].size; i++) {
|
for(unsigned int i = 0; i < vert_index[end].size; i++) {
|
||||||
unsigned int global = vert_remap[vert_index[end].offset + i];
|
unsigned int global = vert_remap[vert_index[end].offset + i];
|
||||||
|
@ -510,7 +490,6 @@ void FourthStep(const string &crudefile, const string &output,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Border &border = nexus.GetBorder(start);
|
Border &border = nexus.GetBorder(start);
|
||||||
nexus.borders.ResizeBorder(start, 3 * links.size());
|
nexus.borders.ResizeBorder(start, 3 * links.size());
|
||||||
border.used = links.size();
|
border.used = links.size();
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.25 2005/02/21 17:55:47 ponchio
|
||||||
|
debug debug debug
|
||||||
|
|
||||||
Revision 1.24 2005/02/20 19:49:44 ponchio
|
Revision 1.24 2005/02/20 19:49:44 ponchio
|
||||||
cleaning (a bit more).
|
cleaning (a bit more).
|
||||||
|
|
||||||
|
@ -68,6 +71,7 @@ Added copyright
|
||||||
#include <vcg/space/index/grid_static_ptr.h>
|
#include <vcg/space/index/grid_static_ptr.h>
|
||||||
|
|
||||||
#include "nxsalgo.h"
|
#include "nxsalgo.h"
|
||||||
|
#include "strip.h"
|
||||||
#include "nexus.h"
|
#include "nexus.h"
|
||||||
#include "watch.h"
|
#include "watch.h"
|
||||||
|
|
||||||
|
@ -463,14 +467,14 @@ int main(int argc, char *argv[]) {
|
||||||
if(add_strips) {
|
if(add_strips) {
|
||||||
ComputeTriStrip(src_patch.nf, src_patch.FaceBegin(), strip);
|
ComputeTriStrip(src_patch.nf, src_patch.FaceBegin(), strip);
|
||||||
assert(strip.size() < 32767);
|
assert(strip.size() < 32767);
|
||||||
out.AddPatch(src_entry.nvert, strip.size(), src_border.Available());
|
out.AddPatch(src_entry.nvert, strip.size(), src_border.Capacity());
|
||||||
if(verbose) {
|
if(verbose) {
|
||||||
cerr << "tri: " << src_patch.nf << " strip: " << strip.size()
|
cerr << "tri: " << src_patch.nf << " strip: " << strip.size()
|
||||||
<< " ratio: " << (float)strip.size()/(float)src_patch.nf
|
<< " ratio: " << (float)strip.size()/(float)src_patch.nf
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
out.AddPatch(src_entry.nvert, src_entry.nface, src_border.Available());
|
out.AddPatch(src_entry.nvert, src_entry.nface, src_border.Capacity());
|
||||||
|
|
||||||
|
|
||||||
Entry &dst_entry = out[p];
|
Entry &dst_entry = out[p];
|
||||||
|
|
|
@ -26,8 +26,9 @@ int main(int argc, char *argv[]) {
|
||||||
crude.Resize(side * side, (side-1) * (side-1) * 2);
|
crude.Resize(side * side, (side-1) * (side-1) * 2);
|
||||||
for(unsigned int x = 0; x < side; x++)
|
for(unsigned int x = 0; x < side; x++)
|
||||||
for(unsigned int y = 0; y < side; y++) {
|
for(unsigned int y = 0; y < side; y++) {
|
||||||
Point3f p(x*x*x/((float)side),
|
// Point3f p(x*x*x/((float)side),
|
||||||
y*y*y/((float)side), x*y/((float)side));
|
// y*y*y/((float)side), x*y/((float)side));
|
||||||
|
Point3f p(x, y, sqrt((float)x*x + y*y));
|
||||||
crude.SetVertex(x + side * y, p);
|
crude.SetVertex(x + side * y, p);
|
||||||
crude.GetBox().Add(p);
|
crude.GetBox().Add(p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.12 2005/02/21 19:05:58 ponchio
|
||||||
|
i already fixed this bug. I hate you cvs.
|
||||||
|
|
||||||
Revision 1.11 2005/02/19 12:06:55 ponchio
|
Revision 1.11 2005/02/19 12:06:55 ponchio
|
||||||
Debug...
|
Debug...
|
||||||
|
|
||||||
|
@ -85,9 +88,9 @@ Encodings::Encodings() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pad64(unsigned int &s) {
|
void pad8(unsigned int &s) {
|
||||||
if((s & 0x0000003f) != 0) {
|
if((s & 0x00000007) != 0) {
|
||||||
s>>=6; s++; s<<=6;
|
s>>=3; s++; s<<=3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void pad(unsigned int &size) {
|
void pad(unsigned int &size) {
|
||||||
|
@ -165,34 +168,33 @@ void Patch::Init(Signature &signature,
|
||||||
assert(0);
|
assert(0);
|
||||||
//non lo so...
|
//non lo so...
|
||||||
}
|
}
|
||||||
pad64(offset);
|
pad8(offset);
|
||||||
|
|
||||||
fstartc = (unsigned short)(offset/64);
|
fstartc = fstart + offset;
|
||||||
offset += encodings[signature.fcolor].size(nf);
|
offset += encodings[signature.fcolor].size(nf);
|
||||||
fstartn = (unsigned short)(offset/64);
|
fstartn = fstart + offset;
|
||||||
offset += encodings[signature.fnorm].size(nf);
|
offset += encodings[signature.fnorm].size(nf);
|
||||||
fstartt = (unsigned short)(offset/64);
|
fstartt = fstart + offset;
|
||||||
offset += encodings[signature.ftext].size(nf);
|
offset += encodings[signature.ftext].size(nf);
|
||||||
fstartd = (unsigned short)(offset/64);
|
fstartd = fstart + offset;
|
||||||
offset += encodings[signature.fdata].size(nf);
|
offset += encodings[signature.fdata].size(nf);
|
||||||
|
|
||||||
vstart = fstart + offset;
|
vstart = fstart + offset;
|
||||||
offset = 0;
|
|
||||||
if(signature.vert == Signature::POINT3F)
|
if(signature.vert == Signature::POINT3F)
|
||||||
offset += nv * sizeof(float) * 3;
|
offset += nv * sizeof(float) * 3;
|
||||||
else if(signature.vert == Signature::POINT4F)
|
else if(signature.vert == Signature::POINT4F)
|
||||||
offset += nv * sizeof(float) * 4;
|
offset += nv * sizeof(float) * 4;
|
||||||
else
|
else
|
||||||
assert(0);
|
assert(0);
|
||||||
pad64(offset);
|
pad8(offset);
|
||||||
|
|
||||||
vstartc = (unsigned short)(offset/64);
|
vstartc = fstart + offset;
|
||||||
offset += encodings[signature.vcolor].size(nv);
|
offset += encodings[signature.vcolor].size(nv);
|
||||||
vstartn = (unsigned short)(offset/64);
|
vstartn = fstart + offset;
|
||||||
offset += encodings[signature.vnorm].size(nv);
|
offset += encodings[signature.vnorm].size(nv);
|
||||||
vstartt = (unsigned short)(offset/64);
|
vstartt = fstart + offset;
|
||||||
offset += encodings[signature.vtext].size(nv);
|
offset += encodings[signature.vtext].size(nv);
|
||||||
vstartd = (unsigned short)(offset/64);
|
vstartd = fstart + offset;
|
||||||
offset += encodings[signature.vdata].size(nv);
|
offset += encodings[signature.vdata].size(nv);
|
||||||
|
|
||||||
|
|
||||||
|
@ -251,7 +253,7 @@ unsigned int Patch::ByteSize(Signature &signature,
|
||||||
assert(0);
|
assert(0);
|
||||||
//non lo so...
|
//non lo so...
|
||||||
}
|
}
|
||||||
pad64(size);
|
pad8(size);
|
||||||
|
|
||||||
size += encodings[signature.fcolor].size(nface);
|
size += encodings[signature.fcolor].size(nface);
|
||||||
size += encodings[signature.fnorm].size(nface);
|
size += encodings[signature.fnorm].size(nface);
|
||||||
|
@ -264,7 +266,7 @@ unsigned int Patch::ByteSize(Signature &signature,
|
||||||
size += nvert * sizeof(float) * 4;
|
size += nvert * sizeof(float) * 4;
|
||||||
else
|
else
|
||||||
assert(0);
|
assert(0);
|
||||||
pad64(size);
|
pad8(size);
|
||||||
|
|
||||||
size += encodings[signature.vcolor].size(nvert);
|
size += encodings[signature.vcolor].size(nvert);
|
||||||
size += encodings[signature.vnorm].size(nvert);
|
size += encodings[signature.vnorm].size(nvert);
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.13 2005/02/19 12:06:55 ponchio
|
||||||
|
Debug...
|
||||||
|
|
||||||
Revision 1.12 2005/02/19 10:45:05 ponchio
|
Revision 1.12 2005/02/19 10:45:05 ponchio
|
||||||
Patch generalized and small fixes.
|
Patch generalized and small fixes.
|
||||||
|
|
||||||
|
@ -81,9 +84,9 @@ namespace nxs {
|
||||||
|
|
||||||
unsigned int size(unsigned short n) {
|
unsigned int size(unsigned short n) {
|
||||||
unsigned int s = (int)n * (int)bytes * (int)comps;
|
unsigned int s = (int)n * (int)bytes * (int)comps;
|
||||||
//padding a 64 bytes
|
//padding a 8 bytes
|
||||||
if((s & 0x0000003f) != 0) {
|
if((s & 0x0000007) != 0) {
|
||||||
s>>=6; s++; s<<=6;
|
s>>=3; s++; s<<=3;
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -121,15 +124,15 @@ class Patch {
|
||||||
//vcg::Point3f &Vert(unsigned short v) { return VertBegin()[v]; }
|
//vcg::Point3f &Vert(unsigned short v) { return VertBegin()[v]; }
|
||||||
// unsigned short *Face(unsigned short f) { return FaceBegin() + f * 3; }
|
// unsigned short *Face(unsigned short f) { return FaceBegin() + f * 3; }
|
||||||
|
|
||||||
char *VColorBegin() { return vstart + 64*(int)vstartc; }
|
char *VColorBegin() { return vstartc; }
|
||||||
char *VNormBegin() { return vstart + 64*(int)vstartn; }
|
char *VNormBegin() { return vstartn; }
|
||||||
char *VTextBegin() { return vstart + 64*(int)vstartt; }
|
char *VTextBegin() { return vstartt; }
|
||||||
char *VDataBegin() { return vstart + 64*(int)vstartd; }
|
char *VDataBegin() { return vstartd; }
|
||||||
|
|
||||||
char *FColorBegin() { return fstart + 64*(int)fstartc; }
|
char *FColorBegin() { return fstartc; }
|
||||||
char *FNormBegin() { return fstart + 64*(int)fstartn; }
|
char *FNormBegin() { return fstartn; }
|
||||||
char *FTextBegin() { return fstart + 64*(int)fstartt; }
|
char *FTextBegin() { return fstartt; }
|
||||||
char *FDataBegin() { return fstart + 64*(int)fstartd; }
|
char *FDataBegin() { return fstartd; }
|
||||||
|
|
||||||
static unsigned int ChunkSize(Signature &signature,
|
static unsigned int ChunkSize(Signature &signature,
|
||||||
unsigned short nvert,
|
unsigned short nvert,
|
||||||
|
@ -150,17 +153,15 @@ class Patch {
|
||||||
unsigned short nf;
|
unsigned short nf;
|
||||||
unsigned short nv;
|
unsigned short nv;
|
||||||
|
|
||||||
//these offset are from fstart in 64 bytes
|
char *fstartc;
|
||||||
unsigned short fstartc;
|
char *fstartn;
|
||||||
unsigned short fstartn;
|
char *fstartt;
|
||||||
unsigned short fstartt;
|
char *fstartd;
|
||||||
unsigned short fstartd;
|
|
||||||
|
|
||||||
//these offset are from vstart in 64 bytes
|
char *vstartc;
|
||||||
unsigned short vstartc;
|
char *vstartn;
|
||||||
unsigned short vstartn;
|
char *vstartt;
|
||||||
unsigned short vstartt;
|
char *vstartd;
|
||||||
unsigned short vstartd;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} //namespace
|
} //namespace
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.4 2005/02/21 17:55:48 ponchio
|
||||||
|
debug debug debug
|
||||||
|
|
||||||
Revision 1.3 2005/01/21 17:09:13 ponchio
|
Revision 1.3 2005/01/21 17:09:13 ponchio
|
||||||
Porting and debug.
|
Porting and debug.
|
||||||
|
|
||||||
|
@ -95,6 +98,32 @@ void VPartition::Closest(const vcg::Point3f &p,
|
||||||
dist = (float)dists;
|
dist = (float)dists;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VPartition::Closest(const vcg::Point3f &p,
|
||||||
|
vector<int> &targets,
|
||||||
|
vector<double> &dists,
|
||||||
|
float max_distance) {
|
||||||
|
|
||||||
|
double point[3]; point[0] = p[0]; point[1] = p[1]; point[2] = p[2];
|
||||||
|
|
||||||
|
int seeds = 6;
|
||||||
|
while(1) {
|
||||||
|
if(seeds > size()) seeds = size();
|
||||||
|
targets.resize(seeds);
|
||||||
|
dists.resize(seeds);
|
||||||
|
bd->annkSearch(&point[0], seeds, &(targets[0]), &(dists[0]));
|
||||||
|
for(int i = 0; i < seeds; i++) {
|
||||||
|
if(dists[i] > max_distance) {
|
||||||
|
targets.resize(i);
|
||||||
|
dists.resize(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(targets.size() < seeds) break;
|
||||||
|
if(seeds == size()) break;
|
||||||
|
seeds *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VPartition::Closest(const vcg::Point3f &p, unsigned int nsize,
|
void VPartition::Closest(const vcg::Point3f &p, unsigned int nsize,
|
||||||
int *targets,
|
int *targets,
|
||||||
double *dists) {
|
double *dists) {
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.4 2005/02/21 17:55:49 ponchio
|
||||||
|
debug debug debug
|
||||||
|
|
||||||
Revision 1.3 2005/01/18 22:46:58 ponchio
|
Revision 1.3 2005/01/18 22:46:58 ponchio
|
||||||
Small changes.
|
Small changes.
|
||||||
|
|
||||||
|
@ -53,6 +56,7 @@ class ANNbruteForce;
|
||||||
|
|
||||||
namespace nxs {
|
namespace nxs {
|
||||||
|
|
||||||
|
//WARNING: all distances returned are SQUARED!!!!
|
||||||
class VPartition: public std::vector<vcg::Point3f> {
|
class VPartition: public std::vector<vcg::Point3f> {
|
||||||
public:
|
public:
|
||||||
VPartition(): bd(NULL) {}
|
VPartition(): bd(NULL) {}
|
||||||
|
@ -75,6 +79,11 @@ class VPartition: public std::vector<vcg::Point3f> {
|
||||||
std::vector<float> &dist);
|
std::vector<float> &dist);
|
||||||
void Closest(const vcg::Point3f &p,
|
void Closest(const vcg::Point3f &p,
|
||||||
int &target, float &dist);
|
int &target, float &dist);
|
||||||
|
|
||||||
|
//return all targets widthin that distance (SQUARED!!!)
|
||||||
|
void Closest(const vcg::Point3f &p, std::vector<int> &targets,
|
||||||
|
std::vector<double> &dists,
|
||||||
|
float max_distance);
|
||||||
//most efficient!
|
//most efficient!
|
||||||
void Closest(const vcg::Point3f &p, unsigned int nsize,
|
void Closest(const vcg::Point3f &p, unsigned int nsize,
|
||||||
int *targets,
|
int *targets,
|
||||||
|
|
Loading…
Reference in New Issue