From 652c82424af7af5253c6281db665217d26a095f1 Mon Sep 17 00:00:00 2001 From: Angelo Papenhoff Date: Wed, 28 Jan 2015 21:15:49 +0100 Subject: [PATCH] Implemented transforming of normals on PS2. --- tests/ps2/Makefile | 2 +- tests/ps2/defaultpipe.dsm | 16 +++++++++----- tests/ps2/main.cpp | 46 ++++++++++++++++++++++----------------- tests/ps2/math.cpp | 6 ++--- tests/ps2/skinpipe.dsm | 14 +++++++----- tests/ps2/vu.dsm | 6 +++++ 6 files changed, 55 insertions(+), 35 deletions(-) diff --git a/tests/ps2/Makefile b/tests/ps2/Makefile index 8f1b54c..24870f3 100755 --- a/tests/ps2/Makefile +++ b/tests/ps2/Makefile @@ -14,7 +14,7 @@ ASFLAGS = -c -xassembler-with-cpp LDFLAGS = -mno-crt0 $(LIBPATH) OUT=test -C_SRC=main.cpp gs.cpp dma.cpp math.cpp mesh.cpp +C_SRC=main.cpp gs.cpp dma.cpp math.cpp #S_SRC=crt0.s low.s HEADER=dma.h ee_regs.h gif.h gs.h mips_regs.h ps2.h math.h mesh.h OBJ=$(C_SRC:.cpp=.o) $(S_SRC:.s=.o) vu.o defaultpipe.o skinpipe.o diff --git a/tests/ps2/defaultpipe.dsm b/tests/ps2/defaultpipe.dsm index e973efb..50d284d 100644 --- a/tests/ps2/defaultpipe.dsm +++ b/tests/ps2/defaultpipe.dsm @@ -10,7 +10,8 @@ .equ outSize, ((vertexTop-outBuf1-2)/2) .equ outBuf2, (outBuf1+outSize) -.equ lightDir, 0x3d0 +.equ lightMat, 0x3d0 +.equ lightDir, 0x3d4 .equ matrix, 0x3f0 .equ screenOffset, 0x3f9 .equ gifTag, 0x3fa @@ -40,6 +41,9 @@ Cnt: NOP SQ VF01, 0(VI12) NOP ISW.x VI05, 0(VI12) NOP IADDIU VI03, VI12, 1 ; output pointer + NOP LQ VF18, lightMat(VI00) + NOP LQ VF19, lightMat+1(VI00) + NOP LQ VF20, lightMat+2(VI00) Loop: NOP LQI VF01, (VI02++) ; vertex @@ -47,7 +51,7 @@ Loop: NOP LQI VF02, (VI02++) ; color NOP LQI VF03, (VI02++) ; normal - MULAw.xyzw ACC, VF31, VF00w NOP + MULAw.xyzw ACC, VF31, VF00w NOP ; transform vertex MADDAx.xyzw ACC, VF28, VF01x NOP MADDAy.xyzw ACC, VF29, VF01y NOP MADDz.xyzw VF01, VF30, VF01z NOP @@ -61,15 +65,15 @@ Loop: NOP NOP NOP NOP SUB.w VF01, VF01, VF01 NOP - NOP SQ VF03, -1(VI02) ; store scaled normal - NOP NOP - NOP NOP + MULAx.xyz ACC, VF18, VF03x NOP ; transform normal + MADDAy.xyz ACC, VF19, VF03y NOP + MADDz.xyz VF03, VF20, VF03z NOP ADD.xy VF01, VF01, VF25 NOP NOP NOP NOP NOP FTOI0 VF02, VF02 NOP FTOI4 VF01, VF01 NOP - NOP NOP + NOP SQ VF03, -1(VI02) ; store normal NOP IADDI VI01, VI01, -1 NOP SQI VF02, (VI03++) ; color NOP SQI VF01, (VI03++) ; vertex diff --git a/tests/ps2/main.cpp b/tests/ps2/main.cpp index 57353b9..d7a2e26 100755 --- a/tests/ps2/main.cpp +++ b/tests/ps2/main.cpp @@ -13,12 +13,14 @@ #include "gs.h" #include "math.h" -#include "mesh.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[]; @@ -38,22 +40,27 @@ drawAtomic(rw::Atomic *atomic) 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] = 1.0f; - vuMatcolor[1] = 1.0f; - vuMatcolor[2] = 1.0f; - vuMatcolor[3] = 0.5f; - rw::Skin *skin = - *PLUGINOFFSET(rw::Skin*, geo, rw::skinGlobals.offset); + 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; @@ -79,17 +86,16 @@ draw(void) gsClear(); - matMakeIdentity(mathModelViewMat); - matTranslate(mathModelViewMat, 0.0f, 0.0f, -34.0f); -// matTranslate(mathModelViewMat, 0.0f, 0.0f, -10.0f); -// matTranslate(mathModelViewMat, 0.0f, 0.0f, -8.0f); - matRotateX(mathModelViewMat, rot); - matRotateY(mathModelViewMat, rot); - matRotateZ(mathModelViewMat, rot); - matInverse(mathNormalMat, mathModelViewMat); + 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, mathProjectionMat); - matMult(vuMat, mathModelViewMat); + matCopy(vuMat, projMat); + matMult(vuMat, viewMat); for(int i = 0; i < clump->numAtomics; i++){ char *name = PLUGINOFFSET(char, clump->atomicList[i]->frame, @@ -138,8 +144,8 @@ main() // 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: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); @@ -194,7 +200,7 @@ main() // 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(mathProjectionMat, 60.0f, 4.0/3.0, gss.width,gss.height, + matPerspective2(projMat, 60.0f, 4.0/3.0, gss.width,gss.height, 1.0f, 100.0f, 16777216, 1); for(;;){ diff --git a/tests/ps2/math.cpp b/tests/ps2/math.cpp index a4a4be6..0c586b1 100755 --- a/tests/ps2/math.cpp +++ b/tests/ps2/math.cpp @@ -3,9 +3,9 @@ #include #include "math.h" -Matrix mathModelViewMat; -Matrix mathNormalMat; -Matrix mathProjectionMat; +//Matrix mathModelViewMat; +//Matrix mathNormalMat; +//Matrix mathProjectionMat; void matDump(Matrix m) diff --git a/tests/ps2/skinpipe.dsm b/tests/ps2/skinpipe.dsm index 440997d..e18dcfc 100644 --- a/tests/ps2/skinpipe.dsm +++ b/tests/ps2/skinpipe.dsm @@ -10,7 +10,8 @@ .equ outSize, ((vertexTop-outBuf1-2)/2) .equ outBuf2, (outBuf1+outSize) -.equ lightDir, 0x3d0 +.equ lightMat, 0x3d0 +.equ lightDir, 0x3d4 .equ matrix, 0x3f0 .equ screenOffset, 0x3f9 .equ gifTag, 0x3fa @@ -40,6 +41,9 @@ Cnt: NOP SQ VF01, 0(VI12) NOP ISW.x VI05, 0(VI12) NOP IADDIU VI03, VI12, 1 ; output pointer + NOP LQ VF18, lightMat(VI00) + NOP LQ VF19, lightMat+1(VI00) + NOP LQ VF20, lightMat+2(VI00) Loop: NOP LQI VF01, (VI02++) ; vertex @@ -62,15 +66,15 @@ Loop: NOP NOP NOP NOP SUB.w VF01, VF01, VF01 NOP - NOP SQ VF03, -2(VI02) ; store scaled normal - NOP NOP - NOP NOP + MULAx.xyz ACC, VF18, VF03x NOP ; transform normal + MADDAy.xyz ACC, VF19, VF03y NOP + MADDz.xyz VF03, VF20, VF03z NOP ADD.xy VF01, VF01, VF25 NOP NOP NOP NOP NOP FTOI0 VF02, VF02 NOP FTOI4 VF01, VF01 NOP - NOP NOP + NOP SQ VF03, -2(VI02) ; store normal NOP IADDI VI01, VI01, -1 NOP SQI VF02, (VI03++) ; color NOP SQI VF01, (VI03++) ; vertex diff --git a/tests/ps2/vu.dsm b/tests/ps2/vu.dsm index 2cf83e5..0e22811 100644 --- a/tests/ps2/vu.dsm +++ b/tests/ps2/vu.dsm @@ -1,5 +1,6 @@ .data .global MyDmaPacket +.global vuLightMat .global vuMat .global vuOffset .global vuGIFtag @@ -20,6 +21,11 @@ DMAcall *, 0 ;vuProg DMAcnt * UNPACK 4, 4, V4_32, 0x3d0, * +vuLightMat: + .float 1.0, 0.0, 0.0, 0.0 + .float 0.0, 1.0, 0.0, 0.0 + .float 0.0, 0.0, 1.0, 0.0 + .float 0.0, 0.0, 0.0, 1.0 lightDir: .float 0.5, -0.5, -0.70710, 0.0 .EndUnpack