Wednesday, June 18, 2008

Formato Interno

Bueno, como ultimamente no tengo tiempo por culpa de los examenes no estoy haciendo nada relevante con el engine, pero creo que mi falta de tiempo no deberia ser motivo suficiente para su paralizacion. Por esta razon he decidido fijar un pequeño estandard para que todos podais hacer vuestras contribuciones, ya que me consta que hay interesados en colaborar. Para empezar he decidido fijar un formato de modelos que use el engine internamente para mostrar modelos 3D. Asi podreis todos los que querais podreis colaborar creando vuestras propias funciones de creacion de modelos. Empecemos:
Por ahora el engine utiliza internamente para los modelos la siguiente estructura:

typedef struct REV_Mesh{
u16 NVerts;
u16 NFaces;
u16 NCoords;
u16 NNormals;
f32 * Vertices;
f32 * Coordenadas;
f32 * Normales;
u16 * Lista;
} MESH;


NVerts debe contener el numero de vertices que tiene el modelo.
NFaces el numero de Caras.
NCoords el numero de coordenadas UV para cargar texturas.
NNormals el numero de normals.
Simple, ¿no?
Vertices es un puntero a un Array de f32. Esta array debe estar alineada a 32b y contiene las coordenadas de los vertices en el espacio ordenadas como x, y, z.
Lo mismo sucede con Coordenadas (almacenadas como U,V) y los normales.
En cambio lista es un poco mas complicado. Al principio pensaba poner Display lists. Pero he decidido que para las primeras versiones del engine no es necesaria demasiada optimizacion en este sentido. Por tanto en vez de haceros crear displaylists (con el trabajo que ello conlleva), y para que os vallais familiarizando con el Revolution Engine, he implementado una pequeña variante de las display lists. En futuras versiones esto cambiara, pero me parece una buena forma de comenzar. Sin mas dilacion:
List debe apuntar a un Array (no tiene por que estar alineado) de u16. Estos U16 son los indices de los vertices que compondran el modelo. El numero de indices total debe ser multiplo de 9, y vendran dados en este orden: Cada grupo de nueve indices representan un triangulo del modelo final. Se dividen en tres grupos de 3 indices cada uno (cada grupo se corresponde con un vertice del triangulo, y deben aparecer en el sentido contrario a las agujas de un reloj analogico para que se muestren desde el frente y viceversa (por aquello del backface-culling). Dentro de cada grupo de 3 el orden sera:
Indice de Posicion, Indice de Normal, Indice de Coordenadas UV.

Con el fin de que podais probar vuestras funciones sacare dentro de unos dias (2 o 3) Una version Alfa de desarrollo del engine. Con esta version vosotros podreis crear vuestras propias funciones y probarlas, pero ya podeis empezar a crear funciones del tipo creacion de primitivas, cargadores de modelos, etc...

No comments: