Hola! Estoy leyendo un tutorial sobre el formato md2 para intentar implementarlo en lo q se podria llamar mi motor(tengo solo 2 clases hechasxDDD) pero bueno, la duda viene sobre el propio codigo que hay en el tutorial...
A ver.. el tutorial es el de xbdev.net que está
aqui.
struct stVerts
{
byte vertex[3]; // an index reference into the location of our vertexs
byte lightNormalIndex; // in index into which tex coords to use.
};
struct stAliasFrame
{
float scale[3];
float translate[3];
char name[16];
stVerts aliasVerts[1];
};
Vale, mi problema esta en aliasVerts, q se supone es un array de punteros para 1 solo vertice, no?
unsigned char largebuffer[10000];
stAliasFrame* pTempFrame = (stAliasFrame*) largebuffer;
bueno, hasta aqui todo normal... ahora viene lo raro
for(int i=0; i< Md2Header.numVertices; i++)
{
pFrames[0].pVerts[i].vertex[0] = pTempFrame->aliasVerts[i].vertex[0] * pTempFrame->scale[0] + pTempFrame->translate[0]; // x
pFrames[0].pVerts[i].vertex[1] = pTempFrame->aliasVerts[i].vertex[2] * pTempFrame->scale[2] + pTempFrame->translate[2]; // y
pFrames[0].pVerts[i].vertex[2] = -1 * (pTempFrame->aliasVerts[i].vertex[1] * pTempFrame->scale[1] + pTempFrame->translate[1]); // z
}
}
pues entonces, aqui el tio se refiere a aliasVerts como
pTempFrame->aliasVerts.vertex[0] pero.... no se supone q era un array de un elemento??? (nooo)
nose, no le veo la logica, puede q este mal. no he intentado compilarlo, pero me parece raro q publiquen un tutorial tan grande con codigo malo. si me podeis decir si esta bien o mal y porque, os lo agradeceria muxo
un saludo
tywok
Felices Fiestas!
ey, en serio, alguien le ve la logica o me he explicado mal??
ayudarme, plis
Bueno, me he estado mirando el tuto de MD2 (yo mire el de gametutorials que es igual) y parece que como el logicamente la estructura no sabe cuantos vertices va a tener el modelo pues pone 1 para crear como un puntero (o algo asi). Si te fijas como carga los frames:
for (int i=0; i < m_Header.numFrames; i++)
{
// Assign our alias frame to our buffer memory
tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;
// Allocate the memory for the first frame of animation's vertices
m_pFrames[i].pVertices = new tMd2Triangle [m_Header.numVertices];
// Read in the first frame of animation
fread(pFrame, 1, m_Header.frameSize, m_FilePointer);
// Copy the name of the animation to our frames array
strcpy(m_pFrames[i].strName, pFrame->name);
// Store off a vertex array pointer to cut down large lines of code
tMd2Triangle *pVertices = m_pFrames[i].pVertices;
// Go through all of the number of vertices and assign the scale and translations.
// Store the vertices in our current frame's vertex list array, while swapping Y and Z.
// Notice we also negate the Z axis as well to make the swap correctly.
for (int j=0; j < m_Header.numVertices; j++)
{
pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];
pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);
pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];
}
}
se ve que lee los 3 primeros datos del frame ( float scale[3]; float translate[3]; char name[16]; ) y al llegar a "tMd2AliasTriangle aliasVertices[1];" la estructura no sabe cuantos vertices hay, pero estos x vertices estan almacenados en el archivo, por lo cual procede a leer uno por uno.
Esto es mas o menos como lo veo yo, desde luego el codigo de gametutorials funciona.
espero haberte ayudado en algo.saludos
si, es lo q me parecia, aunque lo veia como un poco demasiado raro.. jeje
muchas gracias!;)