Home    Forum    Cerca    FAQ    Iscriviti    Login
Nascondi Menu Principale
  Community

STRUTTURA DEI FILES - PAGINA 1

Questo Manuale descrive i contenuti di alcuni file di dati che Re-Volt utilizza. E' destinato quindi solo a chi ha intenzione di creare i propri livelli e soprattutto a chi ha già sufficienti esperienze di programmazione (in C++).

Le informazioni contenute in questo manuale sono state tradotte dall'inglese e non sono state testate. Risalgono inoltre al 1999-2000, quindi particolarmente vecchie. Le informazioni sulla struttura dei file PRM sono state estrapolate dall'utente Maximvs e sono più recenti.

Le strutture dei dati vengono date in uno stile pseudo-C++, e qualche spiegazione viene data in linguaggio sorgente Pov-Ray.


Informazioni di Base

Files:
I Levels sono simili alle Instances, e consistono in due files:
level.w, che è simile a instance.prm, contiene la vista generale del livello.
level.ncp, che è simile a instance.ncp (ma non uguale), contiene l'essenza del livello, quello che non puoi vedere ma dentro il quale puoi guidare.

Sistema delle coordinate:
Le coordinate che verranno successivamente usate seguono la regola della mano destra (in fisica si dice così):
L'asse X va verso destra
L'asse Y va verso il basso
L'asse Z va in avanti.

Tipi base di dati:
rvfloat è un numero in floating point a 32 bit
rvshort è un numero intero a 16 bit
rvlong è un numero intero a 32 bit (sia rvshort che rvlong hanno il segno + o - a meno che non siano esplicitamente indicati come unsigned, cioè senza segno).


Level.w file

I file.w contengono la vista generale del livello. E' principalmente una sequenza di:
Poligoni in stile .prm con struttura Mesh
una sequenza di FunnyBalls, il cui scopo ci è ancora sconosciuto
alcune liste completamente sconosciute
una env mapping list.


Instance.prm file

Un file.prm consiste in una struttura Mesh e nient'altro. Questo potrebbe essere un esempio:

Codice: [Nascondi] [Seleziona]
struct PRM_Mesh
 {
    /*
     * le istruzioni seguenti sono presenti solo nel file.w:
     * Vector    bound_ball_center;
     * rvfloat    bound_ball_radius;
     * Vector    bound_box[2];
     */

    rvshort polygon_count;
    rvshort vertex_count;

    Polygon polygons[polygon_count];
    Vertex vertices[vertex_count];
 }

.ncp file

I files.ncp contengono l'atmosfera del livello o delle Instances. Iniziano con una sequenza di Poliedri, che descrivono i poligoni senza spessore. Questi file contengono anche una LookupTable, nella quale il gioco va a cercare i dati per sapere quali Poliedri testare per ottenere la posizione dell'auto.


Strutture dei dati


World (.w)

Codice: [Nascondi] [Seleziona]
struct World
 {
    rvlong mesh_count;
    Mesh mesh[mesh_count];

    rvlong funnyball_count;
    FunnyBall fball[funnyball_count];

    Unknownlost unkn_list;

    EnvList env_list;
 }

Mesh (.w)

Codice: [Nascondi] [Seleziona]
 struct Mesh
 {
    Vector bound_ball_center;
    rvfloat bound_baòò_radius;

    BoundingBox bbox;

    rvshort polygon_count;
    rvshort vertex_count;

    Polygon polygons[polygon_count];
    Vertex[vertex_count];
 }

Un Mesh è una sequenza di poligoni (triangoli o quadrati) che sono sistemati uno vicino all'altro.

"bound_ball_center" e "bound_ball_radius" definiscono una sfera che circonda l'intero Mesh, e "bbox" è un parallelepipedo parallelo agli assi che circonda lo stesso Mesh. Funzionano così: "Se non puoi vedere la sfera (o il parallelepipedo), allora non puoi vedere il Mesh".

I poligoni contengono solo gli indici dei vertici, ma non le coordinate. Questi indici sono utilizzati nell'array (matrice) vertices[] (con indici da 0 a (vertex_count - 1)).


Polygon (.w / .prm)

Codice: [Nascondi] [Seleziona]
 struct Polygon
 {
    rvshort type;

    rvshort texture;

    rvshort vertex_indices[4];
    unsigned rvlong colors[4];

    UV texcoord[4];
 }

"Type" è una mappa di bit. Il Bit 0 è il più importante, perchè determina la forma del poligono: 0 è un triangolo, 1 un quadrato. Altri casi conosciuti sono:


MAPPA BIT
Bit-# Valore Effetto in .w Effetto in .prm
bit 0 0x001 Il poligono è quadrato Il poligono è quadrato
bit 1 0x002 Il poligono è a doppia faccia Il poligono è a doppia faccia
bit 2 0x004 Il poligono è traslucido o a specchio Il poligono è traslucido o a specchio
bit 8 0x100 Tipo di effetto traslucido (*) Tipo di effetto traslucido (*)
bit 10 0x400 Non usato Disabilita l'EnvMapping
bit 11 0x800 Abilita l'EnvMapping Non usato

(*): Impostalo a 0 per una trasparenza Alpha (usando il canale alpha in "colors[]"). Impostalo a 1 per sfumature aggiuntive.

"texture" imposta l'immagine grafica da applicare (0 = levela.bmp, 1 = levelb.bmp, ...). Se impostato a -1, il poligono non è texturato ma semplicemente colorato.

"vertex_indices" è una lista di 3 o 4 indici per la lista nella struttura Mesh. Se il poligono non è in dimensione doppia, i vertici vanno dati in ordine orario (se lo guardi "dal suo retro", i punti vengono ordinati in senso antiorario e il poligono diventa invisibile).

Non abbiamo nessuna idea su come funzionino le superfici a specchio. Tutti gli specchi che sono stati usati in realtà sono trasparenti (ad esempio in Museum 2, alla partenza: dovrebbe essere su marmo a specchio, ma in realtà quel pezzo è trasparente). Deve avere a che fare con le FunnyBalls (del tipo "Ogni texture trasparente tra una FunnyBall è a specchio e riflette tutto ciò che sta all'interno della palla").


Vertex (.w / .prm)

Codice: [Nascondi] [Seleziona]
struct Vertex
 {
    Vector position;
    Vector normal;
 }

Il "vector normal" deve avere lunghezza normalizzata (1.0).


Vector (.w / .prm / .ncp-w / .ncp-i)

Codice: [Nascondi] [Seleziona]
 struct Vector
 {
    rvfloat x;
    rvfloat y;
    rvfloat z;
 }

UV (.w / .prm)

Codice: [Nascondi] [Seleziona]
struct UV
 {
    rvfloat u;
    rvfloat v;
 }

FunnyBall (.w)

Codice: [Nascondi] [Seleziona]
struct FunnyBall
 {
    Vector center;
    rvfloat radius;

    rvlong mesh_count;
    rvlong mesh_indices[mesh_count];
 }

Le FunnyBalls sono sfere che circondano qualche (o tutti) i Meshes del livello. Il loro scopo è sconosciuto. Se non si mette nulla nel file.w (e il parametro fball_count è a 0) il gioco si blocca, ma averne una sola che circonda l'intero livello lo fa funzionare.
Possono essere usate per creare superfici a specchio (visto che gli specchi semplici sono poligoni trasparenti). Oppure per creare parti nascoste di un livello.


WorldNCP (.ncp / .w)

Codice: [Nascondi] [Seleziona]
 struct WorldNCP
 {
    rvshort polyhedron_count;
    Polyhedron polyhedra[polyhedron_count];

    LookupGrid lookup;
 }

Polyhedron (.ncp-w / .ncp-i)

Codice: [Nascondi] [Seleziona]
 struct Polyhedron
 {
    rvlong type;
    rvlong surface;

    Plane plane[5];

    BoundingBox bbox;
 }

Un Polyhedron è una struttura infinita di spazi tridimensionali delimitati da 4 o 5 piani. Plane #0 definisce il pavimento, gli altri lo delimitano agli angoli. In linguaggio Pov-Ray:

Codice: [Nascondi] [Seleziona]
 object {
  intersection {
    plane { plane[0] }
    plane { plane[1] }
    plane { plane[2] }
    ...
  }
 }

Type è un campo di Bit. Bit 0 definisce se ha 4 o 5 piani (definisce anche se è triangolare o quadrato).
Bbox è una "scatola" che circonda il plane[0].
Surface definisce il tipo di pavimento. Può variare da 0 a 25, dando risultati diversi (terreno liscio, erba, terra...)


Plane (.ncp-w / .ncp-i)

Codice: [Nascondi] [Seleziona]
 struct Plane
 {
    Vector normal;
    rvfloat distance;
 }

In linguaggio Pov-Ray è plane { normal, distance }

Normal ha come lunghezza 1.0.


LookupGrid (.ncp-w)

Codice: [Nascondi] [Seleziona]
 struct LookupGrid
 {
    rvfloat x0;
    rvfloat z0;

    rvfloat x_size;
    rvfloat z_size;

    rvfloat raster_size;

    LookupList lists[z_size] [x_size];
 }

Questa è una griglia che divide i piani X-Z (con origini in (x0, z0)) in aree di dimensione raster_size*raster_size, con area x_size in direzione +x e area z_size in direzione +z. x_size e z_size sono numeri interi salvati come float.

La griglia definisce una lista di Polyhedra che si trovano sopra o sotto la griglia stessa. La lista è data agli indici WorldNCP.polyhedra[WorldNCP.polyhedron_count].


LookupList (.ncp-w)

Codice: [Nascondi] [Seleziona]
 struct LookupList
 {
    rvlong length;
    rvlong polyhedron_indices[length];
 }

UnknownList (.w)

Questa parte del file.w è completamente sconosciuta. Anche la sua lunghezza non è certa. Per fortuna molti dei file.w non contengono nessun oggetto qui, per cui si può saltare senza problemi.

Codice: [Nascondi] [Seleziona]
 struct UnknownList
 {
    rvlong item_count;

    rvlong something[];
 }

EnvList (.w)

Contiene una definizione di colori per tutti i poligoni con riflessi (bit #11 set). Definisce il colore riflesso.

Codice: [Nascondi] [Seleziona]
 struct EnvList
 {
    unsigned rvlong env_color[number of bit-11-polys in file];
 }

Bounding Box

I Bounding Box sono solo alcuni valori che descrivono le variabili delle coordinate più alte o più basse contenute in esso.

Codice: [Nascondi] [Seleziona]
 struct BoundingBox
 {
    rvfloat xlo, xhi;
    rvfloat ylo, yhi;
    rvfloat zlo, zhi;
 }
Nascondi Menu Struttura Files
  Pagine

 



Copyright (C) 2000 - 2014 AliasReVoltMaster.com
Tutti i diritti riservati

Per qualsiasi problema, domanda, idea o suggerimento, potete scrivere ad arm@aliasrevoltmaster.com