mirror of https://github.com/zeldaret/mm.git
parent
b2c3cc6a11
commit
663834cbc0
|
@ -0,0 +1,21 @@
|
||||||
|
<Root>
|
||||||
|
<File Name="d2_fine_static">
|
||||||
|
<Texture Name="gSkyboxClear1Tex" OutName="skybox_clear_1" Format="ci8" Width="128" Height="64" Offset="0x0" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0"/>
|
||||||
|
<Texture Name="gSkyboxClear2Tex" OutName="skybox_clear_2" Format="ci8" Width="128" Height="64" Offset="0x2000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0"/>
|
||||||
|
<Texture Name="gSkyboxClear3Tex" OutName="skybox_clear_3" Format="ci8" Width="128" Height="64" Offset="0x4000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0"/>
|
||||||
|
<Texture Name="gSkyboxClear4Tex" OutName="skybox_clear_4" Format="ci8" Width="128" Height="64" Offset="0x6000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0"/>
|
||||||
|
<Texture Name="gSkyboxClear5Tex" OutName="skybox_clear_5" Format="ci8" Width="128" Height="128" Offset="0x8000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0"/>
|
||||||
|
</File>
|
||||||
|
|
||||||
|
<File Name="d2_cloud_static">
|
||||||
|
<Texture Name="gSkyboxCloudy1Tex" OutName="skybox_cloudy_1" Format="ci8" Width="128" Height="64" Offset="0x0" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0"/>
|
||||||
|
<Texture Name="gSkyboxCloudy2Tex" OutName="skybox_cloudy_2" Format="ci8" Width="128" Height="64" Offset="0x2000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0" />
|
||||||
|
<Texture Name="gSkyboxCloudy3Tex" OutName="skybox_cloudy_3" Format="ci8" Width="128" Height="64" Offset="0x4000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0" />
|
||||||
|
<Texture Name="gSkyboxCloudy4Tex" OutName="skybox_cloudy_4" Format="ci8" Width="128" Height="64" Offset="0x6000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0" />
|
||||||
|
<Texture Name="gSkyboxCloudy5Tex" OutName="skybox_cloudy_5" Format="ci8" Width="128" Height="128" Offset="0x8000" ExternalTlut="d2_fine_pal_static" ExternalTlutOffset="0x0" />
|
||||||
|
</File>
|
||||||
|
|
||||||
|
<File Name="d2_fine_pal_static">
|
||||||
|
<Texture Name="gSkyboxTLUT" OutName="skybox_tlut" Format="rgba16" Width="16" Height="16" Offset="0x0"/>
|
||||||
|
</File>
|
||||||
|
</Root>
|
|
@ -24,16 +24,16 @@ typedef enum SkyboxId {
|
||||||
typedef struct SkyboxContext {
|
typedef struct SkyboxContext {
|
||||||
/* 0x000 */ View view;
|
/* 0x000 */ View view;
|
||||||
/* 0x168 */ void* staticSegments[4];
|
/* 0x168 */ void* staticSegments[4];
|
||||||
/* 0x178 */ void* paletteStaticSegment;
|
/* 0x178 */ void* palette;
|
||||||
/* 0x17C */ Gfx (*dListBuf)[150];
|
/* 0x17C */ Gfx (*dListBuf)[150];
|
||||||
/* 0x180 */ Gfx* roomDL;
|
/* 0x180 */ Gfx* gfx;
|
||||||
/* 0x184 */ Vtx* roomVtx;
|
/* 0x184 */ Vtx* roomVtx;
|
||||||
/* 0x188 */ DmaRequest unk188;
|
/* 0x188 */ DmaRequest skybox1DmaRequest;
|
||||||
/* 0x1A8 */ DmaRequest unk1A8;
|
/* 0x1A8 */ DmaRequest skybox2DmaRequest;
|
||||||
/* 0x1C8 */ DmaRequest unk1C8;
|
/* 0x1C8 */ DmaRequest paletteDmaRequest;
|
||||||
/* 0x1E8 */ OSMesgQueue loadQueue;
|
/* 0x1E8 */ OSMesgQueue loadQueue;
|
||||||
/* 0x200 */ OSMesg loadMsg;
|
/* 0x200 */ OSMesg loadMsg[1];
|
||||||
/* 0x204 */ s16 skyboxShouldDraw;
|
/* 0x204 */ s16 shouldDraw;
|
||||||
/* 0x208 */ Vec3f rot;
|
/* 0x208 */ Vec3f rot;
|
||||||
/* 0x214 */ Vec3f eye;
|
/* 0x214 */ Vec3f eye;
|
||||||
/* 0x220 */ s16 angle;
|
/* 0x220 */ s16 angle;
|
||||||
|
@ -41,18 +41,7 @@ typedef struct SkyboxContext {
|
||||||
/* 0x225 */ Color_RGB8 env;
|
/* 0x225 */ Color_RGB8 env;
|
||||||
} SkyboxContext; // size = 0x228
|
} SkyboxContext; // size = 0x228
|
||||||
|
|
||||||
typedef struct struct_801C5F44 {
|
void Skybox_Reload(struct PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId);
|
||||||
/* 0x00 */ s32 unk0;
|
|
||||||
/* 0x04 */ s32 unk4;
|
|
||||||
/* 0x08 */ s32 unk8;
|
|
||||||
/* 0x0C */ s32 unkC;
|
|
||||||
/* 0x10 */ s32 unk10;
|
|
||||||
} struct_801C5F44; // size = 0x14
|
|
||||||
|
|
||||||
s32 func_80142440(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8);
|
|
||||||
void func_80143148(SkyboxContext* skyboxCtx, s32 arg1);
|
|
||||||
void Skybox_Setup(struct GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId);
|
|
||||||
void func_80143324(struct PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId);
|
|
||||||
void Skybox_Init(struct GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId);
|
void Skybox_Init(struct GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId);
|
||||||
Mtx* Skybox_UpdateMatrix(SkyboxContext* skyboxCtx, f32 x, f32 y, f32 z);
|
Mtx* Skybox_UpdateMatrix(SkyboxContext* skyboxCtx, f32 x, f32 y, f32 z);
|
||||||
void Skybox_SetColors(SkyboxContext* skyboxCtx, u8 primR, u8 primG, u8 primB, u8 envR, u8 envG, u8 envB);
|
void Skybox_SetColors(SkyboxContext* skyboxCtx, u8 primR, u8 primG, u8 primB, u8 envR, u8 envG, u8 envB);
|
||||||
|
|
6
spec
6
spec
|
@ -8861,21 +8861,21 @@ beginseg
|
||||||
name "d2_fine_static"
|
name "d2_fine_static"
|
||||||
compress
|
compress
|
||||||
romalign 0x1000
|
romalign 0x1000
|
||||||
include "build/baserom/d2_fine_static.o"
|
include "build/assets/misc/skyboxes/d2_fine_static.o"
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "d2_cloud_static"
|
name "d2_cloud_static"
|
||||||
compress
|
compress
|
||||||
romalign 0x1000
|
romalign 0x1000
|
||||||
include "build/baserom/d2_cloud_static.o"
|
include "build/assets/misc/skyboxes/d2_cloud_static.o"
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "d2_fine_pal_static"
|
name "d2_fine_pal_static"
|
||||||
compress
|
compress
|
||||||
romalign 0x1000
|
romalign 0x1000
|
||||||
include "build/baserom/d2_fine_pal_static.o"
|
include "build/assets/misc/skyboxes/d2_fine_pal_static.o"
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
|
|
|
@ -1140,7 +1140,7 @@ void Play_DrawMain(PlayState* this) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTransitionTileState <= TRANS_TILE_SETUP)) {
|
if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTransitionTileState <= TRANS_TILE_SETUP)) {
|
||||||
if (this->skyboxCtx.skyboxShouldDraw || (this->roomCtx.curRoom.roomShape->base.type == ROOM_SHAPE_TYPE_IMAGE)) {
|
if (this->skyboxCtx.shouldDraw || (this->roomCtx.curRoom.roomShape->base.type == ROOM_SHAPE_TYPE_IMAGE)) {
|
||||||
func_8012CF0C(gfxCtx, false, true, 0, 0, 0);
|
func_8012CF0C(gfxCtx, false, true, 0, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
func_8012CF0C(gfxCtx, true, true, this->lightCtx.fogColor[0], this->lightCtx.fogColor[1],
|
func_8012CF0C(gfxCtx, true, true, this->lightCtx.fogColor[0], this->lightCtx.fogColor[1],
|
||||||
|
@ -1282,7 +1282,7 @@ void Play_DrawMain(PlayState* this) {
|
||||||
Environment_UpdateSkybox(this->skyboxId, &this->envCtx, &this->skyboxCtx);
|
Environment_UpdateSkybox(this->skyboxId, &this->envCtx, &this->skyboxCtx);
|
||||||
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.skyboxBlend,
|
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.skyboxBlend,
|
||||||
this->view.eye.x, this->view.eye.y, this->view.eye.z);
|
this->view.eye.x, this->view.eye.y, this->view.eye.z);
|
||||||
} else if (!this->skyboxCtx.skyboxShouldDraw) {
|
} else if (!this->skyboxCtx.shouldDraw) {
|
||||||
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y,
|
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y,
|
||||||
this->view.eye.z);
|
this->view.eye.z);
|
||||||
}
|
}
|
||||||
|
@ -1310,7 +1310,7 @@ void Play_DrawMain(PlayState* this) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->skyboxCtx.skyboxShouldDraw) {
|
if (this->skyboxCtx.shouldDraw) {
|
||||||
Vec3f quakeOffset;
|
Vec3f quakeOffset;
|
||||||
|
|
||||||
if (1) {
|
if (1) {
|
||||||
|
|
|
@ -1,95 +1,132 @@
|
||||||
|
#include "z64skybox.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "buffers.h"
|
#include "buffers.h"
|
||||||
|
|
||||||
u32 D_801C5E30[] = { 0, 0x2000, 0x4000, 0x6000, 0x8000, 0xC000 };
|
typedef struct SkyboxFaceParams {
|
||||||
|
/* 0x00 */ s32 xStart;
|
||||||
|
/* 0x04 */ s32 yStart;
|
||||||
|
/* 0x08 */ s32 zStart;
|
||||||
|
/* 0x0C */ s32 outerIncrVal;
|
||||||
|
/* 0x10 */ s32 innerIncrVal;
|
||||||
|
} SkyboxFaceParams; // size = 0x14
|
||||||
|
|
||||||
u16 D_801C5E48[] = {
|
// Converts texture coordinate values to s10.5 fixed point
|
||||||
|
#define TC(x) ((s16)((x)*32))
|
||||||
|
|
||||||
|
// Texture offsets for each face in the static segment buffer
|
||||||
|
u32 sSkybox128TexOffsets[] = {
|
||||||
|
128 * 64 * 0, 128 * 64 * 1, 128 * 64 * 2, 128 * 64 * 3, 128 * 64 * 4, 128 * 64 * 4 + 128 * 128,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Maps vertex buffer index to coordinate buffer index
|
||||||
|
u16 sSkybox128VtxBufIndices[] = {
|
||||||
0, 2, 10, 12, 2, 4, 12, 14, 10, 12, 20, 22, 12, 14, 22, 24, 1, 3, 5, 6, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19, 21, 23,
|
0, 2, 10, 12, 2, 4, 12, 14, 10, 12, 20, 22, 12, 14, 22, 24, 1, 3, 5, 6, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19, 21, 23,
|
||||||
};
|
};
|
||||||
s32 D_801C5E88[] = { 0, 62 << 5, 124 << 5, 186 << 5, 248 << 5 };
|
|
||||||
|
|
||||||
s32 D_801C5E9C[] = { 0, 62 << 5, 124 << 5, 186 << 5, 248 << 5 };
|
// S coordinates for all faces
|
||||||
|
s32 sSkybox128TexSCoords[] = {
|
||||||
|
TC(62 * 0), TC(62 * 1), TC(62 * 2), TC(62 * 3), TC(62 * 4),
|
||||||
|
};
|
||||||
|
|
||||||
s32 D_801C5EB0[] = { 0, 62 << 5, 124 << 5, 62 << 5, 0 };
|
// T coordinates for top and bottom faces
|
||||||
|
s32 sSkybox128TexTCoordsXZ[] = {
|
||||||
|
TC(62 * 0), TC(62 * 1), TC(62 * 2), TC(62 * 3), TC(62 * 4),
|
||||||
|
};
|
||||||
|
|
||||||
s16 D_801C5EC4[] = {
|
// T coordinates for side faces
|
||||||
|
s32 sSkybox128TexTCoords[] = {
|
||||||
|
TC(62 * 0), TC(62 * 1), TC(62 * 2), TC(62 * 1), TC(62 * 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Maps vertex index to vertex buffer index
|
||||||
|
s16 sSkybox128VtxIndices[] = {
|
||||||
0, 16, 19, 18, 16, 1, 20, 19, 1, 17, 21, 20, 17, 5, 22, 21, 18, 19, 23, 2, 19, 20,
|
0, 16, 19, 18, 16, 1, 20, 19, 1, 17, 21, 20, 17, 5, 22, 21, 18, 19, 23, 2, 19, 20,
|
||||||
3, 23, 20, 21, 24, 3, 21, 22, 7, 24, 2, 23, 26, 25, 23, 3, 27, 26, 3, 24, 28, 27,
|
3, 23, 20, 21, 24, 3, 21, 22, 7, 24, 2, 23, 26, 25, 23, 3, 27, 26, 3, 24, 28, 27,
|
||||||
24, 7, 29, 28, 25, 26, 30, 10, 26, 27, 11, 30, 27, 28, 31, 11, 28, 29, 15, 31,
|
24, 7, 29, 28, 25, 26, 30, 10, 26, 27, 11, 30, 27, 28, 31, 11, 28, 29, 15, 31,
|
||||||
};
|
};
|
||||||
|
|
||||||
s32 func_80142440(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7,
|
/**
|
||||||
s32 arg8) {
|
* Build the vertex and display list data for a skybox with 128x128 and 128x64 face textures.
|
||||||
|
*
|
||||||
|
* While the textures are nominally 128x128 (128x64) the 4x4 (4x2) tiles that cover it are only 31x31,
|
||||||
|
* therefore only a 125x125 (125x63) area is ever sampled (125 = 4 * 31 + 1, the additional +1 accounts for bilinear
|
||||||
|
* filtering)
|
||||||
|
*
|
||||||
|
* Each texture dimension is padded to the next power of 2, resulting in a final size of 128x128 (128x64)
|
||||||
|
*/
|
||||||
|
s32 Skybox_CalculateFace128(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 roomVtxStartIndex, s32 xStart, s32 yStart,
|
||||||
|
s32 zStart, s32 innerIncrVal, s32 outerIncrVal, s32 faceNum) {
|
||||||
s32 i;
|
s32 i;
|
||||||
s32 j;
|
s32 j;
|
||||||
s32 k;
|
s32 k;
|
||||||
s16 phi_a0_4;
|
s16 uls;
|
||||||
s16 phi_t1;
|
s16 m;
|
||||||
s32 temp1;
|
s32 outerIncr;
|
||||||
u16 index;
|
u16 index;
|
||||||
s16 phi_a2_4;
|
s16 ult;
|
||||||
s16 phi_ra;
|
s16 l;
|
||||||
s16 phi_t2_4;
|
s16 vtxIndex;
|
||||||
s32 temp2;
|
s32 innerIncr;
|
||||||
s32 roomVtxPosX[5 * 5];
|
s32 xPoints[5 * 5];
|
||||||
s32 roomVtxPosY[5 * 5];
|
s32 yPoints[5 * 5];
|
||||||
s32 roomVtxPosZ[5 * 5];
|
s32 zPoints[5 * 5];
|
||||||
s32 roomVtxTexU[5 * 5];
|
s32 tcS[5 * 5];
|
||||||
s32 roomVtxTexV[5 * 5];
|
s32 tcT[5 * 5];
|
||||||
s32 pad;
|
s32 pad;
|
||||||
|
|
||||||
switch (arg8) {
|
// Collect all vertex positions for this face
|
||||||
case 0:
|
switch (faceNum) {
|
||||||
|
case 0: // xy plane
|
||||||
case 1:
|
case 1:
|
||||||
temp1 = arg4;
|
outerIncr = yStart;
|
||||||
|
|
||||||
for (i = 0, k = 0; k < 25; i++) {
|
for (i = 0, k = 0; k < 25; i++) {
|
||||||
temp2 = arg3;
|
innerIncr = xStart;
|
||||||
for (j = 0; j < 5; j++, k++) {
|
for (j = 0; j < 5; j++, k++) {
|
||||||
roomVtxPosZ[k] = arg5;
|
zPoints[k] = zStart;
|
||||||
roomVtxPosX[k] = temp2;
|
xPoints[k] = innerIncr;
|
||||||
roomVtxPosY[k] = temp1;
|
yPoints[k] = outerIncr;
|
||||||
roomVtxTexU[k] = D_801C5E88[j];
|
tcS[k] = sSkybox128TexSCoords[j];
|
||||||
roomVtxTexV[k] = D_801C5EB0[i];
|
tcT[k] = sSkybox128TexTCoords[i];
|
||||||
temp2 += arg6;
|
innerIncr += innerIncrVal;
|
||||||
}
|
}
|
||||||
temp1 += arg7;
|
outerIncr += outerIncrVal;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2: // yz plane
|
||||||
case 3:
|
case 3:
|
||||||
temp1 = arg4;
|
outerIncr = yStart;
|
||||||
|
|
||||||
for (i = 0, k = 0; k < 25; i++) {
|
for (i = 0, k = 0; k < 25; i++) {
|
||||||
temp2 = arg5;
|
innerIncr = zStart;
|
||||||
for (j = 0; j < 5; j++, k++) {
|
for (j = 0; j < 5; j++, k++) {
|
||||||
roomVtxPosX[k] = arg3;
|
xPoints[k] = xStart;
|
||||||
roomVtxPosY[k] = temp1;
|
yPoints[k] = outerIncr;
|
||||||
roomVtxPosZ[k] = temp2;
|
zPoints[k] = innerIncr;
|
||||||
roomVtxTexU[k] = D_801C5E88[j];
|
tcS[k] = sSkybox128TexSCoords[j];
|
||||||
roomVtxTexV[k] = D_801C5EB0[i];
|
tcT[k] = sSkybox128TexTCoords[i];
|
||||||
temp2 += arg6;
|
innerIncr += innerIncrVal;
|
||||||
}
|
}
|
||||||
temp1 += arg7;
|
outerIncr += outerIncrVal;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4: // xz plane
|
||||||
case 5:
|
case 5:
|
||||||
temp1 = arg5;
|
outerIncr = zStart;
|
||||||
|
|
||||||
for (i = 0, k = 0; k < 25; i++) {
|
for (i = 0, k = 0; k < 25; i++) {
|
||||||
temp2 = arg3;
|
innerIncr = xStart;
|
||||||
for (j = 0; j < 5; j++, k++) {
|
for (j = 0; j < 5; j++, k++) {
|
||||||
roomVtxPosY[k] = arg4;
|
yPoints[k] = yStart;
|
||||||
roomVtxPosX[k] = temp2;
|
xPoints[k] = innerIncr;
|
||||||
roomVtxPosZ[k] = temp1;
|
zPoints[k] = outerIncr;
|
||||||
roomVtxTexU[k] = D_801C5E88[j];
|
tcS[k] = sSkybox128TexSCoords[j];
|
||||||
roomVtxTexV[k] = D_801C5E9C[i];
|
tcT[k] = sSkybox128TexTCoordsXZ[i];
|
||||||
temp2 += arg6;
|
innerIncr += innerIncrVal;
|
||||||
}
|
}
|
||||||
temp1 += arg7;
|
outerIncr += outerIncrVal;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -97,90 +134,106 @@ s32 func_80142440(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
skyboxCtx->roomDL = &skyboxCtx->dListBuf[2 * arg8][0];
|
// Select gfx buffer
|
||||||
|
skyboxCtx->gfx = &skyboxCtx->dListBuf[2 * faceNum][0];
|
||||||
|
|
||||||
for (i = 0; i < 0x20; i++) {
|
// Generate and load Vertex structures
|
||||||
index = D_801C5E48[i];
|
for (i = 0; i < ARRAY_COUNT(sSkybox128VtxBufIndices); i++) {
|
||||||
|
index = sSkybox128VtxBufIndices[i];
|
||||||
|
|
||||||
roomVtx[arg2 + i].v.ob[0] = roomVtxPosX[index];
|
roomVtx[roomVtxStartIndex + i].v.ob[0] = xPoints[index];
|
||||||
roomVtx[arg2 + i].v.ob[1] = roomVtxPosY[index];
|
roomVtx[roomVtxStartIndex + i].v.ob[1] = yPoints[index];
|
||||||
roomVtx[arg2 + i].v.ob[2] = roomVtxPosZ[index];
|
roomVtx[roomVtxStartIndex + i].v.ob[2] = zPoints[index];
|
||||||
roomVtx[arg2 + i].v.flag = 0;
|
roomVtx[roomVtxStartIndex + i].v.flag = 0;
|
||||||
roomVtx[arg2 + i].v.tc[0] = roomVtxTexU[index];
|
roomVtx[roomVtxStartIndex + i].v.tc[0] = tcS[index];
|
||||||
roomVtx[arg2 + i].v.tc[1] = roomVtxTexV[index];
|
roomVtx[roomVtxStartIndex + i].v.tc[1] = tcT[index];
|
||||||
roomVtx[arg2 + i].v.cn[1] = 0;
|
roomVtx[roomVtxStartIndex + i].v.cn[1] = 0;
|
||||||
roomVtx[arg2 + i].v.cn[2] = 0;
|
roomVtx[roomVtxStartIndex + i].v.cn[2] = 0;
|
||||||
roomVtx[arg2 + i].v.cn[0] = 255;
|
roomVtx[roomVtxStartIndex + i].v.cn[0] = 255;
|
||||||
}
|
}
|
||||||
gSPVertex(skyboxCtx->roomDL++, &roomVtx[arg2], 32, 0);
|
gSPVertex(skyboxCtx->gfx++, &roomVtx[roomVtxStartIndex], 32, 0);
|
||||||
arg2 += i;
|
roomVtxStartIndex += i; // += 32
|
||||||
gSPCullDisplayList(skyboxCtx->roomDL++, 0, 15);
|
|
||||||
|
|
||||||
if ((arg8 == 4) || (arg8 == 5)) {
|
// Cull the face if not within the viewing volume
|
||||||
phi_a2_4 = 0;
|
gSPCullDisplayList(skyboxCtx->gfx++, 0, 15);
|
||||||
for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 4; phi_ra++, phi_a2_4 += 0x1F) {
|
|
||||||
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) {
|
// Draw face, load the texture in several tiles to work around TMEM size limitations
|
||||||
gDPLoadMultiTile(skyboxCtx->roomDL++, (uintptr_t)skyboxCtx->staticSegments[0] + D_801C5E30[arg8], 0,
|
if ((faceNum == 4) || (faceNum == 5)) {
|
||||||
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
|
// top/bottom faces, 128x128 texture
|
||||||
phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD,
|
ult = 0;
|
||||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
for (vtxIndex = 0, l = 0; l < 4; l++, ult += 31) {
|
||||||
gDPLoadMultiTile(skyboxCtx->roomDL++, (uintptr_t)skyboxCtx->staticSegments[1] + D_801C5E30[arg8], 0x80,
|
for (uls = 0, m = 0; m < 4; m++, uls += 31, vtxIndex += 4) {
|
||||||
1, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
|
gDPLoadMultiTile(skyboxCtx->gfx++,
|
||||||
phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD,
|
(uintptr_t)skyboxCtx->staticSegments[0] + sSkybox128TexOffsets[faceNum], 0,
|
||||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, uls, ult, uls + 31, ult + 31, 0,
|
||||||
gSP1Quadrangle(skyboxCtx->roomDL++, D_801C5EC4[phi_t2_4 + 1], D_801C5EC4[phi_t2_4 + 2],
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP,
|
||||||
D_801C5EC4[phi_t2_4 + 3], D_801C5EC4[phi_t2_4 + 0], 3);
|
G_TX_NOMASK, G_TX_NOLOD);
|
||||||
|
gDPLoadMultiTile(
|
||||||
|
skyboxCtx->gfx++, (uintptr_t)skyboxCtx->staticSegments[1] + sSkybox128TexOffsets[faceNum], 0x80, 1,
|
||||||
|
G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, uls, ult, uls + 31, ult + 31, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||||
|
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
||||||
|
gSP1Quadrangle(skyboxCtx->gfx++, sSkybox128VtxIndices[vtxIndex + 1], sSkybox128VtxIndices[vtxIndex + 2],
|
||||||
|
sSkybox128VtxIndices[vtxIndex + 3], sSkybox128VtxIndices[vtxIndex + 0], 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
phi_a2_4 = 0;
|
// other faces, 128x64 texture
|
||||||
for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 2; phi_ra++, phi_a2_4 += 0x1F) {
|
ult = 0;
|
||||||
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) {
|
for (vtxIndex = 0, l = 0; l < 2; l++, ult += 31) {
|
||||||
gDPLoadMultiTile(skyboxCtx->roomDL++, (uintptr_t)skyboxCtx->staticSegments[0] + D_801C5E30[arg8], 0,
|
for (uls = 0, m = 0; m < 4; m++, uls += 31, vtxIndex += 4) {
|
||||||
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
|
gDPLoadMultiTile(skyboxCtx->gfx++,
|
||||||
phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD,
|
(uintptr_t)skyboxCtx->staticSegments[0] + sSkybox128TexOffsets[faceNum], 0,
|
||||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, uls, ult, uls + 31, ult + 31, 0,
|
||||||
gDPLoadMultiTile(skyboxCtx->roomDL++, (uintptr_t)skyboxCtx->staticSegments[1] + D_801C5E30[arg8], 0x80,
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP,
|
||||||
1, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
|
G_TX_NOMASK, G_TX_NOLOD);
|
||||||
phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD,
|
gDPLoadMultiTile(
|
||||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
skyboxCtx->gfx++, (uintptr_t)skyboxCtx->staticSegments[1] + sSkybox128TexOffsets[faceNum], 0x80, 1,
|
||||||
gSP1Quadrangle(skyboxCtx->roomDL++, D_801C5EC4[phi_t2_4 + 1], D_801C5EC4[phi_t2_4 + 2],
|
G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, uls, ult, uls + 31, ult + 31, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||||
D_801C5EC4[phi_t2_4 + 3], D_801C5EC4[phi_t2_4 + 0], 3);
|
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
||||||
|
gSP1Quadrangle(skyboxCtx->gfx++, sSkybox128VtxIndices[vtxIndex + 1], sSkybox128VtxIndices[vtxIndex + 2],
|
||||||
|
sSkybox128VtxIndices[vtxIndex + 3], sSkybox128VtxIndices[vtxIndex + 0], 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
phi_a2_4 -= 0x1F;
|
ult -= 31;
|
||||||
for (phi_ra = 0; phi_ra < 2; phi_ra++, phi_a2_4 -= 0x1F) {
|
for (l = 0; l < 2; l++, ult -= 31) {
|
||||||
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) {
|
for (uls = 0, m = 0; m < 4; m++, uls += 31, vtxIndex += 4) {
|
||||||
gDPLoadMultiTile(skyboxCtx->roomDL++, (uintptr_t)skyboxCtx->staticSegments[0] + D_801C5E30[arg8], 0,
|
gDPLoadMultiTile(skyboxCtx->gfx++,
|
||||||
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
|
(uintptr_t)skyboxCtx->staticSegments[0] + sSkybox128TexOffsets[faceNum], 0,
|
||||||
phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD,
|
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, uls, ult, uls + 31, ult + 31, 0,
|
||||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP,
|
||||||
gDPLoadMultiTile(skyboxCtx->roomDL++, (uintptr_t)skyboxCtx->staticSegments[1] + D_801C5E30[arg8], 0x80,
|
G_TX_NOMASK, G_TX_NOLOD);
|
||||||
1, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
|
gDPLoadMultiTile(
|
||||||
phi_a2_4 + 0x1F, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD,
|
skyboxCtx->gfx++, (uintptr_t)skyboxCtx->staticSegments[1] + sSkybox128TexOffsets[faceNum], 0x80, 1,
|
||||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, uls, ult, uls + 31, ult + 31, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||||
gSP1Quadrangle(skyboxCtx->roomDL++, D_801C5EC4[phi_t2_4 + 1], D_801C5EC4[phi_t2_4 + 2],
|
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
||||||
D_801C5EC4[phi_t2_4 + 3], D_801C5EC4[phi_t2_4 + 0], 3);
|
gSP1Quadrangle(skyboxCtx->gfx++, sSkybox128VtxIndices[vtxIndex + 1], sSkybox128VtxIndices[vtxIndex + 2],
|
||||||
|
sSkybox128VtxIndices[vtxIndex + 3], sSkybox128VtxIndices[vtxIndex + 0], 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gSPEndDisplayList(skyboxCtx->roomDL++);
|
|
||||||
return arg2;
|
gSPEndDisplayList(skyboxCtx->gfx++);
|
||||||
|
return roomVtxStartIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80143148(SkyboxContext* skyboxCtx, s32 arg1) {
|
SkyboxFaceParams sSkybox128FaceParams[] = {
|
||||||
static struct_801C5F44 D_801C5F44[] = {
|
|
||||||
{ -64, 64, -64, 32, -32 }, { 64, 64, 64, -32, -32 }, { -64, 64, 64, -32, -32 },
|
{ -64, 64, -64, 32, -32 }, { 64, 64, 64, -32, -32 }, { -64, 64, 64, -32, -32 },
|
||||||
{ 64, 64, -64, 32, -32 }, { -64, 64, 64, 32, -32 }, { -64, -64, -64, 32, 32 },
|
{ 64, 64, -64, 32, -32 }, { -64, 64, 64, 32, -32 }, { -64, -64, -64, 32, 32 },
|
||||||
};
|
};
|
||||||
s32 ret = 0;
|
|
||||||
struct_801C5F44* unkStruct;
|
|
||||||
s32 face;
|
|
||||||
|
|
||||||
for (face = 0; face < arg1; face++) {
|
/**
|
||||||
unkStruct = &D_801C5F44[face];
|
* Computes the display list for a skybox with up to 6 faces, where the sides are 128x64 CI8 textures and the
|
||||||
ret = func_80142440(skyboxCtx, skyboxCtx->roomVtx, ret, unkStruct->unk0, unkStruct->unk4, unkStruct->unk8,
|
* top/bottom faces are 128x128 CI8 textures.
|
||||||
unkStruct->unkC, unkStruct->unk10, face);
|
*/
|
||||||
|
void Skybox_Calculate128(SkyboxContext* skyboxCtx, s32 nFaces) {
|
||||||
|
s32 roomVtxStartIndex = 0;
|
||||||
|
s32 faceNum;
|
||||||
|
|
||||||
|
for (faceNum = 0; faceNum < nFaces; faceNum++) {
|
||||||
|
roomVtxStartIndex = Skybox_CalculateFace128(
|
||||||
|
skyboxCtx, skyboxCtx->roomVtx, roomVtxStartIndex, sSkybox128FaceParams[faceNum].xStart,
|
||||||
|
sSkybox128FaceParams[faceNum].yStart, sSkybox128FaceParams[faceNum].zStart,
|
||||||
|
sSkybox128FaceParams[faceNum].outerIncrVal, sSkybox128FaceParams[faceNum].innerIncrVal, faceNum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,10 +259,10 @@ void Skybox_Setup(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId)
|
||||||
DmaMgr_RequestSync(skyboxCtx->staticSegments[1], SEGMENT_ROM_START(d2_fine_static), size);
|
DmaMgr_RequestSync(skyboxCtx->staticSegments[1], SEGMENT_ROM_START(d2_fine_static), size);
|
||||||
|
|
||||||
// Send a DMA request for the skybox palette
|
// Send a DMA request for the skybox palette
|
||||||
skyboxCtx->paletteStaticSegment = segment;
|
skyboxCtx->palette = segment;
|
||||||
size = SEGMENT_ROM_SIZE(d2_fine_pal_static);
|
size = SEGMENT_ROM_SIZE(d2_fine_pal_static);
|
||||||
segment = (void*)ALIGN8((uintptr_t)segment + size);
|
segment = (void*)ALIGN8((uintptr_t)segment + size);
|
||||||
DmaMgr_RequestSync(skyboxCtx->paletteStaticSegment, SEGMENT_ROM_START(d2_fine_pal_static), size);
|
DmaMgr_RequestSync(skyboxCtx->palette, SEGMENT_ROM_START(d2_fine_pal_static), size);
|
||||||
|
|
||||||
skyboxCtx->prim.r = 145;
|
skyboxCtx->prim.r = 145;
|
||||||
skyboxCtx->prim.g = 120;
|
skyboxCtx->prim.g = 120;
|
||||||
|
@ -233,51 +286,51 @@ void Skybox_Setup(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
|
void Skybox_Reload(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
switch (skyboxId) {
|
switch (skyboxId) {
|
||||||
case SKYBOX_NORMAL_SKY:
|
case SKYBOX_NORMAL_SKY:
|
||||||
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
|
osCreateMesgQueue(&skyboxCtx->loadQueue, skyboxCtx->loadMsg, ARRAY_COUNT(skyboxCtx->loadMsg));
|
||||||
|
|
||||||
if (play->envCtx.skybox1Index == 0) {
|
if (play->envCtx.skybox1Index == 0) {
|
||||||
// Send a DMA request for the clear sky texture
|
// Send a DMA request for the clear sky texture
|
||||||
size = SEGMENT_ROM_SIZE(d2_fine_static);
|
size = SEGMENT_ROM_SIZE(d2_fine_static);
|
||||||
|
|
||||||
DmaMgr_RequestAsync(&skyboxCtx->unk188, skyboxCtx->staticSegments[0], SEGMENT_ROM_START(d2_fine_static),
|
DmaMgr_RequestAsync(&skyboxCtx->skybox1DmaRequest, skyboxCtx->staticSegments[0],
|
||||||
size, 0, &skyboxCtx->loadQueue, NULL);
|
SEGMENT_ROM_START(d2_fine_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
||||||
} else {
|
} else {
|
||||||
// Send a DMA request for the cloudy sky texture
|
// Send a DMA request for the cloudy sky texture
|
||||||
size = SEGMENT_ROM_SIZE(d2_cloud_static);
|
size = SEGMENT_ROM_SIZE(d2_cloud_static);
|
||||||
|
|
||||||
DmaMgr_RequestAsync(&skyboxCtx->unk188, skyboxCtx->staticSegments[0],
|
DmaMgr_RequestAsync(&skyboxCtx->skybox1DmaRequest, skyboxCtx->staticSegments[0],
|
||||||
SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
||||||
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
|
osCreateMesgQueue(&skyboxCtx->loadQueue, skyboxCtx->loadMsg, ARRAY_COUNT(skyboxCtx->loadMsg));
|
||||||
|
|
||||||
if (play->envCtx.skybox2Index == 0) {
|
if (play->envCtx.skybox2Index == 0) {
|
||||||
// Send a DMA request for the clear sky texture
|
// Send a DMA request for the clear sky texture
|
||||||
size = SEGMENT_ROM_SIZE(d2_fine_static);
|
size = SEGMENT_ROM_SIZE(d2_fine_static);
|
||||||
|
|
||||||
DmaMgr_RequestAsync(&skyboxCtx->unk1A8, skyboxCtx->staticSegments[1], SEGMENT_ROM_START(d2_fine_static),
|
DmaMgr_RequestAsync(&skyboxCtx->skybox2DmaRequest, skyboxCtx->staticSegments[1],
|
||||||
size, 0, &skyboxCtx->loadQueue, NULL);
|
SEGMENT_ROM_START(d2_fine_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
||||||
} else {
|
} else {
|
||||||
// Send a DMA request for the cloudy sky texture
|
// Send a DMA request for the cloudy sky texture
|
||||||
size = SEGMENT_ROM_SIZE(d2_cloud_static);
|
size = SEGMENT_ROM_SIZE(d2_cloud_static);
|
||||||
|
|
||||||
DmaMgr_RequestAsync(&skyboxCtx->unk1A8, skyboxCtx->staticSegments[1],
|
DmaMgr_RequestAsync(&skyboxCtx->skybox2DmaRequest, skyboxCtx->staticSegments[1],
|
||||||
SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
||||||
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
|
osCreateMesgQueue(&skyboxCtx->loadQueue, skyboxCtx->loadMsg, ARRAY_COUNT(skyboxCtx->loadMsg));
|
||||||
|
|
||||||
size = SEGMENT_ROM_SIZE(d2_fine_pal_static);
|
size = SEGMENT_ROM_SIZE(d2_fine_pal_static);
|
||||||
|
|
||||||
// Send a DMA request for the skybox palette
|
// Send a DMA request for the skybox palette
|
||||||
DmaMgr_RequestAsync(&skyboxCtx->unk1C8, skyboxCtx->paletteStaticSegment,
|
DmaMgr_RequestAsync(&skyboxCtx->paletteDmaRequest, skyboxCtx->palette,
|
||||||
SEGMENT_ROM_START(d2_fine_pal_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
SEGMENT_ROM_START(d2_fine_pal_static), size, 0, &skyboxCtx->loadQueue, NULL);
|
||||||
|
|
||||||
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
||||||
|
@ -289,22 +342,22 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Skybox_Init(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId) {
|
void Skybox_Init(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId) {
|
||||||
skyboxCtx->skyboxShouldDraw = false;
|
skyboxCtx->shouldDraw = false;
|
||||||
skyboxCtx->rot.x = skyboxCtx->rot.y = skyboxCtx->rot.z = 0.0f;
|
skyboxCtx->rot.x = skyboxCtx->rot.y = skyboxCtx->rot.z = 0.0f;
|
||||||
|
|
||||||
Skybox_Setup(gameState, skyboxCtx, skyboxId);
|
Skybox_Setup(gameState, skyboxCtx, skyboxId);
|
||||||
|
|
||||||
if (skyboxId != SKYBOX_NONE) {
|
if (skyboxId != SKYBOX_NONE) {
|
||||||
skyboxCtx->dListBuf = THA_AllocTailAlign16(&gameState->tha, 0x3840);
|
skyboxCtx->dListBuf = THA_AllocTailAlign16(&gameState->tha, 12 * 150 * sizeof(Gfx));
|
||||||
|
|
||||||
if (skyboxId == SKYBOX_CUTSCENE_MAP) {
|
if (skyboxId == SKYBOX_CUTSCENE_MAP) {
|
||||||
// Allocate enough space for the vertices for a 6 sided skybox (cube)
|
// Allocate enough space for the vertices for a 6 sided skybox (cube)
|
||||||
skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, sizeof(Vtx) * 32 * 6);
|
skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, 6 * 32 * sizeof(Vtx));
|
||||||
func_80143148(skyboxCtx, 6);
|
Skybox_Calculate128(skyboxCtx, 6);
|
||||||
} else {
|
} else {
|
||||||
// Allocate enough space for the vertices for a 5 sided skybox (bottom is missing)
|
// Allocate enough space for the vertices for a 5 sided skybox (bottom is missing)
|
||||||
skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, sizeof(Vtx) * 32 * 5);
|
skyboxCtx->roomVtx = THA_AllocTailAlign16(&gameState->tha, 5 * 32 * sizeof(Vtx));
|
||||||
func_80143148(skyboxCtx, 5);
|
Skybox_Calculate128(skyboxCtx, 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,37 +25,46 @@ void Skybox_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyboxId
|
||||||
|
|
||||||
Gfx_SetupDL40_Opa(gfxCtx);
|
Gfx_SetupDL40_Opa(gfxCtx);
|
||||||
|
|
||||||
gSPSegment(POLY_OPA_DISP++, 0x0B, skyboxCtx->paletteStaticSegment);
|
gSPSegment(POLY_OPA_DISP++, 0x0B, skyboxCtx->palette);
|
||||||
gSPTexture(POLY_OPA_DISP++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON);
|
gSPTexture(POLY_OPA_DISP++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON);
|
||||||
|
|
||||||
|
// Prepare matrix
|
||||||
sSkyboxDrawMatrix = GRAPH_ALLOC(gfxCtx, sizeof(Mtx));
|
sSkyboxDrawMatrix = GRAPH_ALLOC(gfxCtx, sizeof(Mtx));
|
||||||
|
|
||||||
Matrix_Translate(x, y, z, MTXMODE_NEW);
|
Matrix_Translate(x, y, z, MTXMODE_NEW);
|
||||||
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
|
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
|
||||||
Matrix_RotateXFApply(skyboxCtx->rot.x);
|
Matrix_RotateXFApply(skyboxCtx->rot.x);
|
||||||
Matrix_RotateYF(skyboxCtx->rot.y, MTXMODE_APPLY);
|
Matrix_RotateYF(skyboxCtx->rot.y, MTXMODE_APPLY);
|
||||||
Matrix_RotateZF(skyboxCtx->rot.z, MTXMODE_APPLY);
|
Matrix_RotateZF(skyboxCtx->rot.z, MTXMODE_APPLY);
|
||||||
Matrix_ToMtx(sSkyboxDrawMatrix);
|
Matrix_ToMtx(sSkyboxDrawMatrix);
|
||||||
|
|
||||||
gSPMatrix(POLY_OPA_DISP++, sSkyboxDrawMatrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
gSPMatrix(POLY_OPA_DISP++, sSkyboxDrawMatrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||||
|
|
||||||
|
// Enable magic square RGB dithering and bilinear filtering
|
||||||
gDPSetColorDither(POLY_OPA_DISP++, G_CD_MAGICSQ);
|
gDPSetColorDither(POLY_OPA_DISP++, G_CD_MAGICSQ);
|
||||||
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
|
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
|
||||||
gDPLoadTLUT_pal256(POLY_OPA_DISP++, skyboxCtx->paletteStaticSegment);
|
|
||||||
|
// All skyboxes use CI8 textures with an RGBA16 palette
|
||||||
|
gDPLoadTLUT_pal256(POLY_OPA_DISP++, skyboxCtx->palette);
|
||||||
gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16);
|
gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16);
|
||||||
|
|
||||||
|
// Enable texture filtering RDP pipeline stages for bilinear filtering
|
||||||
gDPSetTextureConvert(POLY_OPA_DISP++, G_TC_FILT);
|
gDPSetTextureConvert(POLY_OPA_DISP++, G_TC_FILT);
|
||||||
|
|
||||||
|
// Set skybox color
|
||||||
gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0,
|
gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0,
|
||||||
PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, 0, 0, 0, COMBINED);
|
PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, 0, 0, 0, COMBINED);
|
||||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, skyboxCtx->prim.r, skyboxCtx->prim.g, skyboxCtx->prim.b, blend);
|
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, skyboxCtx->prim.r, skyboxCtx->prim.g, skyboxCtx->prim.b, blend);
|
||||||
gDPSetEnvColor(POLY_OPA_DISP++, skyboxCtx->env.r, skyboxCtx->env.g, skyboxCtx->env.b, 0);
|
gDPSetEnvColor(POLY_OPA_DISP++, skyboxCtx->env.r, skyboxCtx->env.g, skyboxCtx->env.b, 0);
|
||||||
|
|
||||||
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[0]);
|
// Draw each face
|
||||||
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[2]);
|
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[0]); // -z face
|
||||||
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[4]);
|
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[2]); // +z face
|
||||||
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[6]);
|
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[4]); // -x face
|
||||||
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[8]);
|
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[6]); // +x face
|
||||||
|
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[8]); // +y face
|
||||||
|
|
||||||
if (skyboxId == SKYBOX_CUTSCENE_MAP) {
|
if (skyboxId == SKYBOX_CUTSCENE_MAP) {
|
||||||
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[10]);
|
// Skip the bottom face unless in the cutscene map
|
||||||
|
gSPDisplayList(POLY_OPA_DISP++, &skyboxCtx->dListBuf[10]); // -y face
|
||||||
}
|
}
|
||||||
|
|
||||||
gDPPipeSync(POLY_OPA_DISP++);
|
gDPPipeSync(POLY_OPA_DISP++);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* Overlay: ovl_player_actor
|
* Overlay: ovl_player_actor
|
||||||
* Description: Player
|
* Description: Player
|
||||||
*/
|
*/
|
||||||
|
#include "prevent_bss_reordering.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "z64horse.h"
|
#include "z64horse.h"
|
||||||
#include "z64malloc.h"
|
#include "z64malloc.h"
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "z_kaleido_scope.h"
|
#include "z_kaleido_scope.h"
|
||||||
|
#include "z64skybox.h"
|
||||||
#include "z64view.h"
|
#include "z64view.h"
|
||||||
#include "overlays/gamestates/ovl_opening/z_opening.h"
|
#include "overlays/gamestates/ovl_opening/z_opening.h"
|
||||||
|
|
||||||
|
@ -3599,7 +3600,7 @@ void KaleidoScope_Update(PlayState* play) {
|
||||||
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
|
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
|
||||||
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
|
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
|
||||||
MsgEvent_SendNullTask();
|
MsgEvent_SendNullTask();
|
||||||
func_80143324(play, &play->skyboxCtx, play->skyboxId);
|
Skybox_Reload(play, &play->skyboxCtx, play->skyboxId);
|
||||||
|
|
||||||
if ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId == 0xFF)) {
|
if ((msgCtx->msgMode != MSGMODE_NONE) && (msgCtx->currentTextId == 0xFF)) {
|
||||||
func_80115844(play, DO_ACTION_STOP);
|
func_80115844(play, DO_ACTION_STOP);
|
||||||
|
|
|
@ -2778,10 +2778,10 @@
|
||||||
0x801420C0:("VisZbuf_Init",),
|
0x801420C0:("VisZbuf_Init",),
|
||||||
0x801420F4:("VisZbuf_Destroy",),
|
0x801420F4:("VisZbuf_Destroy",),
|
||||||
0x80142100:("VisZbuf_Draw",),
|
0x80142100:("VisZbuf_Draw",),
|
||||||
0x80142440:("func_80142440",),
|
0x80142440:("Skybox_CalculateFace128",),
|
||||||
0x80143148:("func_80143148",),
|
0x80143148:("Skybox_Calculate128",),
|
||||||
0x801431E8:("Skybox_Setup",),
|
0x801431E8:("Skybox_Setup",),
|
||||||
0x80143324:("func_80143324",),
|
0x80143324:("Skybox_Reload",),
|
||||||
0x801434E4:("Skybox_Init",),
|
0x801434E4:("Skybox_Init",),
|
||||||
0x801435A0:("Skybox_UpdateMatrix",),
|
0x801435A0:("Skybox_UpdateMatrix",),
|
||||||
0x80143624:("Skybox_SetColors",),
|
0x80143624:("Skybox_SetColors",),
|
||||||
|
|
|
@ -1901,13 +1901,13 @@
|
||||||
0x801C5DE0:("D_801C5DE0","UNK_TYPE1","",0x1),
|
0x801C5DE0:("D_801C5DE0","UNK_TYPE1","",0x1),
|
||||||
0x801C5DF0:("D_801C5DF0","UNK_TYPE1","",0x1),
|
0x801C5DF0:("D_801C5DF0","UNK_TYPE1","",0x1),
|
||||||
0x801C5E00:("D_801C5E00","UNK_TYPE1","",0x1),
|
0x801C5E00:("D_801C5E00","UNK_TYPE1","",0x1),
|
||||||
0x801C5E30:("D_801C5E30","UNK_TYPE1","",0x1),
|
0x801C5E30:("sSkybox128TexOffsets","UNK_TYPE1","",0x1),
|
||||||
0x801C5E48:("D_801C5E48","UNK_TYPE2","",0x2),
|
0x801C5E48:("sSkybox128VtxBufIndices","UNK_TYPE2","",0x2),
|
||||||
0x801C5E88:("D_801C5E88","UNK_TYPE4","",0x4),
|
0x801C5E88:("sSkybox128TexSCoords","UNK_TYPE4","",0x4),
|
||||||
0x801C5E9C:("D_801C5E9C","UNK_TYPE4","",0x4),
|
0x801C5E9C:("sSkybox128TexTCoordsXZ","UNK_TYPE4","",0x4),
|
||||||
0x801C5EB0:("D_801C5EB0","UNK_TYPE4","",0x4),
|
0x801C5EB0:("sSkybox128TexTCoords","UNK_TYPE4","",0x4),
|
||||||
0x801C5EC4:("D_801C5EC4","UNK_TYPE2","",0x2),
|
0x801C5EC4:("sSkybox128VtxIndices","UNK_TYPE2","",0x2),
|
||||||
0x801C5F44:("D_801C5F44","UNK_TYPE4","",0x4),
|
0x801C5F44:("sSkybox128FaceParams","UNK_TYPE4","",0x4),
|
||||||
0x801C5FC0:("sPersistentCycleSceneFlags","u32","[452]",0x710),
|
0x801C5FC0:("sPersistentCycleSceneFlags","u32","[452]",0x710),
|
||||||
0x801C66D0:("sPersistentCycleWeekEventRegs","UNK_TYPE2","",0x2),
|
0x801C66D0:("sPersistentCycleWeekEventRegs","UNK_TYPE2","",0x2),
|
||||||
0x801C6798:("gSramSlotOffsets","UNK_TYPE4","",0x4),
|
0x801C6798:("gSramSlotOffsets","UNK_TYPE4","",0x4),
|
||||||
|
|
|
@ -2292,10 +2292,10 @@ asm/non_matchings/code/z_vismono/VisMono_DrawOld.s,VisMono_DrawOld,0x8014204C,0x
|
||||||
asm/non_matchings/code/z_viszbuf/VisZbuf_Init.s,VisZbuf_Init,0x801420C0,0xD
|
asm/non_matchings/code/z_viszbuf/VisZbuf_Init.s,VisZbuf_Init,0x801420C0,0xD
|
||||||
asm/non_matchings/code/z_viszbuf/VisZbuf_Destroy.s,VisZbuf_Destroy,0x801420F4,0x3
|
asm/non_matchings/code/z_viszbuf/VisZbuf_Destroy.s,VisZbuf_Destroy,0x801420F4,0x3
|
||||||
asm/non_matchings/code/z_viszbuf/VisZbuf_Draw.s,VisZbuf_Draw,0x80142100,0xD0
|
asm/non_matchings/code/z_viszbuf/VisZbuf_Draw.s,VisZbuf_Draw,0x80142100,0xD0
|
||||||
asm/non_matchings/code/z_vr_box/func_80142440.s,func_80142440,0x80142440,0x342
|
asm/non_matchings/code/z_vr_box/Skybox_CalculateFace128.s,Skybox_CalculateFace128,0x80142440,0x342
|
||||||
asm/non_matchings/code/z_vr_box/func_80143148.s,func_80143148,0x80143148,0x28
|
asm/non_matchings/code/z_vr_box/Skybox_Calculate128.s,Skybox_Calculate128,0x80143148,0x28
|
||||||
asm/non_matchings/code/z_vr_box/Skybox_Setup.s,Skybox_Setup,0x801431E8,0x4F
|
asm/non_matchings/code/z_vr_box/Skybox_Setup.s,Skybox_Setup,0x801431E8,0x4F
|
||||||
asm/non_matchings/code/z_vr_box/func_80143324.s,func_80143324,0x80143324,0x70
|
asm/non_matchings/code/z_vr_box/Skybox_Reload.s,Skybox_Reload,0x80143324,0x70
|
||||||
asm/non_matchings/code/z_vr_box/Skybox_Init.s,Skybox_Init,0x801434E4,0x2F
|
asm/non_matchings/code/z_vr_box/Skybox_Init.s,Skybox_Init,0x801434E4,0x2F
|
||||||
asm/non_matchings/code/z_vr_box_draw/func_801435A0.s,func_801435A0,0x801435A0,0x21
|
asm/non_matchings/code/z_vr_box_draw/func_801435A0.s,func_801435A0,0x801435A0,0x21
|
||||||
asm/non_matchings/code/z_vr_box_draw/func_80143624.s,func_80143624,0x80143624,0x11
|
asm/non_matchings/code/z_vr_box_draw/func_80143624.s,func_80143624,0x80143624,0x11
|
||||||
|
|
|
Loading…
Reference in New Issue