1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-06 13:16:52 +02:00

#368 minor optimizations (next & prev links, mod in drawPoly, anglesFromVector)

This commit is contained in:
XProger
2022-02-05 06:56:45 +03:00
parent 48e57ece0e
commit 3d0f82ba6b
10 changed files with 100 additions and 87 deletions

View File

@@ -1057,12 +1057,7 @@ uint32 phd_sqrt(uint32 x)
void anglesFromVector(int32 x, int32 y, int32 z, int16 &angleX, int16 &angleY) void anglesFromVector(int32 x, int32 y, int32 z, int16 &angleX, int16 &angleY)
{ {
angleY = phd_atan(z, x); angleY = phd_atan(z, x);
angleX = phd_atan(phd_sqrt(x * x + z * z), y); angleX = phd_atan(phd_sqrt(x * x + z * z), -y);
if ((y > 0 && angleX > 0) || (y < 0 && angleX < 0))
{
angleX = -angleX;
}
} }
bool boxIntersect(const AABBi &a, const AABBi &b) bool boxIntersect(const AABBi &a, const AABBi &b)

View File

@@ -13,8 +13,10 @@
.equ VERTEX_CLIP, 7 .equ VERTEX_CLIP, 7
.equ VERTEX_T, 8 .equ VERTEX_T, 8
.equ VERTEX_PREV, 12 .equ VERTEX_PREV, 12
.equ VERTEX_NEXT, 16 .equ VERTEX_NEXT, 13
.equ VERTEX_SIZEOF, 20
.equ VERTEX_SIZEOF_SHIFT, 4
.equ VERTEX_SIZEOF, (1 << VERTEX_SIZEOF_SHIFT)
.equ LEVEL_TILES, 40 .equ LEVEL_TILES, 40
.equ LEVEL_TEXTURES, 92 .equ LEVEL_TEXTURES, 92

View File

@@ -45,7 +45,8 @@ rasterizeF_asm:
.calc_left_start: .calc_left_start:
cmp Lh, #0 cmp Lh, #0
bne .calc_left_end // if (Lh != 0) end with left bne .calc_left_end // if (Lh != 0) end with left
ldr N, [L, #VERTEX_PREV] // N = L->prev ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev
add N, L, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x)
ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y
subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y
@@ -65,7 +66,8 @@ rasterizeF_asm:
.calc_right_start: .calc_right_start:
cmp Rh, #0 cmp Rh, #0
bne .calc_right_end // if (Rh != 0) end with right bne .calc_right_end // if (Rh != 0) end with right
ldr N, [R, #VERTEX_NEXT] // N = R->next ldrsb N, [R, #VERTEX_NEXT] // N = R + R->next
add N, R, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x) ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x)
ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y
subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y

View File

@@ -100,7 +100,8 @@ rasterizeFT_asm:
.calc_left_start: .calc_left_start:
cmp Lh, #0 cmp Lh, #0
bne .calc_left_end // if (Lh != 0) end with left bne .calc_left_end // if (Lh != 0) end with left
ldr N, [L, #VERTEX_PREV] // N = L->prev ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev
add N, L, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x)
ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y
subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y
@@ -136,7 +137,8 @@ rasterizeFT_asm:
.calc_right_start: .calc_right_start:
cmp Rh, #0 cmp Rh, #0
bne .calc_right_end // if (Rh != 0) end with right bne .calc_right_end // if (Rh != 0) end with right
ldr N, [R, #VERTEX_NEXT] // N = R->next ldrsb N, [R, #VERTEX_NEXT] // N = R + R->next
add N, R, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x) ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x)
ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y
subs Rh, Ry2, Rxy, asr #16 // Rh = Ry2 - Rxy subs Rh, Ry2, Rxy, asr #16 // Rh = Ry2 - Rxy

View File

@@ -106,7 +106,8 @@ rasterizeFTA_asm:
.calc_left_start: .calc_left_start:
cmp Lh, #0 cmp Lh, #0
bne .calc_left_end // if (Lh != 0) end with left bne .calc_left_end // if (Lh != 0) end with left
ldr N, [L, #VERTEX_PREV] // N = L->prev ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev
add N, L, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x)
ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y
subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y
@@ -142,7 +143,8 @@ rasterizeFTA_asm:
.calc_right_start: .calc_right_start:
cmp Rh, #0 cmp Rh, #0
bne .calc_right_end // if (Rh != 0) end with right bne .calc_right_end // if (Rh != 0) end with right
ldr N, [R, #VERTEX_NEXT] // N = R->next ldrsb N, [R, #VERTEX_NEXT] // N = R + R->next
add N, R, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x) ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x)
ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y
subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y

View File

@@ -122,7 +122,8 @@ rasterizeGT_asm:
.calc_left_start: .calc_left_start:
cmp Lh, #0 cmp Lh, #0
bne .calc_left_end // if (Lh != 0) end with left bne .calc_left_end // if (Lh != 0) end with left
ldr N, [L, #VERTEX_PREV] // N = L->prev ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev
add N, L, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x)
ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y
subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y
@@ -166,7 +167,8 @@ rasterizeGT_asm:
.calc_right_start: .calc_right_start:
cmp Rh, #0 cmp Rh, #0
bne .calc_right_end // if (Rh != 0) end with right bne .calc_right_end // if (Rh != 0) end with right
ldr N, [R, #VERTEX_NEXT] // N = R->next ldrsb N, [R, #VERTEX_NEXT] // N = R + R->next
add N, R, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x) ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x)
ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y
subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y

View File

@@ -127,7 +127,8 @@ rasterizeGTA_asm:
.calc_left_start: .calc_left_start:
cmp Lh, #0 cmp Lh, #0
bne .calc_left_end // if (Lh != 0) end with left bne .calc_left_end // if (Lh != 0) end with left
ldr N, [L, #VERTEX_PREV] // N = L->prev ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev
add N, L, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x)
ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y
subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y
@@ -171,7 +172,8 @@ rasterizeGTA_asm:
.calc_right_start: .calc_right_start:
cmp Rh, #0 cmp Rh, #0
bne .calc_right_end // if (Rh != 0) end with right bne .calc_right_end // if (Rh != 0) end with right
ldr N, [R, #VERTEX_NEXT] // N = R->next ldrsb N, [R, #VERTEX_NEXT] // N = R + R->next
add N, R, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x) ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x)
ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y
subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y

View File

@@ -39,7 +39,8 @@ rasterizeS_asm:
.calc_left_start: .calc_left_start:
cmp Lh, #0 cmp Lh, #0
bne .calc_left_end // if (Lh != 0) end with left bne .calc_left_end // if (Lh != 0) end with left
ldr N, [L, #VERTEX_PREV] // N = L->prev ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev
add N, L, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x)
ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y ldrsh Ly2, [N, #VERTEX_Y] // Ly2 = N->v.y
subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y subs Lh, Ly2, Lxy, asr #16 // Lh = N->v.y - L->v.y
@@ -59,7 +60,8 @@ rasterizeS_asm:
.calc_right_start: .calc_right_start:
cmp Rh, #0 cmp Rh, #0
bne .calc_right_end // if (Rh != 0) end with right bne .calc_right_end // if (Rh != 0) end with right
ldr N, [R, #VERTEX_NEXT] // N = R->next ldrsb N, [R, #VERTEX_NEXT] // N = R + R->next
add N, R, N, lsl #VERTEX_SIZEOF_SHIFT
ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x) ldr Rxy, [R, #VERTEX_X] // Rxy = (R->v.y << 16) | (R->v.x)
ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y ldrsh Ry2, [N, #VERTEX_Y] // Ry2 = N->v.y
subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y subs Rh, Ry2, Rxy, asr #16 // Rh = N->v.y - R->v.y

View File

@@ -60,7 +60,7 @@ void rasterizeS_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
if (N->v.y < L->v.y) return; if (N->v.y < L->v.y) return;
@@ -79,7 +79,7 @@ void rasterizeS_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
if (N->v.y < R->v.y) return; if (N->v.y < R->v.y) return;
@@ -167,7 +167,7 @@ void rasterizeF_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
ASSERT(L->v.y >= 0); ASSERT(L->v.y >= 0);
@@ -188,7 +188,7 @@ void rasterizeF_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
ASSERT(R->v.y >= 0); ASSERT(R->v.y >= 0);
@@ -270,7 +270,7 @@ void rasterizeG_c(uint16* pixel, const VertexLink* L, const VertexLink* R, int32
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
if (N->v.y < L->v.y) return; if (N->v.y < L->v.y) return;
@@ -292,7 +292,7 @@ void rasterizeG_c(uint16* pixel, const VertexLink* L, const VertexLink* R, int32
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
if (N->v.y < R->v.y) return; if (N->v.y < R->v.y) return;
@@ -396,7 +396,7 @@ void rasterizeFT_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
if (N->v.y < L->v.y) return; if (N->v.y < L->v.y) return;
@@ -421,7 +421,7 @@ void rasterizeFT_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
if (N->v.y < R->v.y) return; if (N->v.y < R->v.y) return;
@@ -528,7 +528,7 @@ void rasterizeGT_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
if (N->v.y < L->v.y) return; if (N->v.y < L->v.y) return;
@@ -556,7 +556,7 @@ void rasterizeGT_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
if (N->v.y < R->v.y) return; if (N->v.y < R->v.y) return;
@@ -680,7 +680,7 @@ void rasterizeFTA_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
if (N->v.y < L->v.y) return; if (N->v.y < L->v.y) return;
@@ -705,7 +705,7 @@ void rasterizeFTA_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
if (N->v.y < R->v.y) return; if (N->v.y < R->v.y) return;
@@ -823,7 +823,7 @@ void rasterizeGTA_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
{ {
while (!Lh) while (!Lh)
{ {
const VertexLink* N = L->prev; const VertexLink* N = L + L->prev;
if (N->v.y < L->v.y) return; if (N->v.y < L->v.y) return;
@@ -851,7 +851,7 @@ void rasterizeGTA_c(uint16* pixel, const VertexLink* L, const VertexLink* R)
while (!Rh) while (!Rh)
{ {
const VertexLink* N = R->next; const VertexLink* N = R + R->next;
if (N->v.y < R->v.y) return; if (N->v.y < R->v.y) return;

View File

@@ -13,8 +13,9 @@ struct VertexLink
{ {
Vertex v; Vertex v;
TexCoord t; TexCoord t;
VertexLink* prev; int8 prev;
VertexLink* next; int8 next;
uint16 padding;
}; };
struct ViewportRel { struct ViewportRel {
@@ -637,16 +638,6 @@ X_NOINLINE void rasterize_c(uint32 flags, VertexLink* top)
top->v.clip = flags; // use tex coord as color index for untextured polys top->v.clip = flags; // use tex coord as color index for untextured polys
} }
#if defined(_WIN32)
if (type <= FACE_TYPE_GTA) {
VertexLink* t = top;
do {
ASSERT(t->v.x >= 0 && t->v.x <= FRAME_WIDTH && t->v.y >= 0 && t->v.y <= FRAME_HEIGHT);
t = t->next;
} while (t != top);
}
#endif
gRasterProc[type]((uint16*)pixel, top, top); gRasterProc[type]((uint16*)pixel, top, top);
} }
@@ -805,30 +796,30 @@ void renderInit()
extern "C" X_NOINLINE void drawTriangle(uint32 flags, VertexLink* v) extern "C" X_NOINLINE void drawTriangle(uint32 flags, VertexLink* v)
{ {
VertexLink* v1 = v + 0; VertexLink* v0 = v + 0;
VertexLink* v2 = v + 1; VertexLink* v1 = v + 1;
VertexLink* v3 = v + 2; VertexLink* v2 = v + 2;
v1->next = v2; v0->next = v1 - v0;
v2->next = v3; v1->next = v2 - v1;
v3->next = v1; v2->next = v0 - v2;
v1->prev = v3; v0->prev = v2 - v0;
v2->prev = v1; v1->prev = v0 - v1;
v3->prev = v2; v2->prev = v1 - v2;
VertexLink* top = v1; VertexLink* top;
if (v1->v.y < v2->v.y) { if (v0->v.y < v1->v.y) {
if (v1->v.y < v3->v.y) { if (v0->v.y < v2->v.y) {
top = v1; top = v0;
} else { } else {
top = v3; top = v2;
} }
} else { } else {
if (v2->v.y < v3->v.y) { if (v1->v.y < v2->v.y) {
top = v2; top = v1;
} else { } else {
top = v3; top = v2;
} }
} }
@@ -837,33 +828,33 @@ extern "C" X_NOINLINE void drawTriangle(uint32 flags, VertexLink* v)
extern "C" X_NOINLINE void drawQuad(uint32 flags, VertexLink* v) extern "C" X_NOINLINE void drawQuad(uint32 flags, VertexLink* v)
{ {
VertexLink* v1 = v + 0; VertexLink* v0 = v + 0;
VertexLink* v2 = v + 1; VertexLink* v1 = v + 1;
VertexLink* v3 = v + 2; VertexLink* v2 = v + 2;
VertexLink* v4 = v + 3; VertexLink* v3 = v + 3;
v1->next = v2; v0->next = v1 - v0;
v2->next = v3; v1->next = v2 - v1;
v3->next = v4; v2->next = v3 - v2;
v4->next = v1; v3->next = v0 - v3;
v1->prev = v4; v0->prev = v3 - v0;
v2->prev = v1; v1->prev = v0 - v1;
v3->prev = v2; v2->prev = v1 - v2;
v4->prev = v3; v3->prev = v2 - v3;
VertexLink* top; VertexLink* top;
if (v1->v.y < v2->v.y) { if (v0->v.y < v1->v.y) {
if (v1->v.y < v3->v.y) { if (v0->v.y < v2->v.y) {
top = (v1->v.y < v4->v.y) ? v1 : v4; top = (v0->v.y < v3->v.y) ? v0 : v3;
} else { } else {
top = (v3->v.y < v4->v.y) ? v3 : v4; top = (v2->v.y < v3->v.y) ? v2 : v3;
} }
} else { } else {
if (v2->v.y < v3->v.y) { if (v1->v.y < v2->v.y) {
top = (v2->v.y < v4->v.y) ? v2 : v4; top = (v1->v.y < v3->v.y) ? v1 : v3;
} else { } else {
top = (v3->v.y < v4->v.y) ? v3 : v4; top = (v2->v.y < v3->v.y) ? v2 : v3;
} }
} }
@@ -902,17 +893,30 @@ extern "C" X_NOINLINE void drawPoly(uint32 flags, VertexLink* v)
} }
VertexLink* top = v; VertexLink* top = v;
top->next = v + 1; top->next = (v + 1) - top;
top->prev = v + count - 1; top->prev = (v + count - 1) - top;
bool skip = true; bool skip = true;
for (int32 i = 1; i < count; i++) for (int32 i = 1; i < count; i++)
{ {
VertexLink *p = v + i; int8 next = i + 1;
int8 prev = i - 1;
p->next = v + (i + 1) % count; if (next >= count) {
p->prev = v + (i - 1 + count) % count; next -= count;
}
if (prev < 0) {
prev += count;
}
next -= i;
prev -= i;
VertexLink *p = v + i;
p->next = next;
p->prev = prev;
if (p->v.y != top->v.y) if (p->v.y != top->v.y)
{ {