1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-20 03:41:33 +02:00

#370 3DO save 14 ticks per vertex for projectVertices func

This commit is contained in:
XProger
2021-11-23 10:07:52 +03:00
parent 581b428814
commit 11f9b29487

View File

@@ -8,20 +8,20 @@
EXPORT projectVertices_asm
vCount RN r0
mx RN r0
mx RN vCount
my RN r1
mz RN r2
x RN r3
y RN r4
z RN r5
dz RN r6
minX RN dz
minY RN r7
maxX RN r8
minX RN r7
minY RN r8
maxX RN r9
maxY RN r12
last RN r9
m RN r10
vp RN m
m RN minX
vp RN minX
last RN r10
vertex RN r11
divLUT RN lr
@@ -36,7 +36,7 @@ CLIP_FAR EQU (1 << 4)
CLIP_NEAR EQU (1 << 5)
DIV_TABLE_END EQU (1025 - 1)
VIEW_DIST EQU (1024 * 10)
VIEW_DIST EQU (1024 * 10) ; max = DIV_TABLE_END << PROJ_SHIFT
VIEW_MIN EQU (256 << CLIP_SHIFT)
VIEW_MAX EQU (VIEW_DIST << CLIP_SHIFT)
@@ -61,6 +61,7 @@ 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}
loop ldmia vertex, {x, y, z} ; read unpacked vertex
@@ -79,17 +80,14 @@ loop ldmia vertex, {x, y, z} ; read unpacked vertex
orrgt z, z, #CLIP_FAR
; projection
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT)
cmp dz, #DIV_TABLE_END
movge dz, #DIV_TABLE_END
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive
ldr dz, [divLUT, dz, lsl #2]
mul x, dz, x
mul y, dz, y
mov x, x, asr #12
mov y, y, asr #12
mov x, x, asr #(16 - PROJ_SHIFT)
mov y, y, asr #(16 - PROJ_SHIFT)
; check xy clipping
ldmia vp, {minX, minY, maxX, maxY}
cmp x, minX
orrlt z, z, #CLIP_LEFT
cmp y, minY