88#include <string.h>
99#include <assert.h>
1010
11+ #include "public/bridge/gfxbridge.h"
12+
1113void func_80095AB4 (PlayState * play , Room * room , u32 flags );
1214void func_80095D04 (PlayState * play , Room * room , u32 flags );
1315void func_80096F6C (PlayState * play , Room * room , u32 flags );
@@ -254,23 +256,21 @@ s32 swapAndConvertJPEG(void* data) {
254256}
255257
256258
257- void func_8009638C (Gfx * * displayList , void * source , void * tlut , u16 width , u16 height , u8 fmt , u8 siz , u16 mode0 ,
258- u16 tlutCount , f32 frameX , f32 frameY ) {
259- Gfx * displayListHead ;
259+ void Room_DrawBackground2D (Gfx * * gfxP , void * tex , void * tlut , u16 width , u16 height , u8 fmt , u8 siz , u16 tlutMode ,
260+ u16 tlutCount , f32 offsetX , f32 offsetY ) {
261+ Gfx * gfx = * gfxP ;
260262 uObjBg * bg ;
261- s32 temp ;
262263
263- displayListHead = * displayList ;
264+ bg = (uObjBg * )(gfx + 1 );
265+ gSPBranchList (gfx , (Gfx * )(bg + 1 ));
264266
265- bg = (uObjBg * )(displayListHead + 1 );
266- gSPBranchList (displayListHead , (u8 * )bg + sizeof (uObjBg ));
267267 bg -> b .imageX = 0 ;
268- bg -> b .imageW = width * 4 ;
269- bg -> b .frameX = frameX * 4 ;
268+ bg -> b .imageW = width * ( 1 << 2 ) ;
269+ bg -> b .frameX = offsetX * ( 1 << 2 ) ;
270270 bg -> b .imageY = 0 ;
271- bg -> b .imageH = height * 4 ;
272- bg -> b .frameY = frameY * 4 ;
273- bg -> b .imagePtr = source ;
271+ bg -> b .imageH = height * ( 1 << 2 ) ;
272+ bg -> b .frameY = offsetY * ( 1 << 2 ) ;
273+ bg -> b .imagePtr = tex ;
274274 bg -> b .imageLoad = G_BGLT_LOADTILE ;
275275 bg -> b .imageFmt = fmt ;
276276 bg -> b .imageSiz = siz ;
@@ -280,62 +280,68 @@ void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 h
280280 // When an alt resource exists for the background, we need to unload the original asset
281281 // to clear the cache so the alt asset will be loaded instead
282282 // OTRTODO: If Alt loading over original cache is fixed, this line can most likely be removed
283- ResourceMgr_UnloadOriginalWhenAltExists ((char * ) source );
283+ ResourceMgr_UnloadOriginalWhenAltExists ((char * )tex );
284284
285- if (ResourceMgr_ResourceIsBackground ((char * ) source )) {
286- char * blob = (char * ) ResourceGetDataByName ((char * ) source );
285+ if (ResourceMgr_ResourceIsBackground ((char * )tex )) {
286+ char * blob = (char * )ResourceGetDataByName ((char * )tex );
287287 swapAndConvertJPEG (blob );
288- bg -> b .imagePtr = (uintptr_t ) blob ;
288+ bg -> b .imagePtr = (uintptr_t )blob ;
289289 }
290290
291- displayListHead = (void * )(bg + 1 );
291+ gfx = (Gfx * )(bg + 1 );
292+
292293 if (fmt == G_IM_FMT_CI ) {
293- gDPLoadTLUT (displayListHead ++ , tlutCount , 256 , tlut );
294+ gDPLoadTLUT (gfx ++ , tlutCount , 256 , tlut );
294295 } else {
295- gDPPipeSync (displayListHead ++ );
296+ gDPPipeSync (gfx ++ );
296297 }
297298
298299 if ((fmt == G_IM_FMT_RGBA ) && (SREG (26 ) == 0 )) {
299- bg -> b .frameW = width * 4 ;
300- bg -> b .frameH = height * 4 ;
300+ bg -> b .frameW = width * ( 1 << 2 ) ;
301+ bg -> b .frameH = height * ( 1 << 2 ) ;
301302 guS2DInitBg (bg );
302303
303- gDPSetOtherMode (displayListHead ++ , mode0 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE ,
304- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2 );
305-
306- gDPSetFillColor (displayListHead ++ , GPACK_RGBA5551 (0 , 0 , 0 , 1 ) << 16 | GPACK_RGBA5551 (0 , 0 , 0 , 1 ));
307- gDPFillWideRectangle (displayListHead ++ , OTRGetRectDimensionFromLeftEdge (0 ), 0 ,
308- OTRGetRectDimensionFromRightEdge (SCREEN_WIDTH ), SCREEN_HEIGHT );
304+ // #region SOH [Port][Widescreen]
305+ // When larger than 4:3 we want to render an additional black rectangle behind the 2d image
306+ // to simulate black bars on the side that cover up the world
307+ s16 newX = OTRGetRectDimensionFromLeftEdge (0 );
308+ if (newX < 0 ) {
309+ gDPSetOtherMode (gfx ++ , tlutMode | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE ,
310+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2 );
311+ gDPSetFillColor (gfx ++ , GPACK_RGBA5551 (0 , 0 , 0 , 1 ) << 16 | GPACK_RGBA5551 (0 , 0 , 0 , 1 ));
312+ gDPFillWideRectangle (gfx ++ , newX , 0 , OTRGetRectDimensionFromRightEdge (SCREEN_WIDTH ), SCREEN_HEIGHT );
313+ }
314+ // #endregion
309315
310- gDPSetOtherMode (displayListHead ++ , mode0 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE ,
316+ gDPSetOtherMode (gfx ++ , tlutMode | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE ,
311317 G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2 );
312318
313- gDPLoadMultiTile (displayListHead ++ , bg -> b .imagePtr , 0 ,
319+ gDPLoadMultiTile (gfx ++ , bg -> b .imagePtr , 0 ,
314320 G_TX_RENDERTILE , G_IM_FMT_RGBA , G_IM_SIZ_16b , 320 , 0 , 0 , 0 , 0 + 31 ,
315321 0 + 31 , 0 , G_TX_NOMIRROR | G_TX_WRAP , G_TX_NOMASK , G_TX_NOLOD ,
316322 G_TX_NOMIRROR | G_TX_WRAP , G_TX_NOMASK , G_TX_NOLOD );
317323
318- gSPBgRectCopy (displayListHead ++ , bg );
319-
324+ gSPBgRectCopy (gfx ++ , bg );
320325 } else {
321- bg -> s .frameW = width * 4 ;
322- bg -> s .frameH = height * 4 ;
323- bg -> s .scaleW = 1024 ;
324- bg -> s .scaleH = 1024 ;
326+ bg -> s .frameW = width * ( 1 << 2 ) ;
327+ bg -> s .frameH = height * ( 1 << 2 ) ;
328+ bg -> s .scaleW = 1 << 10 ;
329+ bg -> s .scaleH = 1 << 10 ;
325330 bg -> s .imageYorig = bg -> b .imageY ;
326- gDPSetOtherMode (displayListHead ++ ,
327- mode0 | G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE |
331+ gDPSetOtherMode (gfx ++ ,
332+ tlutMode | G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE |
328333 G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE ,
329334 G_AC_THRESHOLD | G_ZS_PIXEL | AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | ALPHA_CVG_SEL |
330335 GBL_c1 (G_BL_CLR_IN , G_BL_A_IN , G_BL_CLR_BL , G_BL_1MA ) |
331336 GBL_c2 (G_BL_CLR_IN , G_BL_A_IN , G_BL_CLR_BL , G_BL_1MA ));
332- gDPSetCombineLERP (displayListHead ++ , 0 , 0 , 0 , TEXEL0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , TEXEL0 , 0 , 0 , 0 , 1 );
333- gSPObjRenderMode (displayListHead ++ , G_OBJRM_ANTIALIAS | G_OBJRM_BILERP );
334- gSPBgRect1Cyc (displayListHead ++ , bg );
337+ gDPSetCombineLERP (gfx ++ , 0 , 0 , 0 , TEXEL0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , TEXEL0 , 0 , 0 , 0 , 1 );
338+ gSPObjRenderMode (gfx ++ , G_OBJRM_ANTIALIAS | G_OBJRM_BILERP );
339+ gSPBgRect1Cyc (gfx ++ , bg );
335340 }
336341
337- gDPPipeSync (displayListHead ++ );
338- * displayList = displayListHead ;
342+ gDPPipeSync (gfx ++ );
343+
344+ * gfxP = gfx ;
339345}
340346
341347// Room Draw Polygon Type 1 - Single Format
@@ -369,22 +375,20 @@ void func_80096680(PlayState* play, Room* room, u32 flags) {
369375 }
370376
371377 if (sp98 ) {
372- // gSPLoadUcodeL(POLY_OPA_DISP++, rspS2DEX)?
373- //gSPLoadUcodeEx(POLY_OPA_DISP++, OS_K0_TO_PHYSICAL(D_80113070), OS_K0_TO_PHYSICAL(D_801579A0), 0x800);
378+ gSPLoadUcodeL (POLY_OPA_DISP ++ , ucode_s2dex );
374379
375380 {
376381 Vec3f sp60 ;
377382 spA8 = POLY_OPA_DISP ;
378383 Camera_GetSkyboxOffset (& sp60 , camera );
379- func_8009638C (& spA8 , polygon1 -> single .source , polygon1 -> single .tlut , polygon1 -> single .width ,
384+ Room_DrawBackground2D (& spA8 , polygon1 -> single .source , polygon1 -> single .tlut , polygon1 -> single .width ,
380385 polygon1 -> single .height , polygon1 -> single .fmt , polygon1 -> single .siz ,
381386 polygon1 -> single .mode0 , polygon1 -> single .tlutCount ,
382387 (sp60 .x + sp60 .z ) * 1.2f + sp60 .y * 0.6f , sp60 .y * 2.4f + (sp60 .x + sp60 .z ) * 0.3f );
383388 POLY_OPA_DISP = spA8 ;
384389 }
385390
386- // gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData())?
387- gSPLoadUcodeEx (POLY_OPA_DISP ++ , SysUcode_GetUCode (), SysUcode_GetUCodeData (), 0x800 );
391+ gSPLoadUcode (POLY_OPA_DISP ++ , SysUcode_GetUCode ());
388392 }
389393 }
390394
@@ -472,21 +476,19 @@ void func_80096B6C(PlayState* play, Room* room, u32 flags) {
472476 }
473477
474478 if (sp94 ) {
475- // gSPLoadUcodeL(POLY_OPA_DISP++, rspS2DEX)?
476- //gSPLoadUcodeEx(POLY_OPA_DISP++, OS_K0_TO_PHYSICAL(D_80113070), OS_K0_TO_PHYSICAL(D_801579A0), 0x800);
479+ gSPLoadUcodeL (POLY_OPA_DISP ++ , ucode_s2dex );
477480
478481 {
479482 Vec3f sp5C ;
480483 spA8 = POLY_OPA_DISP ;
481484 Camera_GetSkyboxOffset (& sp5C , camera );
482- func_8009638C (& spA8 , bgImage -> source , bgImage -> tlut , bgImage -> width , bgImage -> height , bgImage -> fmt ,
485+ Room_DrawBackground2D (& spA8 , bgImage -> source , bgImage -> tlut , bgImage -> width , bgImage -> height , bgImage -> fmt ,
483486 bgImage -> siz , bgImage -> mode0 , bgImage -> tlutCount ,
484487 (sp5C .x + sp5C .z ) * 1.2f + sp5C .y * 0.6f , sp5C .y * 2.4f + (sp5C .x + sp5C .z ) * 0.3f );
485488 POLY_OPA_DISP = spA8 ;
486489 }
487490
488- // gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData())?
489- gSPLoadUcodeEx (POLY_OPA_DISP ++ , SysUcode_GetUCode (), SysUcode_GetUCodeData (), 0x800 );
491+ gSPLoadUcode (POLY_OPA_DISP ++ , SysUcode_GetUCode ());
490492 }
491493 }
492494
0 commit comments