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.