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.