diff --git a/src/fixed/common.h b/src/fixed/common.h index 0b330c2..dca937b 100644 --- a/src/fixed/common.h +++ b/src/fixed/common.h @@ -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); diff --git a/src/fixed/draw.h b/src/fixed/draw.h index d7e72a4..4fd24c3 100644 --- a/src/fixed/draw.h +++ b/src/fixed/draw.h @@ -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 diff --git a/src/platform/3do/boxIsVisible.s b/src/platform/3do/boxIsVisible.s index 1966af0..dbcfa68 100644 --- a/src/platform/3do/boxIsVisible.s +++ b/src/platform/3do/boxIsVisible.s @@ -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 diff --git a/src/platform/3do/common_asm.inc b/src/platform/3do/common_asm.inc index e80fc5d..6e6ee50 100644 --- a/src/platform/3do/common_asm.inc +++ b/src/platform/3do/common_asm.inc @@ -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) \ No newline at end of file +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 diff --git a/src/platform/3do/faceAddMeshQuads.s b/src/platform/3do/faceAddMeshQuads.s index 99a1535..7fd3607 100644 --- a/src/platform/3do/faceAddMeshQuads.s +++ b/src/platform/3do/faceAddMeshQuads.s @@ -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] diff --git a/src/platform/3do/faceAddMeshQuadsFlat.s b/src/platform/3do/faceAddMeshQuadsFlat.s index 6e9007e..3ea85cf 100644 --- a/src/platform/3do/faceAddMeshQuadsFlat.s +++ b/src/platform/3do/faceAddMeshQuadsFlat.s @@ -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] diff --git a/src/platform/3do/faceAddMeshTriangles.s b/src/platform/3do/faceAddMeshTriangles.s index 9d4b6f5..8b5d6f7 100644 --- a/src/platform/3do/faceAddMeshTriangles.s +++ b/src/platform/3do/faceAddMeshTriangles.s @@ -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] diff --git a/src/platform/3do/faceAddMeshTrianglesFlat.s b/src/platform/3do/faceAddMeshTrianglesFlat.s index 584f626..846f139 100644 --- a/src/platform/3do/faceAddMeshTrianglesFlat.s +++ b/src/platform/3do/faceAddMeshTrianglesFlat.s @@ -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] diff --git a/src/platform/3do/faceAddRoomQuads.s b/src/platform/3do/faceAddRoomQuads.s index e1accd6..907934a 100644 --- a/src/platform/3do/faceAddRoomQuads.s +++ b/src/platform/3do/faceAddRoomQuads.s @@ -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 diff --git a/src/platform/3do/faceAddRoomTriangles.s b/src/platform/3do/faceAddRoomTriangles.s index 85ba2b1..352a7f2 100644 --- a/src/platform/3do/faceAddRoomTriangles.s +++ b/src/platform/3do/faceAddRoomTriangles.s @@ -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 diff --git a/src/platform/3do/matrixTranslate.s b/src/platform/3do/matrixTranslate.s index dc2f697..faf01ad 100644 --- a/src/platform/3do/matrixTranslate.s +++ b/src/platform/3do/matrixTranslate.s @@ -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} diff --git a/src/platform/3do/projectVertices.s b/src/platform/3do/projectVertices.s index a2d4f8f..bb943be 100644 --- a/src/platform/3do/projectVertices.s +++ b/src/platform/3do/projectVertices.s @@ -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 diff --git a/src/platform/3do/render_cel.cpp b/src/platform/3do/render_cel.cpp index 4671b87..da6bb4c 100644 --- a/src/platform/3do/render_cel.cpp +++ b/src/platform/3do/render_cel.cpp @@ -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;