From 5efa62c6abb1db96ac9630831738f691e752db98 Mon Sep 17 00:00:00 2001 From: ponchio Date: Thu, 24 Jun 2004 17:38:35 +0000 Subject: [PATCH] moving to apps/nexus --- wrap/nexus/crude.cpp | 120 ------------------- wrap/nexus/crude.h | 89 -------------- wrap/nexus/mfhash.cpp | 130 -------------------- wrap/nexus/mfhash.h | 78 ------------ wrap/nexus/nexus.html | 140 ---------------------- wrap/nexus/nexus_logo_midi.png | Bin 27989 -> 0 bytes wrap/nexus/pchain.h | 89 -------------- wrap/nexus/pvoronoi.cpp | 182 ---------------------------- wrap/nexus/pvoronoi.h | 114 ------------------ wrap/nexus/vert_remap.cpp | 76 ------------ wrap/nexus/vert_remap.h | 63 ---------- wrap/nexus/vfile.h | 210 --------------------------------- 12 files changed, 1291 deletions(-) delete mode 100644 wrap/nexus/crude.cpp delete mode 100644 wrap/nexus/crude.h delete mode 100644 wrap/nexus/mfhash.cpp delete mode 100644 wrap/nexus/mfhash.h delete mode 100644 wrap/nexus/nexus.html delete mode 100644 wrap/nexus/nexus_logo_midi.png delete mode 100644 wrap/nexus/pchain.h delete mode 100644 wrap/nexus/pvoronoi.cpp delete mode 100644 wrap/nexus/pvoronoi.h delete mode 100644 wrap/nexus/vert_remap.cpp delete mode 100644 wrap/nexus/vert_remap.h delete mode 100644 wrap/nexus/vfile.h diff --git a/wrap/nexus/crude.cpp b/wrap/nexus/crude.cpp deleted file mode 100644 index b078b1bc..00000000 --- a/wrap/nexus/crude.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ - -****************************************************************************/ - -#include "crude.h" - -using namespace std; -using namespace vcg; -using namespace nxs; - - -Crude::~Crude() { - if(fp) - Close(); -} - -bool Crude::Create(const std::string &file, unsigned int nv, unsigned int nf) { - if(!vert.Create(file + ".vrt")) return false; - if(!face.Create(file + ".frt")) return false; - - fp = fopen(file.c_str(), "wb+"); - if(!fp) return false; - Resize(nv, nf); - return true; -} -bool Crude::Load(const std::string &file) { - if(!vert.Load(file + ".vrt")) return false; - if(!face.Load(file + ".frt")) return false; - - fp = fopen(file.c_str(), "rb+"); - if(!fp) return false; - fread(&nvert, sizeof(unsigned int), 1, fp); - fread(&nface, sizeof(unsigned int), 1, fp); - fread(&box, sizeof(Box3f), 1, fp); - return true; -} -void Crude::Close() { - vert.Close(); - face.Close(); - rewind(fp); - fwrite(&nvert, sizeof(unsigned int), 1, fp); - fwrite(&nface, sizeof(unsigned int), 1, fp); - fwrite(&box, sizeof(Box3f), 1, fp); - fclose(fp); - fp = NULL; -} - -void Crude::Resize(unsigned int nv, unsigned int nf) { - nvert = nv; - nface = nf; - vert.Resize(nv); - face.Resize(nf); -} - -unsigned int Crude::Vertices() { - return nvert; -} -unsigned int Crude::Faces() { - return nface; -} - -void Crude::SetVertex(unsigned int i, float *f) { - Point3f &p = vert[i]; - p[0] = f[0]; - p[1] = f[1]; - p[2] = f[2]; -} - -Point3f &Crude::GetVertex(unsigned int i) { - return vert[i]; -} -Crude::Face &Crude::GetFace(unsigned int i) { - return face[i]; -} - void Crude::SetFace(unsigned int i, unsigned int *f) { - Face &ff = face[i]; - ff[0] = f[0]; - ff[1] = f[1]; - ff[2] = f[2]; - } - -vcg::Point3f Crude::GetBari(unsigned int i) { - Point3f bari(0, 0, 0); - Face &f = face[i]; - for(int k = 0; k < 3; k++) - bari += vert[f[k]]; - bari /= 3; - return bari; -} - -vcg::Box3f &Crude::GetBox() { - return box; -} - - diff --git a/wrap/nexus/crude.h b/wrap/nexus/crude.h deleted file mode 100644 index 80b1d47a..00000000 --- a/wrap/nexus/crude.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ - -****************************************************************************/ - -#ifndef NXS_CRUDE_H -#define NXS_CRUDE_H - -#include -#include -#include -#include - -#include "vfile.h" - -namespace nxs { - -class Crude { -public: - - struct Face { - Face() {} - Face(unsigned int a, unsigned int b, unsigned int c) { - v[0] = a; v[1] = b; v[2] = c; - } - unsigned int v[3]; - unsigned int &operator[](int k) { return v[k]; } - unsigned int *ptr() { return v; } - }; - - Crude(): fp(NULL), nvert(0), nface(0) {} - ~Crude(); - - bool Create(const std::string &file, unsigned int nvert = 0, - unsigned int nface = 0); - bool Load(const std::string &file); - void Close(); - void Resize(unsigned int nvert, unsigned int nface); - - unsigned int Vertices(); - unsigned int Faces(); - - vcg::Point3f &GetVertex(unsigned int i); - void SetVertex(unsigned int i, float *p); - - Face &GetFace(unsigned int i); - void SetFace(unsigned int i, unsigned int *f); - - vcg::Point3f GetBari(unsigned int i); - - vcg::Box3f &GetBox(); - - protected: - VFile vert; - VFile face; - - FILE *fp; - unsigned int nvert; - unsigned int nface; - vcg::Box3f box; -}; - -} //namespace - -#endif diff --git a/wrap/nexus/mfhash.cpp b/wrap/nexus/mfhash.cpp deleted file mode 100644 index 06895e9d..00000000 --- a/wrap/nexus/mfhash.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ - -****************************************************************************/ - -#include "mfhash.h" - -using namespace std; -using namespace nxs; - -bool MFHash::Create(const string &file, unsigned int reserved) { - if(!buffer.Create(file)) return false; - buffer.Resize(reserved); - Bucket empty; - for(unsigned int i = 0; i < buffer.Size(); i++) - buffer[i] = empty; - space = reserved; - return true; -} - -bool MFHash::Load(const string &file, unsigned int used) { - if(!buffer.Load(file)) return false; - if(used != 0xffffffff) { - space = buffer.Size() - used; - } else { - space = 0; - for(unsigned int i = 0; i < buffer.Size(); i++) - if(buffer[i].Empty()) space++; - } - return true; -} - -void MFHash::Resize(unsigned int n) { - assert(buffer.Size() - space <= n); - //lets dump actual content - 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); - ++count; - } - } - - buffer.Resize(n); - Clear(); - - rewind(fp); - Bucket bucket; - for(unsigned int i = 0; i < count; i++) { - fread(&bucket, sizeof(Bucket), 1, fp); - Insert(bucket.key, bucket.value, false); - } - fclose(fp); -} - -void MFHash::Insert(unsigned int key, unsigned int value, bool rehash) { - if(buffer.Size() < 5) - Resize(5); - 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 - return; - j++; - if(j >= hash_size) j = 0; - } - buffer[j] = Bucket(key, value); - space--; - - if(rehash) { - float ratio = space / (float)buffer.Size(); - if(ratio < 0.4) //need to resize - Resize(buffer.Size() * 2 - 1); - } -} - -unsigned int MFHash::Count(unsigned int key) { - unsigned int count = 0; - unsigned int hash_size = buffer.Size(); - unsigned int j = key % hash_size; - - while(!buffer[j].Empty()) { - if(buffer[j].key == key) - count++; - j++; - if(j >= hash_size) j = 0; - } - return count; -} - -void MFHash::Clear() { - Bucket empty; - for(unsigned int i = 0; i < buffer.Size(); i++) - buffer[i] = empty; - space = buffer.Size(); -} - -void MFHash::Close() { - buffer.Close(); -} - -unsigned int MFHash::Size() { - return buffer.Size() - space; -} diff --git a/wrap/nexus/mfhash.h b/wrap/nexus/mfhash.h deleted file mode 100644 index bb381657..00000000 --- a/wrap/nexus/mfhash.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ - -****************************************************************************/ - -#ifndef NXS_MFHASH_H -#define NXS_MFHASH_H - -#include "vfile.h" -#include -#include - -namespace nxs { - - - -class MFHash { - public: - struct Bucket { - unsigned int key; - unsigned int value; - Bucket(): key(0xffffffff) {} - Bucket(unsigned int k, unsigned int v): key(k), value(v) {} - bool Empty() { return key == 0xffffffff; } - }; - - MFHash() {} - bool Create(const std::string &file, unsigned int reserved = 32); - bool Load(const std::string &file, unsigned int used = 0xffffffff); - - void Resize(unsigned int n); - void Insert(unsigned int key, unsigned int value, bool rehash = true); - template void GetValues(unsigned int key, C &container) { - container.clear(); - unsigned int hash_size = buffer.Size(); - unsigned int j = key % hash_size; - while(!buffer[j].Empty()) { - if(buffer[j].key == key) { - container.push_back(buffer[j].value); - } - j++; - if(j >= hash_size) j = 0; - } - } - unsigned int Count(unsigned int key); - void Clear(); - unsigned int Size(); - void Close(); - private: - VFile buffer; - unsigned int space; - }; -}//namespace -#endif diff --git a/wrap/nexus/nexus.html b/wrap/nexus/nexus.html deleted file mode 100644 index 89e89ac4..00000000 --- a/wrap/nexus/nexus.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - -

-

-

-

Index:

-

-

- - -

Big picture

-

Structures and interfaces

- -

VFile

-VFile dovrebbe avere piu' o meno la stessa interfaccia di vector -ma usare un file per storare i dati (un mmapping, ma non limitato a 4Gb).
- -

Crude

-Crude e' un formato tipo il ply... solo che usa dei VFile per -storare i dati.(3 unsigned int per una faccia e 3 float per un vertice)
-Per cui e' composto di 3 files almeno: header (numero di facce, -vertici e Bounding box), file dei vertici, file delle facce ed -opzionalmente file degli attributi dei vertici e delle facce.
-Come interfaccia e' sufficente che dia accesso casuale a facce e vertici... -

PChain

-Sta per 'partition chain' cioe' una catena di partizioni dello -spazio.
-Una PChain detto in matematichese e' una funzione da -[0..L] X R^3 -> N (cioe' dato un livello e un punto nello spazio -restituisce un numero naturale. (una patch)
-Oltre a questo va aggiunta una funzione che dato un punto e una patch -ne restituisce la distanza (o un valore 'equivalente').
-Si deve poter salvare su disco e recuperare una pchain
- -

Remap

-E' composta da 3 files:
-indice delle patches: per ogni patch il numero di vertici, di facce e -di bordi
- vertici -> lista di patches: per ogni vertice una lista di patch -di cui fa parte (se sono + di 1 e' ovviamente di bordo.
-facce->patches: per ogni faccia un intero che dice in quale patch -sta.
- - -

Nexus

-E' una struttura con 3 files: 'index', 'patches' e 'borders'.
-'Index' contiene l'indice delle patches: per ogni patch viene storato -offset, size (ma questa potrebbe essere storata direttamente nei -files?) dei dati geometrici nel file delle patches e dei bordi nel -file dei borders, oltre alla bounding sphere.
-'Patches' e' un VFile di chunks da 4k dove i dati geometrici di una -patch occupano un numero intero di chunks. P.S. Come ce la caviamo con -gli attributi dei vertici e delle facce?
-'Borders' e' un VFile di 'links' dove ogni link fa riferimento ad un -vertice di bordo tra la patch A (V_a) e la B (V_b) e contiene -(V_a, V_b, B) (A e' implicito). L'informazione e' replicata nei bordi -relativi a B con (V_b, V_a, A)
- -

Bmt

-Bmt (batched multi triangulation) e' il formato per la -multirisoluzione:
-E' un vettore di 'Cell' scritti su disco + un 'Index' e una 'History'. -Cell contiene i dati da visualizzare: vertici e strip (e altro?).
-Index contiene per ogni cell 'offset' per trovare la cell -corrispondente, error e bounding sphere (e per il face o vertex -count?).
-History e' la storia della multirisoluzione.
- -

Algorithms

-

Plys to Crude

-Si copiano i vertici un ply dopo l'altro nel crude.
-Per le facce si copiano sommando un offset ai vertici
-Se si montano insieme piu' ply i vertici rimangono duplicati.
-E' piu' semplice fare il join dentro Nexus.
- -

Crude + PChain to Remap

-Come prima cosa si costruisce il pchain passandogli il Crude.
-Asegnamo per ogni faccia la sua patch al livello 0.
-Per ogni patch sappiamo quante ce ne sono.
-Ridistribuiamo le patch troppo piccole (e rimappiamo i numeri delle -patches per rimuovere i buchi (anche dentro il PChain).
-Per risparmiare nella stessa passata ci segnamo dove vanno i vertici
-Poi facciamo un'altra passate per contare i bordi
-Infine si sortano le facce secondo l'ordine delle patches.
- -

Crude + Remap to Nexus

-Per ogni patch raccogliamo le facce, e i vertici (ma non li -unifichiamo) e costruiamo una patch nel Nexus.
-Ci dobbiamo segnare i bordi mano a mano che lo facciamo: -per ogni patch ci salviamo una lista di triplette: il numero assoluto -del vertice di bordo, il numero relativo nella patch che stiamo -salvando, e il numero della patch (o delle patch) con la quale -confina.
-Queste informazioni le tiriamo fuori dal Remap dei vertici
-Una volta salvate tutte le patches ci smazziamo i bordi: -per ogni patch prendiamo quella lista e la incrociamo con quella -delle patches confinanti per costruire i bordi da passare a nexus.
- -

Nexus + PChain to Bmt

-Per costruire il file multirisoluzione aggiungeremo semplicemente -nuove patches al file nexus.
-Ad ogni passo selezioniamo un gruppo di patches (il PChain ci dice i -gruppi), li joiniamo insieme usando i bordi per riunificare i vertici -e per marcare i bordi esterni.
-Poi semplifichiamo e splittiamo (e sempre il PChain ci dice quali -nuove patches creare), ridistribuiamo le patches troppo piccole.
-E aggiungiamo le nuove patches al Nexus, e i nuovi bordi.
-Ci salviamo anche la storia da qualche parte.
- - diff --git a/wrap/nexus/nexus_logo_midi.png b/wrap/nexus/nexus_logo_midi.png deleted file mode 100644 index 47e791f58be3b56177ad8022d7c999516b9cab44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27989 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 diff --git a/wrap/nexus/pchain.h b/wrap/nexus/pchain.h deleted file mode 100644 index 4fa36864..00000000 --- a/wrap/nexus/pchain.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ -Revision 1.1 2004/06/23 17:17:46 ponchio -Created - - -****************************************************************************/ - -#ifndef NXS_PCHAIN_H -#define NXS_PCHAIN_H - -#include -#include - -/** Partition must be a class with a Key type, with - Levels, Locate, Priority, Save(FILE *), Load(FILE *) - as in pvoronoi.h */ -namespace { - -template class PChain { - public: - typedef typename Partition::Key Key; - std::vector levels; - - unsigned int Levels() { - return levels.size(); - } - - Key Locate(unsigned int level, const vcg::Point3f &p) { - assert(level < levels.size()); - return levels[level].Locate(p); - } - - float Priority(unsigned int level, const vcg::Point3f &p, Key key) { - assert(level < levels.size()); - return levels[level].Priority(level, p, key); - } - bool Save(const std::string &file) { - FILE *fp = fopen(file.c_str(), "wb+"); - if(!fp) return false; - int n = Levels(); - fwrite(&n, sizeof(int), 1, fp); - for(int i = 0; i < n; i++) - levels[i].Save(fp); - fclose(fp); - return true; - } - bool Load(const std::string &file) { - levels.clear(); - FILE *fp = fopen(file.c_str(), "rb"); - if(!fp) return false; - int n; - fread(&n, sizeof(int), 1, fp); - levels.resize(n); - for(int i = 0; i < n; i++) - levels[i].Load(fp); - - fclose(fp); - return true; - } -}; - -}//namespace - -#endif diff --git a/wrap/nexus/pvoronoi.cpp b/wrap/nexus/pvoronoi.cpp deleted file mode 100644 index d3eae937..00000000 --- a/wrap/nexus/pvoronoi.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ -Revision 1.1 2004/06/23 17:17:46 ponchio -Created - - -****************************************************************************/ - -#pragma warning(disable:4786 4804 4244 4018 4267 4311) -#include -#include -#include "pvoronoi.h" - -using namespace std; -using namespace vcg; -using namespace nxs; - -bool Seed::Dist(const Point3f &point, float &mindist, - Point3f &res) { - float newdist = Distance(p, point); - if(newdist < mindist) { - mindist = newdist; - res = p; - return true; - } else - return false; -} - -int VoronoiPartition::Add(vcg::Point3f p, float weight) { - Seed ns(p,weight); - all_seeds.push_back(ns); - seedBuf.push_back(p); - - if(seedBuf.size() >= MAX_BUF) { - for(unsigned int i = 0; i < seedBuf.size(); ++i) - ug_seeds.push_back(seedBuf[i]); - seedBuf.clear(); - ug.Set(ug_seeds); - } - return size(); -} - -float VoronoiPartition::Closest(const vcg::Point3f &p, int &target, float radius) { - Point3f res; - float mindist = 1e20; - target = -1; - - if(ug_seeds.size()) { - Seed *nsp = ug.GetClosest(p, mindist, res); - if(nsp) { - target = nsp-&*ug_seeds.begin(); - } - } - - for(unsigned int i=0;i dist) { - target=ug_seeds.size()+i; - mindist=dist; - } - } - - //assert(target >=0 ); - //assert (target < size()+seedBuf.size()); - return mindist; -} - - -void VoronoiPartition::iterator::operator++() { - ++seed; -} -const VoronoiPartition::Key VoronoiPartition::iterator::operator*() { - return seed; -} -bool VoronoiPartition::iterator::operator==(const VoronoiPartition::iterator &key) { - return key.seed == seed; -} -bool VoronoiPartition::iterator::operator!=(const VoronoiPartition::iterator &key) { - return key.seed != seed; -} - -VoronoiPartition::iterator VoronoiPartition::begin() { - iterator i; - i.seed = 0; - return i; -} -VoronoiPartition::iterator VoronoiPartition::end() { - iterator i; - i.seed = size(); - return i; -} -int VoronoiPartition::size() { - return all_seeds.size(); -} -void VoronoiPartition::clear() { - all_seeds.clear(); - ug_seeds.clear(); - seedBuf.clear(); -} -unsigned int VoronoiPartition::count(Key key) { - return key > 0 && key < size(); -} - -Seed &VoronoiPartition::operator[](Key key) { - assert(key < all_seeds.size()); - return all_seeds[key]; -} - -VoronoiPartition::Key VoronoiPartition::Locate(const vcg::Point3f &p) { - int target; - Closest(p, target); - assert(target != -1); - return target; -} - -float VoronoiPartition::Priority(const vcg::Point3f &p, Key key) { - Seed &seed = all_seeds[key]; - return seed.Dist(p); -} - -bool VoronoiPartition::Save(const std::string &file) { - FILE *fp = fopen(file.c_str(), "wb+"); - if(!fp) return false; - Save(fp); - fclose(fp); - return true; -} - -bool VoronoiPartition::Load(const std::string &file) { - FILE *fp = fopen(file.c_str(), "rb"); - if(!fp) return false; - Load(fp); - fclose(fp); - return true; -} - -unsigned int VoronoiPartition::Save(FILE *fp) { - fwrite(&bbox, sizeof(Box3f), 1, fp); - int n = all_seeds.size(); - fwrite(&n, sizeof(int), 1, fp); - fwrite(&all_seeds[0], sizeof(Seed), all_seeds.size(), fp); - return sizeof(Box3f) + sizeof(int) + sizeof(Seed) * all_seeds.size(); -} - -unsigned int VoronoiPartition::Load(FILE *fp) { - clear(); - fread(&bbox, sizeof(Box3f), 1, fp); - int n; - fread(&n, sizeof(int), 1, fp); - all_seeds.resize(n); - fread(&all_seeds[0], sizeof(Seed), all_seeds.size(), fp); - ug_seeds.resize(n); - for(int i = 0; i < n; i++) - ug_seeds[i] = all_seeds[i]; - ug.SetBBox(bbox); - ug.Set(ug_seeds); - return sizeof(Box3f) + sizeof(int) + sizeof(Seed) * all_seeds.size(); -} diff --git a/wrap/nexus/pvoronoi.h b/wrap/nexus/pvoronoi.h deleted file mode 100644 index 4f4c89e3..00000000 --- a/wrap/nexus/pvoronoi.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ -Revision 1.1 2004/06/23 17:17:46 ponchio -Created - - -****************************************************************************/ - -#ifndef NXS_NET_GRID_H -#define NXS_NET_GRID_H - -#include -#include -#include -#include - -#include -#include -#include - -namespace nxs { - - class Seed { - public: - vcg::Point3f p; - float weight; - typedef float ScalarType; - bool Dist(const vcg::Point3f & point, float &mindist, vcg::Point3f &res); - void GetBBox(vcg::Box3f &b) {b.Set(p);} - bool IsD() { return false; } - - Seed(): weight(1) {} - Seed(const vcg::Point3f &point): p(point), weight(1) {} - Seed(const vcg::Point3f &point, const float w): - p(point), weight(w) {} - - inline float Dist(const vcg::Point3f &q) const { - return weight * vcg::Distance(p,q); - } - inline float SquaredDist(const vcg::Point3f &q) const { - return weight * weight *vcg::SquaredDistance(p,q); - } - }; - - - class VoronoiPartition { - public: - enum { MAX_BUF=25 }; - typedef int Key; - - VoronoiPartition() {} - - void Init(vcg::Box3f &bb) { bbox=bb; ug.SetBBox(bb); } - int Add(vcg::Point3f p, float weight = 1); - float Closest(const vcg::Point3f &p, Key &target, float radius = 0); - - class iterator { - public: - void operator++(); - const Key operator*(); - bool operator==(const iterator &key); - bool operator!=(const iterator &key); - private: - int seed; - friend class VoronoiPartition; - }; - iterator begin(); - iterator end(); - int size(); - unsigned int count(Key key); - Seed &operator[](Key key); - void clear(); - Key Locate(const vcg::Point3f &p); - float Priority(const vcg::Point3f &p, Key key); - - bool Save(const std::string &file); - bool Load(const std::string &file); - unsigned int Save(FILE *fp); - unsigned int Load(FILE *fp); - private: - vcg::Box3f bbox; - vcg::GridStaticPtr< std::vector > ug; - std::vector all_seeds; - std::vector ug_seeds; - std::vector seedBuf; - }; - -} -#endif - diff --git a/wrap/nexus/vert_remap.cpp b/wrap/nexus/vert_remap.cpp deleted file mode 100644 index 817ada3b..00000000 --- a/wrap/nexus/vert_remap.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ - -****************************************************************************/ - -#include -#include "vert_remap.h" - -using namespace std; -using namespace nxs; - -bool VertRemap::Create(const std::string &file) { - if(all.Create(file)) return false; - if(!borders.Create(file)) return false; - return true; -} - -bool VertRemap::Load(const std::string &file) { - if(!all.Load(file)) return false; - if(!borders.Create(file)) return false; - return true; -} - -void VertRemap::Resize(unsigned int n_vert) { - all.Resize(n_vert); - for(unsigned int i = 0; i < n_vert; i++) - all[i] = 0xffffffff; - borders.Clear(); - borders.Resize(n_vert/10); -} - -unsigned int VertRemap::Size() { - return all.Size(); -} - -unsigned int VertRemap::Count(unsigned int key) { - assert(key < Size()); - if(all[key] == 0xffffffff) return 0; - return 1 + borders.Count(key); -} - -void VertRemap::Insert(unsigned int key, unsigned int value) { - if(all[key] == 0xffffffff) - all[key] = value; - else - borders.Insert(key, value); -} - -unsigned int VertRemap::GetValue(unsigned int key) { //return first value - assert(key < Size()); - return all[key]; -} diff --git a/wrap/nexus/vert_remap.h b/wrap/nexus/vert_remap.h deleted file mode 100644 index c74d22f1..00000000 --- a/wrap/nexus/vert_remap.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ - -****************************************************************************/ -#ifndef NXS_VERTEX_REMAP_H -#define NXS_VERTEX_REMAP_H - -#include -#include "vfile.h" -#include "mfhash.h" - -namespace nxs { - -class VertRemap { - public: - bool Create(const std::string &file); - bool Load(const std::string &file); - void Resize(unsigned int n_vert); - - unsigned int Size(); - unsigned int Count(unsigned int key); - void Insert(unsigned int key, unsigned int value); - unsigned int GetValue(unsigned int key); //return first value - template void GetValues(unsigned int key, - C &container) { - assert(key < Size()); - container.clear(); - if(all[key] == 0xffffffff) return; - container.push_back(all[key]); - borders.GetValue(key, container); - } - - private: - VFile all; - MFHash borders; -}; -} //namespace bmt - -#endif diff --git a/wrap/nexus/vfile.h b/wrap/nexus/vfile.h deleted file mode 100644 index abdc758a..00000000 --- a/wrap/nexus/vfile.h +++ /dev/null @@ -1,210 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/**************************************************************************** - History - -$Log: not supported by cvs2svn $ -Revision 1.2 2004/06/22 10:27:16 ponchio -*** empty log message *** - -Revision 1.1 2004/06/22 00:39:56 ponchio -Created - - -****************************************************************************/ - -#ifndef VFILE_H -#define VFILE_H - -#include -#include -//#include -#include -#include -#include - -/**Vector structure on file with simulated mmapping. - * a priority queue of buffers is used - * TODO: port to over 4Gb usable space - * some mechanism to report errors? - * use an Iterator? - */ - -namespace nxs { - -template class VFile { - public: - - struct Buffer { - unsigned int key; - T *data; - }; - - private: - - FILE *fp; - std::list buffers; - typedef typename std::list::iterator iterator; - - std::map index; //TODO move to hash_map - - unsigned int chunk_size; //default buffer size (expressed in number of T) - unsigned int queue_size; - unsigned int n_elements; //size of the vector - - public: - - VFile(): fp(NULL) {} - ~VFile() { if(fp) Close(); } - bool Create(const std::string &filename, - unsigned int _chunk_size = 4096/sizeof(T), - unsigned int _queue_size = 1000) { - - assert(_chunk_size > 0); - chunk_size = _chunk_size; - queue_size = _queue_size; - n_elements = 0; - - fp = fopen(filename.c_str(), "wb+"); - if(!fp) return false; - - return true; - } - - bool Load(const std:: string &filename, - unsigned int _chunk_size = 4096/sizeof(T), - unsigned int _queue_size = 1000) { - - assert(_chunk_size > 0); - chunk_size = _chunk_size; - queue_size = _queue_size; - - fp = fopen(filename.c_str(), "rb+"); - if(!fp) return false; - - fseek(fp, 0, SEEK_END); - n_elements = ftell(fp)/ sizeof(T); - return true; - } - - void Close() { - Flush(); - fclose(fp); - fp = 0; - } - - void Flush() { - iterator i; - for(i = buffers.begin(); i != buffers.end(); i++) - FlushBuffer(*i); - buffers.clear(); - index.clear(); - } - - 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)) { - assert(0 && "Could not write"); - } - delete []buffer.data; - } - - void Resize(unsigned int elem) { - if(elem > n_elements) { - if(-1 == fseek(fp, elem*sizeof(T) -1, SEEK_SET)) { - assert(0 && "Could not resize"); - } - unsigned char a; - 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)); - } - n_elements = elem; - } - - /** Remember that T is a valid pointer only until next call of - * getElement or setElement - */ - T &operator[](unsigned int n) { - - assert(n <= n_elements); - - unsigned int chunk = n/chunk_size; - unsigned int offset = n - chunk*chunk_size; - assert(offset < chunk_size*sizeof(T)); - - if(index.count(chunk)) - return *((*(index[chunk])).data + offset); - - if(buffers.size() > queue_size) { - Buffer &buffer= buffers.back(); - FlushBuffer(buffer); - index.erase(buffer.key); - buffers.pop_back(); - } - - Buffer buffer; - buffer.key = chunk; - buffer.data = new T[chunk_size * sizeof(T)]; - 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(feof(fp)) { - assert(0 && "end of file"); - } else { - assert(0 && "failed reading!"); - } - return (*buffer.data); - } - - buffers.push_front(buffer); - index[chunk] = buffers.begin(); - return *(buffer.data + offset); - } - - /**use this for directly writing on the file... - * be careful to flush (unless you never readed or flushed) - */ - unsigned int Size() { return n_elements; } - unsigned int ChunkSize() { return chunk_size; } - unsigned int QueueSize() { return queue_size; } - - protected: - void SetPosition(unsigned int chunk) { - fseek(fp, chunk * chunk_size * sizeof(T), SEEK_SET); - } -}; - -}//namespace - -#endif