1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-07 21:56:37 +02:00

#368 GBA don't call clipPoly for portals

This commit is contained in:
XProger
2022-04-03 14:11:07 +03:00
parent 8fe5d86a64
commit dc86146886
9 changed files with 61 additions and 64 deletions

View File

@@ -40,8 +40,9 @@
.equ CLIP_BOTTOM, ((1 << 3) << 8) .equ CLIP_BOTTOM, ((1 << 3) << 8)
.equ CLIP_FAR, ((1 << 4) << 8) .equ CLIP_FAR, ((1 << 4) << 8)
.equ CLIP_NEAR, ((1 << 5) << 8) .equ CLIP_NEAR, ((1 << 5) << 8)
.equ CLIP_MASK_VP, (CLIP_LEFT + CLIP_RIGHT + CLIP_TOP + CLIP_BOTTOM) .equ CLIP_FRAME, ((1 << 6) << 8)
.equ CLIP_MASK, (CLIP_MASK_VP + CLIP_FAR + CLIP_NEAR) .equ CLIP_DISCARD, (CLIP_LEFT + CLIP_RIGHT + CLIP_TOP + CLIP_BOTTOM + CLIP_FAR + CLIP_NEAR)
.equ CLIP_MASK, 0xFF00
.equ FACE_TEXTURE_BITS, 14 .equ FACE_TEXTURE_BITS, 14
.equ FACE_TEXTURE, ((1 << FACE_TEXTURE_BITS) - 1) .equ FACE_TEXTURE, ((1 << FACE_TEXTURE_BITS) - 1)

View File

@@ -74,14 +74,15 @@ faceAddMeshQuads_asm:
// check clipping // check clipping
and tmp, vg0, vg1 and tmp, vg0, vg1
and tmp, vg2 and tmp, vg2
ands tmp, vg3 and tmp, vg3
tst tmp, #(CLIP_DISCARD >> 8)
bne .skip bne .skip
// mark if should be clipped by viewport // mark if should be clipped by viewport
orr tmp, vg0, vg1 orr tmp, vg0, vg1
orr tmp, vg2 orr tmp, vg2
orr tmp, vg3 orr tmp, vg3
tst tmp, #(CLIP_MASK_VP >> 8) tst tmp, #(CLIP_FRAME >> 8)
ldrh flags, [polys, #-8] ldrh flags, [polys, #-8]
orrne flags, #FACE_CLIPPED orrne flags, #FACE_CLIPPED

View File

@@ -64,13 +64,14 @@ faceAddMeshTriangles_asm:
// check clipping // check clipping
and tmp, vg0, vg1 and tmp, vg0, vg1
ands tmp, vg2 and tmp, vg2
tst tmp, #(CLIP_DISCARD >> 8)
bne .skip bne .skip
// mark if should be clipped by viewport // mark if should be clipped by viewport
orr tmp, vg0, vg1 orr tmp, vg0, vg1
orr tmp, vg2 orr tmp, vg2
tst tmp, #(CLIP_MASK_VP >> 8) tst tmp, #(CLIP_FRAME >> 8)
ldrh flags, [polys, #-8] ldrh flags, [polys, #-8]
orrne flags, #FACE_CLIPPED orrne flags, #FACE_CLIPPED

View File

@@ -73,14 +73,14 @@ faceAddRoomQuads_asm:
and tmp, vg0, vg1 and tmp, vg0, vg1
and tmp, vg2 and tmp, vg2
and tmp, vg3 and tmp, vg3
tst tmp, #CLIP_MASK tst tmp, #CLIP_DISCARD
bne .skip bne .skip
// mark if should be clipped by viewport // mark if should be clipped by viewport
orr tmp, vg0, vg1 orr tmp, vg0, vg1
orr tmp, vg2 orr tmp, vg2
orr tmp, vg3 orr tmp, vg3
tst tmp, #CLIP_MASK_VP tst tmp, #CLIP_FRAME
ldrh flags, [polys, #-12] ldrh flags, [polys, #-12]
orrne flags, #FACE_CLIPPED orrne flags, #FACE_CLIPPED

View File

@@ -63,13 +63,13 @@ faceAddRoomTriangles_asm:
// check clipping // check clipping
and tmp, vg0, vg1 and tmp, vg0, vg1
and tmp, vg2 and tmp, vg2
tst tmp, #CLIP_MASK tst tmp, #CLIP_DISCARD
bne .skip bne .skip
// mark if should be clipped by viewport // mark if should be clipped by viewport
orr tmp, vg0, vg1 orr tmp, vg0, vg1
orr tmp, vg2 orr tmp, vg2
tst tmp, #CLIP_MASK_VP tst tmp, #CLIP_FRAME
ldrh flags, [polys, #-10] ldrh flags, [polys, #-10]
orrne flags, #FACE_CLIPPED orrne flags, #FACE_CLIPPED

View File

@@ -17,16 +17,9 @@ z .req r12
res .req lr res .req lr
ambient .req vx ambient .req vx
vp .req vx
minXY .req vx
maxXY .req vy
tmp .req vy tmp .req vy
dz .req vx dz .req vx
SP_MINXY = 0
SP_MAXXY = 4
SP_SIZE = 8
.global transformMesh_asm .global transformMesh_asm
transformMesh_asm: transformMesh_asm:
stmfd sp!, {r4-r11, lr} stmfd sp!, {r4-r11, lr}
@@ -43,11 +36,6 @@ transformMesh_asm:
movge vg, #31 movge vg, #31
bic vg, vg, asr #31 bic vg, vg, asr #31
ldr vp, =viewportRel
ldmia vp, {minXY, maxXY}
stmfd sp!, {minXY, maxXY}
ldr m, =gMatrixPtr ldr m, =gMatrixPtr
ldr m, [m] ldr m, [m]
@@ -99,25 +87,14 @@ transformMesh_asm:
asr x, #(16 - PROJ_SHIFT) asr x, #(16 - PROJ_SHIFT)
asr y, #(16 - PROJ_SHIFT) asr y, #(16 - PROJ_SHIFT)
// viewport clipping
ldmia sp, {minXY, maxXY}
cmp x, minXY, asr #16
orrle vg, #CLIP_LEFT
cmp x, maxXY, asr #16
orrge vg, #CLIP_RIGHT
lsl minXY, #16
lsl maxXY, #16
cmp y, minXY, asr #16
orrle vg, #CLIP_TOP
cmp y, maxXY, asr #16
orrge vg, #CLIP_BOTTOM
add x, #(FRAME_WIDTH >> 1) add x, #(FRAME_WIDTH >> 1)
add y, #(FRAME_HEIGHT >> 1) add y, #(FRAME_HEIGHT >> 1)
// frame rect clipping
cmp x, #FRAME_WIDTH
cmpls y, #FRAME_HEIGHT
orrhi vg, #CLIP_FRAME
// store the result // store the result
strh x, [res], #2 strh x, [res], #2
strh y, [res], #2 strh y, [res], #2
@@ -127,5 +104,4 @@ transformMesh_asm:
subs count, #1 subs count, #1
bne .loop bne .loop
add sp, #SP_SIZE
ldmfd sp!, {r4-r11, pc} ldmfd sp!, {r4-r11, pc}

View File

@@ -116,7 +116,7 @@ transformRoom_asm:
asr x, #(16 - PROJ_SHIFT) asr x, #(16 - PROJ_SHIFT)
asr y, #(16 - PROJ_SHIFT) asr y, #(16 - PROJ_SHIFT)
// viewport clipping // portal rect clipping
ldmia sp, {minXY, maxXY} ldmia sp, {minXY, maxXY}
cmp x, minXY, asr #16 cmp x, minXY, asr #16
@@ -135,6 +135,11 @@ transformRoom_asm:
add x, #(FRAME_WIDTH >> 1) add x, #(FRAME_WIDTH >> 1)
add y, #(FRAME_HEIGHT >> 1) add y, #(FRAME_HEIGHT >> 1)
// frame rect clipping
cmp x, #FRAME_WIDTH
cmpls y, #FRAME_HEIGHT
orrhi vg, #CLIP_FRAME
// store the result // store the result
strh x, [res, #-6] strh x, [res, #-6]
strh y, [res, #-4] strh y, [res, #-4]

View File

@@ -142,7 +142,7 @@ transformRoomUW_asm:
asr x, #(16 - PROJ_SHIFT) asr x, #(16 - PROJ_SHIFT)
asr y, #(16 - PROJ_SHIFT) asr y, #(16 - PROJ_SHIFT)
// viewport clipping // portal rect clipping
ldmia sp, {minXY, maxXY} ldmia sp, {minXY, maxXY}
cmp x, minXY, asr #16 cmp x, minXY, asr #16
@@ -161,6 +161,11 @@ transformRoomUW_asm:
add x, #(FRAME_WIDTH >> 1) add x, #(FRAME_WIDTH >> 1)
add y, #(FRAME_HEIGHT >> 1) add y, #(FRAME_HEIGHT >> 1)
// frame rect clipping
cmp x, #FRAME_WIDTH
cmpls y, #FRAME_HEIGHT
orrhi vg, #CLIP_FRAME
// store the result // store the result
strh x, [res, #-6] strh x, [res, #-6]
strh y, [res, #-4] strh y, [res, #-4]

View File

@@ -71,13 +71,14 @@ EWRAM_DATA Face gFaces[MAX_FACES]; // EWRAM 30k
Face* gOT[OT_SIZE]; // IWRAM 2.5k Face* gOT[OT_SIZE]; // IWRAM 2.5k
enum ClipFlags { enum ClipFlags {
CLIP_LEFT = 1 << 0, CLIP_LEFT = 1 << 0,
CLIP_RIGHT = 1 << 1, CLIP_RIGHT = 1 << 1,
CLIP_TOP = 1 << 2, CLIP_TOP = 1 << 2,
CLIP_BOTTOM = 1 << 3, CLIP_BOTTOM = 1 << 3,
CLIP_FAR = 1 << 4, CLIP_FAR = 1 << 4,
CLIP_NEAR = 1 << 5, CLIP_NEAR = 1 << 5,
CLIP_MASK_VP = (CLIP_LEFT | CLIP_RIGHT | CLIP_TOP | CLIP_BOTTOM), CLIP_FRAME = 1 << 6,
CLIP_DISCARD = (CLIP_LEFT | CLIP_RIGHT | CLIP_TOP | CLIP_BOTTOM | CLIP_FAR | CLIP_NEAR),
}; };
const MeshQuad gShadowQuads[] = { const MeshQuad gShadowQuads[] = {
@@ -207,6 +208,10 @@ void transformRoom_c(const RoomVertex* vertices, int32 count)
x += (FRAME_WIDTH >> 1); x += (FRAME_WIDTH >> 1);
y += (FRAME_HEIGHT >> 1); y += (FRAME_HEIGHT >> 1);
if ((x < 0 || x > FRAME_WIDTH) || (y < 0 || y > FRAME_HEIGHT)) {
clip |= CLIP_FRAME;
}
if (x < viewport.x0) clip |= CLIP_LEFT; if (x < viewport.x0) clip |= CLIP_LEFT;
if (x > viewport.x1) clip |= CLIP_RIGHT; if (x > viewport.x1) clip |= CLIP_RIGHT;
if (y < viewport.y0) clip |= CLIP_TOP; if (y < viewport.y0) clip |= CLIP_TOP;
@@ -270,6 +275,10 @@ void transformRoomUW_c(const RoomVertex* vertices, int32 count)
x += (FRAME_WIDTH >> 1); x += (FRAME_WIDTH >> 1);
y += (FRAME_HEIGHT >> 1); y += (FRAME_HEIGHT >> 1);
if ((x < 0 || x > FRAME_WIDTH) || (y < 0 || y > FRAME_HEIGHT)) {
clip |= CLIP_FRAME;
}
if (x < viewport.x0) clip |= CLIP_LEFT; if (x < viewport.x0) clip |= CLIP_LEFT;
if (x > viewport.x1) clip |= CLIP_RIGHT; if (x > viewport.x1) clip |= CLIP_RIGHT;
if (y < viewport.y0) clip |= CLIP_TOP; if (y < viewport.y0) clip |= CLIP_TOP;
@@ -322,10 +331,9 @@ void transformMesh_c(const MeshVertex* vertices, int32 count, int32 intensity)
x += (FRAME_WIDTH >> 1); x += (FRAME_WIDTH >> 1);
y += (FRAME_HEIGHT >> 1); y += (FRAME_HEIGHT >> 1);
if (x < viewport.x0) clip |= CLIP_LEFT; if ((x < 0 || x > FRAME_WIDTH) || (y < 0 || y > FRAME_HEIGHT)) {
if (x > viewport.x1) clip |= CLIP_RIGHT; clip |= CLIP_FRAME;
if (y < viewport.y0) clip |= CLIP_TOP; }
if (y > viewport.y1) clip |= CLIP_BOTTOM;
res->x = x; res->x = x;
res->y = y; res->y = y;
@@ -352,10 +360,10 @@ void faceAddRoomQuads_c(const RoomQuad* polys, int32 count)
uint32 c2 = v2->clip; uint32 c2 = v2->clip;
uint32 c3 = v3->clip; uint32 c3 = v3->clip;
if (c0 & c1 & c2 & c3) if (c0 & c1 & c2 & c3 & CLIP_DISCARD)
continue; continue;
if ((c0 | c1 | c2 | c3) & CLIP_MASK_VP) { if ((c0 | c1 | c2 | c3) & CLIP_FRAME) {
flags |= FACE_CLIPPED; flags |= FACE_CLIPPED;
} }
@@ -397,10 +405,10 @@ void faceAddRoomTriangles_c(const RoomTriangle* polys, int32 count)
uint32 c1 = v1->clip; uint32 c1 = v1->clip;
uint32 c2 = v2->clip; uint32 c2 = v2->clip;
if (c0 & c1 & c2) if (c0 & c1 & c2 & CLIP_DISCARD)
continue; continue;
if ((c0 | c1 | c2) & CLIP_MASK_VP) { if ((c0 | c1 | c2) & CLIP_FRAME) {
flags |= FACE_CLIPPED; flags |= FACE_CLIPPED;
} }
@@ -446,10 +454,10 @@ void faceAddMeshQuads_c(const MeshQuad* polys, int32 count)
uint32 c2 = v2->clip; uint32 c2 = v2->clip;
uint32 c3 = v3->clip; uint32 c3 = v3->clip;
if (c0 & c1 & c2 & c3) if (c0 & c1 & c2 & c3 & CLIP_DISCARD)
continue; continue;
if ((c0 | c1 | c2 | c3) & CLIP_MASK_VP) { if ((c0 | c1 | c2 | c3) & CLIP_FRAME) {
flags |= FACE_CLIPPED; flags |= FACE_CLIPPED;
} }
@@ -482,10 +490,10 @@ void faceAddMeshTriangles_c(const MeshTriangle* polys, int32 count)
uint32 c1 = v1->clip; uint32 c1 = v1->clip;
uint32 c2 = v2->clip; uint32 c2 = v2->clip;
if (c0 & c1 & c2) if (c0 & c1 & c2 & CLIP_DISCARD)
continue; continue;
if ((c0 | c1 | c2) & CLIP_MASK_VP) { if ((c0 | c1 | c2) & CLIP_FRAME) {
flags |= FACE_CLIPPED; flags |= FACE_CLIPPED;
} }
flags |= FACE_TRIANGLE; flags |= FACE_TRIANGLE;
@@ -504,7 +512,7 @@ bool transformBoxRect(const AABBs* box, RectMinMax* rect)
{ {
const Matrix &m = matrixGet(); const Matrix &m = matrixGet();
if ((m.e23 < VIEW_MIN_F) || (m.e23 >= VIEW_MAX_F)) if ((m.e23 < (VIEW_MIN_F >> MATRIX_FIXED_SHIFT)) || (m.e23 >= (VIEW_MAX_F >> MATRIX_FIXED_SHIFT)))
return false; return false;
vec3i v[8]; vec3i v[8];
@@ -776,13 +784,13 @@ VertexLink* clipPoly(VertexLink* poly, VertexLink* tmp, int32 &pCount)
VertexLink *out = tmp; VertexLink *out = tmp;
// clip x // clip x
CLIP_XY(x, y, viewport.x0, viewport.x1, in, out); CLIP_XY(x, y, 0, FRAME_WIDTH, in, out);
pCount = count; pCount = count;
count = 0; count = 0;
// clip y // clip y
CLIP_XY(y, x, viewport.y0, viewport.y1, out, in); CLIP_XY(y, x, 0, FRAME_HEIGHT, out, in);
pCount = count; pCount = count;
return in; return in;
@@ -807,7 +815,7 @@ extern "C" X_NOINLINE void drawTriangle(uint32 flags, VertexLink* v)
v1->prev = v0 - v1; v1->prev = v0 - v1;
v2->prev = v1 - v2; v2->prev = v1 - v2;
VertexLink* top; VertexLink* top;
if (v0->v.y < v1->v.y) { if (v0->v.y < v1->v.y) {
if (v0->v.y < v2->v.y) { if (v0->v.y < v2->v.y) {