#include #include #define _USE_MATH_DEFINES #include #include #include #include #include "ps2.h" #include "dma.h" #include "gif.h" #include "gs.h" #include "math.h" using namespace std; Matrix projMat, viewMat, worldMat; extern uint32 MyDmaPacket[]; extern Matrix vuMat; extern Matrix vuLightMat; extern float vuOffset[]; extern uint64 vuGIFtag[]; extern float vuMatcolor[]; extern float vuSurfProps[]; extern uint32 vuGeometry[]; extern uint32 mpgCall[]; extern uint32 geometryCall[]; extern uint32 defaultPipe[]; extern uint32 skinPipe[]; rw::Clump *clump; void drawAtomic(rw::Atomic *atomic) { rw::Geometry *geo = atomic->geometry; assert(geo->instData != NULL); rw::ps2::InstanceDataHeader *instData = (rw::ps2::InstanceDataHeader*)geo->instData; rw::MeshHeader *meshHeader = geo->meshHeader; rw::Mesh *mesh; uint8 *color; atomic->frame->updateLTM(); matCopy(vuLightMat, atomic->frame->ltm); matMult(vuMat, atomic->frame->ltm); rw::Skin *skin = *PLUGINOFFSET(rw::Skin*, geo, rw::skinGlobals.offset); for(int i = 0; i < instData->numMeshes; i++){ if(instData->instanceMeshes[i].arePointersFixed == 0) rw::ps2::fixDmaOffsets(&instData->instanceMeshes[i]); geometryCall[1] = (uint32)instData->instanceMeshes[i].data; mesh = &meshHeader->mesh[i]; color = mesh->material->color; vuGIFtag[0] = MAKE_GIF_TAG(0,1,1,0xC,0,2); vuGIFtag[1] = 0x41; vuMatcolor[0] = color[0]/255.0f; vuMatcolor[1] = color[1]/255.0f; vuMatcolor[2] = color[2]/255.0f; vuMatcolor[3] = color[3]/2.0f/255.0f; if(rw::skinGlobals.offset && skin){ geometryCall[3] = 0x020000DC; mpgCall[1] = (uint32)skinPipe; }else{ geometryCall[3] = 0x02000114; mpgCall[1] = (uint32)defaultPipe; } SET_REG32(D1_QWC, 0x00); SET_REG32(D1_TADR, (uint)MyDmaPacket & 0x0FFFFFFF); FlushCache(0); SET_REG32(D1_CHCR, MAKE_DN_CHCR(1, 1, 0, 1, 0, 1)); DMA_WAIT(D1_CHCR); } } void draw(void) { Matrix m; static float rot = 0.0f; gsClear(); matMakeIdentity(viewMat); // matTranslate(viewMat, 0.0f, 0.0f, -34.0f); // matTranslate(viewMat, 0.0f, 0.0f, -10.0f); matTranslate(viewMat, 0.0f, 0.0f, -8.0f); matRotateX(viewMat, rot); matRotateY(viewMat, rot); matRotateZ(viewMat, rot); matCopy(vuMat, projMat); matMult(vuMat, viewMat); for(int i = 0; i < clump->numAtomics; i++){ char *name = PLUGINOFFSET(char, clump->atomicList[i]->frame, gta::nodeNameOffset); if(strstr(name, "_dam") || strstr(name, "_vlo")) continue; matCopy(m, vuMat); drawAtomic(clump->atomicList[i]); matCopy(vuMat, m); } rot += 0.01f; if(rot > 2*M_PI) rot -= 2*M_PI; } int main() { GsState gss; gsCurState = &gss; dmaReset(1); // gsInitState(NONINTERLACED, PAL, FRAME); // gsInitState(INTERLACED, PAL, FRAME); gsInitState(INTERLACED, PAL, FIELD); gsCurState->clearcol = 0x80404040; gsInit(); gta::registerEnvSpecPlugin(); rw::registerMatFXPlugin(); rw::registerMaterialRightsPlugin(); rw::registerAtomicRightsPlugin(); rw::registerHAnimPlugin(); gta::registerNodeNamePlugin(); gta::registerBreakableModelPlugin(); gta::registerExtraVertColorPlugin(); rw::ps2::registerADCPlugin(); rw::registerSkinPlugin(); rw::registerNativeDataPlugin(); // rw::ps2::registerNativeDataPlugin(); rw::registerMeshPlugin(); // rw::StreamFile in; // in.open("host:player-vc-ps2.dff", "rb"); FILE *cf = fopen("host:player-vc-ps2.dff", "rb"); // FILE *cf = fopen("host:od_newscafe_dy-ps2.dff", "rb"); // FILE *cf = fopen("host:admiral-ps2.dff", "rb"); assert(cf != NULL); fseek(cf, 0, SEEK_END); rw::uint32 len = ftell(cf); fseek(cf, 0, SEEK_SET); rw::uint8 *data = new rw::uint8[len]; fread(data, len, 1, cf); fclose(cf); rw::StreamMemory in; in.open(data, len); printf("opened file\n"); rw::findChunk(&in, rw::ID_CLUMP, NULL, NULL); printf("found chunk\n"); clump = rw::Clump::streamRead(&in); printf("read file\n"); in.close(); printf("closed file\n"); delete[] data; data = new rw::uint8[256*1024]; rw::StreamMemory out; out.open(data, 0, 256*1024); clump->streamWrite(&out); // cf = fopen("host:out-ps2.dff", "wb"); // assert(cf != NULL); // fwrite(data, out.getLength(), 1, cf); // fclose(cf); out.close(); delete[] data; // rw::StreamFile out; // out.open("host:out-ps2.dff", "wb"); // c->streamWrite(&out); // out.close(); // // printf("wrote file\n"); vuOffset[0] = 2048.0f; vuOffset[1] = 2048.0f; for(int i = 0; i < clump->numAtomics; i++){ rw::Atomic *a = clump->atomicList[i]; char *name = PLUGINOFFSET(char, a->frame, gta::nodeNameOffset); printf("%s\n", name); } // gsDumpState(); // matPerspective(mathProjectionMat, 60.0f, (float)gss.width/gss.height, // matPerspective(mathProjectionMat, 60.0f, (float)gss.width/gss.dh, // matPerspective(mathProjectionMat, 60.0f, 4.0/3.0, 1.0f, 100.0f); // matPerspective(mathProjectionMat, 60.0f, 16.0/9.0, 1.0f, 100.0f); matPerspective2(projMat, 60.0f, 4.0/3.0, gss.width,gss.height, 1.0f, 100.0f, 16777216, 1); for(;;){ draw(); gsFlip(); } return 0; }