GX Vertex descriptors

Haciendo pruebas con las GX para el Game Engine que estoy creando (unos hilos mas abajo) he empezado a trastear con los vertex descriptors. Estaba siguiendo uno de los antiguos ejemplos de las GX, donde se crea un cubo de colores hecho a base de Quads, este ejemplo trae lo siguiente (dentro de mucho mas codigo):
// cube vertex data
s16 cube[] ATTRIBUTE_ALIGN (32) =
{
  // x y z
  -30, 30, -30,         // 0
    30, 30, -30,      // 1
    30, 30, 30,         // 2
    -30, 30, 30,      // 3
    30, -30, -30,      // 4
    30, -30, 30,      // 5
    -30, -30, 30,      // 6
    -30, -30, -30,      // 7
};

....

// setup the vertex descriptor
  // tells the flipper to expect 8bit indexes for position
  // and color data. could also be set to direct.
  GX_ClearVtxDesc ();
  GX_SetVtxDesc (GX_VA_POS, GX_INDEX8);
  GX_SetVtxDesc (GX_VA_CLR0, GX_INDEX8);

  // setup the vertex attribute table
  // describes the data
  // args: vat location 0-7, type of data, data format, size, scale
  // so for ex. in the first call we are sending position data with
  // 3 values X,Y,Z of size S16. scale sets the number of fractional
  // bits for non float data.
  GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
  GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);

......

GX_Begin (GX_QUADS, GX_VTXFMT0, 24);

  draw_quad (0, 3, 2, 1, 0);
  draw_quad (0, 7, 6, 3, 1);
  draw_quad (0, 1, 4, 7, 2);
  draw_quad (1, 2, 5, 4, 3);
  draw_quad (2, 3, 6, 5, 4);
  draw_quad (4, 7, 6, 5, 5);

  GX_End ();

......

// draws a quad from 4 vertex idx and one color idx
void
draw_quad (u8 v0, u8 v1, u8 v2, u8 v3, u8 c)
{
  // one 8bit position idx
  GX_Position1x8 (v0);
  // one 8bit color idx
  GX_Color1x8 (c);
  GX_Position1x8 (v1);
  GX_Color1x8 (c);
  GX_Position1x8 (v2);
  GX_Color1x8 (c);
  GX_Position1x8 (v3);
  GX_Color1x8 (c);
}


y yo eso lo he cambiado un poco para ir trasteando, primero hice que en vez de quads, lo dibujase a base de triangles y funcionó
y ahora intento hacerlo funcionar pasandole las posiciones como un vector de 3 flotantes y no hay forma. El resultado del codigo es este (ya modificado):
Vector v0 = {-30.0f, 30.0f, -30.0f},
   v1 = {30.0f, 30.0f, -30.0f},
   v2 = {30.0f, 30.0f, 30.0f},
   v3 = {-30.0f, 30.0f, 30.0f},
   v4 = {30.0f, -30.0f, -30.0f},
   v5 = {30.0f, -30.0f, 30.0f},
   v6 = {-30.0f, -30.0f, 30.0f},
   v7 = {-30.0f, -30.0f, -30.0f};
.....

// setup the vertex descriptor
  // tells the flipper to expect 8bit indexes for position
  // and color data. could also be set to direct.
  GX_ClearVtxDesc ();
  GX_SetVtxDesc (GX_VA_POS, GX_F32);
  GX_SetVtxDesc (GX_VA_CLR0, GX_INDEX8);

  // setup the vertex attribute table
  // describes the data
  // args: vat location 0-7, type of data, data format, size, scale
  // so for ex. in the first call we are sending position data with
  // 3 values X,Y,Z of size S16. scale sets the number of fractional
  // bits for non float data.
  GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
  GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);

......

GX_Begin (GX_TRIANGLES, GX_VTXFMT0, 32);

  draw_quad (v0, v3, v2, v1, 0);
  draw_quad (v0, v7, v6, v3, 1);
  draw_quad (v0, v1, v4, v7, 2);
  draw_quad (v1, v2, v5, v4, 3);
  draw_quad (v2, v3, v6, v5, 4);
  draw_quad (v4, v7, v6, v5, 5);

  GX_End ();

.....

void
draw_quad (Vector v0, Vector v1, Vector v2, Vector v3, u8 c)
{
  //first triangle
  GX_Position3f32(v2.x,v2.y,v2.z);
  GX_Color1x8 (c);
  GX_Position3f32(v1.x,v1.y,v1.z);
  GX_Color1x8 (c);
  GX_Position3f32(v0.x,v0.y,v0.z);
  GX_Color1x8 (c);
  //second triangle
  GX_Position3f32(v0.x,v0.y,v0.z);
  GX_Color1x8 (c);
  GX_Position3f32(v3.x,v3.y,v3.z);
  GX_Color1x8 (c);
  GX_Position3f32(v2.x,v2.y,v2.z);
  GX_Color1x8 (c);
}


y ahora la aplicacion se queda con la pantalla en negro en vez de mostrar nada, como si no crease ningun triangulo
1 respuesta