Path: blob/master/RSDKv5/RSDK/Graphics/Legacy/v4/Scene3DLegacyv4.cpp
1170 views
1RSDK::Legacy::Face RSDK::Legacy::v4::faceBuffer[LEGACY_v4_FACEBUFFER_SIZE];2RSDK::Legacy::Vertex RSDK::Legacy::v4::vertexBuffer[LEGACY_v4_VERTEXBUFFER_SIZE];3RSDK::Legacy::Vertex RSDK::Legacy::v4::vertexBufferT[LEGACY_v4_VERTEXBUFFER_SIZE];45RSDK::Legacy::DrawListEntry3D RSDK::Legacy::v4::drawList3D[LEGACY_v4_FACEBUFFER_SIZE];67int32 RSDK::Legacy::v4::fogColor = 0;8int32 RSDK::Legacy::v4::fogStrength = 0;910void RSDK::Legacy::v4::SetIdentityMatrix(Matrix *matrix)11{12matrix->values[0][0] = 0x100;13matrix->values[0][1] = 0;14matrix->values[0][2] = 0;15matrix->values[0][3] = 0;1617matrix->values[1][0] = 0;18matrix->values[1][1] = 0x100;19matrix->values[1][2] = 0;20matrix->values[1][3] = 0;2122matrix->values[2][0] = 0;23matrix->values[2][1] = 0;24matrix->values[2][2] = 0x100;25matrix->values[2][3] = 0;2627matrix->values[3][0] = 0;28matrix->values[3][1] = 0;29matrix->values[3][2] = 0;30matrix->values[3][3] = 0x100;31}32void RSDK::Legacy::v4::MatrixMultiply(Matrix *matrixA, Matrix *matrixB)33{34int32 output[16];3536for (int32 i = 0; i < 0x10; ++i) {37uint32 rowA = i / 4;38uint32 rowB = i % 4;39output[i] = (matrixA->values[rowA][3] * matrixB->values[3][rowB] >> 8) + (matrixA->values[rowA][2] * matrixB->values[2][rowB] >> 8)40+ (matrixA->values[rowA][1] * matrixB->values[1][rowB] >> 8) + (matrixA->values[rowA][0] * matrixB->values[0][rowB] >> 8);41}4243for (int32 i = 0; i < 0x10; ++i) matrixA->values[i / 4][i % 4] = output[i];44}45void RSDK::Legacy::v4::MatrixTranslateXYZ(Matrix *matrix, int32 XPos, int32 YPos, int32 ZPos)46{47matrix->values[0][0] = 0x100;48matrix->values[0][1] = 0;49matrix->values[0][2] = 0;50matrix->values[0][3] = 0;5152matrix->values[1][0] = 0;53matrix->values[1][1] = 0x100;54matrix->values[1][2] = 0;55matrix->values[1][3] = 0;5657matrix->values[2][0] = 0;58matrix->values[2][1] = 0;59matrix->values[2][2] = 0x100;60matrix->values[2][3] = 0;6162matrix->values[3][0] = XPos;63matrix->values[3][1] = YPos;64matrix->values[3][2] = ZPos;65matrix->values[3][3] = 0x100;66}67void RSDK::Legacy::v4::MatrixScaleXYZ(Matrix *matrix, int32 scaleX, int32 scaleY, int32 scaleZ)68{69matrix->values[0][0] = scaleX;70matrix->values[0][1] = 0;71matrix->values[0][2] = 0;72matrix->values[0][3] = 0;7374matrix->values[1][0] = 0;75matrix->values[1][1] = scaleY;76matrix->values[1][2] = 0;77matrix->values[1][3] = 0;7879matrix->values[2][0] = 0;80matrix->values[2][1] = 0;81matrix->values[2][2] = scaleZ;82matrix->values[2][3] = 0;8384matrix->values[3][0] = 0;85matrix->values[3][1] = 0;86matrix->values[3][2] = 0;87matrix->values[3][3] = 0x100;88}89void RSDK::Legacy::v4::MatrixRotateX(Matrix *matrix, int32 rotationX)90{91int32 sine = sin512LookupTable[rotationX & 0x1FF] >> 1;92int32 cosine = cos512LookupTable[rotationX & 0x1FF] >> 1;9394matrix->values[0][0] = 0x100;95matrix->values[0][1] = 0;96matrix->values[0][2] = 0;97matrix->values[0][3] = 0;9899matrix->values[1][0] = 0;100matrix->values[1][1] = cosine;101matrix->values[1][2] = sine;102matrix->values[1][3] = 0;103104matrix->values[2][0] = 0;105matrix->values[2][1] = -sine;106matrix->values[2][2] = cosine;107matrix->values[2][3] = 0;108109matrix->values[3][0] = 0;110matrix->values[3][1] = 0;111matrix->values[3][2] = 0;112matrix->values[3][3] = 0x100;113}114void RSDK::Legacy::v4::MatrixRotateY(Matrix *matrix, int32 rotationY)115{116int32 sine = sin512LookupTable[rotationY & 0x1FF] >> 1;117int32 cosine = cos512LookupTable[rotationY & 0x1FF] >> 1;118119matrix->values[0][0] = cosine;120matrix->values[0][1] = 0;121matrix->values[0][2] = sine;122matrix->values[0][3] = 0;123124matrix->values[1][0] = 0;125matrix->values[1][1] = 0x100;126matrix->values[1][2] = 0;127matrix->values[1][3] = 0;128129matrix->values[2][0] = -sine;130matrix->values[2][1] = 0;131matrix->values[2][2] = cosine;132matrix->values[2][3] = 0;133134matrix->values[3][0] = 0;135matrix->values[3][1] = 0;136matrix->values[3][2] = 0;137matrix->values[3][3] = 0x100;138}139void RSDK::Legacy::v4::MatrixRotateZ(Matrix *matrix, int32 rotationZ)140{141int32 sine = sin512LookupTable[rotationZ & 0x1FF] >> 1;142int32 cosine = cos512LookupTable[rotationZ & 0x1FF] >> 1;143matrix->values[0][0] = cosine;144matrix->values[0][1] = 0;145matrix->values[0][2] = sine;146matrix->values[0][3] = 0;147148matrix->values[1][0] = 0;149matrix->values[1][1] = 0x100;150matrix->values[1][2] = 0;151matrix->values[1][3] = 0;152153matrix->values[2][0] = -sine;154matrix->values[2][1] = 0;155matrix->values[2][2] = cosine;156matrix->values[2][3] = 0;157158matrix->values[3][0] = 0;159matrix->values[3][1] = 0;160matrix->values[3][2] = 0;161matrix->values[3][3] = 0x100;162}163void RSDK::Legacy::v4::MatrixRotateXYZ(Matrix *matrix, int16 rotationX, int16 rotationY, int16 rotationZ)164{165int32 sinX = sin512LookupTable[rotationX & 0x1FF] >> 1;166int32 cosX = cos512LookupTable[rotationX & 0x1FF] >> 1;167int32 sinY = sin512LookupTable[rotationY & 0x1FF] >> 1;168int32 cosY = cos512LookupTable[rotationY & 0x1FF] >> 1;169int32 sinZ = sin512LookupTable[rotationZ & 0x1FF] >> 1;170int32 cosZ = cos512LookupTable[rotationZ & 0x1FF] >> 1;171172matrix->values[0][0] = (cosZ * cosY >> 8) + (sinZ * (sinY * sinX >> 8) >> 8);173matrix->values[0][1] = (sinZ * cosY >> 8) - (cosZ * (sinY * sinX >> 8) >> 8);174matrix->values[0][2] = sinY * cosX >> 8;175matrix->values[0][3] = 0;176177matrix->values[1][0] = sinZ * -cosX >> 8;178matrix->values[1][1] = cosZ * cosX >> 8;179matrix->values[1][2] = sinX;180matrix->values[1][3] = 0;181182matrix->values[2][0] = (sinZ * (cosY * sinX >> 8) >> 8) - (cosZ * sinY >> 8);183matrix->values[2][1] = (sinZ * -sinY >> 8) - (cosZ * (cosY * sinX >> 8) >> 8);184matrix->values[2][2] = cosY * cosX >> 8;185matrix->values[2][3] = 0;186187matrix->values[3][0] = 0;188matrix->values[3][1] = 0;189matrix->values[3][2] = 0;190matrix->values[3][3] = 0x100;191}192void RSDK::Legacy::v4::MatrixInverse(Matrix *matrix)193{194double inv[16], det;195double m[16];196for (int32 y = 0; y < 4; ++y) {197for (int32 x = 0; x < 4; ++x) {198m[(y << 2) + x] = matrix->values[y][x] / 256.0;199}200}201202inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10];203204inv[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10];205206inv[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9];207208inv[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9];209210inv[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10];211212inv[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10];213214inv[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9];215216inv[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9];217218inv[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6];219220inv[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6];221222inv[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5];223224inv[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5];225226inv[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6];227228inv[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6];229230inv[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5];231232inv[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5];233234det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12];235236if (det == 0)237return;238239det = 1.0 / det;240241for (int32 i = 0; i < 0x10; ++i) inv[i] = (int32)((inv[i] * det) * 256);242for (int32 i = 0; i < 0x10; ++i) matrix->values[i / 4][i % 4] = (int32)inv[i];243}244void RSDK::Legacy::v4::TransformVertexBuffer()245{246matFinal.values[0][0] = matWorld.values[0][0];247matFinal.values[0][1] = matWorld.values[0][1];248matFinal.values[0][2] = matWorld.values[0][2];249matFinal.values[0][3] = matWorld.values[0][3];250251matFinal.values[1][0] = matWorld.values[1][0];252matFinal.values[1][1] = matWorld.values[1][1];253matFinal.values[1][2] = matWorld.values[1][2];254matFinal.values[1][3] = matWorld.values[1][3];255256matFinal.values[2][0] = matWorld.values[2][0];257matFinal.values[2][1] = matWorld.values[2][1];258matFinal.values[2][2] = matWorld.values[2][2];259matFinal.values[2][3] = matWorld.values[2][3];260261matFinal.values[3][0] = matWorld.values[3][0];262matFinal.values[3][1] = matWorld.values[3][1];263matFinal.values[3][2] = matWorld.values[3][2];264matFinal.values[3][3] = matWorld.values[3][3];265MatrixMultiply(&matFinal, &matView);266267for (int32 v = 0; v < vertexCount; ++v) {268int32 vx = vertexBuffer[v].x;269int32 vy = vertexBuffer[v].y;270int32 vz = vertexBuffer[v].z;271272vertexBufferT[v].x =273(vx * matFinal.values[0][0] >> 8) + (vy * matFinal.values[1][0] >> 8) + (vz * matFinal.values[2][0] >> 8) + matFinal.values[3][0];274vertexBufferT[v].y =275(vx * matFinal.values[0][1] >> 8) + (vy * matFinal.values[1][1] >> 8) + (vz * matFinal.values[2][1] >> 8) + matFinal.values[3][1];276vertexBufferT[v].z =277(vx * matFinal.values[0][2] >> 8) + (vy * matFinal.values[1][2] >> 8) + (vz * matFinal.values[2][2] >> 8) + matFinal.values[3][2];278}279}280void RSDK::Legacy::v4::TransformVertices(Matrix *matrix, int32 startIndex, int32 endIndex)281{282for (int32 v = startIndex; v < endIndex; ++v) {283int32 vx = vertexBuffer[v].x;284int32 vy = vertexBuffer[v].y;285int32 vz = vertexBuffer[v].z;286Vertex *vert = &vertexBuffer[v];287vert->x = (vx * matrix->values[0][0] >> 8) + (vy * matrix->values[1][0] >> 8) + (vz * matrix->values[2][0] >> 8) + matrix->values[3][0];288vert->y = (vx * matrix->values[0][1] >> 8) + (vy * matrix->values[1][1] >> 8) + (vz * matrix->values[2][1] >> 8) + matrix->values[3][1];289vert->z = (vx * matrix->values[0][2] >> 8) + (vy * matrix->values[1][2] >> 8) + (vz * matrix->values[2][2] >> 8) + matrix->values[3][2];290}291}292void RSDK::Legacy::v4::Sort3DDrawList()293{294for (int32 i = 0; i < faceCount; ++i) {295drawList3D[i].depth = (vertexBufferT[faceBuffer[i].d].z + vertexBufferT[faceBuffer[i].c].z + vertexBufferT[faceBuffer[i].b].z296+ vertexBufferT[faceBuffer[i].a].z)297>> 2;298drawList3D[i].faceID = i;299}300301for (int32 i = 0; i < faceCount; ++i) {302for (int32 j = faceCount - 1; j > i; --j) {303if (drawList3D[j].depth > drawList3D[j - 1].depth) {304int32 faceID = drawList3D[j].faceID;305int32 depth = drawList3D[j].depth;306drawList3D[j].faceID = drawList3D[j - 1].faceID;307drawList3D[j].depth = drawList3D[j - 1].depth;308drawList3D[j - 1].faceID = faceID;309drawList3D[j - 1].depth = depth;310}311}312}313}314void RSDK::Legacy::v4::Draw3DScene(int32 spriteSheetID)315{316Vertex quad[4];317for (int32 i = 0; i < faceCount; ++i) {318Face *face = &faceBuffer[drawList3D[i].faceID];319memset(quad, 0, 4 * sizeof(Vertex));320switch (face->flag) {321default: break;322case FACE_FLAG_TEXTURED_3D:323if (vertexBufferT[face->a].z > 0 && vertexBufferT[face->b].z > 0 && vertexBufferT[face->c].z > 0 && vertexBufferT[face->d].z > 0) {324quad[0].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->a].x / vertexBufferT[face->a].z;325quad[0].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->a].y / vertexBufferT[face->a].z;326quad[1].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->b].x / vertexBufferT[face->b].z;327quad[1].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->b].y / vertexBufferT[face->b].z;328quad[2].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->c].x / vertexBufferT[face->c].z;329quad[2].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->c].y / vertexBufferT[face->c].z;330quad[3].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->d].x / vertexBufferT[face->d].z;331quad[3].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->d].y / vertexBufferT[face->d].z;332quad[0].u = vertexBuffer[face->a].u;333quad[0].v = vertexBuffer[face->a].v;334quad[1].u = vertexBuffer[face->b].u;335quad[1].v = vertexBuffer[face->b].v;336quad[2].u = vertexBuffer[face->c].u;337quad[2].v = vertexBuffer[face->c].v;338quad[3].u = vertexBuffer[face->d].u;339quad[3].v = vertexBuffer[face->d].v;340DrawTexturedFace(quad, spriteSheetID);341}342break;343case FACE_FLAG_TEXTURED_2D:344if (vertexBufferT[face->a].z >= 0 && vertexBufferT[face->b].z >= 0 && vertexBufferT[face->c].z >= 0345&& vertexBufferT[face->d].z >= 0) {346quad[0].x = vertexBufferT[face->a].x;347quad[0].y = vertexBufferT[face->a].y;348quad[1].x = vertexBufferT[face->b].x;349quad[1].y = vertexBufferT[face->b].y;350quad[2].x = vertexBufferT[face->c].x;351quad[2].y = vertexBufferT[face->c].y;352quad[3].x = vertexBufferT[face->d].x;353quad[3].y = vertexBufferT[face->d].y;354quad[0].u = vertexBuffer[face->a].u;355quad[0].v = vertexBuffer[face->a].v;356quad[1].u = vertexBuffer[face->b].u;357quad[1].v = vertexBuffer[face->b].v;358quad[2].u = vertexBuffer[face->c].u;359quad[2].v = vertexBuffer[face->c].v;360quad[3].u = vertexBuffer[face->d].u;361quad[3].v = vertexBuffer[face->d].v;362DrawTexturedFace(quad, spriteSheetID);363}364break;365case FACE_FLAG_COLORED_3D:366if (vertexBufferT[face->a].z > 0 && vertexBufferT[face->b].z > 0 && vertexBufferT[face->c].z > 0 && vertexBufferT[face->d].z > 0) {367quad[0].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->a].x / vertexBufferT[face->a].z;368quad[0].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->a].y / vertexBufferT[face->a].z;369quad[1].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->b].x / vertexBufferT[face->b].z;370quad[1].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->b].y / vertexBufferT[face->b].z;371quad[2].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->c].x / vertexBufferT[face->c].z;372quad[2].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->c].y / vertexBufferT[face->c].z;373quad[3].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->d].x / vertexBufferT[face->d].z;374quad[3].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->d].y / vertexBufferT[face->d].z;375DrawFace(quad, face->color);376}377break;378case FACE_FLAG_COLORED_2D:379if (vertexBufferT[face->a].z >= 0 && vertexBufferT[face->b].z >= 0 && vertexBufferT[face->c].z >= 0380&& vertexBufferT[face->d].z >= 0) {381quad[0].x = vertexBufferT[face->a].x;382quad[0].y = vertexBufferT[face->a].y;383quad[1].x = vertexBufferT[face->b].x;384quad[1].y = vertexBufferT[face->b].y;385quad[2].x = vertexBufferT[face->c].x;386quad[2].y = vertexBufferT[face->c].y;387quad[3].x = vertexBufferT[face->d].x;388quad[3].y = vertexBufferT[face->d].y;389DrawFace(quad, face->color);390}391break;392case FACE_FLAG_FADED:393if (vertexBufferT[face->a].z > 0 && vertexBufferT[face->b].z > 0 && vertexBufferT[face->c].z > 0 && vertexBufferT[face->d].z > 0) {394quad[0].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->a].x / vertexBufferT[face->a].z;395quad[0].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->a].y / vertexBufferT[face->a].z;396quad[1].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->b].x / vertexBufferT[face->b].z;397quad[1].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->b].y / vertexBufferT[face->b].z;398quad[2].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->c].x / vertexBufferT[face->c].z;399quad[2].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->c].y / vertexBufferT[face->c].z;400quad[3].x = SCREEN_CENTERX + projectionX * vertexBufferT[face->d].x / vertexBufferT[face->d].z;401quad[3].y = SCREEN_CENTERY - projectionY * vertexBufferT[face->d].y / vertexBufferT[face->d].z;402403int32 fogStr = 0;404if ((drawList3D[i].depth - 0x8000) >> 8 >= 0)405fogStr = (drawList3D[i].depth - 0x8000) >> 8;406if (fogStr > fogStrength)407fogStr = fogStrength;408409DrawFadedFace(quad, face->color, fogColor, 0xFF - fogStr);410}411break;412case FACE_FLAG_TEXTURED_C:413if (vertexBufferT[face->a].z > 0) {414// [face->a].uv == sprite center415// [face->b].uv == ???416// [face->c].uv == sprite extend (how far to each edge X & Y)417// [face->d].uv == unused418419quad[0].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x - vertexBuffer[face->b].u) / vertexBufferT[face->a].z;420quad[0].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y + vertexBuffer[face->b].v) / vertexBufferT[face->a].z;421quad[1].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x + vertexBuffer[face->b].u) / vertexBufferT[face->a].z;422quad[1].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y + vertexBuffer[face->b].v) / vertexBufferT[face->a].z;423quad[2].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x - vertexBuffer[face->b].u) / vertexBufferT[face->a].z;424quad[2].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y - vertexBuffer[face->b].v) / vertexBufferT[face->a].z;425quad[3].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x + vertexBuffer[face->b].u) / vertexBufferT[face->a].z;426quad[3].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y - vertexBuffer[face->b].v) / vertexBufferT[face->a].z;427428quad[0].u = vertexBuffer[face->a].u - vertexBuffer[face->c].u;429quad[0].v = vertexBuffer[face->a].v - vertexBuffer[face->c].v;430quad[1].u = vertexBuffer[face->a].u + vertexBuffer[face->c].u;431quad[1].v = vertexBuffer[face->a].v - vertexBuffer[face->c].v;432quad[2].u = vertexBuffer[face->a].u - vertexBuffer[face->c].u;433quad[2].v = vertexBuffer[face->a].v + vertexBuffer[face->c].v;434quad[3].u = vertexBuffer[face->a].u + vertexBuffer[face->c].u;435quad[3].v = vertexBuffer[face->a].v + vertexBuffer[face->c].v;436437DrawTexturedFace(quad, spriteSheetID);438}439break;440case FACE_FLAG_TEXTURED_C_BLEND:441if (vertexBufferT[face->a].z > 0) {442// See above, its the same just blended443444quad[0].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x - vertexBuffer[face->b].u) / vertexBufferT[face->a].z;445quad[0].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y + vertexBuffer[face->b].v) / vertexBufferT[face->a].z;446quad[1].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x + vertexBuffer[face->b].u) / vertexBufferT[face->a].z;447quad[1].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y + vertexBuffer[face->b].v) / vertexBufferT[face->a].z;448quad[2].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x - vertexBuffer[face->b].u) / vertexBufferT[face->a].z;449quad[2].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y - vertexBuffer[face->b].v) / vertexBufferT[face->a].z;450quad[3].x = SCREEN_CENTERX + projectionX * (vertexBufferT[face->a].x + vertexBuffer[face->b].u) / vertexBufferT[face->a].z;451quad[3].y = SCREEN_CENTERY - projectionY * (vertexBufferT[face->a].y - vertexBuffer[face->b].v) / vertexBufferT[face->a].z;452453quad[0].u = vertexBuffer[face->a].u - vertexBuffer[face->c].u;454quad[0].v = vertexBuffer[face->a].v - vertexBuffer[face->c].v;455quad[1].u = vertexBuffer[face->a].u + vertexBuffer[face->c].u;456quad[1].v = vertexBuffer[face->a].v - vertexBuffer[face->c].v;457quad[2].u = vertexBuffer[face->a].u - vertexBuffer[face->c].u;458quad[2].v = vertexBuffer[face->a].v + vertexBuffer[face->c].v;459quad[3].u = vertexBuffer[face->a].u + vertexBuffer[face->c].u;460quad[3].v = vertexBuffer[face->a].v + vertexBuffer[face->c].v;461462DrawTexturedFaceBlended(quad, spriteSheetID);463}464break;465case FACE_FLAG_3DSPRITE:466if (vertexBufferT[face->a].z > 0) {467int32 xpos = SCREEN_CENTERX + projectionX * vertexBufferT[face->a].x / vertexBufferT[face->a].z;468int32 ypos = SCREEN_CENTERY - projectionY * vertexBufferT[face->a].y / vertexBufferT[face->a].z;469470ObjectScript *scriptInfo = &objectScriptList[vertexBuffer[face->a].u];471SpriteFrame *frame = &scriptFrames[scriptInfo->frameListOffset + vertexBuffer[face->b].u];472473switch (vertexBuffer[face->a].v) {474case FX_SCALE:475DrawSpriteScaled(vertexBuffer[face->b].v, xpos, ypos, -frame->pivotX, -frame->pivotY, vertexBuffer[face->c].u,476vertexBuffer[face->c].u, frame->width, frame->height, frame->sprX, frame->sprY,477scriptInfo->spriteSheetID);478break;479case FX_ROTATE:480DrawSpriteRotated(vertexBuffer[face->b].v, xpos, ypos, -frame->pivotX, -frame->pivotY, frame->sprX, frame->sprY,481frame->width, frame->height, vertexBuffer[face->c].v, scriptInfo->spriteSheetID);482break;483case FX_ROTOZOOM:484DrawSpriteRotozoom(vertexBuffer[face->b].v, xpos, ypos, -frame->pivotX, -frame->pivotY, frame->sprX, frame->sprY,485frame->width, frame->height, vertexBuffer[face->c].v, vertexBuffer[face->c].u,486scriptInfo->spriteSheetID);487break;488}489}490break;491}492}493}494495496