diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2024-10-10 07:29:58 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-10 08:29:58 -0600 |
| commit | 12eb254d769d84743b5cc6cd5424057c57eaf0ad (patch) | |
| tree | 4509be332b2ccfc6fe939f47740d68f7746eca3e /src/d/d_map_path.cpp | |
| parent | 2fd702c0ac170a789af879b8b92a82d4dcc9080c (diff) | |
switch to dtk setup (#2203)
* switch to dtk setup
* some cleanup / fixes
* cleanup d_a_alink literals
* Restore doxygen, update CI & README.md (#1)
* Fix build image ref (#2)
---------
Co-authored-by: Luke Street <luke@street.dev>
Diffstat (limited to 'src/d/d_map_path.cpp')
| -rw-r--r-- | src/d/d_map_path.cpp | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/src/d/d_map_path.cpp b/src/d/d_map_path.cpp new file mode 100644 index 0000000000..a555813ad9 --- /dev/null +++ b/src/d/d_map_path.cpp @@ -0,0 +1,340 @@ +/** + * d_map_path.cpp + * + */ + +#include "d/d_map_path.h" +#include "JSystem/J2DGraph/J2DGrafContext.h" +#include "JSystem/JUtility/JUTTexture.h" +#include "d/d_com_inf_game.h" +#include "m_Do/m_Do_lib.h" + +/* 8003C85C-8003C8F4 03719C 0098+00 0/0 1/1 0/0 .text create__Q28dMpath_n18dTexObjAggregate_cFv */ +void dMpath_n::dTexObjAggregate_c::create() { + static int const data[7] = { + 79, 80, 77, 78, 76, 81, 82, + }; + + for (int i = 0; i < 7; i++) { + mp_texObj[i] = new GXTexObj(); + + ResTIMG* image = (ResTIMG*)dComIfG_getObjectRes("Always", data[i]); + mDoLib_setResTimgObj(image, mp_texObj[i], 0, NULL); + } +} + +/* 8003C8F4-8003C94C 037234 0058+00 1/1 1/1 0/0 .text remove__Q28dMpath_n18dTexObjAggregate_cFv */ +void dMpath_n::dTexObjAggregate_c::remove() { + for (int i = 0; i < 7; i++) { + delete mp_texObj[i]; + mp_texObj[i] = NULL; + } +} + +/* 8003C94C-8003CA40 03728C 00F4+00 2/0 9/2 0/0 .text + * rendering__11dDrawPath_cFPCQ211dDrawPath_c10line_class */ +void dDrawPath_c::rendering(dDrawPath_c::line_class const* p_line) { + if (isDrawType(p_line->field_0x0)) { + int width = getLineWidth(p_line->field_0x1); + + if (width > 0 && p_line->mDataNum >= 2) { + GXSetLineWidth(width, GX_TO_ZERO); + GXSetTevColor(GX_TEVREG0, *getLineColor(p_line->field_0x0 & 0x3F, p_line->field_0x1)); + GXBegin(GX_LINESTRIP, GX_VTXFMT0, p_line->mDataNum); + + u16* tmp = p_line->mpData; + for (int i = 0; i < p_line->mDataNum; i++) { + GXPosition1x16(*tmp); + tmp++; + } + GXEnd(); + } + } +} + +/* 8003CA40-8003CB00 037380 00C0+00 2/0 9/1 0/0 .text + * rendering__11dDrawPath_cFPCQ211dDrawPath_c10poly_class */ +void dDrawPath_c::rendering(dDrawPath_c::poly_class const* p_poly) { + if (isDrawType(p_poly->field_0x0)) { + GXSetTevColor(GX_TEVREG0, *getColor(p_poly->field_0x0 & 0x3F)); + + if (p_poly->mDataNum >= 3) { + GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, p_poly->mDataNum); + + u16* tmp = p_poly->mpData; + for (int i = 0; i < p_poly->mDataNum; i++) { + GXPosition1x16(*tmp); + tmp++; + } + GXEnd(); + } + } +} + +/* 8003CB00-8003CBBC 037440 00BC+00 1/1 0/0 0/0 .text + * rendering__11dDrawPath_cFPCQ211dDrawPath_c11group_class */ +void dDrawPath_c::rendering(dDrawPath_c::group_class const* p_group) { + if (isSwitch(p_group)) { + poly_class* poly = p_group->mpPoly; + for (int i = 0; i < p_group->mPolyNum; i++) { + rendering(poly); + poly++; + } + + line_class* line = p_group->mpLine; + for (int i = 0; i < p_group->mLineNum; i++) { + rendering(line); + line++; + } + } +} + +/* 8003CBBC-8003CC24 0374FC 0068+00 1/1 0/0 0/0 .text + * rendering__11dDrawPath_cFPCQ211dDrawPath_c11floor_class */ +void dDrawPath_c::rendering(dDrawPath_c::floor_class const* p_floor) { + if (p_floor->mpGroup != NULL) { + group_class* group = p_floor->mpGroup; + + for (int i = 0; i < p_floor->mGroupNum; i++) { + rendering(group); + group++; + } + } +} + +/* 8003CC24-8003CCC4 037564 00A0+00 2/0 9/1 0/0 .text + * rendering__11dDrawPath_cFPCQ211dDrawPath_c10room_class */ +void dDrawPath_c::rendering(dDrawPath_c::room_class const* p_room) { + if (p_room != NULL) { + GXSetArray(GX_VA_POS, p_room->mpFloatData, 8); + floor_class* floor = p_room->mpFloor; + + if (floor != NULL) { + for (int i = 0; i < p_room->mFloorNum; i++) { + if (isRenderingFloor(floor->mFloorNo)) { + rendering(floor); + } + floor++; + } + } + } +} + +/* 8003CCC4-8003CD38 037604 0074+00 2/0 9/1 0/0 .text drawPath__11dDrawPath_cFv */ +void dDrawPath_c::drawPath() { + room_class* room = getFirstRoomPointer(); + while (room != NULL) { + rendering(room); + room = getNextRoomPointer(); + } +} + +/* 8003CD38-8003CDAC 037678 0074+00 0/0 3/3 0/0 .text + * makeResTIMG__15dRenderingMap_cCFP7ResTIMGUsUsPUcPUcUs */ +void dRenderingMap_c::makeResTIMG(ResTIMG* p_image, u16 width, u16 height, u8* p_data, + u8* p_palette, u16 param_5) const { + p_image->format = GX_TF_CI14; + p_image->alphaEnabled = 2; + p_image->width = width; + p_image->height = height; + p_image->wrapS = GX_CLAMP; + p_image->wrapT = GX_CLAMP; + p_image->indexTexture = true; + p_image->colorFormat = 2; + p_image->numColors = param_5 * 4; + p_image->paletteOffset = p_palette - (u8*)p_image; + p_image->mipmapEnabled = false; + p_image->doEdgeLOD = false; + p_image->biasClamp = false; + p_image->maxAnisotropy = 0; + p_image->minFilter = GX_LINEAR; + p_image->magFilter = GX_LINEAR; + p_image->minLOD = 0; + p_image->maxLOD = 0; + p_image->mipmapCount = 1; + p_image->LODBias = 0; + p_image->imageOffset = p_data - (u8*)p_image; +} + +/* 8003CDAC-8003CE78 0376EC 00CC+00 0/0 2/2 0/0 .text renderingMap__15dRenderingMap_cFv + */ +void dRenderingMap_c::renderingMap() { + preRenderingMap(); + if (isDrawPath()) { + preDrawPath(); + beforeDrawPath(); + drawPath(); + afterDrawPath(); + postDrawPath(); + } + postRenderingMap(); +} + +/* 8003CE78-8003CF40 0377B8 00C8+00 2/2 3/3 0/0 .text + * setTevSettingNonTextureDirectColor__18dRenderingFDAmap_cCFv */ +void dRenderingFDAmap_c::setTevSettingNonTextureDirectColor() const { + GXSetNumTevStages(1); + GXSetNumChans(1); + GXSetNumTexGens(0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0); +} + +/* 8003CF40-8003D0AC 037880 016C+00 1/1 3/3 0/0 .text + * setTevSettingIntensityTextureToCI__18dRenderingFDAmap_cCFv */ +void dRenderingFDAmap_c::setTevSettingIntensityTextureToCI() const { + GXSetNumTevStages(2); + GXSetNumChans(1); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 60, GX_FALSE, 125); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_KONST, GX_CC_TEXC, GX_CC_C1); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_CPREV, GX_CC_C2, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_COMP_R8_GT, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, + GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_AND, GX_ALWAYS, 0); + GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_1_4); +} + +/* 8003D0AC-8003D188 0379EC 00DC+00 1/1 0/0 0/0 .text drawBack__18dRenderingFDAmap_cCFv + */ +void dRenderingFDAmap_c::drawBack() const { + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXSetTevColor(GX_TEVREG0, *getBackColor()); + 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(); +} + +/* 8003D188-8003D320 037AC8 0198+00 1/0 8/0 0/0 .text preRenderingMap__18dRenderingFDAmap_cFv */ +void dRenderingFDAmap_c::preRenderingMap() { + GXSetViewport(0.0f, 0.0f, mTexWidth, mTexHeight, 0.0f, 1.0f); + GXSetScissor(0, 0, mTexWidth, mTexHeight); + 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); + GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor); + GXSetCullMode(GX_CULL_NONE); + GXSetDither(GX_FALSE); + GXSetNumIndStages(0); + GXSetClipMode(GX_CLIP_ENABLE); + setTevSettingNonTextureDirectColor(); + f32 right = field_0x8 * 0.5f; + f32 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(); +} + +/* 8003D320-8003D3C0 037C60 00A0+00 1/0 7/1 0/0 .text postRenderingMap__18dRenderingFDAmap_cFv */ +void dRenderingFDAmap_c::postRenderingMap() { + GXSetCopyFilter(GX_FALSE, NULL, GX_FALSE, NULL); + GXSetTexCopySrc(0, 0, mTexWidth, mTexHeight); + GXSetTexCopyDst(mTexWidth, mTexHeight, GX_CTF_G8, GX_FALSE); + GXCopyTex(field_0x4, GX_TRUE); + GXPixModeSync(); + GXSetClipMode(GX_CLIP_ENABLE); + GXSetDither(GX_TRUE); + dComIfGp_getCurrentGrafPort()->setup2D(); +} + +/* 80424684-804246A0 0513A4 001C+00 2/2 5/5 0/0 .bss m_texObjAgg__8dMpath_n */ +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 */ +void dRenderingFDAmap_c::renderingDecoration(dDrawPath_c::line_class const* p_line) { + s32 width = getDecorationLineWidth(p_line->field_0x1); + 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.mp_texObj[6], GX_TEXMAP0); + + u16* data_p = p_line->mpData; + s32 data_num = p_line->mDataNum; + GXSetLineWidth(width, GX_TO_ONE); + GXSetPointSize(width, GX_TO_ONE); + GXColor lineColor = *getDecoLineColor(p_line->field_0x0 & 0x3f, p_line->field_0x1); + GXSetTevColor(GX_TEVREG0, lineColor); + lineColor.r = lineColor.r - 4; + GXSetTevColor(GX_TEVREG1, lineColor); + + for (int i = 0; i < data_num; data_p++, i++) { +#ifndef HYRULE_FIELD_SPEEDHACK + if (i < data_num - 1) { + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, + GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_KONST); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, + GX_TEVPREV); + GXBegin(GX_LINESTRIP, GX_VTXFMT0, 2); + GXPosition1x16(data_p[0]); + GXTexCoord2f32(0, 0); + GXPosition1x16(data_p[1]); + GXTexCoord2f32(0, 0); + } + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_KONST, GX_CC_TEXC, GX_CC_C1); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); +#endif + GXBegin(GX_POINTS, GX_VTXFMT0, 1); + GXPosition1x16(data_p[0]); + GXTexCoord2f32(0, 0); + GXEnd(); + } + + setTevSettingNonTextureDirectColor(); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGB, GX_F32, 0); +} + +/* 8003D68C-8003D6B8 037FCC 002C+00 1/0 6/0 0/0 .text getDecoLineColor__18dRenderingFDAmap_cFii */ +const GXColor* dRenderingFDAmap_c::getDecoLineColor(int param_0, int param_1) { + return getLineColor(param_0, param_1); +} + +/* 8003D6B8-8003D6E4 037FF8 002C+00 1/0 6/0 0/0 .text + * getDecorationLineWidth__18dRenderingFDAmap_cFi */ +s32 dRenderingFDAmap_c::getDecorationLineWidth(int param_0) { + return getLineWidth(param_0); +}
\ No newline at end of file |
