mirror of https://github.com/aap/librw.git
Implemented transforming of normals on PS2.
This commit is contained in:
parent
5247d1c26e
commit
652c82424a
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(;;){
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
#include <math.h>
|
||||
#include "math.h"
|
||||
|
||||
Matrix mathModelViewMat;
|
||||
Matrix mathNormalMat;
|
||||
Matrix mathProjectionMat;
|
||||
//Matrix mathModelViewMat;
|
||||
//Matrix mathNormalMat;
|
||||
//Matrix mathProjectionMat;
|
||||
|
||||
void
|
||||
matDump(Matrix m)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue