1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-20 11:51:36 +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 EXPORT projectVertices_asm
vCount RN r0 vCount RN r0
mx RN r0 mx RN vCount
my RN r1 my RN r1
mz RN r2 mz RN r2
x RN r3 x RN r3
y RN r4 y RN r4
z RN r5 z RN r5
dz RN r6 dz RN r6
minX RN dz minX RN r7
minY RN r7 minY RN r8
maxX RN r8 maxX RN r9
maxY RN r12 maxY RN r12
last RN r9 m RN minX
m RN r10 vp RN minX
vp RN m last RN r10
vertex RN r11 vertex RN r11
divLUT RN lr divLUT RN lr
@@ -36,7 +36,7 @@ CLIP_FAR EQU (1 << 4)
CLIP_NEAR EQU (1 << 5) CLIP_NEAR EQU (1 << 5)
DIV_TABLE_END EQU (1025 - 1) 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_MIN EQU (256 << CLIP_SHIFT)
VIEW_MAX EQU (VIEW_DIST << 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 ldmia m, {mx, my, mz} ; get view space offset from matrix
ldr divLUT, =divTable ldr divLUT, =divTable
ldr vp, =viewportRel ldr vp, =viewportRel
ldmia vp, {minX, minY, maxX, maxY}
loop ldmia vertex, {x, y, z} ; read unpacked vertex 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 orrgt z, z, #CLIP_FAR
; projection ; projection
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive
cmp dz, #DIV_TABLE_END
movge dz, #DIV_TABLE_END
ldr dz, [divLUT, dz, lsl #2] ldr dz, [divLUT, dz, lsl #2]
mul x, dz, x mul x, dz, x
mul y, dz, y mul y, dz, y
mov x, x, asr #12 mov x, x, asr #(16 - PROJ_SHIFT)
mov y, y, asr #12 mov y, y, asr #(16 - PROJ_SHIFT)
; check xy clipping ; check xy clipping
ldmia vp, {minX, minY, maxX, maxY}
cmp x, minX cmp x, minX
orrlt z, z, #CLIP_LEFT orrlt z, z, #CLIP_LEFT
cmp y, minY cmp y, minY