mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-11 07:34:33 +02:00
#370 remove depth range check for faceAdd* routines, fix box visibility test for near objects
This commit is contained in:
@@ -435,7 +435,7 @@ extern int32 fps;
|
||||
#define FOG_SHIFT 1
|
||||
#define FOG_MAX VIEW_DIST
|
||||
#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 FRUSTUM_FAR_X (5 << 10)
|
||||
@@ -2249,6 +2249,7 @@ void drawFree();
|
||||
void drawModel(const ItemObj* item);
|
||||
void drawItem(const ItemObj* item);
|
||||
void drawRooms(Camera* camera);
|
||||
void drawBox(const AABBi &box);
|
||||
|
||||
void checkTrigger(const FloorData* fd, ItemObj* lara);
|
||||
void readLevel(const uint8 *data);
|
||||
|
@@ -935,4 +935,42 @@ void drawRooms(Camera* camera)
|
||||
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
|
||||
|
@@ -92,8 +92,8 @@ boxIsVisible_asm
|
||||
ldr m, =matrixPtr
|
||||
ldr m, [m]
|
||||
ldr bz, [m, #(11 * 4)]
|
||||
sub bz, bz, #VIEW_MIN_F
|
||||
cmp bz, #(VIEW_MAX_F - VIEW_MIN_F)
|
||||
add bz, bz, #VIEW_OFF_F
|
||||
cmp bz, #(VIEW_OFF_F + VIEW_MAX_F)
|
||||
movhi r0, #0
|
||||
movhi pc, lr
|
||||
|
||||
|
@@ -52,8 +52,9 @@ VIEW_DIST EQU (1024 * 10) ; max = DIV_TABLE_END << PROJ_SHIFT
|
||||
FOG_SHIFT EQU 1
|
||||
FOG_MAX EQU VIEW_DIST
|
||||
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_OFF_F EQU (1024 << FIXED_SHIFT)
|
||||
OT_SHIFT EQU 4
|
||||
OT_SIZE EQU ((VIEW_MAX_F >> (FIXED_SHIFT + OT_SHIFT)) + 1)
|
||||
|
||||
@@ -64,4 +65,68 @@ VIEW_MAX EQU (VIEW_DIST << CLIP_SHIFT)
|
||||
MIN_INT32 EQU 0x80000000
|
||||
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
|
||||
|
@@ -119,12 +119,11 @@ skip cmp fPolys, fLast
|
||||
ldmia fPolys!, {flags, indices}
|
||||
|
||||
; get vertex pointers
|
||||
and vp0, indices, #0xFF
|
||||
mov vp1, indices, lsr #8
|
||||
and vp1, vp1, #0xFF
|
||||
mov vp2, indices, lsr #16
|
||||
and vp2, vp2, #0xFF
|
||||
mov vp3, indices, lsr #24
|
||||
mov mask, #0xFF
|
||||
and vp0, mask, indices
|
||||
and vp1, mask, indices, lsr #8
|
||||
and vp2, mask, indices, lsr #16
|
||||
and vp3, mask, indices, lsr #24
|
||||
|
||||
add vp0, vp0, vp0, lsl #1
|
||||
add vp1, vp1, vp1, lsl #1
|
||||
@@ -149,10 +148,7 @@ skip cmp fPolys, fLast
|
||||
tst mask, #CLIP_MASK
|
||||
bne skip
|
||||
|
||||
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_Q_AVG)
|
||||
add depth, vz0, vz1
|
||||
add depth, depth, vz2
|
||||
add depth, depth, vz3
|
||||
AVG_Z4 depth, vz0, vz1, vz2, vz3
|
||||
|
||||
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
|
||||
ldmia vp0, {vx0, vy0}
|
||||
@@ -162,25 +158,16 @@ skip cmp fPolys, fLast
|
||||
sub hdy0, vy1, vy0
|
||||
sub vdx0, vx3, vx0
|
||||
sub vdy0, vy3, vy0
|
||||
mul cross, hdy0, vdx0
|
||||
rsb cross, cross, #0
|
||||
mla cross, hdx0, vdy0, cross
|
||||
teq cross, flags
|
||||
bmi skip
|
||||
|
||||
CCW_SIGN cross, flags, hdx0, hdy0, vdx0, vdy0, skip
|
||||
|
||||
; poly is visible, store fPolys on the stack to reuse the reg
|
||||
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
|
||||
ldmia tmp, {ot, faceBase, tex}
|
||||
|
||||
; faceAdd
|
||||
cmp depth, #(OT_SIZE - 1)
|
||||
movgt depth, #(OT_SIZE - 1)
|
||||
add ot, ot, depth, lsl #3 ; mul by size of OT element
|
||||
|
||||
ldr face, [faceBase]
|
||||
|
@@ -116,12 +116,11 @@ skip cmp fPolys, fLast
|
||||
ldmia fPolys!, {flags, indices}
|
||||
|
||||
; get vertex pointers
|
||||
and vp0, indices, #0xFF
|
||||
mov vp1, indices, lsr #8
|
||||
and vp1, vp1, #0xFF
|
||||
mov vp2, indices, lsr #16
|
||||
and vp2, vp2, #0xFF
|
||||
mov vp3, indices, lsr #24
|
||||
mov mask, #0xFF
|
||||
and vp0, mask, indices
|
||||
and vp1, mask, indices, lsr #8
|
||||
and vp2, mask, indices, lsr #16
|
||||
and vp3, mask, indices, lsr #24
|
||||
|
||||
add vp0, vp0, vp0, lsl #1
|
||||
add vp1, vp1, vp1, lsl #1
|
||||
@@ -146,10 +145,7 @@ skip cmp fPolys, fLast
|
||||
tst mask, #CLIP_MASK
|
||||
bne skip
|
||||
|
||||
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_Q_AVG)
|
||||
add depth, vz0, vz1
|
||||
add depth, depth, vz2
|
||||
add depth, depth, vz3
|
||||
AVG_Z4 depth, vz0, vz1, vz2, vz3
|
||||
|
||||
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
|
||||
ldmia vp0, {vx0, vy0}
|
||||
@@ -159,18 +155,12 @@ skip cmp fPolys, fLast
|
||||
sub hdy0, vy1, vy0
|
||||
sub vdx0, vx3, vx0
|
||||
sub vdy0, vy3, vy0
|
||||
mul cross, hdy0, vdx0
|
||||
rsb cross, cross, #0
|
||||
mlas cross, hdx0, vdy0, cross
|
||||
ble skip
|
||||
|
||||
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
|
||||
|
||||
; poly is visible, store fPolys on the stack to reuse the reg
|
||||
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
|
||||
and colorIndex, flags, #0xFF
|
||||
|
||||
@@ -181,8 +171,6 @@ skip cmp fPolys, fLast
|
||||
add dataPtr, plutOffset, colorIndex, lsl #1
|
||||
|
||||
; faceAdd
|
||||
cmp depth, #(OT_SIZE - 1)
|
||||
movgt depth, #(OT_SIZE - 1)
|
||||
add ot, ot, depth, lsl #3 ; mul by size of OT element
|
||||
|
||||
ldr face, [faceBase]
|
||||
|
@@ -115,10 +115,10 @@ skip cmp fPolys, fLast
|
||||
ldmia fPolys!, {flags, indices}
|
||||
|
||||
; get vertex pointers
|
||||
and vp0, indices, #0xFF
|
||||
mov vp1, indices, lsr #8
|
||||
and vp1, vp1, #0xFF
|
||||
mov vp2, indices, lsr #16
|
||||
mov mask, #0xFF
|
||||
and vp0, mask, indices
|
||||
and vp1, mask, indices, lsr #8
|
||||
and vp2, mask, indices, lsr #16
|
||||
|
||||
add vp0, vp0, vp0, lsl #1
|
||||
add vp1, vp1, vp1, lsl #1
|
||||
@@ -139,9 +139,7 @@ skip cmp fPolys, fLast
|
||||
tst mask, #CLIP_MASK
|
||||
bne skip
|
||||
|
||||
; depth = (vz0 + vz1 + vz2 + vz2) (DEPTH_T_AVG)
|
||||
add depth, vz0, vz1
|
||||
add depth, depth, vz2, lsl #1
|
||||
AVG_Z3 depth, vz0, vz1, vz2
|
||||
|
||||
; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0
|
||||
ldmia vp0, {vx0, vy0}
|
||||
@@ -151,24 +149,16 @@ skip cmp fPolys, fLast
|
||||
sub hdy0, vy1, vy0
|
||||
sub vdx0, vx2, vx0
|
||||
sub vdy0, vy2, vy0
|
||||
mul cross, hdy0, vdx0
|
||||
rsb cross, cross, #0
|
||||
mlas cross, hdx0, vdy0, cross
|
||||
ble skip
|
||||
|
||||
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
|
||||
|
||||
; poly is visible, store fPolys on the stack to reuse the reg
|
||||
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
|
||||
ldmia tmp, {ot, plutOffset, faceBase, tex}
|
||||
|
||||
; faceAdd
|
||||
cmp depth, #(OT_SIZE - 1)
|
||||
movgt depth, #(OT_SIZE - 1)
|
||||
add ot, ot, depth, lsl #3 ; mul by size of OT element
|
||||
|
||||
ldr face, [faceBase]
|
||||
|
@@ -112,10 +112,10 @@ skip cmp fPolys, fLast
|
||||
ldmia fPolys!, {flags, indices}
|
||||
|
||||
; get vertex pointers
|
||||
and vp0, indices, #0xFF
|
||||
mov vp1, indices, lsr #8
|
||||
and vp1, vp1, #0xFF
|
||||
mov vp2, indices, lsr #16
|
||||
mov mask, #0xFF
|
||||
and vp0, mask, indices
|
||||
and vp1, mask, indices, lsr #8
|
||||
and vp2, mask, indices, lsr #16
|
||||
|
||||
add vp0, vp0, vp0, lsl #1
|
||||
add vp1, vp1, vp1, lsl #1
|
||||
@@ -136,9 +136,7 @@ skip cmp fPolys, fLast
|
||||
tst mask, #CLIP_MASK
|
||||
bne skip
|
||||
|
||||
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_T_AVG)
|
||||
add depth, vz0, vz1
|
||||
add depth, depth, vz2, lsl #1
|
||||
AVG_Z3 depth, vz0, vz1, vz2
|
||||
|
||||
; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0
|
||||
ldmia vp0, {vx0, vy0}
|
||||
@@ -148,18 +146,12 @@ skip cmp fPolys, fLast
|
||||
sub hdy0, vy1, vy0
|
||||
sub vdx0, vx2, vx0
|
||||
sub vdy0, vy2, vy0
|
||||
mul cross, hdy0, vdx0
|
||||
rsb cross, cross, #0
|
||||
mlas cross, hdx0, vdy0, cross
|
||||
ble skip
|
||||
|
||||
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
|
||||
|
||||
; poly is visible, store fPolys on the stack to reuse the reg
|
||||
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
|
||||
and colorIndex, flags, #0xFF
|
||||
|
||||
@@ -170,8 +162,6 @@ skip cmp fPolys, fLast
|
||||
add dataPtr, plutOffset, colorIndex, lsl #1
|
||||
|
||||
; faceAdd
|
||||
cmp depth, #(OT_SIZE - 1)
|
||||
movgt depth, #(OT_SIZE - 1)
|
||||
add ot, ot, depth, lsl #3 ; mul by size of OT element
|
||||
|
||||
ldr face, [faceBase]
|
||||
|
@@ -122,7 +122,7 @@ skip cmp fPolys, fLast
|
||||
|
||||
ldmia fPolys!, {flags, i0, i1}
|
||||
|
||||
; get vertex pointers
|
||||
; get vertex pointers (indices are pre-multiplied by 12)
|
||||
add vp0, fVertices, i0, lsr #16
|
||||
mov i0, i0, lsl #16
|
||||
add vp1, fVertices, i0, lsr #16
|
||||
@@ -144,14 +144,7 @@ skip cmp fPolys, fLast
|
||||
tst mask, #CLIP_MASK
|
||||
bne skip
|
||||
|
||||
; depth = max(vz0, vz1, vz2, vz3) (DEPTH_Q_MAX)
|
||||
mov depth, vz0
|
||||
cmp depth, vz1
|
||||
movlt depth, vz1
|
||||
cmp depth, vz2
|
||||
movlt depth, vz2
|
||||
cmp depth, vz3
|
||||
movlt depth, vz3
|
||||
MAX_Z4 depth, vz0, vz1, vz2, vz3
|
||||
|
||||
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
|
||||
ldmia vp0, {vx0, vy0}
|
||||
@@ -161,18 +154,12 @@ skip cmp fPolys, fLast
|
||||
sub hdy0, vy1, vy0
|
||||
sub vdx0, vx3, vx0
|
||||
sub vdy0, vy3, vy0
|
||||
mul cross, hdy0, vdx0
|
||||
rsb cross, cross, #0
|
||||
mlas cross, hdx0, vdy0, cross
|
||||
ble skip
|
||||
|
||||
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
|
||||
|
||||
; poly is visible, store fPolys on the stack to reuse the reg
|
||||
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)
|
||||
sub fog, depth, #(FOG_MIN >> OT_SHIFT)
|
||||
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
|
||||
|
||||
; faceAdd
|
||||
cmp depth, #(OT_SIZE - 1)
|
||||
movgt depth, #(OT_SIZE - 1)
|
||||
add ot, ot, depth, lsl #3 ; mul by size of OT element
|
||||
|
||||
mov depth, faceBase ; use depth reg due face vs faceBase reg collision
|
||||
|
@@ -118,7 +118,7 @@ skip cmp fPolys, fLast
|
||||
|
||||
ldmia fPolys!, {flags, i0, i1}
|
||||
|
||||
; get vertex pointers
|
||||
; get vertex pointers (indices are pre-multiplied by 12)
|
||||
add vp0, fVertices, i0, lsr #16
|
||||
mov i0, i0, lsl #16
|
||||
add vp1, fVertices, i0, lsr #16
|
||||
@@ -136,12 +136,7 @@ skip cmp fPolys, fLast
|
||||
tst mask, #CLIP_MASK
|
||||
bne skip
|
||||
|
||||
; depth = max(vz0, vz1, vz2) (DEPTH_T_MAX)
|
||||
mov depth, vz0
|
||||
cmp depth, vz1
|
||||
movlt depth, vz1
|
||||
cmp depth, vz2
|
||||
movlt depth, vz2
|
||||
MAX_Z3 depth, vz0, vz1, vz2
|
||||
|
||||
; (vx1 - vx0) * (vy2 - vy0) <= (vy1 - vy0) * (vx2 - vx0)
|
||||
ldmia vp0, {vx0, vy0}
|
||||
@@ -151,18 +146,12 @@ skip cmp fPolys, fLast
|
||||
sub hdy0, vy1, vy0
|
||||
sub vdx0, vx2, vx0
|
||||
sub vdy0, vy2, vy0
|
||||
mul cross, hdy0, vdx0
|
||||
rsb cross, cross, #0
|
||||
mlas cross, hdx0, vdy0, cross
|
||||
ble skip
|
||||
|
||||
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
|
||||
|
||||
; poly is visible, store fPolys on the stack to reuse the reg
|
||||
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)
|
||||
sub fog, depth, #(FOG_MIN >> OT_SHIFT)
|
||||
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
|
||||
|
||||
; faceAdd
|
||||
cmp depth, #(OT_SIZE - 1)
|
||||
movgt depth, #(OT_SIZE - 1)
|
||||
add ot, ot, depth, lsl #3 ; mul by size of OT element
|
||||
|
||||
mov depth, faceBase ; use depth reg due face vs faceBase reg collision
|
||||
|
@@ -10,13 +10,10 @@
|
||||
x RN r0
|
||||
y RN r1
|
||||
z RN r2
|
||||
|
||||
m RN r3
|
||||
|
||||
e0 RN r4
|
||||
e1 RN r5
|
||||
e2 RN r6
|
||||
|
||||
dx RN r7
|
||||
dy RN r12
|
||||
dz RN lr
|
||||
@@ -26,28 +23,27 @@ matrixTranslateRel_asm
|
||||
|
||||
ldr m, =matrixPtr
|
||||
ldr m, [m]
|
||||
add m, m, #(12 * 4)
|
||||
|
||||
ldmia m!, {e0, e1, e2}
|
||||
mul dx, e0, x
|
||||
mul dy, e1, x
|
||||
mul dz, e2, x
|
||||
ldmdb m!, {dx, dy, dz}
|
||||
|
||||
ldmia m!, {e0, e1, e2}
|
||||
mla dx, e0, y, dx
|
||||
mla dy, e1, y, dy
|
||||
mla dz, e2, y, dz
|
||||
|
||||
ldmia m!, {e0, e1, e2}
|
||||
ldmdb m!, {e0, e1, e2}
|
||||
mla dx, e0, z, dx
|
||||
mla dy, e1, z, dy
|
||||
mla dz, e2, z, dz
|
||||
|
||||
ldmia m, {e0, e1, e2}
|
||||
add e0, e0, dx
|
||||
add e1, e1, dy
|
||||
add e2, e2, dz
|
||||
ldmdb m!, {e0, e1, e2}
|
||||
mla dx, e0, y, dx
|
||||
mla dy, e1, y, dy
|
||||
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}
|
||||
|
||||
|
@@ -61,9 +61,9 @@ loop ldmia vertex, {x, y, z} ; read transformed vertex
|
||||
|
||||
; check z clipping
|
||||
cmp z, minZ
|
||||
orrlt z, minZ, #CLIP_NEAR
|
||||
orrle z, minZ, #CLIP_NEAR
|
||||
cmp z, maxZ
|
||||
orrgt z, maxZ, #CLIP_FAR
|
||||
orrge z, maxZ, #CLIP_FAR
|
||||
|
||||
; projection
|
||||
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive
|
||||
|
@@ -177,9 +177,6 @@ enum ClipFlags {
|
||||
|
||||
X_INLINE Face* faceAdd(int32 depth)
|
||||
{
|
||||
if (depth < 0) depth = 0;
|
||||
if (depth > OT_SIZE - 1) depth = OT_SIZE - 1;
|
||||
|
||||
Face* face = gFacesBase++;
|
||||
|
||||
if (gOT[depth].head) {
|
||||
@@ -343,10 +340,10 @@ void projectVertices_c(int32 vCount)
|
||||
|
||||
int32 clip = 0;
|
||||
|
||||
if (z < (VIEW_MIN_F >> FIXED_SHIFT)) {
|
||||
if (z <= (VIEW_MIN_F >> FIXED_SHIFT)) {
|
||||
z = (VIEW_MIN_F >> FIXED_SHIFT);
|
||||
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);
|
||||
clip = CLIP_FAR;
|
||||
}
|
||||
@@ -608,11 +605,11 @@ void faceAddMeshTriangles_c(const MeshTriangle* polys, int32 count, uint32 shade
|
||||
if ((c0 & c1 & c2) & CLIP_MASK)
|
||||
continue;
|
||||
|
||||
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
|
||||
|
||||
if (cross(v0, v1, v2) <= 0)
|
||||
continue;
|
||||
|
||||
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
|
||||
|
||||
Face* f = faceAdd(depth);
|
||||
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)
|
||||
continue;
|
||||
|
||||
int32 depth = DEPTH_Q_AVG(v0->z, v1->z, v2->z, v3->z);
|
||||
|
||||
if (cross(v0, v1, v3) <= 0)
|
||||
continue;
|
||||
|
||||
int32 depth = DEPTH_Q_AVG(v0->z, v1->z, v2->z, v3->z);
|
||||
|
||||
Face* f = faceAdd(depth);
|
||||
f->ccb_PIXC = shade;
|
||||
|
||||
@@ -684,11 +681,11 @@ void faceAddMeshTrianglesFlat_c(const MeshTriangle* polys, int32 count, uint32 s
|
||||
if ((c0 & c1 & c2) & CLIP_MASK)
|
||||
continue;
|
||||
|
||||
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
|
||||
|
||||
if (cross(v0, v1, v2) <= 0)
|
||||
continue;
|
||||
|
||||
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
|
||||
|
||||
Face* f = faceAdd(depth);
|
||||
f->ccb_PIXC = shade;
|
||||
|
||||
|
Reference in New Issue
Block a user