From 9cc61c405835a7d5fa831543f9332e7e84d0c44c Mon Sep 17 00:00:00 2001 From: Mike Lester Date: Mon, 12 Jan 2026 23:01:35 -0700 Subject: [PATCH] Fix up a shadow-related variable/parameter names (#920) * Fix up a shadow-related variable/parameter names * Fix compilation errors in d_a_obj_barrel.cpp --- include/d/actor/d_a_obj_barrel.h | 2 +- include/d/actor/d_a_player_main.h | 4 +- include/d/actor/d_a_stone.h | 2 +- include/d/d_com_inf_game.h | 30 ++--- include/d/d_drawlist.h | 14 +-- src/d/actor/d_a_obj_barrel.cpp | 4 +- src/d/actor/d_a_player_hang.inc | 8 +- src/d/actor/d_a_player_main.cpp | 20 ++-- src/d/actor/d_a_stone.cpp | 2 +- src/d/d_com_inf_game.cpp | 16 +-- src/d/d_drawlist.cpp | 175 ++++++++++++++++-------------- 11 files changed, 145 insertions(+), 132 deletions(-) diff --git a/include/d/actor/d_a_obj_barrel.h b/include/d/actor/d_a_obj_barrel.h index 06c474ee3..406736fde 100644 --- a/include/d/actor/d_a_obj_barrel.h +++ b/include/d/actor/d_a_obj_barrel.h @@ -25,7 +25,7 @@ namespace daObjBarrel { struct Attr_c { /* 0x00 */ u16 mBdlIdx; - /* 0x02 */ u8 m02; + /* 0x02 */ u8 mShadowSize; /* 0x03 */ bool mEnableCutoff; /* 0x04 */ float mAttnH; /* 0x08 */ float mNormalGravity; diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index e05da8899..f7be09693 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -2253,7 +2253,7 @@ public: /* 0x35D0 */ f32 m35D0; /* 0x35D4 */ f32 m35D4; /* 0x35D8 */ f32 m35D8; - /* 0x35DC */ f32 m35DC; + /* 0x35DC */ f32 mHangGroundH; /* 0x35E0 */ f32 m35E0; /* 0x35E4 */ f32 m35E4; /* 0x35E8 */ f32 m35E8; @@ -2267,7 +2267,7 @@ public: /* 0x3608 */ f32 m3608; /* 0x360C */ f32 mSeAnmRate; /* 0x3610 */ f32 m3610; - /* 0x3614 */ int m3614; + /* 0x3614 */ int mShadowId; /* 0x3618 */ u32 mModeFlg; /* 0x361C */ u32 mMtrlSndId; /* 0x3620 */ u32 m3620; diff --git a/include/d/actor/d_a_stone.h b/include/d/actor/d_a_stone.h index 16d2453f3..e80b78409 100644 --- a/include/d/actor/d_a_stone.h +++ b/include/d/actor/d_a_stone.h @@ -58,7 +58,7 @@ namespace daStone { /* 0x78 */ u32 m78; /* 0x7C */ u16 m7C; /* 0x7E */ u8 m7E; - /* 0x80 */ s16 m80; + /* 0x80 */ s16 shadowScaleXZ; /* 0x82 */ s16 m82; /* 0x84 */ s16 m84; /* 0x86 */ s16 m86; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 51890c018..c86c7fb8e 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -3445,31 +3445,31 @@ stage_arrow_class* dComIfGp_getRoomArrow(int i_roomNo); * === DRAWLIST === */ -int dComIfGd_setShadow(u32 id, s8 param_2, J3DModel* pModel, cXyz* pPos, f32 param_5, f32 param_6, - f32 y, f32 param_8, cBgS_PolyInfo& pFloorPoly, dKy_tevstr_c* param_10, - s16 rotY = 0, f32 param_12 = 1.0f, +int dComIfGd_setShadow(u32 id, s8 shouldFade, J3DModel* pModel, cXyz* pPos, f32 casterSize, f32 scaleXZ, + f32 y, f32 groundY, cBgS_PolyInfo& pFloorPoly, dKy_tevstr_c* pTevStr, + s16 rotY = 0, f32 scaleZ = 1.0f, GXTexObj* pTexObj = dDlst_shadowControl_c::getSimpleTex()); -inline int dComIfGd_setSimpleShadow(cXyz* i_pos, f32 groundY, f32 param_2, cXyz* floor_nrm, - s16 i_angle = 0, f32 param_5 = 1.0f, +inline int dComIfGd_setSimpleShadow(cXyz* i_pos, f32 groundY, f32 scaleXZ, cXyz* floor_nrm, + s16 i_angle = 0, f32 scaleZ = 1.0f, GXTexObj* i_tex = dDlst_shadowControl_c::getSimpleTex()) { - return g_dComIfG_gameInfo.drawlist.setSimpleShadow(i_pos, groundY, param_2, floor_nrm, i_angle, - param_5, i_tex); + return g_dComIfG_gameInfo.drawlist.setSimpleShadow(i_pos, groundY, scaleXZ, floor_nrm, i_angle, + scaleZ, i_tex); } -int dComIfGd_setSimpleShadow2(cXyz* i_pos, f32 param_1, f32 param_2, cBgS_PolyInfo& i_floorPoly, - s16 i_angle = 0, f32 param_5 = 1.0f, +int dComIfGd_setSimpleShadow2(cXyz* i_pos, f32 groundY, f32 scaleXZ, cBgS_PolyInfo& i_floorPoly, + s16 i_angle = 0, f32 scaleZ = 1.0f, GXTexObj* i_tex = dDlst_shadowControl_c::getSimpleTex()); -inline int dComIfGd_setRealShadow(u32 id, s8 param_2, J3DModel* pModel, cXyz* pPos, f32 param_5, - f32 param_6, dKy_tevstr_c* pTevStr) { - return g_dComIfG_gameInfo.drawlist.setRealShadow(id, param_2, pModel, pPos, param_5, param_6, +inline int dComIfGd_setRealShadow(u32 id, s8 shouldFade, J3DModel* pModel, cXyz* pPos, f32 casterSize, + f32 heightAboveGround, dKy_tevstr_c* pTevStr) { + return g_dComIfG_gameInfo.drawlist.setRealShadow(id, shouldFade, pModel, pPos, casterSize, heightAboveGround, pTevStr); } -inline int dComIfGd_setRealShadow2(u32 id, s8 param_2, J3DModel* pModel, cXyz* pPos, f32 param_5, - f32 param_6, dKy_tevstr_c* pTevStr) { - return g_dComIfG_gameInfo.drawlist.setRealShadow2(id, param_2, pModel, pPos, param_5, param_6, +inline int dComIfGd_setRealShadow2(u32 id, s8 shouldFade, J3DModel* pModel, cXyz* pPos, f32 casterSize, + f32 heightAboveGround, dKy_tevstr_c* pTevStr) { + return g_dComIfG_gameInfo.drawlist.setRealShadow2(id, shouldFade, pModel, pPos, casterSize, heightAboveGround, pTevStr); } diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index 4d5e72115..0bec36577 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -580,18 +580,18 @@ public: void drawXluListInvisible() { drawXluDrawList(mpXluListInvisible); } void drawOpaList2D() { drawOpaDrawList(mpOpaList2D); } - int setSimpleShadow(cXyz* i_pos, f32 groundY, f32 param_2, cXyz* floor_nrm, s16 i_angle, - f32 param_5, GXTexObj* i_tex) { - return mShadowControl.setSimple(i_pos, groundY, param_2, floor_nrm, i_angle, param_5, + int setSimpleShadow(cXyz* i_pos, f32 groundY, f32 scaleXZ, cXyz* floor_nrm, s16 i_angle, + f32 scaleZ, GXTexObj* i_tex) { + return mShadowControl.setSimple(i_pos, groundY, scaleXZ, floor_nrm, i_angle, scaleZ, i_tex); } - int setRealShadow(u32 id, s8 param_2, J3DModel* pModel, cXyz* pPos, f32 param_5, f32 param_6, + int setRealShadow(u32 id, s8 shouldFade, J3DModel* pModel, cXyz* pPos, f32 casterSize, f32 heightAboveGround, dKy_tevstr_c* pTevStr) { - return mShadowControl.setReal(id, param_2, pModel, pPos, param_5, param_6, pTevStr); + return mShadowControl.setReal(id, shouldFade, pModel, pPos, casterSize, heightAboveGround, pTevStr); } - int setRealShadow2(u32 id, s8 param_2, J3DModel* pModel, cXyz* pPos, f32 param_5, f32 param_6, + int setRealShadow2(u32 id, s8 shouldFade, J3DModel* pModel, cXyz* pPos, f32 casterSize, f32 heightAboveGround, dKy_tevstr_c* pTevStr) { - return mShadowControl.setReal2(id, param_2, pModel, pPos, param_5, param_6, pTevStr); + return mShadowControl.setReal2(id, shouldFade, pModel, pPos, casterSize, heightAboveGround, pTevStr); } bool addRealShadow(u32 id, J3DModel* pModel) { return mShadowControl.addReal(id, pModel); diff --git a/src/d/actor/d_a_obj_barrel.cpp b/src/d/actor/d_a_obj_barrel.cpp index 1fefabfbc..9edeb1de7 100644 --- a/src/d/actor/d_a_obj_barrel.cpp +++ b/src/d/actor/d_a_obj_barrel.cpp @@ -59,7 +59,7 @@ const dCcD_SrcCyl daObjBarrel::Act_c::M_cyl_src = { const daObjBarrel::Act_c::Attr_c daObjBarrel::Act_c::M_attr = { /* mBdlIdx */ KTARU_01_BDL_KTARU_01, - /* m02 */ 60, + /* mShadowSize */ 60, /* mEnableCutoff */ false, /* mAttnH */ 50.0f, /* mNormalGravity */ -6.0f, @@ -727,7 +727,7 @@ bool daObjBarrel::Act_c::_draw() { cM3dGPla* gndPlane = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); cXyz *norm = gndPlane->GetNP(); if (norm && gndH != -G_CM3D_F_INF) { - dComIfGd_setSimpleShadow(¤t.pos, gndH, attr().m02, norm); + dComIfGd_setSimpleShadow(¤t.pos, gndH, attr().mShadowSize, norm); } } return true; diff --git a/src/d/actor/d_a_player_hang.inc b/src/d/actor/d_a_player_hang.inc index 857fba640..24cae1cfa 100644 --- a/src/d/actor/d_a_player_hang.inc +++ b/src/d/actor/d_a_player_hang.inc @@ -113,13 +113,13 @@ int daPy_lk_c::changeHangEndProc(int param_0) { pos.z = pMVar6[2][3] - cM_scos(shape_angle.y) * 4.0f; mGndChk.SetPos(&pos); - m35DC = dComIfG_Bgsp()->GroundCross(&mGndChk); - if (-G_CM3D_F_INF != m35DC) { + mHangGroundH = dComIfG_Bgsp()->GroundCross(&mGndChk); + if (-G_CM3D_F_INF != mHangGroundH) { m3588 = dComIfG_Bgsp()->GetAttributeCode(mGndChk); } else { m3588 = dBgS_Attr_UNK1B_e; } - if (m35DC > mFootData[1].field_0x018.y + current.pos.y) { + if (mHangGroundH > mFootData[1].field_0x018.y + current.pos.y) { return procLand_init(m_HIO->mAutoJump.m.field_0x24, 0); } if (param_0 != 0) { @@ -215,7 +215,7 @@ BOOL daPy_lk_c::procHangStart_init() { mVelocity = 0.0f; speed.y = 0.0f; dComIfGp_setPlayerStatus0(0, daPyStts0_UNK100_e); - m35DC = mAcch.GetGroundH(); + mHangGroundH = mAcch.GetGroundH(); return true; } diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index 2b7d28285..129889c31 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -1584,7 +1584,7 @@ void daPy_lk_c::drawShadow() { } f32 f31; if (checkModeFlg(ModeFlg_HANG)) { - f31 = m35DC; + f31 = mHangGroundH; } else { f31 = mAcch.GetGroundH(); } @@ -1596,13 +1596,13 @@ void daPy_lk_c::drawShadow() { } else { f1 = m_HIO->mBasic.m.field_0x10; } - int iVar4 = dComIfGd_setShadow(m3614, 0, mpCLModel, &local_30, f1, 30.0f, current.pos.y, + int iVar4 = dComIfGd_setShadow(mShadowId, 0, mpCLModel, &local_30, f1, 30.0f, current.pos.y, f31, mAcch.m_gnd, &tevStr, 0, 1.0f, &dDlst_shadowControl_c::mSimpleTexObj); - m3614 = iVar4; - if ((u32)m3614 != 0) { + mShadowId = iVar4; + if ((u32)mShadowId != 0) { if (checkNoResetFlg1(daPyFlg1_CASUAL_CLOTHES) && !checkCaughtShapeHide()) { - dComIfGd_addRealShadow(m3614, mpKatsuraModel); + dComIfGd_addRealShadow(mShadowId, mpKatsuraModel); } if (checkSwordEquip() #if VERSION == VERSION_DEMO @@ -1611,7 +1611,7 @@ void daPy_lk_c::drawShadow() { && !checkDemoSwordNoDraw(1) #endif ) { - dComIfGd_addRealShadow(m3614, mpEquippedSwordModel); + dComIfGd_addRealShadow(mShadowId, mpEquippedSwordModel); } if ((mpEquipItemModel != NULL #if VERSION == VERSION_DEMO @@ -1622,7 +1622,7 @@ void daPy_lk_c::drawShadow() { ) && (!checkBowItem(mEquipItem) || !checkPlayerGuard())) { - dComIfGd_addRealShadow(m3614, mpEquipItemModel); + dComIfGd_addRealShadow(mShadowId, mpEquipItemModel); } if (dComIfGs_getSelectEquip(1) != dItem_NONE_e #if VERSION == VERSION_DEMO @@ -1631,18 +1631,18 @@ void daPy_lk_c::drawShadow() { && !checkDemoShieldNoDraw() #endif ) { - dComIfGd_addRealShadow(m3614, mpEquippedShieldModel); + dComIfGd_addRealShadow(mShadowId, mpEquippedShieldModel); } fopAc_ac_c* pfVar10; if (mActorKeepGrab.getID() != fpcM_ERROR_PROCESS_ID_e) { pfVar10 = fopAcM_SearchByID(mActorKeepGrab.getID()); if (pfVar10 != NULL && fopAcM_GetModel(pfVar10) != NULL) { - dComIfGd_addRealShadow(m3614, fopAcM_GetModel(pfVar10)); + dComIfGd_addRealShadow(mShadowId, fopAcM_GetModel(pfVar10)); } } else if (mActorKeepEquip.getID() != fpcM_ERROR_PROCESS_ID_e) { pfVar10 = fopAcM_SearchByID(mActorKeepEquip.getID()); if (pfVar10 != NULL && fopAcM_GetModel(pfVar10) != NULL) { - dComIfGd_addRealShadow(m3614, fopAcM_GetModel(pfVar10)); + dComIfGd_addRealShadow(mShadowId, fopAcM_GetModel(pfVar10)); } } } diff --git a/src/d/actor/d_a_stone.cpp b/src/d/actor/d_a_stone.cpp index 469ea9a9d..ddb2e8dbe 100644 --- a/src/d/actor/d_a_stone.cpp +++ b/src/d/actor/d_a_stone.cpp @@ -969,7 +969,7 @@ bool Act_c::_draw() { g_env_light.setLightTevColorType(mpModel, &tevStr); mDoExt_modelUpdateDL(mpModel); if (fopAcM_GetModel(this) == NULL) { - dComIfGd_setSimpleShadow2(¤t.pos, mAcch.GetGroundH(), data().m80, mAcch.m_gnd); + dComIfGd_setSimpleShadow2(¤t.pos, mAcch.GetGroundH(), data().shadowScaleXZ, mAcch.m_gnd); } } return true; diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index 9bde2487d..bcb848a3d 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -563,13 +563,13 @@ s8 dComIfGp_getReverb(int param_0) { } /* 800534C4-800535B8 .text dComIfGd_setSimpleShadow2__FP4cXyzffR13cBgS_PolyInfosfP9_GXTexObj */ -int dComIfGd_setSimpleShadow2(cXyz* i_pos, f32 groundY, f32 param_2, cBgS_PolyInfo& i_floorPoly, - s16 i_angle, f32 param_5, GXTexObj* i_tex) { +int dComIfGd_setSimpleShadow2(cXyz* i_pos, f32 groundY, f32 scaleXZ, cBgS_PolyInfo& i_floorPoly, + s16 i_angle, f32 scaleZ, GXTexObj* i_tex) { if (i_floorPoly.ChkSetInfo() && -G_CM3D_F_INF != groundY) { cM3dGPla* plane_p = dComIfG_Bgsp()->GetTriPla(i_floorPoly); - return dComIfGd_setSimpleShadow(i_pos, groundY, param_2, plane_p->GetNP(), i_angle, param_5, i_tex); + return dComIfGd_setSimpleShadow(i_pos, groundY, scaleXZ, plane_p->GetNP(), i_angle, scaleZ, i_tex); } else { return 0; } @@ -1041,17 +1041,17 @@ u8 dComIfGs_checkGetItemNum(u8 i_itemNo) { } /* 80054578-8005468C .text dComIfGd_setShadow__FUlScP8J3DModelP4cXyzffffR13cBgS_PolyInfoP12dKy_tevstr_csfP9_GXTexObj */ -int dComIfGd_setShadow(u32 id, s8 param_2, J3DModel* pModel, cXyz* pPos, f32 param_5, f32 param_6, - f32 y, f32 groundY, cBgS_PolyInfo& pFloorPoly, dKy_tevstr_c* param_10, - s16 rotY, f32 param_12, GXTexObj* pTexObj) { +int dComIfGd_setShadow(u32 id, s8 shouldFade, J3DModel* pModel, cXyz* pPos, f32 casterSize, f32 scaleXZ, + f32 y, f32 groundY, cBgS_PolyInfo& pFloorPoly, dKy_tevstr_c* pTevStr, + s16 rotY, f32 scaleZ, GXTexObj* pTexObj) { if (groundY <= -G_CM3D_F_INF) { return 0; } - int sid = dComIfGd_setRealShadow2(id, param_2, pModel, pPos, param_5, y - groundY, param_10); + int sid = dComIfGd_setRealShadow2(id, shouldFade, pModel, pPos, casterSize, y - groundY, pTevStr); if (sid == 0) { cXyz pos(pPos->x, y, pPos->z); - dComIfGd_setSimpleShadow2(&pos, groundY, param_6, pFloorPoly, rotY, param_12, pTexObj); + dComIfGd_setSimpleShadow2(&pos, groundY, scaleXZ, pFloorPoly, rotY, scaleZ, pTexObj); } return sid; } diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 7dce6cc98..7e362f026 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -1427,118 +1427,131 @@ void seaRealCallBack(void* user, cXyz& v0, cXyz& v1, cXyz& v2) { } /* 80083E18-800840B0 .text realPolygonCheck__FP4cXyzffP4cXyzP18dDlst_shadowPoly_c */ -BOOL realPolygonCheck(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, dDlst_shadowPoly_c* param_4) { +BOOL realPolygonCheck(cXyz* param_0, f32 casterRadius, f32 heightAgl, cXyz* lightDir, dDlst_shadowPoly_c* shadowPoly) { ShdwDrawPoly_c shdwDrawPoly; - cXyz local_8c; - cXyz local_98; - f32 tmp1 = param_1 * param_1 * 0.002f; + + // Compute a bounding box around the shadow receiver based on its position, size, and light direction + cXyz bbMin; + cXyz bbMax; + f32 tmp1 = casterRadius * casterRadius * 0.002f; f32 tmp2 = cLib_maxLimit(tmp1, 120.0f); - f32 var1 = param_1 + param_2 - tmp2; - local_8c.y = param_0->y - var1; - local_98.y = param_0->y + param_1 * 0.4f; - local_98.x = param_0->x + param_3->x * var1; - if (local_98.x < param_0->x) { - local_8c.x = local_98.x; - local_98.x = param_0->x; + f32 var1 = casterRadius + heightAgl - tmp2; + bbMin.y = param_0->y - var1; + bbMax.y = param_0->y + casterRadius * 0.4f; + bbMax.x = param_0->x + lightDir->x * var1; + if (bbMax.x < param_0->x) { + bbMin.x = bbMax.x; + bbMax.x = param_0->x; } else { - local_8c.x = param_0->x; + bbMin.x = param_0->x; } - local_8c.x -= param_1; - local_98.x += param_1; - var1 = param_0->z + param_3->z * var1; - local_98.z = var1; + bbMin.x -= casterRadius; + bbMax.x += casterRadius; + var1 = param_0->z + lightDir->z * var1; + bbMax.z = var1; if (var1 < param_0->z) { - local_8c.z = local_98.z; - local_98.z = param_0->z; + bbMin.z = bbMax.z; + bbMax.z = param_0->z; } else { - local_8c.z = param_0->z; + bbMin.z = param_0->z; } - local_8c.z -= param_1; - local_98.z += param_1; + bbMin.z -= casterRadius; + bbMax.z += casterRadius; + mDoLib_clipper::changeFar(mDoLib_clipper::getFovyRate() * 3000.0f); - s32 clip = mDoLib_clipper::clip(j3dSys.getViewMtx(), &local_98, &local_8c); + s32 clip = mDoLib_clipper::clip(j3dSys.getViewMtx(), &bbMax, &bbMin); mDoLib_clipper::resetFar(); if (clip) { return FALSE; } - shdwDrawPoly.Set(local_8c, local_98); + + // Gather a list of polygons from the bg geometry (dBgS) or the sea (daSea) that will act as shadow receivers + // ShdwDrawPoly_c is a transient object for collecting the triangles, which are stored permanently in dDlst_shadowPoly_c + shdwDrawPoly.Set(bbMin, bbMax); shdwDrawPoly.SetCallback(psdRealCallBack); shdwDrawPoly.setCenter(param_0); - shdwDrawPoly.setLightVec(param_3); - shdwDrawPoly.setPoly(param_4); + shdwDrawPoly.setLightVec(lightDir); + shdwDrawPoly.setPoly(shadowPoly); dComIfG_Bgsp()->ShdwDraw(&shdwDrawPoly); - daSea_GetPoly(&shdwDrawPoly, seaRealCallBack, local_8c, local_98); + daSea_GetPoly(&shdwDrawPoly, seaRealCallBack, bbMin, bbMax); return TRUE; } /* 800841B0-8008450C .text setShadowRealMtx__FPA4_fPA4_fPA4_fP4cXyzP4cXyzffP18dDlst_shadowPoly_cf */ -u8 setShadowRealMtx(Mtx r26, Mtx r27, Mtx r28, cXyz* r6, cXyz* r29, f32 f30, f32 f31, dDlst_shadowPoly_c* r30, f32 f3) { - r30->reset(); - if (f3 >= 1.0f) { +u8 setShadowRealMtx(Mtx viewMtx, Mtx renderProjMtx, Mtx receiverProjMtx, cXyz* lightPos, cXyz* pos, f32 casterSize, f32 heightAgl, dDlst_shadowPoly_c* shadowPoly, f32 heightFade) { + shadowPoly->reset(); + if (heightFade >= 1.0f) { return 0; } - f32 f1 = 1.0f - f3; - if (f1 > 1.0f) { - f1 = 1.0f; + f32 opacity = 1.0f - heightFade; + if (opacity > 1.0f) { + opacity = 1.0f; } - int r31 = 200.0f * f1; - cXyz local_64 = *r6 - *r29; - local_64.y += f31; - f32 tmp = 0.02f * (50.0f - f31); + int alpha = 200.0f * opacity; + cXyz lightVec = *lightPos - *pos; + + // The higher off the ground a shadow caster is, the weaker the shadow's horizontal components become + // This cheats the light vec to be more vertical when the caster is high up, a la platforming drop shadows + // At 50 units above ground, the shadow is fully vertical + lightVec.y += heightAgl; + f32 tmp = 0.02f * (50.0f - heightAgl); if (tmp < 0.0f) { - local_64.x = 0.0f; - local_64.z = 0.0f; + lightVec.x = 0.0f; + lightVec.z = 0.0f; } else if (tmp < 1.0f) { - local_64.x *= tmp; - local_64.z *= tmp; + lightVec.x *= tmp; + lightVec.z *= tmp; } - f32 tmp2 = std::sqrtf(local_64.abs2()); - if (tmp2 != 0.0f) { - f32 tmp3 = (local_64.y / tmp2); + + f32 lightDist = std::sqrtf(lightVec.abs2()); + if (lightDist != 0.0f) { + f32 tmp3 = (lightVec.y / lightDist); if (tmp3 < 1.5f) { - local_64.y = 1.5f * tmp2; - tmp2 = local_64.abs2(); - tmp2 = std::sqrtf(tmp2); + lightVec.y = 1.5f * lightDist; + lightDist = lightVec.abs2(); + lightDist = std::sqrtf(lightDist); } - tmp2 = (f30 * 0.5f) / tmp2; + lightDist = (casterSize * 0.5f) / lightDist; } - local_64 *= tmp2; - local_64 += *r29; - f32 f29 = f30 * 0.4f; - cXyz local_70 = *r29 - local_64; - if (local_70.isZero()) { - local_70.y = -1.0f; - local_64.y = r29->y + 1.0f; + lightVec *= lightDist; + lightVec += *pos; + + f32 casterRadius = casterSize * 0.4f; + cXyz rayDir = *pos - lightVec; + if (rayDir.isZero()) { + rayDir.y = -1.0f; + lightVec.y = pos->y + 1.0f; } else { - local_70.normalize(); + rayDir.normalize(); } - if (!realPolygonCheck(r29, f29, f31, &local_70, r30)) { + + if (!realPolygonCheck(pos, casterRadius, heightAgl, &rayDir, shadowPoly)) { return 0; } - cMtx_lookAt(r26, &local_64, r29, 0); - C_MTXOrtho(r27, f29, -f29, -f29, f29, 1.0f, 10000.0f); - C_MTXLightOrtho(r28, f29, -f29, -f29, f29, 0.5f, -0.5f, 0.5f, 0.5f); - cMtx_concat(r28, r26, r28); - return r31; + cMtx_lookAt(viewMtx, &lightVec, pos, 0); + C_MTXOrtho(renderProjMtx, casterRadius, -casterRadius, -casterRadius, casterRadius, 1.0f, 10000.0f); + C_MTXLightOrtho(receiverProjMtx, casterRadius, -casterRadius, -casterRadius, casterRadius, 0.5f, -0.5f, 0.5f, 0.5f); + cMtx_concat(receiverProjMtx, viewMtx, receiverProjMtx); + return alpha; } /* 8008450C-800846C8 .text set__18dDlst_shadowReal_cFUlScP8J3DModelP4cXyzffP12dKy_tevstr_c */ -u32 dDlst_shadowReal_c::set(u32 key, s8 param_2, J3DModel* model, cXyz* param_4, f32 param_5, f32 param_6, dKy_tevstr_c* tevstr) { +u32 dDlst_shadowReal_c::set(u32 key, s8 shouldFade, J3DModel* model, cXyz* pos, f32 casterSize, f32 heightAboveGround, dKy_tevstr_c* tevstr) { if (mState != 1 || key != mKey) { cXyz lightPos = dKy_plight_near_pos(); if (tevstr) { lightPos = tevstr->mLightPosWorld; } mAlpha = setShadowRealMtx( - mViewMtx, mRenderProjMtx, mReceiverProjMtx, &lightPos, param_4, param_5, param_6, &mShadowRealPoly, - param_2 == 0 ? 0.0f : param_6 * 0.0007f + mViewMtx, mRenderProjMtx, mReceiverProjMtx, &lightPos, pos, casterSize, heightAboveGround, &mShadowRealPoly, + shouldFade == 0 ? 0.0f : heightAboveGround * 0.0007f ); if (mAlpha == 0) { return 0; } mState = 1; mKey = key; - field_0x1 = param_2; + field_0x1 = shouldFade; mpDrawBuffer->setCallBackPacket(mpCallBack); mModelNum = 0; } @@ -1558,22 +1571,22 @@ u32 dDlst_shadowReal_c::set(u32 key, s8 param_2, J3DModel* model, cXyz* param_4, } /* 800846C8-80084844 .text set2__18dDlst_shadowReal_cFUlScP8J3DModelP4cXyzffP12dKy_tevstr_c */ -u32 dDlst_shadowReal_c::set2(u32 key, s8 r27, J3DModel* model, cXyz* r28, f32 f30, f32 f31, dKy_tevstr_c* tevstr) { +u32 dDlst_shadowReal_c::set2(u32 key, s8 shouldFade, J3DModel* model, cXyz* pos, f32 casterSize, f32 heightAboveGround, dKy_tevstr_c* tevstr) { if (mModelNum == 0) { cXyz lightPos = dKy_plight_near_pos(); if (tevstr) { lightPos = tevstr->mLightPosWorld; } mAlpha = setShadowRealMtx( - mViewMtx, mRenderProjMtx, mReceiverProjMtx, &lightPos, r28, f30, f31, &mShadowRealPoly, - r27 == 0 ? 0.0f : f31 * 0.00025f + mViewMtx, mRenderProjMtx, mReceiverProjMtx, &lightPos, pos, casterSize, heightAboveGround, &mShadowRealPoly, + shouldFade == 0 ? 0.0f : heightAboveGround * 0.00025f ); if (mAlpha == 0) { return 0; } mState = 1; mKey = key; - field_0x1 = r27; + field_0x1 = shouldFade; mModelNum = 0; } @@ -1645,11 +1658,11 @@ void dDlst_shadowSimple_c::draw() { } /* 80084AC8-80084D48 .text set__20dDlst_shadowSimple_cFP4cXyzffP4cXyzsfP9_GXTexObj */ -void dDlst_shadowSimple_c::set(cXyz* pos, f32 y, f32 param_3, cXyz* floorNrm, s16 rotY, f32 param_6, GXTexObj* texObj) { - f32 offsetY = param_3 * 16.0f * (1.0f - floorNrm->y) + 1.0f; +void dDlst_shadowSimple_c::set(cXyz* pos, f32 y, f32 scaleXZ, cXyz* floorNrm, s16 rotY, f32 scaleZ, GXTexObj* texObj) { + f32 offsetY = scaleXZ * 16.0f * (1.0f - floorNrm->y) + 1.0f; mDoMtx_stack_c::transS(pos->x, y + offsetY, pos->z); mDoMtx_stack_c::YrotM(rotY); - mDoMtx_stack_c::scaleM(param_3, offsetY + offsetY + 16.0f, param_3 * param_6); + mDoMtx_stack_c::scaleM(scaleXZ, offsetY + offsetY + 16.0f, scaleXZ * scaleZ); mDoMtx_concat(j3dSys.getViewMtx(), mDoMtx_stack_c::get(), mVolumeMtx); f32 xs = std::sqrtf(1.0f - floorNrm->x * floorNrm->x); @@ -1679,7 +1692,7 @@ void dDlst_shadowSimple_c::set(cXyz* pos, f32 y, f32 param_3, cXyz* floorNrm, s1 mDoMtx_stack_c::get()[2][3] = pos->z; mDoMtx_stack_c::YrotM(rotY); - mDoMtx_stack_c::scaleM(param_3, 1.0f, param_3 * param_6); + mDoMtx_stack_c::scaleM(scaleXZ, 1.0f, scaleXZ * scaleZ); mDoMtx_concat(j3dSys.getViewMtx(), mDoMtx_stack_c::get(), mMtx); f32 dist = 1.0f - (pos->y - y) * 0.0007f; if (dist < 0.0f) @@ -1762,12 +1775,12 @@ void dDlst_shadowControl_c::draw(Mtx drawMtx) { } /* 800850D4-80085170 .text setReal__21dDlst_shadowControl_cFUlScP8J3DModelP4cXyzffP12dKy_tevstr_c */ -int dDlst_shadowControl_c::setReal(u32 key, s8 size, J3DModel* model, cXyz* pos, f32 f0, f32 f1, dKy_tevstr_c* tevstr) { +int dDlst_shadowControl_c::setReal(u32 key, s8 shouldFade, J3DModel* model, cXyz* pos, f32 casterSize, f32 heightAboveGround, dKy_tevstr_c* tevstr) { if (key != 0) { dDlst_shadowReal_c * real = &mReal[0]; for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, real++) { if (real->isUse() && real->checkKey(key)) { - return real->set(key, size, model, pos, f0, f1, tevstr); + return real->set(key, shouldFade, model, pos, casterSize, heightAboveGround, tevstr); } } } @@ -1776,7 +1789,7 @@ int dDlst_shadowControl_c::setReal(u32 key, s8 size, J3DModel* model, cXyz* pos, for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, real++) { if (real->isNoUse()) { while (++mNextID == 0) {} - return real->set(mNextID, size, model, pos, f0, f1, tevstr); + return real->set(mNextID, shouldFade, model, pos, casterSize, heightAboveGround, tevstr); } } @@ -1784,12 +1797,12 @@ int dDlst_shadowControl_c::setReal(u32 key, s8 size, J3DModel* model, cXyz* pos, } /* 80085170-8008520C .text setReal2__21dDlst_shadowControl_cFUlScP8J3DModelP4cXyzffP12dKy_tevstr_c */ -int dDlst_shadowControl_c::setReal2(u32 key, s8 size, J3DModel* model, cXyz* pos, f32 f0, f32 f1, dKy_tevstr_c* tevstr) { +int dDlst_shadowControl_c::setReal2(u32 key, s8 shouldFade, J3DModel* model, cXyz* pos, f32 casterSize, f32 heightAboveGround, dKy_tevstr_c* tevstr) { if (key != 0) { dDlst_shadowReal_c * real = &mReal[0]; for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, real++) { if (real->isUse() && real->checkKey(key)) { - return real->set2(key, size, model, pos, f0, f1, tevstr); + return real->set2(key, shouldFade, model, pos, casterSize, heightAboveGround, tevstr); } } } @@ -1798,7 +1811,7 @@ int dDlst_shadowControl_c::setReal2(u32 key, s8 size, J3DModel* model, cXyz* pos for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, real++) { if (real->isNoUse()) { while (++mNextID == 0) {} - return real->set2(mNextID, size, model, pos, f0, f1, tevstr); + return real->set2(mNextID, shouldFade, model, pos, casterSize, heightAboveGround, tevstr); } } @@ -1821,11 +1834,11 @@ bool dDlst_shadowControl_c::addReal(u32 key, J3DModel* model) { } /* 80085274-800852D8 .text setSimple__21dDlst_shadowControl_cFP4cXyzffP4cXyzsfP9_GXTexObj */ -int dDlst_shadowControl_c::setSimple(cXyz* pos, f32 groundY, f32 f1, cXyz* floor_nrm, s16 rotY, f32 f2, GXTexObj* tex) { +int dDlst_shadowControl_c::setSimple(cXyz* pos, f32 groundY, f32 scaleXZ, cXyz* floor_nrm, s16 rotY, f32 scaleZ, GXTexObj* tex) { if (floor_nrm == NULL || mSimpleNum >= ARRAY_SIZE(mSimple)) return false; - mSimple[mSimpleNum].set(pos, groundY, f1, floor_nrm, rotY, f2, tex); + mSimple[mSimpleNum].set(pos, groundY, scaleXZ, floor_nrm, rotY, scaleZ, tex); mSimpleNum++; return true; }