1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-05 20:57:46 +02:00

#368 GBA apply changes to transformRoomUW

This commit is contained in:
XProger
2022-12-05 00:57:05 +03:00
parent dd05e19d9f
commit f1c1d835fc

View File

@@ -35,7 +35,7 @@ maxXY .req vz
tmp .req vy tmp .req vy
dx .req vz dx .req vz
dy .req tmp dy .req vy
dz .req vz dz .req vz
fog .req vz fog .req vz
@@ -62,7 +62,6 @@ transformRoomUW_asm:
ldr res, =gVerticesBase ldr res, =gVerticesBase
ldr res, [res] ldr res, [res]
add res, #VERTEX_G
ldr tmp, =viewportRel ldr tmp, =viewportRel
ldmia tmp, {spMinXY, spMaxXY} ldmia tmp, {spMinXY, spMaxXY}
@@ -75,8 +74,6 @@ transformRoomUW_asm:
stmfd sp!, {spMinXY, spMaxXY, spRandLUT, spFrame, spCaustLUT} stmfd sp!, {spMinXY, spMaxXY, spRandLUT, spFrame, spCaustLUT}
mov mask, #0xFF
ldr m, =gMatrixPtr ldr m, =gMatrixPtr
ldr m, [m] ldr m, [m]
fiq_on fiq_on
@@ -85,30 +82,23 @@ transformRoomUW_asm:
asr mw1, #FIXED_SHIFT asr mw1, #FIXED_SHIFT
fiq_off fiq_off
ldmia m, {mx2, my2, mz2, mw2} ldmia m, {mx2, my2, mz2, mw2}
asr mw2, #FIXED_SHIFT asr mw2, #(FIXED_SHIFT + OT_SHIFT)
.loop: .loop:
// unpack vertex // unpack vertex
ldmia vertices!, {v} ldr v, [vertices], #4
and vz, mask, v, lsr #16 mov mask, #0xFF
and vy, mask, v, lsr #8
and vx, mask, v and vx, mask, v
and vy, mask, v, lsr #8
and vz, mask, v, lsr #16
mov vg, v, lsr #(24 + 3)
// transform z // transform z
mul z, mx2, vx mul z, mx2, vx
mla z, my2, vy, z mla z, my2, vy, z
mla z, mz2, vz, z mla z, mz2, vz, z
add z, mw2, z, asr #(FIXED_SHIFT - 8) add z, mw2, z, asr #(FIXED_SHIFT - 8 + OT_SHIFT)
// skip if vertex is out of z-range
add z, #VIEW_OFF
cmp z, #(VIEW_OFF + VIEW_OFF + VIEW_MAX)
movhi vg, #(CLIP_NEAR + CLIP_FAR)
bhi .skip
mov vg, v, lsr #24
sub z, #VIEW_OFF
fiq_on fiq_on
// transform y // transform y
@@ -133,28 +123,24 @@ transformRoomUW_asm:
and rand, #(MAX_CAUSTICS - 1) and rand, #(MAX_CAUSTICS - 1)
ldr caust, [sp, #SP_CAUST] ldr caust, [sp, #SP_CAUST]
ldr caust, [caust, rand, lsl #2] ldr caust, [caust, rand, lsl #2]
add vg, caust, asr #5 add vg, caust, asr #8
// fog // fog
subs fog, z, #FOG_MIN subs fog, z, #(FOG_MIN >> OT_SHIFT)
addgt vg, fog, lsr #4 addgt vg, fog, lsr #(3 + FOG_SHIFT - OT_SHIFT)
cmpgt vg, #31
// vg 0..255 -> 0..31
lsr vg, #3
cmp vg, #31
movgt vg, #31 movgt vg, #31
// z clipping // z clipping
cmp z, #VIEW_MIN cmp z, #(VIEW_MIN >> OT_SHIFT)
movle z, #VIEW_MIN movle z, #(VIEW_MIN >> OT_SHIFT)
orrle vg, #CLIP_NEAR orrle vg, #CLIP_NEAR
cmp z, #VIEW_MAX cmp z, #(VIEW_MAX >> OT_SHIFT)
movge z, #VIEW_MAX movge z, #(VIEW_MAX >> OT_SHIFT)
orrge vg, #CLIP_FAR orrge vg, #CLIP_FAR
// project // project
add dz, z, z, lsr #2 add dz, z, z, lsr #2
lsr dz, #4
divLUT tmp, dz divLUT tmp, dz
mul dx, x, tmp mul dx, x, tmp
mul dy, y, tmp mul dy, y, tmp
@@ -186,13 +172,10 @@ transformRoomUW_asm:
orrhi vg, #CLIP_FRAME orrhi vg, #CLIP_FRAME
// store the result // store the result
strh x, [res, #-6] strh x, [res], #2
strh y, [res, #-4] strh y, [res], #2
strh z, [res, #-2] strh z, [res], #2
strh vg, [res], #2
mov mask, #0xFF
.skip:
strh vg, [res], #8
subs count, #1 subs count, #1
bne .loop bne .loop