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:
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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}
|
||||||
|
@@ -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]
|
||||||
|
@@ -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]
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user