|
|
|
@ -368,6 +368,9 @@ static int fakeLight(const int *norm) |
|
|
|
|
|
|
|
SVECTOR outPos; |
|
|
|
|
|
|
|
#define MAXVERTEXBUF 512 |
|
|
|
SVECTOR vertexBuffer[MAXVERTEXBUF] = { 0 }; // Temporary buffer for precalculating vertex data |
|
|
|
|
|
|
|
#define SCTR(v, i) (short)((scale[i]*(v)->position[i]+translate[i])>>10) |
|
|
|
|
|
|
|
void drawModel(MATRIX *view_matrix, ps1mdl_t *model, ps1skin_t *skin, int frameCounter) |
|
|
|
@ -377,9 +380,10 @@ void drawModel(MATRIX *view_matrix, ps1mdl_t *model, ps1skin_t *skin, int frameC |
|
|
|
int p; |
|
|
|
|
|
|
|
short halfSkinWidth = model->header->skinWidth >> 1; |
|
|
|
unsigned short numTriangles = model->header->triangleCount; |
|
|
|
unsigned short vertexCount = model->header->vertexCount; |
|
|
|
unsigned short triangleCount = model->header->triangleCount; |
|
|
|
int frameNum = frameCounter % model->header->frameCount; |
|
|
|
ps1mdl_vertex_t *baseVert = &model->vertices[frameNum * model->header->vertexCount]; |
|
|
|
ps1mdl_vertex_t *baseVertex = &model->vertices[frameNum * vertexCount]; |
|
|
|
|
|
|
|
int *scale = model->header->scale; |
|
|
|
int *translate = model->header->translate; |
|
|
|
@ -406,22 +410,26 @@ void drawModel(MATRIX *view_matrix, ps1mdl_t *model, ps1skin_t *skin, int frameC |
|
|
|
gte_SetRotMatrix(&model_mtx); |
|
|
|
gte_SetTransMatrix(&model_mtx); |
|
|
|
|
|
|
|
for (unsigned short triIdx = 0; triIdx < numTriangles; ++triIdx) |
|
|
|
ps1mdl_vertex_t *vin = baseVertex; |
|
|
|
for (unsigned short vertIdx = 0; vertIdx < vertexCount; ++vertIdx, ++vin) |
|
|
|
{ |
|
|
|
SVECTOR *v = &vertexBuffer[vertIdx]; |
|
|
|
setVector(v, SCTR(vin,0), SCTR(vin,1), SCTR(vin,2)); |
|
|
|
} |
|
|
|
|
|
|
|
for (unsigned short triIdx = 0; triIdx < triangleCount; ++triIdx) |
|
|
|
{ |
|
|
|
ps1mdl_triangle_t *tri = &model->triangles[triIdx]; |
|
|
|
|
|
|
|
ps1mdl_vertex_t *v0 = &baseVert[tri->vertexIndex[0]]; |
|
|
|
ps1mdl_vertex_t *v1 = &baseVert[tri->vertexIndex[1]]; |
|
|
|
ps1mdl_vertex_t *v2 = &baseVert[tri->vertexIndex[2]]; |
|
|
|
ps1mdl_vertex_t *v0 = &baseVertex[tri->vertexIndex[0]]; |
|
|
|
ps1mdl_vertex_t *v1 = &baseVertex[tri->vertexIndex[1]]; |
|
|
|
ps1mdl_vertex_t *v2 = &baseVertex[tri->vertexIndex[2]]; |
|
|
|
|
|
|
|
// SVECTOR pos0 = { v0->position[0], v0->position[1], v0->position[2], 0 }; |
|
|
|
// SVECTOR pos1 = { v1->position[0], v1->position[1], v1->position[2], 0 }; |
|
|
|
// SVECTOR pos2 = { v2->position[0], v2->position[1], v2->position[2], 0 }; |
|
|
|
SVECTOR pos0 = { SCTR(v0,0), SCTR(v0,1), SCTR(v0,2), 0 }; |
|
|
|
SVECTOR pos1 = { SCTR(v1,0), SCTR(v1,1), SCTR(v1,2), 0 }; |
|
|
|
SVECTOR pos2 = { SCTR(v2,0), SCTR(v2,1), SCTR(v2,2), 0 }; |
|
|
|
SVECTOR *pos0 = &vertexBuffer[tri->vertexIndex[0]]; |
|
|
|
SVECTOR *pos1 = &vertexBuffer[tri->vertexIndex[1]]; |
|
|
|
SVECTOR *pos2 = &vertexBuffer[tri->vertexIndex[2]]; |
|
|
|
|
|
|
|
gte_ldv3(&pos0, &pos1, &pos2); |
|
|
|
gte_ldv3(pos0, pos1, pos2); |
|
|
|
gte_rtpt(); // Rotation, Translation and Perspective triplet (all three vertices at once) |
|
|
|
|
|
|
|
// Normal clipping for backface culling |
|
|
|
|