diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt
index cb0f5cb8..278dda93 100644
--- a/config/SOUE01/splits.txt
+++ b/config/SOUE01/splits.txt
@@ -2191,6 +2191,7 @@ egg/gfx/eggCpuTexture.cpp:
egg/gfx/eggDrawGX.cpp:
.text start:0x8049ECA0 end:0x804A0C24
.ctors start:0x804DB998 end:0x804DB99C
+ .data start:0x8056EDA0 end:0x8056EE60
.sdata2 start:0x8057F440 end:0x8057F584
egg/gfx/eggDrawPathBase.cpp:
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index 6beb34a5..feea3c5c 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -41147,7 +41147,7 @@ sAssertCallback2__Q23EGG6Assert = .sbss:0x805767FC; // type:object size:0x4 data
sPtrOverride__Q23EGG6Assert = .sbss:0x80576800; // type:object size:0x4 data:4byte
sInstantHalt__Q23EGG6Assert = .sbss:0x80576804; // type:object size:0x1 data:byte
sAssertOccurred__Q23EGG6Assert = .sbss:0x80576805; // type:object size:0x1 data:byte
-lbl_80576808 = .sbss:0x80576808; // type:object size:0x4 data:4byte
+s_flag__Q23EGG6DrawGX = .sbss:0x80576808; // type:object size:0x4 data:4byte
EGG__DrawGX__sTexMapDefault = .sbss:0x8057680C; // type:object size:0x4 data:4byte
EGG__Frustum__sGlobalScale = .sbss:0x80576810; // type:object size:0x4 data:float
EGG__Frustum__sGlobalOffset = .sbss:0x80576818; // type:object size:0x4 data:float
diff --git a/src/egg/gfx/eggDrawGX.cpp b/src/egg/gfx/eggDrawGX.cpp
index f27d08af..0f3caa02 100644
--- a/src/egg/gfx/eggDrawGX.cpp
+++ b/src/egg/gfx/eggDrawGX.cpp
@@ -24,21 +24,17 @@ static void DrawCircleYPolygonFan(const nw4r::math::MTX34 &mtx, f32, u16) {}
namespace EGG {
+u8 sDetailLevels[] = {10, 20};
-extern "C" u8 lbl_8057F528[];
-// Halp
void DrawGX::CreateDisplayList(EGG::Heap *pHeap) {
- u8 tmpDisplayList[16 * 1024];
-
+ u8 ALIGN_DECL(32) tmpDisplayList[16 * 1024];
+
OSInitFastCast();
- DLData *dl = s_DL;
- u8 *dat = lbl_8057F528;
-
for (int i = 0; i < DL_MAX; i++) {
DCInvalidateRange(tmpDisplayList, sizeof(tmpDisplayList));
GXBeginDisplayList(tmpDisplayList, sizeof(tmpDisplayList));
- switch ((DL)i) {
+ switch (static_cast
(i)) {
case DL_0:
GXSetChanMatColor(GX_COLOR0A0, RED);
GXBegin(GX_LINES, GX_VTXFMT0, 2);
@@ -72,24 +68,24 @@ void DrawGX::CreateDisplayList(EGG::Heap *pHeap) {
case DL_4: GXDrawSphere(8, 16); break;
case DL_5:
case DL_6: {
- u16 numSegments = dat[i - DL_5] + 1;
+ u16 numSegments = sDetailLevels[i - DL_5] + 1;
f32 radPerSegment = 2.0f * M_PI / (numSegments - 1);
GXBegin(GX_LINESTRIP, GX_VTXFMT0, numSegments);
for (int i = 0; i < numSegments; i++) {
GXPosition3f32(
- nw4r::math::CosRad(i * radPerSegment) / 2.0f, nw4r::math::SinRad(i * radPerSegment) / 2.0f, 0.0f
+ 0.5f * nw4r::math::CosRad(radPerSegment * i), 0.5f * nw4r::math::SinRad(radPerSegment * i), 0.0f
);
}
break;
}
case DL_9:
case DL_10: {
- u16 numSegments = dat[i - DL_9] + 1;
+ u16 numSegments = sDetailLevels[i - DL_9] + 1;
f32 radPerSegment = 2.0f * M_PI / (numSegments - 1);
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, numSegments * 2);
for (int i = 0; i < numSegments; i++) {
- f32 x = 0.5f * nw4r::math::CosRad(i * radPerSegment);
- f32 z = 0.5f * nw4r::math::SinRad(i * radPerSegment);
+ f32 x = 0.5f * nw4r::math::SinRad(radPerSegment * i);
+ f32 z = 0.5f * nw4r::math::CosRad(radPerSegment * i);
GXPosition3f32(x, -0.5f, z);
GXPosition3f32(2.0f * x, 0.0f, 2.0f * z);
GXPosition3f32(x, 0.5f, z);
@@ -97,21 +93,21 @@ void DrawGX::CreateDisplayList(EGG::Heap *pHeap) {
}
nw4r::math::MTX34 mtx;
PSMTXTrans(mtx, 0.0f, 0.5f, 0.0f);
- DrawCircleYPolygonFan(mtx, 0.0f, dat[i - DL_9]);
+ DrawCircleYPolygonFan(mtx, 0.0f, sDetailLevels[i - DL_9]);
PSMTXIdentity(mtx);
PSMTXRotRad(mtx, M_PI, 0x7A);
PSMTXTransApply(mtx, mtx, 0.0f, -0.5f, 0.0f);
- DrawCircleYPolygonFan(mtx, 0.0f, dat[i - DL_9]);
+ DrawCircleYPolygonFan(mtx, 0.0f, sDetailLevels[i - DL_9]);
break;
}
case DL_11:
case DL_12: {
nw4r::math::MTX34 mtx;
PSMTXIdentity(mtx);
- DrawCircleYPolygonFan(mtx, 1.0f, dat[i - DL_11]);
+ DrawCircleYPolygonFan(mtx, 1.0f, sDetailLevels[i - DL_11]);
PSMTXRotRad(mtx, M_PI, 0x7A);
- DrawCircleYPolygonFan(mtx, 0.0f, dat[i - DL_11]);
+ DrawCircleYPolygonFan(mtx, 0.0f, sDetailLevels[i - DL_11]);
break;
}
case DL_7:
@@ -119,7 +115,7 @@ void DrawGX::CreateDisplayList(EGG::Heap *pHeap) {
nw4r::math::MTX34 mtx;
PSMTXIdentity(mtx);
PSMTXRotRad(mtx, M_PI / 2.0f, 0x78);
- DrawCircleYPolygonFan(mtx, 0.0f, dat[i - DL_7]);
+ DrawCircleYPolygonFan(mtx, 0.0f, sDetailLevels[i - DL_7]);
break;
}
@@ -128,19 +124,19 @@ void DrawGX::CreateDisplayList(EGG::Heap *pHeap) {
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition2u8(0, 0);
if (i == DL_13) {
- GXCmd1u8(0);
+ GXPosition1x8(0);
}
GXPosition2u8(1, 0);
if (i == DL_13) {
- GXCmd1u8(1);
+ GXPosition1x8(1);
}
GXPosition2u8(2, 0);
if (i == DL_13) {
- GXCmd1u8(2);
+ GXPosition1x8(2);
}
GXPosition2u8(3, 0);
if (i == DL_13) {
- GXCmd1u8(3);
+ GXPosition1x8(3);
}
break;
}
@@ -150,35 +146,35 @@ void DrawGX::CreateDisplayList(EGG::Heap *pHeap) {
GXPosition3f32(0.5f, 0.5f, 0.0f);
GXPosition3f32(0.5f, -0.5f, 0.0f);
GXPosition3f32(-0.5f, -0.5f, 0.0f);
- GXPosition3f32(0.5f, 0.5f, 0.0f);
+ GXPosition3f32(-0.5f, 0.5f, 0.0f);
break;
case DL_16:
case DL_17:
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
- GXCmd1u8(0);
+ GXPosition1x8(0);
if (i == DL_16) {
- GXCmd1u8(0);
+ GXPosition1x8(0);
}
- GXCmd1u8(1);
+ GXPosition1x8(1);
if (i == DL_16) {
- GXCmd1u8(1);
+ GXPosition1x8(1);
}
- GXCmd1u8(2);
+ GXPosition1x8(2);
if (i == DL_16) {
- GXCmd1u8(2);
+ GXPosition1x8(2);
}
- GXCmd1u8(3);
+ GXPosition1x8(3);
if (i == DL_16) {
- GXCmd1u8(3);
+ GXPosition1x8(3);
}
break;
- case DL_MAX:
- default: break;
+ default: break;
}
+
u32 size = GXEndDisplayList();
- dl[i].mLen = size;
- u8 *data = new (pHeap, 0x20) u8[(2 * size) - size];
- dl[i].mpList = data;
+ s_DL[i].mLen = size;
+ u8 *data = new (pHeap, 0x20) u8[size];
+ s_DL[i].mpList = data;
for (int j = 0; j < size; j++) {
data[j] = tmpDisplayList[j];
}