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:
73
src/platform/3do/ccbMap3.s
Normal file
73
src/platform/3do/ccbMap3.s
Normal 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
|
85
src/platform/3do/ccbMap4.s
Normal file
85
src/platform/3do/ccbMap4.s
Normal 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
|
@@ -185,14 +185,22 @@ enum ClipFlags {
|
||||
#define unpackRoom unpackRoom_asm
|
||||
#define unpackMesh unpackMesh_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" void unpackMesh_asm(const MeshVertex* vertices, int32 vCount);
|
||||
extern "C" void projectVertices_asm(int32 vCount);
|
||||
extern "C" {
|
||||
void unpackRoom_asm(const RoomVertex* vertices, 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
|
||||
#define unpackRoom unpackRoom_c
|
||||
#define unpackMesh unpackMesh_c
|
||||
#define projectVertices projectVertices_c
|
||||
#define ccbMap4 ccbMap4_c
|
||||
#define ccbMap3 ccbMap3_c
|
||||
|
||||
void unpackRoom_c(const RoomVertex* vertices, int32 vCount)
|
||||
{
|
||||
@@ -296,6 +304,79 @@ void projectVertices_c(int32 vCount)
|
||||
v++;
|
||||
} 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
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
uint32 i01 = ((uint32*)indices)[0];
|
||||
|
@@ -133,9 +133,6 @@ void sndInit()
|
||||
ConnectInstruments(ch->sampler, "Output", sndMixer, InputName);
|
||||
}
|
||||
|
||||
if (ch->sampler < 0)
|
||||
printf("FUCK!\n");
|
||||
|
||||
ch->frequency = GrabKnob(ch->sampler, "Frequency");
|
||||
ch->amplitude = GrabKnob(ch->sampler, "Amplitude");
|
||||
ch->setVolume(0x7FFF);
|
||||
|
Reference in New Issue
Block a user