mirror of
https://github.com/XProger/OpenLara.git
synced 2025-03-14 16:19:41 +01:00
#368 GBA don't call clipPoly for portals
This commit is contained in:
parent
8fe5d86a64
commit
dc86146886
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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}
|
||||
|
@ -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]
|
||||
|
@ -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]
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user