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.