diff --git a/Makefile b/Makefile index 63fed2bb70a..fa8b99b94d8 100644 --- a/Makefile +++ b/Makefile @@ -144,9 +144,11 @@ $(ELF_SHIFT): $(DOL) @echo $(O_FILES) > build/o_files @$(PYTHON) tools/lcf.py dol_shift --output $(LDSCRIPT) $(LD) -application $(LDFLAGS) -o $@ -lcf $(LDSCRIPT) @build/o_files $(LIBS) + @cp -v $(ELF_SHIFT) $(ELF) $(DOL_SHIFT): $(ELF_SHIFT) | tools $(ELF2DOL) $< $@ $(SDATA_PDHR) $(SBSS_PDHR) $(TARGET_COL) + @cp -v $(DOL_SHIFT) $(DOL) shift: dirs $(DOL_SHIFT) diff --git a/include/d/map/d_map_path.h b/include/d/map/d_map_path.h index f4fc8a3f2ec..e1efd518f8e 100644 --- a/include/d/map/d_map_path.h +++ b/include/d/map/d_map_path.h @@ -6,7 +6,13 @@ class dDrawPath_c : public dDlst_base_c { public: - struct line_class {}; + struct line_class { + /*0x0*/ u8 unk0; + /*0x1*/ u8 unk1; + /*0x2*/ u8 unk2; + /*0x3*/ u8 unk3; + /*0x4*/ u16* unk4; + }; struct poly_class {}; @@ -52,7 +58,7 @@ public: virtual void isDrawPath() = 0; virtual void preRenderingMap() = 0; virtual void postRenderingMap() = 0; - virtual void getBackColor() const = 0; + virtual GXColor* getBackColor() const = 0; }; class dRenderingFDAmap_c : public dRenderingMap_c { @@ -65,8 +71,8 @@ public: /* 8002ABF8 */ virtual ~dRenderingFDAmap_c(); /* 8003D188 */ virtual void preRenderingMap(); /* 8003D320 */ virtual void postRenderingMap(); - /* 8003D68C */ virtual void getDecoLineColor(int, int); - /* 8003D6B8 */ virtual void getDecorationLineWidth(int); + /* 8003D68C */ virtual GXColor* getDecoLineColor(int, int); + /* 8003D6B8 */ virtual s32 getDecorationLineWidth(int); private: /* 0x04 */ int field_0x4; diff --git a/include/dolphin/gx/GX.h b/include/dolphin/gx/GX.h index d7aeb521c6c..d5bd716e52a 100644 --- a/include/dolphin/gx/GX.h +++ b/include/dolphin/gx/GX.h @@ -990,6 +990,10 @@ inline void GXPosition2u16(u16 x, u16 y) { GFX_FIFO(u16) = y; } +inline void GXPosition1x16(u16 x) { + GFX_FIFO(u16) = x; +} + inline void GXEnd() {} }; diff --git a/src/d/map/d_map_path.cpp b/src/d/map/d_map_path.cpp index b673a6283f4..ab7b7364902 100644 --- a/src/d/map/d_map_path.cpp +++ b/src/d/map/d_map_path.cpp @@ -17,16 +17,25 @@ struct dRes_control_c { /* 8003C2EC */ void getRes(char const*, s32, dRes_info_c*, int); }; + struct dMpath_n { struct dTexObjAggregate_c { /* 8003C85C */ void create(); /* 8003C8F4 */ void remove(); - /* 8003D740 */ ~dTexObjAggregate_c(); + /* 8003D740 */ ~dTexObjAggregate_c() {remove();}; + inline dTexObjAggregate_c() { + for(int i = 0;i<7;i++) { + mTexObjs[i] = NULL; + } + } + GXTexObj* mTexObjs[7]; }; - static u8 m_texObjAgg[28]; + static dTexObjAggregate_c m_texObjAgg; }; +STATIC_ASSERT(sizeof(dMpath_n::dTexObjAggregate_c)==28); + // // Forward References: // @@ -78,9 +87,9 @@ extern "C" void _savegpr_28(); extern "C" void _restgpr_26(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); -extern "C" extern u8 g_mDoMtx_identity[48 + 24 /* padding */]; +extern "C" extern Mtx g_mDoMtx_identity; extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" extern u8 g_clearColor[4]; +extern "C" extern GXColor g_clearColor; // // Declarations: @@ -232,48 +241,49 @@ asm void dRenderingFDAmap_c::setTevSettingIntensityTextureToCI() const { } #pragma pop -/* ############################################################################################## */ -/* 80451E08-80451E0C 000408 0004+00 3/3 0/0 0/0 .sdata2 @3836 */ -SECTION_SDATA2 static u8 lit_3836[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; - /* 8003D0AC-8003D188 0379EC 00DC+00 1/1 0/0 0/0 .text drawBack__18dRenderingFDAmap_cCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dRenderingFDAmap_c::drawBack() const { - nofralloc -#include "asm/d/map/d_map_path/drawBack__18dRenderingFDAmap_cCFv.s" +void dRenderingFDAmap_c::drawBack() const { + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS,GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_POS,GX_CLR_RGBA,GX_F32,0); + GXColor* colorPtr = getBackColor(); + GXSetTevColor(GX_TEVREG0,*colorPtr); + GXBegin(GX_QUADS,GX_VTXFMT0,4); + GXPosition3f32(-field_0x8,-field_0xc,0); + GXPosition3f32(field_0x8,-field_0xc,0); + GXPosition3f32(field_0x8,field_0xc,0); + GXPosition3f32(-field_0x8,field_0xc,0); + GXEnd(); } -#pragma pop - -/* ############################################################################################## */ -/* 80451E0C-80451E10 00040C 0004+00 1/1 0/0 0/0 .sdata2 @3846 */ -SECTION_SDATA2 static f32 lit_3846 = 1.0f; - -/* 80451E10-80451E14 000410 0004+00 1/1 0/0 0/0 .sdata2 @3847 */ -SECTION_SDATA2 static f32 lit_3847 = 0.5f; - -/* 80451E14-80451E18 000414 0004+00 1/1 0/0 0/0 .sdata2 @3848 */ -SECTION_SDATA2 static f32 lit_3848 = 10000.0f; - -/* 80451E18-80451E20 000418 0008+00 1/1 0/0 0/0 .sdata2 @3850 */ -SECTION_SDATA2 static f64 lit_3850 = 4503599627370496.0 /* cast u32 to float */; /* 8003D188-8003D320 037AC8 0198+00 1/0 8/0 0/0 .text preRenderingMap__18dRenderingFDAmap_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dRenderingFDAmap_c::preRenderingMap() { - nofralloc -#include "asm/d/map/d_map_path/preRenderingMap__18dRenderingFDAmap_cFv.s" +void dRenderingFDAmap_c::preRenderingMap() { + GXSetViewport(0.0f,0.0f,field_0x1c,field_0x1e,0.0f,1.0f); + GXSetScissor(0,0,field_0x1c,field_0x1e); + GXSetNumChans(1); + GXSetNumTevStages(1); + GXSetChanCtrl(GX_COLOR0A0,GX_FALSE,GX_SRC_REG,GX_SRC_REG,GX_LIGHT_NULL,GX_DF_NONE,GX_AF_NONE); + GXSetAlphaCompare(GX_ALWAYS,0,GX_AOP_OR,GX_ALWAYS,0); + GXSetZCompLoc(GX_TRUE); + GXSetZMode(GX_FALSE,GX_ALWAYS,GX_FALSE); + GXSetBlendMode(GX_BM_NONE,GX_BL_SRC_ALPHA,GX_BL_INV_SRC_ALPHA,GX_LO_CLEAR); + GXColor color = g_clearColor; + GXSetFog(GX_FOG_NONE,0.0f,0.0f,0.0f,0.0f,color); + GXSetCullMode(GX_CULL_NONE); + GXSetDither(GX_FALSE); + GXSetNumIndStages(0); + GXSetClipMode(GX_FALSE); + setTevSettingNonTextureDirectColor(); + float right = field_0x8*0.5f; + float top = field_0xc*0.5f; + Mtx44 matrix; + C_MTXOrtho(matrix,top,-top,-right,right,0.0f,10000.0f); + GXSetProjection(matrix,GX_ORTHOGRAPHIC); + GXLoadPosMtxImm(g_mDoMtx_identity,GX_PNMTX0); + GXSetCurrentMtx(0); + drawBack(); } -#pragma pop /* 8003D320-8003D3C0 037C60 00A0+00 1/0 7/1 0/0 .text postRenderingMap__18dRenderingFDAmap_cFv */ #pragma push @@ -285,29 +295,73 @@ asm void dRenderingFDAmap_c::postRenderingMap() { } #pragma pop -/* ############################################################################################## */ -/* 80424678-80424684 051398 000C+00 1/1 0/0 0/0 .bss @3639 */ -static u8 lit_3639[12]; - /* 80424684-804246A0 0513A4 001C+00 2/2 5/5 0/0 .bss m_texObjAgg__8dMpath_n */ -u8 dMpath_n::m_texObjAgg[28]; +dMpath_n::dTexObjAggregate_c dMpath_n::m_texObjAgg; + +/* Enabling the following definition will modify the following function to + * make the map look worse for extra speed in the emulator, especially in large + * areas such as hyrule field. + */ +//#define HYRULE_FIELD_SPEEDHACK /* 8003D3C0-8003D68C 037D00 02CC+00 0/0 2/2 0/0 .text * renderingDecoration__18dRenderingFDAmap_cFPCQ211dDrawPath_c10line_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void dRenderingFDAmap_c::renderingDecoration(dDrawPath_c::line_class const* param_0) { - nofralloc -#include "asm/d/map/d_map_path/renderingDecoration__18dRenderingFDAmap_cFPCQ211dDrawPath_c10line_class.s" +void dRenderingFDAmap_c::renderingDecoration(dDrawPath_c::line_class const* line) { + s32 width = getDecorationLineWidth(line->unk1); + if (width<=0) { + return; + } + setTevSettingIntensityTextureToCI(); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS,GX_INDEX16); + GXSetVtxDesc(GX_VA_TEX0,GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_POS,GX_POS_XY,GX_F32,0); + GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_TEX0,GX_POS_XYZ,GX_F32,0); + GXSetNumTevStages(1); + GXLoadTexObj(dMpath_n::m_texObjAgg.mTexObjs[6],GX_TEXMAP0); + u16* unk = line->unk4; + s32 unk2 = line->unk2; + GXSetLineWidth(width,GX_TO_ONE); + GXSetPointSize(width,GX_TO_ONE); + GXColor* lineColorPtr = getDecoLineColor(line->unk0&0x3f,line->unk1); + GXColor lineColor = *lineColorPtr; + GXSetTevColor(GX_TEVREG0,lineColor); + lineColor.r = lineColor.r-4; + GXSetTevColor(GX_TEVREG1,lineColor); + for (int i = 0; i 3 and linesplit[2]!="NOT": + if line.find("lit_")!=-1: + lbl = symbol['label'] + for literal in literals_found: + if literal == lbl: + print("Warning! two literals with the same name found!\n"+lbl) + literals_found.append(symbol['label']) addr = int(linesplit[2],16) file.write(f"\t\"{symbol['label']}\" = 0x{addr:08X};\n") else: