1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-11 15:45:05 +02:00

#370 remove depth range check for faceAdd* routines, fix box visibility test for near objects

This commit is contained in:
XProger
2021-12-22 14:42:13 +03:00
parent 702cacb5aa
commit 8a51916cd7
13 changed files with 171 additions and 147 deletions

View File

@@ -435,7 +435,7 @@ extern int32 fps;
#define FOG_SHIFT 1 #define FOG_SHIFT 1
#define FOG_MAX VIEW_DIST #define FOG_MAX VIEW_DIST
#define FOG_MIN (FOG_MAX - (8192 >> FOG_SHIFT)) #define FOG_MIN (FOG_MAX - (8192 >> FOG_SHIFT))
#define VIEW_MIN_F (256 << FIXED_SHIFT) #define VIEW_MIN_F (64 << FIXED_SHIFT)
#define VIEW_MAX_F (VIEW_DIST << FIXED_SHIFT) #define VIEW_MAX_F (VIEW_DIST << FIXED_SHIFT)
#define FRUSTUM_FAR_X (5 << 10) #define FRUSTUM_FAR_X (5 << 10)
@@ -2249,6 +2249,7 @@ void drawFree();
void drawModel(const ItemObj* item); void drawModel(const ItemObj* item);
void drawItem(const ItemObj* item); void drawItem(const ItemObj* item);
void drawRooms(Camera* camera); void drawRooms(Camera* camera);
void drawBox(const AABBi &box);
void checkTrigger(const FloorData* fd, ItemObj* lara); void checkTrigger(const FloorData* fd, ItemObj* lara);
void readLevel(const uint8 *data); void readLevel(const uint8 *data);

View File

@@ -935,4 +935,42 @@ void drawRooms(Camera* camera)
setViewport(camera->view.room->clip); setViewport(camera->view.room->clip);
} }
#define MESH_FACE(flags, i0, i1, i2, i3) { flags, (i0 | (i1 << 8) | (i2 << 16) | (i3 << 24)) }
const MeshQuad gBoxFaces[6] = {
MESH_FACE(15, 0, 4, 5, 1),
MESH_FACE(15, 1, 5, 6, 2),
MESH_FACE(15, 2, 6, 7, 3),
MESH_FACE(15, 3, 7, 4, 0),
MESH_FACE(15, 0, 1, 2, 3),
MESH_FACE(15, 7, 6, 5, 4)
};
MeshVertex boxVertices[8];
void drawBox(const AABBi &box)
{
lightAmbient = 4096;
int32 minX = box.minX << 2;
int32 minY = box.minY << 2;
int32 minZ = box.minZ << 2;
int32 maxX = box.maxX << 2;
int32 maxY = box.maxY << 2;
int32 maxZ = box.maxZ << 2;
boxVertices[0].x = minX; boxVertices[0].y = minY; boxVertices[0].z = minZ;
boxVertices[1].x = maxX; boxVertices[1].y = minY; boxVertices[1].z = minZ;
boxVertices[2].x = maxX; boxVertices[2].y = minY; boxVertices[2].z = maxZ;
boxVertices[3].x = minX; boxVertices[3].y = minY; boxVertices[3].z = maxZ;
boxVertices[4].x = minX; boxVertices[4].y = maxY; boxVertices[4].z = minZ;
boxVertices[5].x = maxX; boxVertices[5].y = maxY; boxVertices[5].z = minZ;
boxVertices[6].x = maxX; boxVertices[6].y = maxY; boxVertices[6].z = maxZ;
boxVertices[7].x = minX; boxVertices[7].y = maxY; boxVertices[7].z = maxZ;
transformMesh(boxVertices, 8, NULL, NULL);
faceAddMesh(NULL, gBoxFaces, NULL, NULL, 0, 6, 0, 0);
}
#endif #endif

View File

@@ -92,8 +92,8 @@ boxIsVisible_asm
ldr m, =matrixPtr ldr m, =matrixPtr
ldr m, [m] ldr m, [m]
ldr bz, [m, #(11 * 4)] ldr bz, [m, #(11 * 4)]
sub bz, bz, #VIEW_MIN_F add bz, bz, #VIEW_OFF_F
cmp bz, #(VIEW_MAX_F - VIEW_MIN_F) cmp bz, #(VIEW_OFF_F + VIEW_MAX_F)
movhi r0, #0 movhi r0, #0
movhi pc, lr movhi pc, lr

View File

@@ -52,8 +52,9 @@ VIEW_DIST EQU (1024 * 10) ; max = DIV_TABLE_END << PROJ_SHIFT
FOG_SHIFT EQU 1 FOG_SHIFT EQU 1
FOG_MAX EQU VIEW_DIST FOG_MAX EQU VIEW_DIST
FOG_MIN EQU (FOG_MAX - (8192 >> FOG_SHIFT)) FOG_MIN EQU (FOG_MAX - (8192 >> FOG_SHIFT))
VIEW_MIN_F EQU (256 << FIXED_SHIFT) VIEW_MIN_F EQU (64 << FIXED_SHIFT)
VIEW_MAX_F EQU (VIEW_DIST << FIXED_SHIFT) VIEW_MAX_F EQU (VIEW_DIST << FIXED_SHIFT)
VIEW_OFF_F EQU (1024 << FIXED_SHIFT)
OT_SHIFT EQU 4 OT_SHIFT EQU 4
OT_SIZE EQU ((VIEW_MAX_F >> (FIXED_SHIFT + OT_SHIFT)) + 1) OT_SIZE EQU ((VIEW_MAX_F >> (FIXED_SHIFT + OT_SHIFT)) + 1)
@@ -65,3 +66,67 @@ MIN_INT32 EQU 0x80000000
MAX_INT32 EQU 0x7FFFFFFF MAX_INT32 EQU 0x7FFFFFFF
MulManyVec3Mat33_F16 EQU (0x50000 + 2) MulManyVec3Mat33_F16 EQU (0x50000 + 2)
; max depth = max(z0, z1, z2, z3) >> (CLIP_SHIFT + OT_SHIFT)
MACRO
MAX_Z4 $depth, $z0, $z1, $z2, $z3
mov $depth, $z0, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z3, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z3, asr #(CLIP_SHIFT + OT_SHIFT)
MEND
; max depth = max(z0, z1, z2) >> (CLIP_SHIFT + OT_SHIFT)
MACRO
MAX_Z3 $depth, $z0, $z1, $z2, $z3
mov $depth, $z0, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
MEND
; average depth = (z0 + z1 + z2 + z2) / 4 >> (CLIP_SHIFT + OT_SHIFT)
MACRO
AVG_Z4 $depth, $z0, $z1, $z2, $z3
add $depth, $z0, $z1
add $depth, $depth, $z2
add $depth, $depth, $z3
mov $depth, $depth, asr #(2 + CLIP_SHIFT + OT_SHIFT)
MEND
; average depth = (z0 + z1 + z2 + z2) / 4 >> (CLIP_SHIFT + OT_SHIFT)
MACRO
AVG_Z3 $depth, $z0, $z1, $z2
add $depth, $z0, $z1
add $depth, $depth, $z2, lsl #1
mov $depth, $depth, asr #(2 + CLIP_SHIFT + OT_SHIFT)
MEND
; back facing check
MACRO
CCW $cross, $dx0, $dy0, $dx1, $dy1, $skip
mul $cross, $dy0, $dx1
rsb $cross, cross, #0
mlas $cross, $dx0, $dy1, $cross
ble skip
MEND
; back/front facing check depending on sign
MACRO
CCW_SIGN $cross, $sign, $dx0, $dy0, $dx1, $dy1, $skip
mul $cross, $dy0, $dx1
rsb $cross, cross, #0
mla $cross, $dx0, $dy1, $cross
teq $cross, $sign
bmi skip
MEND

View File

@@ -119,12 +119,11 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices} ldmia fPolys!, {flags, indices}
; get vertex pointers ; get vertex pointers
and vp0, indices, #0xFF mov mask, #0xFF
mov vp1, indices, lsr #8 and vp0, mask, indices
and vp1, vp1, #0xFF and vp1, mask, indices, lsr #8
mov vp2, indices, lsr #16 and vp2, mask, indices, lsr #16
and vp2, vp2, #0xFF and vp3, mask, indices, lsr #24
mov vp3, indices, lsr #24
add vp0, vp0, vp0, lsl #1 add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1 add vp1, vp1, vp1, lsl #1
@@ -149,10 +148,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK tst mask, #CLIP_MASK
bne skip bne skip
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_Q_AVG) AVG_Z4 depth, vz0, vz1, vz2, vz3
add depth, vz0, vz1
add depth, depth, vz2
add depth, depth, vz3
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0) ; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
ldmia vp0, {vx0, vy0} ldmia vp0, {vx0, vy0}
@@ -162,25 +158,16 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0 sub hdy0, vy1, vy0
sub vdx0, vx3, vx0 sub vdx0, vx3, vx0
sub vdy0, vy3, vy0 sub vdy0, vy3, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0 CCW_SIGN cross, flags, hdx0, hdy0, vdx0, vdy0, skip
mla cross, hdx0, vdy0, cross
teq cross, flags
bmi skip
; poly is visible, store fPolys on the stack to reuse the reg ; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS] str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
add tmp, sp, #SP_OT add tmp, sp, #SP_OT
ldmia tmp, {ot, faceBase, tex} ldmia tmp, {ot, faceBase, tex}
; faceAdd ; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase] ldr face, [faceBase]

View File

@@ -116,12 +116,11 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices} ldmia fPolys!, {flags, indices}
; get vertex pointers ; get vertex pointers
and vp0, indices, #0xFF mov mask, #0xFF
mov vp1, indices, lsr #8 and vp0, mask, indices
and vp1, vp1, #0xFF and vp1, mask, indices, lsr #8
mov vp2, indices, lsr #16 and vp2, mask, indices, lsr #16
and vp2, vp2, #0xFF and vp3, mask, indices, lsr #24
mov vp3, indices, lsr #24
add vp0, vp0, vp0, lsl #1 add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1 add vp1, vp1, vp1, lsl #1
@@ -146,10 +145,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK tst mask, #CLIP_MASK
bne skip bne skip
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_Q_AVG) AVG_Z4 depth, vz0, vz1, vz2, vz3
add depth, vz0, vz1
add depth, depth, vz2
add depth, depth, vz3
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0) ; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
ldmia vp0, {vx0, vy0} ldmia vp0, {vx0, vy0}
@@ -159,18 +155,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0 sub hdy0, vy1, vy0
sub vdx0, vx3, vx0 sub vdx0, vx3, vx0
sub vdy0, vy3, vy0 sub vdy0, vy3, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0 CCW cross, hdx0, hdy0, vdx0, vdy0, skip
mlas cross, hdx0, vdy0, cross
ble skip
; poly is visible, store fPolys on the stack to reuse the reg ; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS] str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; get color index from flags ; get color index from flags
and colorIndex, flags, #0xFF and colorIndex, flags, #0xFF
@@ -181,8 +171,6 @@ skip cmp fPolys, fLast
add dataPtr, plutOffset, colorIndex, lsl #1 add dataPtr, plutOffset, colorIndex, lsl #1
; faceAdd ; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase] ldr face, [faceBase]

View File

@@ -115,10 +115,10 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices} ldmia fPolys!, {flags, indices}
; get vertex pointers ; get vertex pointers
and vp0, indices, #0xFF mov mask, #0xFF
mov vp1, indices, lsr #8 and vp0, mask, indices
and vp1, vp1, #0xFF and vp1, mask, indices, lsr #8
mov vp2, indices, lsr #16 and vp2, mask, indices, lsr #16
add vp0, vp0, vp0, lsl #1 add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1 add vp1, vp1, vp1, lsl #1
@@ -139,9 +139,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK tst mask, #CLIP_MASK
bne skip bne skip
; depth = (vz0 + vz1 + vz2 + vz2) (DEPTH_T_AVG) AVG_Z3 depth, vz0, vz1, vz2
add depth, vz0, vz1
add depth, depth, vz2, lsl #1
; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0 ; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0
ldmia vp0, {vx0, vy0} ldmia vp0, {vx0, vy0}
@@ -151,24 +149,16 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0 sub hdy0, vy1, vy0
sub vdx0, vx2, vx0 sub vdx0, vx2, vx0
sub vdy0, vy2, vy0 sub vdy0, vy2, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0 CCW cross, hdx0, hdy0, vdx0, vdy0, skip
mlas cross, hdx0, vdy0, cross
ble skip
; poly is visible, store fPolys on the stack to reuse the reg ; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS] str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
add tmp, sp, #SP_OT add tmp, sp, #SP_OT
ldmia tmp, {ot, plutOffset, faceBase, tex} ldmia tmp, {ot, plutOffset, faceBase, tex}
; faceAdd ; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase] ldr face, [faceBase]

View File

@@ -112,10 +112,10 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices} ldmia fPolys!, {flags, indices}
; get vertex pointers ; get vertex pointers
and vp0, indices, #0xFF mov mask, #0xFF
mov vp1, indices, lsr #8 and vp0, mask, indices
and vp1, vp1, #0xFF and vp1, mask, indices, lsr #8
mov vp2, indices, lsr #16 and vp2, mask, indices, lsr #16
add vp0, vp0, vp0, lsl #1 add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1 add vp1, vp1, vp1, lsl #1
@@ -136,9 +136,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK tst mask, #CLIP_MASK
bne skip bne skip
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_T_AVG) AVG_Z3 depth, vz0, vz1, vz2
add depth, vz0, vz1
add depth, depth, vz2, lsl #1
; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0 ; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0
ldmia vp0, {vx0, vy0} ldmia vp0, {vx0, vy0}
@@ -148,18 +146,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0 sub hdy0, vy1, vy0
sub vdx0, vx2, vx0 sub vdx0, vx2, vx0
sub vdy0, vy2, vy0 sub vdy0, vy2, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0 CCW cross, hdx0, hdy0, vdx0, vdy0, skip
mlas cross, hdx0, vdy0, cross
ble skip
; poly is visible, store fPolys on the stack to reuse the reg ; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS] str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; get color index from flags ; get color index from flags
and colorIndex, flags, #0xFF and colorIndex, flags, #0xFF
@@ -170,8 +162,6 @@ skip cmp fPolys, fLast
add dataPtr, plutOffset, colorIndex, lsl #1 add dataPtr, plutOffset, colorIndex, lsl #1
; faceAdd ; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase] ldr face, [faceBase]

View File

@@ -122,7 +122,7 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, i0, i1} ldmia fPolys!, {flags, i0, i1}
; get vertex pointers ; get vertex pointers (indices are pre-multiplied by 12)
add vp0, fVertices, i0, lsr #16 add vp0, fVertices, i0, lsr #16
mov i0, i0, lsl #16 mov i0, i0, lsl #16
add vp1, fVertices, i0, lsr #16 add vp1, fVertices, i0, lsr #16
@@ -144,14 +144,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK tst mask, #CLIP_MASK
bne skip bne skip
; depth = max(vz0, vz1, vz2, vz3) (DEPTH_Q_MAX) MAX_Z4 depth, vz0, vz1, vz2, vz3
mov depth, vz0
cmp depth, vz1
movlt depth, vz1
cmp depth, vz2
movlt depth, vz2
cmp depth, vz3
movlt depth, vz3
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0) ; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
ldmia vp0, {vx0, vy0} ldmia vp0, {vx0, vy0}
@@ -161,18 +154,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0 sub hdy0, vy1, vy0
sub vdx0, vx3, vx0 sub vdx0, vx3, vx0
sub vdy0, vy3, vy0 sub vdy0, vy3, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0 CCW cross, hdx0, hdy0, vdx0, vdy0, skip
mlas cross, hdx0, vdy0, cross
ble skip
; poly is visible, store fPolys on the stack to reuse the reg ; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS] str fPolys, [sp, #SP_POLYS]
; depth = max(0, depth >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; fog = max(0, (depth - (FOG_MIN >> OT_SHIFT)) >> 1) ; fog = max(0, (depth - (FOG_MIN >> OT_SHIFT)) >> 1)
sub fog, depth, #(FOG_MIN >> OT_SHIFT) sub fog, depth, #(FOG_MIN >> OT_SHIFT)
movs fog, fog, asr #1 movs fog, fog, asr #1
@@ -199,8 +186,6 @@ skip cmp fPolys, fLast
add tex, tex, texIndex, lsr #(32 - FACE_MIP_SHIFT - 3) ; sizeof(Texture) = 2^3 add tex, tex, texIndex, lsr #(32 - FACE_MIP_SHIFT - 3) ; sizeof(Texture) = 2^3
; faceAdd ; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element add ot, ot, depth, lsl #3 ; mul by size of OT element
mov depth, faceBase ; use depth reg due face vs faceBase reg collision mov depth, faceBase ; use depth reg due face vs faceBase reg collision

View File

@@ -118,7 +118,7 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, i0, i1} ldmia fPolys!, {flags, i0, i1}
; get vertex pointers ; get vertex pointers (indices are pre-multiplied by 12)
add vp0, fVertices, i0, lsr #16 add vp0, fVertices, i0, lsr #16
mov i0, i0, lsl #16 mov i0, i0, lsl #16
add vp1, fVertices, i0, lsr #16 add vp1, fVertices, i0, lsr #16
@@ -136,12 +136,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK tst mask, #CLIP_MASK
bne skip bne skip
; depth = max(vz0, vz1, vz2) (DEPTH_T_MAX) MAX_Z3 depth, vz0, vz1, vz2
mov depth, vz0
cmp depth, vz1
movlt depth, vz1
cmp depth, vz2
movlt depth, vz2
; (vx1 - vx0) * (vy2 - vy0) <= (vy1 - vy0) * (vx2 - vx0) ; (vx1 - vx0) * (vy2 - vy0) <= (vy1 - vy0) * (vx2 - vx0)
ldmia vp0, {vx0, vy0} ldmia vp0, {vx0, vy0}
@@ -151,18 +146,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0 sub hdy0, vy1, vy0
sub vdx0, vx2, vx0 sub vdx0, vx2, vx0
sub vdy0, vy2, vy0 sub vdy0, vy2, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0 CCW cross, hdx0, hdy0, vdx0, vdy0, skip
mlas cross, hdx0, vdy0, cross
ble skip
; poly is visible, store fPolys on the stack to reuse the reg ; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS] str fPolys, [sp, #SP_POLYS]
; depth = max(0, depth >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; fog = max(0, (depth - (FOG_MIN >> OT_SHIFT)) >> 1) ; fog = max(0, (depth - (FOG_MIN >> OT_SHIFT)) >> 1)
sub fog, depth, #(FOG_MIN >> OT_SHIFT) sub fog, depth, #(FOG_MIN >> OT_SHIFT)
movs fog, fog, asr #1 movs fog, fog, asr #1
@@ -189,8 +178,6 @@ skip cmp fPolys, fLast
add tex, tex, texIndex, lsr #(32 - FACE_MIP_SHIFT - 3) ; sizeof(Texture) = 2^3 add tex, tex, texIndex, lsr #(32 - FACE_MIP_SHIFT - 3) ; sizeof(Texture) = 2^3
; faceAdd ; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element add ot, ot, depth, lsl #3 ; mul by size of OT element
mov depth, faceBase ; use depth reg due face vs faceBase reg collision mov depth, faceBase ; use depth reg due face vs faceBase reg collision

View File

@@ -10,13 +10,10 @@
x RN r0 x RN r0
y RN r1 y RN r1
z RN r2 z RN r2
m RN r3 m RN r3
e0 RN r4 e0 RN r4
e1 RN r5 e1 RN r5
e2 RN r6 e2 RN r6
dx RN r7 dx RN r7
dy RN r12 dy RN r12
dz RN lr dz RN lr
@@ -26,28 +23,27 @@ matrixTranslateRel_asm
ldr m, =matrixPtr ldr m, =matrixPtr
ldr m, [m] ldr m, [m]
add m, m, #(12 * 4)
ldmia m!, {e0, e1, e2} ldmdb m!, {dx, dy, dz}
mul dx, e0, x
mul dy, e1, x
mul dz, e2, x
ldmia m!, {e0, e1, e2} ldmdb m!, {e0, e1, e2}
mla dx, e0, y, dx
mla dy, e1, y, dy
mla dz, e2, y, dz
ldmia m!, {e0, e1, e2}
mla dx, e0, z, dx mla dx, e0, z, dx
mla dy, e1, z, dy mla dy, e1, z, dy
mla dz, e2, z, dz mla dz, e2, z, dz
ldmia m, {e0, e1, e2} ldmdb m!, {e0, e1, e2}
add e0, e0, dx mla dx, e0, y, dx
add e1, e1, dy mla dy, e1, y, dy
add e2, e2, dz mla dz, e2, y, dz
stmia m!, {e0, e1, e2} ldmdb m!, {e0, e1, e2}
mla dx, e0, x, dx
mla dy, e1, x, dy
mla dz, e2, x, dz
add m, m, #(9 * 4)
stmia m!, {dx, dy, dz}
ldmfd sp!, {r4-r7, pc} ldmfd sp!, {r4-r7, pc}

View File

@@ -61,9 +61,9 @@ loop ldmia vertex, {x, y, z} ; read transformed vertex
; check z clipping ; check z clipping
cmp z, minZ cmp z, minZ
orrlt z, minZ, #CLIP_NEAR orrle z, minZ, #CLIP_NEAR
cmp z, maxZ cmp z, maxZ
orrgt z, maxZ, #CLIP_FAR orrge z, maxZ, #CLIP_FAR
; projection ; projection
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive

View File

@@ -177,9 +177,6 @@ enum ClipFlags {
X_INLINE Face* faceAdd(int32 depth) X_INLINE Face* faceAdd(int32 depth)
{ {
if (depth < 0) depth = 0;
if (depth > OT_SIZE - 1) depth = OT_SIZE - 1;
Face* face = gFacesBase++; Face* face = gFacesBase++;
if (gOT[depth].head) { if (gOT[depth].head) {
@@ -343,10 +340,10 @@ void projectVertices_c(int32 vCount)
int32 clip = 0; int32 clip = 0;
if (z < (VIEW_MIN_F >> FIXED_SHIFT)) { if (z <= (VIEW_MIN_F >> FIXED_SHIFT)) {
z = (VIEW_MIN_F >> FIXED_SHIFT); z = (VIEW_MIN_F >> FIXED_SHIFT);
clip = CLIP_NEAR; clip = CLIP_NEAR;
} else if (z > (VIEW_MAX_F >> FIXED_SHIFT)) { } else if (z >= (VIEW_MAX_F >> FIXED_SHIFT)) {
z = (VIEW_MAX_F >> FIXED_SHIFT); z = (VIEW_MAX_F >> FIXED_SHIFT);
clip = CLIP_FAR; clip = CLIP_FAR;
} }
@@ -608,11 +605,11 @@ void faceAddMeshTriangles_c(const MeshTriangle* polys, int32 count, uint32 shade
if ((c0 & c1 & c2) & CLIP_MASK) if ((c0 & c1 & c2) & CLIP_MASK)
continue; continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
if (cross(v0, v1, v2) <= 0) if (cross(v0, v1, v2) <= 0)
continue; continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
Face* f = faceAdd(depth); Face* f = faceAdd(depth);
f->ccb_PIXC = shade; f->ccb_PIXC = shade;
@@ -648,11 +645,11 @@ void faceAddMeshQuadsFlat_c(const MeshQuad* polys, int32 count, uint32 shade)
if ((c0 & c1 & c2 & c3) & CLIP_MASK) if ((c0 & c1 & c2 & c3) & CLIP_MASK)
continue; continue;
int32 depth = DEPTH_Q_AVG(v0->z, v1->z, v2->z, v3->z);
if (cross(v0, v1, v3) <= 0) if (cross(v0, v1, v3) <= 0)
continue; continue;
int32 depth = DEPTH_Q_AVG(v0->z, v1->z, v2->z, v3->z);
Face* f = faceAdd(depth); Face* f = faceAdd(depth);
f->ccb_PIXC = shade; f->ccb_PIXC = shade;
@@ -684,11 +681,11 @@ void faceAddMeshTrianglesFlat_c(const MeshTriangle* polys, int32 count, uint32 s
if ((c0 & c1 & c2) & CLIP_MASK) if ((c0 & c1 & c2) & CLIP_MASK)
continue; continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
if (cross(v0, v1, v2) <= 0) if (cross(v0, v1, v2) <= 0)
continue; continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
Face* f = faceAdd(depth); Face* f = faceAdd(depth);
f->ccb_PIXC = shade; f->ccb_PIXC = shade;