1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-19 03:11:22 +02:00

#370 3DO save 6 ticks per vertex in projection

This commit is contained in:
XProger
2021-11-24 10:27:31 +03:00
parent 11f9b29487
commit c4ae675027
2 changed files with 36 additions and 24 deletions

View File

@@ -15,12 +15,12 @@ x RN r3
y RN r4
z RN r5
dz RN r6
minX RN r7
minY RN r8
maxX RN r9
maxY RN r12
m RN minX
vp RN minX
minXY RN r7
maxXY RN r8
minZ RN r9
maxZ RN r12
m RN dz
vp RN dz
last RN r10
vertex RN r11
divLUT RN lr
@@ -61,23 +61,28 @@ projectVertices_asm
ldmia m, {mx, my, mz} ; get view space offset from matrix
ldr divLUT, =divTable
ldr vp, =viewportRel
ldmia vp, {minX, minY, maxX, maxY}
ldmia vp, {minXY, maxXY}
mov minZ, #VIEW_MIN
mov maxZ, #VIEW_MAX
mov my, my, asr #FIXED_SHIFT
mov my, my, lsl #PROJ_SHIFT
mov mz, mz, asr #FIXED_SHIFT
mov mz, mz, lsl #CLIP_SHIFT
loop ldmia vertex, {x, y, z} ; read unpacked vertex
add x, x, mx, asr #FIXED_SHIFT
add y, y, my, asr #FIXED_SHIFT
add z, z, mz, asr #FIXED_SHIFT
mov z, z, lsl #CLIP_SHIFT ; add some bits for the clipping flags
add y, my, y, lsl #PROJ_SHIFT ; extra shift for min/max cmp with hi half-word
add z, mz, z, lsl #CLIP_SHIFT ; add some bits for the clipping flags
; check z clipping
cmp z, #VIEW_MIN
movlt z, #VIEW_MIN
orrlt z, z, #CLIP_NEAR
cmp z, #VIEW_MAX
movgt z, #VIEW_MAX
orrgt z, z, #CLIP_FAR
cmp z, minZ
orrlt z, minZ, #CLIP_NEAR
cmp z, maxZ
orrgt z, maxZ, #CLIP_FAR
; projection
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive
@@ -85,18 +90,20 @@ loop ldmia vertex, {x, y, z} ; read unpacked vertex
mul x, dz, x
mul y, dz, y
mov x, x, asr #(16 - PROJ_SHIFT)
mov y, y, asr #(16 - PROJ_SHIFT)
; keep y shifted by 16 for min/max cmp
; check xy clipping
cmp x, minX
cmp x, minXY, asr #16
orrlt z, z, #CLIP_LEFT
cmp y, minY
cmp y, minXY, lsl #16
orrlt z, z, #CLIP_TOP
cmp x, maxX
cmp x, maxXY, asr #16
orrgt z, z, #CLIP_RIGHT
cmp y, maxY
cmp y, maxXY, lsl #16
orrgt z, z, #CLIP_BOTTOM
mov y, y, asr #16
stmia vertex!, {x, y, z} ; store projected vertex
cmp vertex, last
blt loop

View File

@@ -28,7 +28,12 @@ Face* otFacesTail[OT_SIZE];
int32 otMin = OT_SIZE - 1;
int32 otMax = 0;
RectMinMax viewportRel;
struct ViewportRel {
int16 x0, y0;
int16 x1, y1;
};
ViewportRel viewportRel;
bool enableClipping;
@@ -321,7 +326,7 @@ bool transformBoxRect(const AABBs* box, RectMinMax* rect)
*rect = RectMinMax( INT_MAX, INT_MAX, INT_MIN, INT_MIN );
Vertex* v = gVertices;
const Vertex* v = gVertices;
for (int32 i = 0; i < 8; i++, v++)
{