mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-21 04:11:53 +02:00
#370 3DO save 6 ticks per vertex in projection
This commit is contained in:
@@ -15,12 +15,12 @@ x RN r3
|
|||||||
y RN r4
|
y RN r4
|
||||||
z RN r5
|
z RN r5
|
||||||
dz RN r6
|
dz RN r6
|
||||||
minX RN r7
|
minXY RN r7
|
||||||
minY RN r8
|
maxXY RN r8
|
||||||
maxX RN r9
|
minZ RN r9
|
||||||
maxY RN r12
|
maxZ RN r12
|
||||||
m RN minX
|
m RN dz
|
||||||
vp RN minX
|
vp RN dz
|
||||||
last RN r10
|
last RN r10
|
||||||
vertex RN r11
|
vertex RN r11
|
||||||
divLUT RN lr
|
divLUT RN lr
|
||||||
@@ -61,23 +61,28 @@ 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}
|
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
|
loop ldmia vertex, {x, y, z} ; read unpacked vertex
|
||||||
|
|
||||||
add x, x, mx, asr #FIXED_SHIFT
|
add x, x, mx, asr #FIXED_SHIFT
|
||||||
add y, y, my, asr #FIXED_SHIFT
|
add y, my, y, lsl #PROJ_SHIFT ; extra shift for min/max cmp with hi half-word
|
||||||
add z, z, mz, asr #FIXED_SHIFT
|
add z, mz, z, lsl #CLIP_SHIFT ; add some bits for the clipping flags
|
||||||
|
|
||||||
mov z, z, lsl #CLIP_SHIFT ; add some bits for the clipping flags
|
|
||||||
|
|
||||||
; check z clipping
|
; check z clipping
|
||||||
cmp z, #VIEW_MIN
|
cmp z, minZ
|
||||||
movlt z, #VIEW_MIN
|
orrlt z, minZ, #CLIP_NEAR
|
||||||
orrlt z, z, #CLIP_NEAR
|
cmp z, maxZ
|
||||||
cmp z, #VIEW_MAX
|
orrgt z, maxZ, #CLIP_FAR
|
||||||
movgt z, #VIEW_MAX
|
|
||||||
orrgt z, z, #CLIP_FAR
|
|
||||||
|
|
||||||
; projection
|
; projection
|
||||||
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive
|
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 x, dz, x
|
||||||
mul y, dz, y
|
mul y, dz, y
|
||||||
mov x, x, asr #(16 - PROJ_SHIFT)
|
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
|
; check xy clipping
|
||||||
cmp x, minX
|
cmp x, minXY, asr #16
|
||||||
orrlt z, z, #CLIP_LEFT
|
orrlt z, z, #CLIP_LEFT
|
||||||
cmp y, minY
|
cmp y, minXY, lsl #16
|
||||||
orrlt z, z, #CLIP_TOP
|
orrlt z, z, #CLIP_TOP
|
||||||
cmp x, maxX
|
cmp x, maxXY, asr #16
|
||||||
orrgt z, z, #CLIP_RIGHT
|
orrgt z, z, #CLIP_RIGHT
|
||||||
cmp y, maxY
|
cmp y, maxXY, lsl #16
|
||||||
orrgt z, z, #CLIP_BOTTOM
|
orrgt z, z, #CLIP_BOTTOM
|
||||||
|
|
||||||
|
mov y, y, asr #16
|
||||||
|
|
||||||
stmia vertex!, {x, y, z} ; store projected vertex
|
stmia vertex!, {x, y, z} ; store projected vertex
|
||||||
cmp vertex, last
|
cmp vertex, last
|
||||||
blt loop
|
blt loop
|
||||||
|
@@ -28,7 +28,12 @@ Face* otFacesTail[OT_SIZE];
|
|||||||
int32 otMin = OT_SIZE - 1;
|
int32 otMin = OT_SIZE - 1;
|
||||||
int32 otMax = 0;
|
int32 otMax = 0;
|
||||||
|
|
||||||
RectMinMax viewportRel;
|
struct ViewportRel {
|
||||||
|
int16 x0, y0;
|
||||||
|
int16 x1, y1;
|
||||||
|
};
|
||||||
|
|
||||||
|
ViewportRel viewportRel;
|
||||||
|
|
||||||
bool enableClipping;
|
bool enableClipping;
|
||||||
|
|
||||||
@@ -321,7 +326,7 @@ bool transformBoxRect(const AABBs* box, RectMinMax* rect)
|
|||||||
|
|
||||||
*rect = RectMinMax( INT_MAX, INT_MAX, INT_MIN, INT_MIN );
|
*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++)
|
for (int32 i = 0; i < 8; i++, v++)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user