1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-13 16:44:50 +02:00

#370 3DO add CCB mapping implementation in ARM asm

This commit is contained in:
XProger
2021-11-30 22:14:11 +03:00
parent c4ae675027
commit 13b0efcb01
4 changed files with 242 additions and 82 deletions

View File

@@ -0,0 +1,73 @@
AREA |C$$code|, CODE, READONLY
|x$codeseg|
EXPORT ccbMap3_asm
ccbMap3_asm
face RN r0
vp0 RN r1
vp1 RN r2
vp2 RN r3
vx0 RN vp0
vy0 RN vp1
xpos RN vx0
ypos RN vy0
vx1 RN vp2
vy1 RN r4
hdx0 RN vx1
hdy0 RN vy1
vx2 RN r5
vy2 RN r6
vdx0 RN vx2
vdy0 RN vy2
ws RN r12
hs RN lr
shift RN hs
hddx RN ws
hddy RN hs
FRAME_WIDTH EQU 320
FRAME_HEIGHT EQU 240
stmfd sp!, {r4-r6, lr}
add face, face, #16 ; offset to ccb_XPos
ldr shift, [sp, #16] ; skip 4 regs stored on the stack
ldmia vp2, {vx2, vy2}
ldmia vp1, {vx1, vy1}
ldmia vp0, {vx0, vy0}
and ws, shift, #0xFF
mov hs, shift, lsr #8
sub hdx0, vx1, vx0
sub hdy0, vy1, vy0
mov hdx0, hdx0, lsl ws
mov hdy0, hdy0, lsl ws
sub vdx0, vx2, vx0
sub vdy0, vy2, vy0
mov vdx0, vdx0, lsl hs
mov vdy0, vdy0, lsl hs
rsb hs, hs, #16
mov hddx, hdx0, asr hs
mov hddy, hdy0, asr hs
rsb hddx, hddx, #0
rsb hddy, hddy, #0
mov xpos, vx0, lsl #16
mov ypos, vy0, lsl #16
add xpos, xpos, #(FRAME_WIDTH << 15)
add ypos, ypos, #(FRAME_HEIGHT << 15)
stmia face, {xpos, ypos, hdx0, hdy0, vdx0, vdy0, hddx, hddy}
ldmfd sp!, {r4-r6, pc}
END

View File

@@ -0,0 +1,85 @@
AREA |C$$code|, CODE, READONLY
|x$codeseg|
EXPORT ccbMap4_asm
ccbMap4_asm
face RN r0
vp0 RN r1
vp1 RN r2
vp2 RN r3
vp3 RN r4
vx0 RN vp0
vy0 RN vp1
xpos RN vx0
ypos RN vy0
vx1 RN vp2
vy1 RN vp3
hdx0 RN vx1
hdy0 RN vy1
vx3 RN r5
vy3 RN r6
vdx0 RN vx3
vdy0 RN vy3
vx2 RN r7
vy2 RN r8
hdx1 RN vx2
hdy1 RN vy2
hddx RN hdx1
hddy RN hdy1
ws RN r12
hs RN lr
shift RN hs
FRAME_WIDTH EQU 320
FRAME_HEIGHT EQU 240
stmfd sp!, {r4-r8, lr}
add face, face, #16 ; offset to ccb_XPos
add shift, sp, #24 ; skip 6 regs stored on the stack
ldmia shift, {vp3, shift}
ldmia vp3, {vx3, vy3}
ldmia vp2, {vx2, vy2}
ldmia vp1, {vx1, vy1}
ldmia vp0, {vx0, vy0}
and ws, shift, #0xFF
mov hs, shift, lsr #8
sub hdx1, vx2, vx3
sub hdy1, vy2, vy3
mov hdx1, hdx1, lsl ws
mov hdy1, hdy1, lsl ws
sub hdx0, vx1, vx0
sub hdy0, vy1, vy0
mov hdx0, hdx0, lsl ws
mov hdy0, hdy0, lsl ws
sub vdx0, vx3, vx0
sub vdy0, vy3, vy0
mov vdx0, vdx0, lsl hs
mov vdy0, vdy0, lsl hs
rsb hs, hs, #16
sub hddx, hdx1, hdx0
sub hddy, hdy1, hdy0
mov hddx, hddx, asr hs
mov hddy, hddy, asr hs
mov xpos, vx0, lsl #16
mov ypos, vy0, lsl #16
add xpos, xpos, #(FRAME_WIDTH << 15)
add ypos, ypos, #(FRAME_HEIGHT << 15)
stmia face, {xpos, ypos, hdx0, hdy0, vdx0, vdy0, hddx, hddy}
ldmfd sp!, {r4-r8, pc}
END

View File

@@ -185,14 +185,22 @@ enum ClipFlags {
#define unpackRoom unpackRoom_asm #define unpackRoom unpackRoom_asm
#define unpackMesh unpackMesh_asm #define unpackMesh unpackMesh_asm
#define projectVertices projectVertices_asm #define projectVertices projectVertices_asm
#define ccbMap4 ccbMap4_asm
#define ccbMap3 ccbMap3_asm
extern "C" void unpackRoom_asm(const RoomVertex* vertices, int32 vCount); extern "C" {
extern "C" void unpackMesh_asm(const MeshVertex* vertices, int32 vCount); void unpackRoom_asm(const RoomVertex* vertices, int32 vCount);
extern "C" void projectVertices_asm(int32 vCount); void unpackMesh_asm(const MeshVertex* vertices, int32 vCount);
void projectVertices_asm(int32 vCount);
void ccbMap4_asm(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift);
void ccbMap3_asm(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, uint32 shift);
}
#else #else
#define unpackRoom unpackRoom_c #define unpackRoom unpackRoom_c
#define unpackMesh unpackMesh_c #define unpackMesh unpackMesh_c
#define projectVertices projectVertices_c #define projectVertices projectVertices_c
#define ccbMap4 ccbMap4_c
#define ccbMap3 ccbMap3_c
void unpackRoom_c(const RoomVertex* vertices, int32 vCount) void unpackRoom_c(const RoomVertex* vertices, int32 vCount)
{ {
@@ -296,6 +304,79 @@ void projectVertices_c(int32 vCount)
v++; v++;
} while (v < last); } while (v < last);
} }
void ccbMap4_c(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift)
{
int32 x1 = v1->x;
int32 y1 = v1->y;
int32 x3 = v3->x;
int32 y3 = v3->y;
int32 x2 = v2->x;
int32 y2 = v2->y;
int32 x0 = v0->x;
int32 y0 = v0->y;
uint32 ws = shift & 0xFF;
uint32 hs = shift >> 8;
int32 hdx0 = (x1 - x0) << ws;
int32 hdy0 = (y1 - y0) << ws;
int32 hdx1 = (x2 - x3) << ws;
int32 hdy1 = (y2 - y3) << ws;
int32 vdx0 = (x3 - x0) << hs;
int32 vdy0 = (y3 - y0) << hs;
hs = 16 - hs;
int32 hddx = (hdx1 - hdx0) >> hs;
int32 hddy = (hdy1 - hdy0) >> hs;
f->ccb_XPos = (x0 << 16) + (FRAME_WIDTH << 15);
f->ccb_YPos = (y0 << 16) + (FRAME_HEIGHT << 15);
f->ccb_HDX = hdx0;
f->ccb_HDY = hdy0;
f->ccb_VDX = vdx0;
f->ccb_VDY = vdy0;
f->ccb_HDDX = hddx;
f->ccb_HDDY = hddy;
#ifdef DEBUG_CLIPPING
f->ccb_PIXC = SHADE_SHADOW;
#endif
}
void ccbMap3_c(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, uint32 shift)
{
int32 x0 = v0->x;
int32 y0 = v0->y;
int32 x1 = v1->x;
int32 y1 = v1->y;
int32 x2 = v2->x;
int32 y2 = v2->y;
uint32 ws = shift & 0xFF;
uint32 hs = shift >> 8;
int32 hdx0 = (x1 - x0) << ws;
int32 hdy0 = (y1 - y0) << ws;
int32 vdx0 = (x2 - x0) << hs;
int32 vdy0 = (y2 - y0) << hs;
f->ccb_XPos = (x0 << 16) + (FRAME_WIDTH << 15);
f->ccb_YPos = (y0 << 16) + (FRAME_HEIGHT << 15);
f->ccb_HDX = hdx0;
f->ccb_HDY = hdy0;
f->ccb_VDX = vdx0;
f->ccb_VDY = vdy0;
hs = 16 - hs;
f->ccb_HDDX = -hdx0 >> hs;
f->ccb_HDDY = -hdy0 >> hs;
#ifdef DEBUG_CLIPPING
f->ccb_PIXC = SHADE_SHADOW;
#endif
}
#endif #endif
bool transformBoxRect(const AABBs* box, RectMinMax* rect) bool transformBoxRect(const AABBs* box, RectMinMax* rect)
@@ -441,82 +522,6 @@ X_INLINE void ccbSetColor(uint32 flags, Face* face)
face->ccb_SourcePtr = (CelData*)&gPalette[flags & 0xFF]; face->ccb_SourcePtr = (CelData*)&gPalette[flags & 0xFF];
} }
extern "C" void ccbMap4_asm(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift);
//#define ccbMap4 ccbMap4_asm
#define ccbMap4 ccbMap4_c
X_INLINE void ccbMap4_c(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift)
{
int32 x1 = v1->x;
int32 y1 = v1->y;
int32 x3 = v3->x;
int32 y3 = v3->y;
int32 x2 = v2->x;
int32 y2 = v2->y;
int32 x0 = v0->x;
int32 y0 = v0->y;
uint32 ws = shift & 0xFF;
uint32 hs = shift >> 8;
int32 hdx0 = (x1 - x0) << ws;
int32 hdy0 = (y1 - y0) << ws;
int32 hdx1 = (x2 - x3) << ws;
int32 hdy1 = (y2 - y3) << ws;
int32 vdx0 = (x3 - x0) << hs;
int32 vdy0 = (y3 - y0) << hs;
hs = 16 - hs;
int32 hddx = (hdx1 - hdx0) >> hs;
int32 hddy = (hdy1 - hdy0) >> hs;
f->ccb_XPos = (x0 << 16) + (((FRAME_WIDTH >> 1) << 16) + 32768);
f->ccb_YPos = (y0 << 16) + (((FRAME_HEIGHT >> 1) << 16) + 32768);
f->ccb_HDX = hdx0;
f->ccb_HDY = hdy0;
f->ccb_VDX = vdx0;
f->ccb_VDY = vdy0;
f->ccb_HDDX = hddx;
f->ccb_HDDY = hddy;
#ifdef DEBUG_CLIPPING
f->ccb_PIXC = SHADE_SHADOW;
#endif
}
X_INLINE void ccbMap3(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, uint32 shift)
{
int32 x0 = v0->x;
int32 y0 = v0->y;
int32 x1 = v1->x;
int32 y1 = v1->y;
int32 x2 = v2->x;
int32 y2 = v2->y;
uint32 ws = shift & 0xFF;
uint32 hs = shift >> 8;
int32 hdx0 = (x1 - x0) << ws;
int32 hdy0 = (y1 - y0) << ws;
int32 vdx0 = (x2 - x0) << hs;
int32 vdy0 = (y2 - y0) << hs;
f->ccb_XPos = (x0 << 16) + (((FRAME_WIDTH >> 1) << 16) + 32768);
f->ccb_YPos = (y0 << 16) + (((FRAME_HEIGHT >> 1) << 16) + 32768);
f->ccb_HDX = hdx0;
f->ccb_HDY = hdy0;
f->ccb_VDX = vdx0;
f->ccb_VDY = vdy0;
hs = 16 - hs;
f->ccb_HDDX = -hdx0 >> hs;
f->ccb_HDDY = -hdy0 >> hs;
#ifdef DEBUG_CLIPPING
f->ccb_PIXC = SHADE_SHADOW;
#endif
}
X_INLINE void faceAddRoomQuad(uint32 flags, const Index* indices) X_INLINE void faceAddRoomQuad(uint32 flags, const Index* indices)
{ {
uint32 i01 = ((uint32*)indices)[0]; uint32 i01 = ((uint32*)indices)[0];

View File

@@ -133,9 +133,6 @@ void sndInit()
ConnectInstruments(ch->sampler, "Output", sndMixer, InputName); ConnectInstruments(ch->sampler, "Output", sndMixer, InputName);
} }
if (ch->sampler < 0)
printf("FUCK!\n");
ch->frequency = GrabKnob(ch->sampler, "Frequency"); ch->frequency = GrabKnob(ch->sampler, "Frequency");
ch->amplitude = GrabKnob(ch->sampler, "Amplitude"); ch->amplitude = GrabKnob(ch->sampler, "Amplitude");
ch->setVolume(0x7FFF); ch->setVolume(0x7FFF);