Skip to content

Commit

Permalink
#407 32X SH-2 asm for getSector and transformRoom, int16 matrix 3x4, …
Browse files Browse the repository at this point in the history
…const clipPoly rect
  • Loading branch information
XProger committed Mar 20, 2022
1 parent 497fa98 commit 53a1bb4
Show file tree
Hide file tree
Showing 16 changed files with 363 additions and 317 deletions.
18 changes: 9 additions & 9 deletions src/fixed/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1234,9 +1234,9 @@ void matrixLerp_c(const Matrix &n, int32 pmul, int32 pdiv)
void matrixTranslateRel_c(int32 x, int32 y, int32 z)
{
MATRIX_TRANS(x, y, z);
m.e03 += tx;
m.e13 += ty;
m.e23 += tz;
m.e03 += tx >> MATRIX_FIXED_SHIFT;
m.e13 += ty >> MATRIX_FIXED_SHIFT;
m.e23 += tz >> MATRIX_FIXED_SHIFT;
}

void matrixTranslateAbs_c(int32 x, int32 y, int32 z)
Expand All @@ -1245,17 +1245,17 @@ void matrixTranslateAbs_c(int32 x, int32 y, int32 z)
y -= gCameraViewPos.y;
z -= gCameraViewPos.z;
MATRIX_TRANS(x, y, z);
m.e03 = tx;
m.e13 = ty;
m.e23 = tz;
m.e03 = tx >> MATRIX_FIXED_SHIFT;
m.e13 = ty >> MATRIX_FIXED_SHIFT;
m.e23 = tz >> MATRIX_FIXED_SHIFT;
}

void matrixTranslateSet_c(int32 x, int32 y, int32 z)
{
MATRIX_TRANS(x, y, z);
m.e03 = tx;
m.e13 = ty;
m.e23 = tz;
m.e03 = tx >> MATRIX_FIXED_SHIFT;
m.e13 = ty >> MATRIX_FIXED_SHIFT;
m.e23 = tz >> MATRIX_FIXED_SHIFT;
}

void matrixRotateX_c(int32 angle)
Expand Down
28 changes: 22 additions & 6 deletions src/fixed/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
#define USE_DIV_TABLE // 4k of DRAM
#define CPU_BIG_ENDIAN
#define USE_ASM
#define F16_SHIFT 2

#define MODEHW
#define FRAME_WIDTH 320
Expand Down Expand Up @@ -93,6 +94,8 @@
#define ROM_READ
#define TEX_2PX
#define ALIGNED_LIGHTMAP
#define USE_MATRIX_INT16
#define F16_SHIFT 2

#define MODE13
#define FRAME_WIDTH 320
Expand Down Expand Up @@ -403,6 +406,16 @@ extern int32 fps;

#define FIXED_SHIFT 14

#ifndef F16_SHIFT
#define F16_SHIFT 0
#endif

#ifdef USE_MATRIX_INT16
#define MATRIX_FIXED_SHIFT FIXED_SHIFT
#else
#define MATRIX_FIXED_SHIFT 0
#endif

#define SND_MAX_DIST (8 * 1024)

#ifndef SND_CHANNELS
Expand Down Expand Up @@ -525,7 +538,7 @@ extern int32 fps;
y = _y;\
}

#define DP43(ax,ay,az,aw,bx,by,bz) (ax * bx + ay * by + az * bz + aw)
#define DP43(ax,ay,az,aw,bx,by,bz) (ax * bx + ay * by + az * bz + (aw << MATRIX_FIXED_SHIFT))
#define DP33(ax,ay,az,bx,by,bz) (ax * bx + ay * by + az * bz)

#ifdef USE_DIV_TABLE
Expand Down Expand Up @@ -642,10 +655,11 @@ struct Matrix
int32 e01, e11, e21;
int32 e02, e12, e22;
int32 e03, e13, e23;
#elif defined(__32X__)
int32 e03; int16 e00, e01, e02, _pad0;
int32 e13; int16 e10, e11, e12, _pad1;
int32 e23; int16 e20, e21, e22, _pad2;
#elif defined(USE_MATRIX_INT16)
int16 e00, e01, e02;
int16 e10, e11, e12;
int16 e20, e21, e22;
int16 e03, e13, e23;
#else
int32 e00, e01, e02, e03;
int32 e10, e11, e12, e13;
Expand Down Expand Up @@ -810,8 +824,10 @@ struct Room;

struct RoomVertex
{
#ifdef __3DO__
#if defined(__3DO__)
uint16 xyz565;
#elif defined(__32X__)
uint8 g, z, y, x;
#else
uint8 x, y, z, g;
#endif
Expand Down
24 changes: 22 additions & 2 deletions src/fixed/draw.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
#include "common.h"
#include "item.h"

//#define TEST_ROOM_CACHE

#ifdef TEST_ROOM_CACHE
RoomVertex roomVert[512];
RoomQuad roomQuads[512];
RoomTriangle roomTri[64];
#endif

void drawInit()
{
for (int32 i = 0; i < MAX_RAND_TABLE; i++)
Expand All @@ -16,6 +24,18 @@ void drawInit()
int16 rot = i * (ANGLE_90 * 4) / MAX_CAUSTICS;
gCaustics[i] = sin(rot) * 768 >> FIXED_SHIFT;
}

#ifdef TEST_ROOM_CACHE
Room &room = rooms[14];

memcpy(roomVert, room.data.vertices, sizeof(RoomVertex) * room.info->verticesCount);
memcpy(roomQuads, room.data.quads, sizeof(RoomQuad) * room.info->quadsCount);
memcpy(roomTri, room.data.triangles, sizeof(RoomTriangle) * room.info->trianglesCount);

room.data.vertices = roomVert;
room.data.quads = roomQuads;
room.data.triangles = roomTri;
#endif
}

void drawFree()
Expand Down Expand Up @@ -62,7 +82,7 @@ void calcLightingDynamic(const Room* room, const vec3i &point)

Matrix &m = matrixGet();

int32 fogZ = m.e23 >> FIXED_SHIFT;
int32 fogZ = m.e23 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT);
if (fogZ > FOG_MIN) {
gLightAmbient += (fogZ - FOG_MIN) << FOG_SHIFT;
gLightAmbient = X_MIN(gLightAmbient, 8191);
Expand All @@ -75,7 +95,7 @@ void calcLightingStatic(int32 intensity)

Matrix &m = matrixGet();

int32 fogZ = m.e23 >> FIXED_SHIFT;
int32 fogZ = m.e23 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT);
if (fogZ > FOG_MIN) {
gLightAmbient += (fogZ - FOG_MIN) << FOG_SHIFT;
gLightAmbient = X_MIN(gLightAmbient, 8191);
Expand Down
16 changes: 9 additions & 7 deletions src/fixed/item.h
Original file line number Diff line number Diff line change
Expand Up @@ -850,7 +850,9 @@ vec3i ItemObj::getJoint(int32 jointIndex, const vec3i &offset) const
matrixTranslateRel(offset.x, offset.y, offset.z);

Matrix &m = matrixGet();
vec3i result = _vec3i(m.e03 >> FIXED_SHIFT, m.e13 >> FIXED_SHIFT, m.e23 >> FIXED_SHIFT);
vec3i result = _vec3i(m.e03 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT),
m.e13 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT),
m.e23 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));

gMatrixPtr = oldMatrixPtr;

Expand Down Expand Up @@ -893,9 +895,9 @@ int32 ItemObj::getSpheres(Sphere* spheres, bool flag) const
const Mesh* mesh = *meshPtr;
matrixTranslateRel(mesh->center.x, mesh->center.y, mesh->center.z);
Matrix &m = matrixGet();
sphere->center.x = x + (m.e03 >> FIXED_SHIFT);
sphere->center.y = y + (m.e13 >> FIXED_SHIFT);
sphere->center.z = z + (m.e23 >> FIXED_SHIFT);
sphere->center.x = x + (m.e03 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));
sphere->center.y = y + (m.e13 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));
sphere->center.z = z + (m.e23 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));
sphere->radius = mesh->radius;
sphere++;
meshPtr++;
Expand All @@ -916,9 +918,9 @@ int32 ItemObj::getSpheres(Sphere* spheres, bool flag) const
const Mesh* mesh = *meshPtr;
matrixTranslateRel(mesh->center.x, mesh->center.y, mesh->center.z);
Matrix &m = matrixGet();
sphere->center.x = x + (m.e03 >> FIXED_SHIFT);
sphere->center.y = y + (m.e13 >> FIXED_SHIFT);
sphere->center.z = z + (m.e23 >> FIXED_SHIFT);
sphere->center.x = x + (m.e03 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));
sphere->center.y = y + (m.e13 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));
sphere->center.z = z + (m.e23 >> (FIXED_SHIFT - MATRIX_FIXED_SHIFT));
sphere->radius = mesh->radius;
sphere++;
meshPtr++;
Expand Down
2 changes: 2 additions & 0 deletions src/fixed/room.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ void Sector::getTriggerFloorCeiling(int32 x, int32 y, int32 z, int32* floor, int
} while (!FD_END(cmd));
}

#ifndef __32X__
#ifndef USE_ASM
const Sector* Room::getSector(int32 x, int32 z) const
{
Expand All @@ -198,6 +199,7 @@ const Sector* Room::getSector(int32 x, int32 z) const
return sectors + sx * info->zSectors + sz;
}
#endif
#endif

const Sector* Room::getWaterSector(int32 x, int32 z) const
{
Expand Down
59 changes: 39 additions & 20 deletions src/platform/32x/asm/common.i
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,40 @@
#define SEG_TRANS .data
#define SEG_FACE .data
#define SEG_RASTER .data
#define SEG_PHYSICS .data

// row[0]
#define M03 0 // int32
#define M00 4 // int16
#define M01 6 // int16
#define M02 8 // int16
#define M0P 10 // int16 (padding)
// row[1]
#define M13 12 // int32
#define M10 16 // int16
#define M11 18 // int16
#define M12 20 // int16
#define M1P 22 // int16 (padding)
// row[2]
#define M23 24 // int32
#define M20 28 // int16
#define M21 30 // int16
#define M22 32 // int16
#define M2P 34 // int16 (padding)

#define FIXED_SHIFT 14
// Matrix:
// int16 e00, e01, e02 // rotation
// int16 e10, e11, e12 // rotation
// int16 e20, e21, e22 // rotation
// int16 e03, e13, e23 // translation
//
// word [ N Z Z ] // rot
// [ Z N Z ] // rot
// [ Z Z N ] // rot
// [ Z Z Z ] // trans
// long [ NZ ZZ NZ ZZ NZ ZZ ]

// row[0] rotation
#define M00 0
#define M01 2
#define M02 4
// row[1] rotation
#define M10 6
#define M11 8
#define M12 10
// row[2] rotation
#define M20 12
#define M21 14
#define M22 16
// row[3] translation
#define M03 18
#define M13 20
#define M23 22

#define MATRIX_SIZEOF 24

#define FIXED_SHIFT 14

#define FACE_TYPE_F 1

Expand Down Expand Up @@ -54,3 +67,9 @@
#define VP_MINY 4
#define VP_MAXX 8
#define VP_MAXY 12

.macro shlr14 reg
shll2 \reg
shlr16 \reg
//exts.w reg, reg // skip this because of mov.w
.endm
63 changes: 63 additions & 0 deletions src/platform/32x/asm/getSector.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include "common.i"
SEG_PHYSICS

#define sectors r0
#define info r1
#define roomX r2
#define roomZ r3
#define this r4 // arg
#define x r5 // arg
#define z r6 // arg
#define mask r7
#define sectorsX roomX
#define sectorsZ roomZ
#define offset sectorsZ

.text
.align 4
.global __ZNK4Room9getSectorEii
__ZNK4Room9getSectorEii:
mov.l @(4, this), info
mov.w @info+, roomX
mov.w @info+, roomZ

add #16, info // offset to [sectorsX, sectorsZ]

.getX: // x = MIN(MAX(x - (roomX << 8), 0) >> 10, sectorsX - 1)
shll8 roomX
sub roomX, x
mov.b @info+, sectorsX
cmp/pz x
subc mask, mask
and mask, x
shlr8 x
shlr2 x
cmp/ge sectorsX, x
bf/s .getZ
add #-1, sectorsX
mov sectorsX, x

.getZ: // z = MIN(MAX(z - (roomZ << 8), 0) >> 10, sectorsZ - 1)
shll8 roomZ
sub roomZ, z
mov.b @info+, sectorsZ
cmp/pz z
subc mask, mask
and mask, z
shlr8 z
shlr2 z
cmp/ge sectorsZ, z
bf/s .getPtr
mov.l @(8, this), sectors
mov sectorsZ, z
add #-1, z

.getPtr:
// offset = sectors + ((x * sectorsZ + z) << 3)
mulu.w sectorsZ, x
sts MACL, x
add x, z
shll2 z
shll z
rts
add z, sectors
Loading

0 comments on commit 53a1bb4

Please sign in to comment.