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_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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
|
||||||
@@ -64,4 +65,68 @@ VIEW_MAX EQU (VIEW_DIST << CLIP_SHIFT)
|
|||||||
MIN_INT32 EQU 0x80000000
|
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
|
||||||
|
@@ -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]
|
||||||
|
@@ -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]
|
||||||
|
@@ -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]
|
||||||
|
@@ -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]
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user