mirror of
https://github.com/XProger/OpenLara.git
synced 2025-01-17 21:09:00 +01:00
#370 3DO add projectVertices ARM implementation
This commit is contained in:
parent
7761a5db06
commit
02bc5694d5
118
src/platform/3do/projectVertices.s
Normal file
118
src/platform/3do/projectVertices.s
Normal file
@ -0,0 +1,118 @@
|
||||
AREA |C$$code|, CODE, READONLY
|
||||
|x$codeseg|
|
||||
|
||||
IMPORT matrixPtr
|
||||
IMPORT viewportRel
|
||||
IMPORT divTable
|
||||
IMPORT gVertices
|
||||
EXPORT projectVertices_asm
|
||||
|
||||
vCount RN r0
|
||||
mx RN r0
|
||||
my RN r1
|
||||
mz RN r2
|
||||
vx RN r3
|
||||
vy RN r4
|
||||
vz RN r5
|
||||
x RN r6
|
||||
y RN r7
|
||||
z RN r8
|
||||
|
||||
minX RN mx
|
||||
minY RN my
|
||||
maxX RN mz
|
||||
maxY RN vx
|
||||
dz RN vy
|
||||
|
||||
vp RN r9
|
||||
m RN r10
|
||||
vertex RN r11
|
||||
divLUT RN r12
|
||||
last RN lr
|
||||
|
||||
FIXED_SHIFT EQU 14
|
||||
PROJ_SHIFT EQU 4
|
||||
CLIP_SHIFT EQU 8
|
||||
CLIP_LEFT EQU (1 << 0)
|
||||
CLIP_RIGHT EQU (1 << 1)
|
||||
CLIP_TOP EQU (1 << 2)
|
||||
CLIP_BOTTOM EQU (1 << 3)
|
||||
CLIP_FAR EQU (1 << 4)
|
||||
CLIP_NEAR EQU (1 << 5)
|
||||
|
||||
DIV_TABLE_END EQU (1025 - 1)
|
||||
VIEW_DIST EQU (1024 * 10)
|
||||
VIEW_MIN EQU (256 << CLIP_SHIFT)
|
||||
VIEW_MAX EQU (VIEW_DIST << CLIP_SHIFT)
|
||||
|
||||
projectVertices_asm
|
||||
stmfd sp!, {r4-r11, lr}
|
||||
|
||||
ldr divLUT, =divTable
|
||||
ldr vertex, =gVertices
|
||||
ldr vp, =viewportRel
|
||||
ldr m, =matrixPtr
|
||||
ldr m, [m]
|
||||
add vCount, vCount, vCount, lsl #1
|
||||
add last, vertex, vCount, lsl #2 ; last = gVertices + vCount * 12
|
||||
|
||||
loop ldmia vertex, {vx, vy, vz} ; read unpacked vertex
|
||||
|
||||
; transform x
|
||||
ldmia m!, {mx, my, mz, x}
|
||||
mla x, mx, vx, x
|
||||
mla x, my, vy, x
|
||||
mla x, mz, vz, x
|
||||
; transform y
|
||||
ldmia m!, {mx, my, mz, y}
|
||||
mla y, mx, vx, y
|
||||
mla y, my, vy, y
|
||||
mla y, mz, vz, y
|
||||
; transform z
|
||||
ldmia m!, {mx, my, mz, z}
|
||||
mla z, mx, vx, z
|
||||
mla z, my, vy, z
|
||||
mla z, mz, vz, z
|
||||
|
||||
sub m, m, #48 ; restore matrixPtr
|
||||
|
||||
mov x, x, asr #FIXED_SHIFT
|
||||
mov y, y, asr #FIXED_SHIFT
|
||||
mov z, z, asr #FIXED_SHIFT
|
||||
mov z, 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
|
||||
movge z, #VIEW_MAX
|
||||
orrge z, z, #CLIP_FAR
|
||||
|
||||
; projection
|
||||
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT)
|
||||
cmp dz, #DIV_TABLE_END
|
||||
movge dz, #DIV_TABLE_END
|
||||
ldr dz, [divLUT, dz, lsl #2]
|
||||
mul x, dz, x
|
||||
mul y, dz, y
|
||||
mov x, x, asr #12
|
||||
mov y, y, asr #12
|
||||
|
||||
; check xy clipping
|
||||
ldmia vp, {minX, minY, maxX, maxY}
|
||||
cmp x, minX
|
||||
orrlt z, z, #CLIP_LEFT
|
||||
cmp y, minY
|
||||
orrlt z, z, #CLIP_TOP
|
||||
cmp x, maxX
|
||||
orrge z, z, #CLIP_RIGHT
|
||||
cmp y, maxY
|
||||
orrge z, z, #CLIP_BOTTOM
|
||||
|
||||
stmia vertex!, {x, y, z} ; store projected vertex
|
||||
cmp vertex, last
|
||||
blt loop
|
||||
|
||||
done ldmfd sp!, {r4-r11, pc}
|
||||
END
|
Loading…
x
Reference in New Issue
Block a user