1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-02-04 11:14:21 +00:00
This commit is contained in:
Dragorn421 2022-06-16 17:50:06 +02:00
parent cf68bd7fe4
commit 685c06e913
No known key found for this signature in database
GPG key ID: 32B53D2D16FC4118
4 changed files with 76 additions and 67 deletions

View file

@ -1162,8 +1162,8 @@ Gfx* Gfx_EnvColor(GraphicsContext* gfxCtx, s32 r, s32 g, s32 b, s32 a);
void func_80095248(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b); void func_80095248(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b);
void func_80095974(GraphicsContext* gfxCtx); void func_80095974(GraphicsContext* gfxCtx);
void func_80095AA0(PlayState* play, Room* room, Input* input, s32 arg3); void func_80095AA0(PlayState* play, Room* room, Input* input, s32 arg3);
void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0, void Room_DrawBackground2D(Gfx** gfxP, void* tex, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0,
u16 tlutCount, f32 frameX, f32 frameY); u16 tlutCount, f32 offsetX, f32 offsetY);
void func_80096FD4(PlayState* play, Room* room); void func_80096FD4(PlayState* play, Room* room);
u32 func_80096FE8(PlayState* play, RoomContext* roomCtx); u32 func_80096FE8(PlayState* play, RoomContext* roomCtx);
s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum); s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum);

View file

@ -109,10 +109,10 @@ typedef struct {
typedef struct { typedef struct {
/* 0x00 */ u16 unk_00; /* 0x00 */ u16 unk_00;
/* 0x02 */ u8 id; /* 0x02 */ u8 index;
/* 0x04 */ u32 source; /* 0x04 */ void* source;
/* 0x08 */ u32 unk_0C; /* 0x08 */ u32 unk_0C;
/* 0x0C */ u32 tlut; /* 0x0C */ void* tlut;
/* 0x10 */ u16 width; /* 0x10 */ u16 width;
/* 0x12 */ u16 height; /* 0x12 */ u16 height;
/* 0x14 */ u8 fmt; /* 0x14 */ u8 fmt;

View file

@ -238,7 +238,11 @@ void Room_Draw2(PlayState* play, Room* room, u32 flags) {
#define JPEG_MARKER 0xFFD8FFE0 #define JPEG_MARKER 0xFFD8FFE0
s32 func_80096238(void* data) { /**
* If the data is JPEG, decode it and overwrite the initial data with the result.
* Uses the depth frame buffer as temporary storage.
*/
s32 Room_DecodeJpeg(void* data) {
OSTime time; OSTime time;
if (*(u32*)data == JPEG_MARKER) { if (*(u32*)data == JPEG_MARKER) {
@ -258,7 +262,7 @@ s32 func_80096238(void* data) {
// "If the original buffer size isn't at least 150kb, it will be out of control." // "If the original buffer size isn't at least 150kb, it will be out of control."
osSyncPrintf("元のバッファのサイズが150キロバイト無いと暴走するでしょう。\n"); osSyncPrintf("元のバッファのサイズが150キロバイト無いと暴走するでしょう。\n");
bcopy(gZBuffer, data, sizeof(gZBuffer)); bcopy(gZBuffer, data, sizeof(u16[SCREEN_HEIGHT][SCREEN_WIDTH]));
} else { } else {
osSyncPrintf("失敗!なんで〜\n"); // "Failure! Why is it 〜" osSyncPrintf("失敗!なんで〜\n"); // "Failure! Why is it 〜"
} }
@ -267,68 +271,70 @@ s32 func_80096238(void* data) {
return 0; return 0;
} }
void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0, void Room_DrawBackground2D(Gfx** gfxP, void* tex, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0,
u16 tlutCount, f32 frameX, f32 frameY) { u16 tlutCount, f32 offsetX, f32 offsetY) {
Gfx* displayListHead; Gfx* gfx = *gfxP;
uObjBg* bg; uObjBg* bg;
displayListHead = *displayList; Room_DecodeJpeg(SEGMENTED_TO_VIRTUAL(tex));
func_80096238(SEGMENTED_TO_VIRTUAL(source));
bg = (uObjBg*)(gfx + 1);
gSPBranchList(gfx, (u32)bg + sizeof(uObjBg));
bg = (uObjBg*)(displayListHead + 1);
gSPBranchList(displayListHead, (u8*)bg + sizeof(uObjBg));
bg->b.imageX = 0; bg->b.imageX = 0;
bg->b.imageW = width * 4; bg->b.imageW = width * (1 << 2);
bg->b.frameX = frameX * 4; bg->b.frameX = offsetX * (1 << 2);
bg->b.imageY = 0; bg->b.imageY = 0;
bg->b.imageH = height * 4; bg->b.imageH = height * (1 << 2);
bg->b.frameY = frameY * 4; bg->b.frameY = offsetY * (1 << 2);
bg->b.imagePtr = source; bg->b.imagePtr = tex;
bg->b.imageLoad = G_BGLT_LOADTILE; bg->b.imageLoad = G_BGLT_LOADTILE;
bg->b.imageFmt = fmt; bg->b.imageFmt = fmt;
bg->b.imageSiz = siz; bg->b.imageSiz = siz;
bg->b.imagePal = 0; bg->b.imagePal = 0;
bg->b.imageFlip = 0; bg->b.imageFlip = 0;
displayListHead = (void*)(bg + 1); gfx = (Gfx*)((u32)bg + sizeof(uObjBg));
if (fmt == G_IM_FMT_CI) { if (fmt == G_IM_FMT_CI) {
gDPLoadTLUT(displayListHead++, tlutCount, 256, tlut); gDPLoadTLUT(gfx++, tlutCount, 256, tlut);
} else { } else {
gDPPipeSync(displayListHead++); gDPPipeSync(gfx++);
} }
if ((fmt == G_IM_FMT_RGBA) && (SREG(26) == 0)) { if ((fmt == G_IM_FMT_RGBA) && (SREG(26) == 0)) {
bg->b.frameW = width * 4; bg->b.frameW = width * (1 << 2);
bg->b.frameH = height * 4; bg->b.frameH = height * (1 << 2);
guS2DInitBg(bg); guS2DInitBg(bg);
gDPSetOtherMode(displayListHead++, mode0 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE, gDPSetOtherMode(gfx++, mode0 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2); G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
gSPBgRectCopy(displayListHead++, bg); gSPBgRectCopy(gfx++, bg);
} else { } else {
bg->s.frameW = width * 4; bg->s.frameW = width * (1 << 2);
bg->s.frameH = height * 4; bg->s.frameH = height * (1 << 2);
bg->s.scaleW = 1024; bg->s.scaleW = 1 << 10;
bg->s.scaleH = 1024; bg->s.scaleH = 1 << 10;
bg->s.imageYorig = bg->b.imageY; bg->s.imageYorig = bg->b.imageY;
gDPSetOtherMode(displayListHead++, gDPSetOtherMode(gfx++,
mode0 | G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | mode0 | G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE |
G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
G_AC_THRESHOLD | G_ZS_PIXEL | AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | ALPHA_CVG_SEL | G_AC_THRESHOLD | G_ZS_PIXEL | AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | ALPHA_CVG_SEL |
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_BL, G_BL_1MA) | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_BL, G_BL_1MA) |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_BL, G_BL_1MA)); GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_BL, G_BL_1MA));
gDPSetCombineLERP(displayListHead++, 0, 0, 0, TEXEL0, 0, 0, 0, 1, 0, 0, 0, TEXEL0, 0, 0, 0, 1); gDPSetCombineLERP(gfx++, 0, 0, 0, TEXEL0, 0, 0, 0, 1, 0, 0, 0, TEXEL0, 0, 0, 0, 1);
gSPObjRenderMode(displayListHead++, G_OBJRM_ANTIALIAS | G_OBJRM_BILERP); gSPObjRenderMode(gfx++, G_OBJRM_ANTIALIAS | G_OBJRM_BILERP);
gSPBgRect1Cyc(displayListHead++, bg); gSPBgRect1Cyc(gfx++, bg);
} }
gDPPipeSync(displayListHead++); gDPPipeSync(gfx++);
*displayList = displayListHead;
*gfxP = gfx;
} }
void Room_Draw1Single(PlayState* play, Room* room, u32 flags) { void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
Camera* activeCam; Camera* activeCam;
Gfx* spA8; Gfx* gfx;
MeshHeader1Single* meshHeader1Single; MeshHeader1Single* meshHeader1Single;
MeshHeader01Entry* meshHeader1Entry; MeshHeader01Entry* meshHeader1Entry;
u32 isFixedCamera; u32 isFixedCamera;
@ -342,7 +348,7 @@ void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED); isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED);
meshHeader1Single = &room->meshHeader->meshHeader1Single; meshHeader1Single = &room->meshHeader->meshHeader1Single;
meshHeader1Entry = SEGMENTED_TO_VIRTUAL(meshHeader1Single->base.entry); meshHeader1Entry = SEGMENTED_TO_VIRTUAL(meshHeader1Single->base.entry);
drawBg = (flags & ROOM_DRAW_OPA) && isFixedCamera && meshHeader1Single->source && !(SREG(25) & 1); drawBg = (flags & ROOM_DRAW_OPA) && isFixedCamera && (meshHeader1Single->source != NULL) && !(SREG(25) & 1);
drawOpa = (flags & ROOM_DRAW_OPA) && (meshHeader1Entry->opa != NULL) && !(SREG(25) & 2); drawOpa = (flags & ROOM_DRAW_OPA) && (meshHeader1Entry->opa != NULL) && !(SREG(25) & 2);
drawXlu = (flags & ROOM_DRAW_XLU) && (meshHeader1Entry->xlu != NULL) && !(SREG(25) & 4); drawXlu = (flags & ROOM_DRAW_XLU) && (meshHeader1Entry->xlu != NULL) && !(SREG(25) & 4);
@ -359,14 +365,16 @@ void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo); gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo);
{ {
Vec3f sp60; Vec3f offset;
spA8 = POLY_OPA_DISP;
Camera_GetSkyboxOffset(&sp60, activeCam); gfx = POLY_OPA_DISP;
func_8009638C(&spA8, meshHeader1Single->source, meshHeader1Single->tlut, meshHeader1Single->width, Camera_GetSkyboxOffset(&offset, activeCam);
meshHeader1Single->height, meshHeader1Single->fmt, meshHeader1Single->siz, Room_DrawBackground2D(&gfx, meshHeader1Single->source, meshHeader1Single->tlut,
meshHeader1Single->mode0, meshHeader1Single->tlutCount, meshHeader1Single->width, meshHeader1Single->height, meshHeader1Single->fmt,
(sp60.x + sp60.z) * 1.2f + sp60.y * 0.6f, sp60.y * 2.4f + (sp60.x + sp60.z) * 0.3f); meshHeader1Single->siz, meshHeader1Single->mode0, meshHeader1Single->tlutCount,
POLY_OPA_DISP = spA8; (offset.x + offset.z) * 1.2f + offset.y * 0.6f,
offset.y * 2.4f + (offset.x + offset.z) * 0.3f);
POLY_OPA_DISP = gfx;
} }
gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData()); gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
@ -383,34 +391,33 @@ void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 691); CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 691);
} }
BgImage* func_80096A74(MeshHeader1Multi* meshHeader1Multi, PlayState* play) { BgImage* Room_GetMultiBackgroundImage(MeshHeader1Multi* meshHeader1Multi, PlayState* play) {
Camera* activeCam = GET_ACTIVE_CAM(play); Camera* activeCam = GET_ACTIVE_CAM(play);
s32 camDataIdx; s32 index;
s16 camDataIdx2; s16 newIndex;
Player* player; Player* player;
BgImage* bgImage; BgImage* bgImage;
s32 i; s32 i;
camDataIdx = activeCam->camDataIdx; index = activeCam->camDataIdx;
// jfifid newIndex = func_80041C10(&play->colCtx, index, BGCHECK_SCENE)[2].y;
camDataIdx2 = func_80041C10(&play->colCtx, camDataIdx, BGCHECK_SCENE)[2].y; if (newIndex >= 0) {
if (camDataIdx2 >= 0) { index = newIndex;
camDataIdx = camDataIdx2;
} }
player = GET_PLAYER(play); player = GET_PLAYER(play);
player->actor.params = (player->actor.params & 0xFF00) | camDataIdx; player->actor.params = (player->actor.params & 0xFF00) | index;
bgImage = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->list); bgImage = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->list);
for (i = 0; i < meshHeader1Multi->count; i++) { for (i = 0; i < meshHeader1Multi->count; i++) {
if (bgImage->id == camDataIdx) { if (bgImage->index == index) {
return bgImage; return bgImage;
} }
bgImage++; bgImage++;
} }
// "z_room.c: Data consistent with camera id does not exist camid=%d" // "z_room.c: Data consistent with camera id does not exist camid=%d"
osSyncPrintf(VT_COL(RED, WHITE) "z_room.c:カメラIDに一致するデータが存在しません camid=%d\n" VT_RST, camDataIdx); osSyncPrintf(VT_COL(RED, WHITE) "z_room.c:カメラIDに一致するデータが存在しません camid=%d\n" VT_RST, index);
LogUtils_HungupThread("../z_room.c", 726); LogUtils_HungupThread("../z_room.c", 726);
return NULL; return NULL;
@ -433,8 +440,10 @@ void Room_Draw1Multi(PlayState* play, Room* room, u32 flags) {
isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED); isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED);
meshHeader1Multi = &room->meshHeader->meshHeader1Multi; meshHeader1Multi = &room->meshHeader->meshHeader1Multi;
meshHeader1Entry = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->base.entry); meshHeader1Entry = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->base.entry);
bgImage = func_80096A74(meshHeader1Multi, play);
drawBg = (flags & ROOM_DRAW_OPA) && isFixedCamera && bgImage->source && !(SREG(25) & 1); bgImage = Room_GetMultiBackgroundImage(meshHeader1Multi, play);
drawBg = (flags & ROOM_DRAW_OPA) && isFixedCamera && (bgImage->source != NULL) && !(SREG(25) & 1);
drawOpa = (flags & ROOM_DRAW_OPA) && (meshHeader1Entry->opa != NULL) && !(SREG(25) & 2); drawOpa = (flags & ROOM_DRAW_OPA) && (meshHeader1Entry->opa != NULL) && !(SREG(25) & 2);
drawXlu = (flags & ROOM_DRAW_XLU) && (meshHeader1Entry->xlu != NULL) && !(SREG(25) & 4); drawXlu = (flags & ROOM_DRAW_XLU) && (meshHeader1Entry->xlu != NULL) && !(SREG(25) & 4);
@ -451,14 +460,14 @@ void Room_Draw1Multi(PlayState* play, Room* room, u32 flags) {
gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo); gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo);
{ {
Vec3f skyboxOffset; Vec3f offset;
gfx = POLY_OPA_DISP; gfx = POLY_OPA_DISP;
Camera_GetSkyboxOffset(&skyboxOffset, activeCam); Camera_GetSkyboxOffset(&offset, activeCam);
func_8009638C(&gfx, bgImage->source, bgImage->tlut, bgImage->width, bgImage->height, bgImage->fmt, Room_DrawBackground2D(&gfx, bgImage->source, bgImage->tlut, bgImage->width, bgImage->height,
bgImage->siz, bgImage->mode0, bgImage->tlutCount, bgImage->fmt, bgImage->siz, bgImage->mode0, bgImage->tlutCount,
(skyboxOffset.x + skyboxOffset.z) * 1.2f + skyboxOffset.y * 0.6f, (offset.x + offset.z) * 1.2f + offset.y * 0.6f,
skyboxOffset.y * 2.4f + (skyboxOffset.x + skyboxOffset.z) * 0.3f); offset.y * 2.4f + (offset.x + offset.z) * 0.3f);
POLY_OPA_DISP = gfx; POLY_OPA_DISP = gfx;
} }

View file

@ -531,8 +531,8 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) {
gSPLoadUcodeL(sp1CC++, gspS2DEX2d_fifo); gSPLoadUcodeL(sp1CC++, gspS2DEX2d_fifo);
func_8009638C(&sp1CC, mapImage, gWorldMapImageTLUT, 216, 128, G_IM_FMT_CI, G_IM_SIZ_8b, 0x8000, 256, Room_DrawBackground2D(&sp1CC, mapImage, gWorldMapImageTLUT, 216, 128, G_IM_FMT_CI, G_IM_SIZ_8b, 0x8000, 256,
HREG(13) / 100.0f, HREG(14) / 100.0f); HREG(13) / 100.0f, HREG(14) / 100.0f);
gSPLoadUcode(sp1CC++, SysUcode_GetUCode(), SysUcode_GetUCodeData()); gSPLoadUcode(sp1CC++, SysUcode_GetUCode(), SysUcode_GetUCodeData());