1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-03-13 23:59:41 +01: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_FAR, ((1 << 4) << 8)
.equ CLIP_NEAR, ((1 << 5) << 8)
.equ CLIP_MASK_VP, (CLIP_LEFT + CLIP_RIGHT + CLIP_TOP + CLIP_BOTTOM)
.equ CLIP_MASK, (CLIP_MASK_VP + CLIP_FAR + CLIP_NEAR)
.equ CLIP_FRAME, ((1 << 6) << 8)
.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, ((1 << FACE_TEXTURE_BITS) - 1)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -142,7 +142,7 @@ transformRoomUW_asm:
asr x, #(16 - PROJ_SHIFT)
asr y, #(16 - PROJ_SHIFT)
// viewport clipping
// portal rect clipping
ldmia sp, {minXY, maxXY}
cmp x, minXY, asr #16
@ -161,6 +161,11 @@ transformRoomUW_asm:
add x, #(FRAME_WIDTH >> 1)
add y, #(FRAME_HEIGHT >> 1)
// frame rect clipping
cmp x, #FRAME_WIDTH
cmpls y, #FRAME_HEIGHT
orrhi vg, #CLIP_FRAME
// store the result
strh x, [res, #-6]
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
enum ClipFlags {
CLIP_LEFT = 1 << 0,
CLIP_RIGHT = 1 << 1,
CLIP_TOP = 1 << 2,
CLIP_BOTTOM = 1 << 3,
CLIP_FAR = 1 << 4,
CLIP_NEAR = 1 << 5,
CLIP_MASK_VP = (CLIP_LEFT | CLIP_RIGHT | CLIP_TOP | CLIP_BOTTOM),
CLIP_LEFT = 1 << 0,
CLIP_RIGHT = 1 << 1,
CLIP_TOP = 1 << 2,
CLIP_BOTTOM = 1 << 3,
CLIP_FAR = 1 << 4,
CLIP_NEAR = 1 << 5,
CLIP_FRAME = 1 << 6,
CLIP_DISCARD = (CLIP_LEFT | CLIP_RIGHT | CLIP_TOP | CLIP_BOTTOM | CLIP_FAR | CLIP_NEAR),
};
const MeshQuad gShadowQuads[] = {
@ -207,6 +208,10 @@ void transformRoom_c(const RoomVertex* vertices, int32 count)
x += (FRAME_WIDTH >> 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.x1) clip |= CLIP_RIGHT;
if (y < viewport.y0) clip |= CLIP_TOP;
@ -270,6 +275,10 @@ void transformRoomUW_c(const RoomVertex* vertices, int32 count)
x += (FRAME_WIDTH >> 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.x1) clip |= CLIP_RIGHT;
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);
y += (FRAME_HEIGHT >> 1);
if (x < viewport.x0) clip |= CLIP_LEFT;
if (x > viewport.x1) clip |= CLIP_RIGHT;
if (y < viewport.y0) clip |= CLIP_TOP;
if (y > viewport.y1) clip |= CLIP_BOTTOM;
if ((x < 0 || x > FRAME_WIDTH) || (y < 0 || y > FRAME_HEIGHT)) {
clip |= CLIP_FRAME;
}
res->x = x;
res->y = y;
@ -352,10 +360,10 @@ void faceAddRoomQuads_c(const RoomQuad* polys, int32 count)
uint32 c2 = v2->clip;
uint32 c3 = v3->clip;
if (c0 & c1 & c2 & c3)
if (c0 & c1 & c2 & c3 & CLIP_DISCARD)
continue;
if ((c0 | c1 | c2 | c3) & CLIP_MASK_VP) {
if ((c0 | c1 | c2 | c3) & CLIP_FRAME) {
flags |= FACE_CLIPPED;
}
@ -397,10 +405,10 @@ void faceAddRoomTriangles_c(const RoomTriangle* polys, int32 count)
uint32 c1 = v1->clip;
uint32 c2 = v2->clip;
if (c0 & c1 & c2)
if (c0 & c1 & c2 & CLIP_DISCARD)
continue;
if ((c0 | c1 | c2) & CLIP_MASK_VP) {
if ((c0 | c1 | c2) & CLIP_FRAME) {
flags |= FACE_CLIPPED;
}
@ -446,10 +454,10 @@ void faceAddMeshQuads_c(const MeshQuad* polys, int32 count)
uint32 c2 = v2->clip;
uint32 c3 = v3->clip;
if (c0 & c1 & c2 & c3)
if (c0 & c1 & c2 & c3 & CLIP_DISCARD)
continue;
if ((c0 | c1 | c2 | c3) & CLIP_MASK_VP) {
if ((c0 | c1 | c2 | c3) & CLIP_FRAME) {
flags |= FACE_CLIPPED;
}
@ -482,10 +490,10 @@ void faceAddMeshTriangles_c(const MeshTriangle* polys, int32 count)
uint32 c1 = v1->clip;
uint32 c2 = v2->clip;
if (c0 & c1 & c2)
if (c0 & c1 & c2 & CLIP_DISCARD)
continue;
if ((c0 | c1 | c2) & CLIP_MASK_VP) {
if ((c0 | c1 | c2) & CLIP_FRAME) {
flags |= FACE_CLIPPED;
}
flags |= FACE_TRIANGLE;
@ -504,7 +512,7 @@ bool transformBoxRect(const AABBs* box, RectMinMax* rect)
{
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;
vec3i v[8];
@ -776,13 +784,13 @@ VertexLink* clipPoly(VertexLink* poly, VertexLink* tmp, int32 &pCount)
VertexLink *out = tmp;
// clip x
CLIP_XY(x, y, viewport.x0, viewport.x1, in, out);
CLIP_XY(x, y, 0, FRAME_WIDTH, in, out);
pCount = count;
count = 0;
// clip y
CLIP_XY(y, x, viewport.y0, viewport.y1, out, in);
CLIP_XY(y, x, 0, FRAME_HEIGHT, out, in);
pCount = count;
return in;
@ -807,7 +815,7 @@ extern "C" X_NOINLINE void drawTriangle(uint32 flags, VertexLink* v)
v1->prev = v0 - v1;
v2->prev = v1 - v2;
VertexLink* top;
VertexLink* top;
if (v0->v.y < v1->v.y) {
if (v0->v.y < v2->v.y) {