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