Index:
Big picture
La truttura nexus divide la mesh in tante piccole parti.
Ciascuna parte ha le facce indicizzate localmente, e sono codificate
esplicitamente le corrispondenze tra vertici di patches diverse.
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:
Header (.crd)
Magic: 'c' 'r' 'd' 0x00 (4 bytes)
N vertici: unsigned int (4 bytes)
N facce: unsigned int (4 bytes)
Box: Box3f (6 float min(x, y, z) e max(x, y, z))
File dei vertici: Point3f in sequenza (3 float, x, y, z)
File delle facce: 3 unsigned int
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
Nexus
E' una struttura con 2 files:
File delle patches: (.nxs)
1Kb riservato per dati globali:
Magic: 'n' 'x' 's' 0x00
Signature: unsigned int (maschera di bit)
Chunk size: unsigned int
Index offset: int64 (offset to the index begin,
must be a multiple of chunk size)
History offset: int64: multiple of chunk_size
Tot vert: unsigned int
Tot face: unsigned int
Bound sphere: Sphere3f (4 float: Point3f center (x, y, z), (radius))
Dati (la sequenza di patches)
Index
History
'Index' contiene l'indice delle patches, per ogni patch viene storato:
offset, size dei dati geometrici nel file delle patches etc.
'History' vedi history.h
Index e History sono tenuti in memoria se il file e' aperto per creare
o per modificare, e sono salvati quando si chiude il file.
File dei bordi:
Links.
Index (offset, size tot size used)
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.