diff --git a/include/m_Do/m_Do_lib.h b/include/m_Do/m_Do_lib.h index afa4b26837..8130cab8da 100644 --- a/include/m_Do/m_Do_lib.h +++ b/include/m_Do/m_Do_lib.h @@ -4,6 +4,10 @@ #include "JSystem/J3DU/J3DUClipper.h" #include +#if TARGET_PC +#include "JSystem/JGeometry.h" +#endif + #include "dusk/gx_helper.h" typedef struct Vec Vec; @@ -39,6 +43,10 @@ struct mDoLib_clipper { }; void mDoLib_project(Vec* src, Vec* dst); +#if TARGET_PC +void mDoLib_project(Vec* src, Vec* dst, JGeometry::TBox2 viewport); +#endif + u32 mDoLib_setResTimgObj(ResTIMG const* res, TGXTexObj* o_texObj, u32 tlut_name, GXTlutObj* o_tlutObj); void mDoLib_pos2camera(Vec* src, Vec* dst); diff --git a/src/d/actor/d_a_boomerang.cpp b/src/d/actor/d_a_boomerang.cpp index 590897640e..64dd71f985 100644 --- a/src/d/actor/d_a_boomerang.cpp +++ b/src/d/actor/d_a_boomerang.cpp @@ -337,7 +337,13 @@ void daBoomerang_sight_c::setSight(const cXyz* i_pos, int i_no) { } Vec proj; + + #if TARGET_PC + mDoLib_project(&m_pos[i_no], &proj, {0, 0, FB_WIDTH, FB_HEIGHT}); + #else mDoLib_project(&m_pos[i_no], &proj); + #endif + m_proj_posX[i_no] = proj.x; m_proj_posY[i_no] = proj.y; } diff --git a/src/d/actor/d_a_player.cpp b/src/d/actor/d_a_player.cpp index e5034369c1..1c2383511f 100644 --- a/src/d/actor/d_a_player.cpp +++ b/src/d/actor/d_a_player.cpp @@ -394,8 +394,13 @@ void daPy_sightPacket_c::draw() { void daPy_sightPacket_c::setSight() { Vec proj; - + + #if TARGET_PC + mDoLib_project(&mPos, &proj, {0, 0, FB_WIDTH, FB_HEIGHT}); + #else mDoLib_project(&mPos, &proj); + #endif + mDoMtx_stack_c::transS(proj.x, proj.y, proj.z); mDoMtx_stack_c::scaleM(32.0f, 32.0f, 32.0f); mDoMtx_copy(mDoMtx_stack_c::get(), mProjMtx); diff --git a/src/m_Do/m_Do_lib.cpp b/src/m_Do/m_Do_lib.cpp index e67cc6abf1..b865d9eff8 100644 --- a/src/m_Do/m_Do_lib.cpp +++ b/src/m_Do/m_Do_lib.cpp @@ -111,6 +111,65 @@ void mDoLib_project(Vec* src, Vec* dst) { dst->y = ((0.5f + (multVec.y * (-calcFloat))) * ySize) + yOffset; } + +#if TARGET_PC +void mDoLib_project(Vec* src, Vec* dst, JGeometry::TBox2 viewport) { + if (dComIfGd_getView() == NULL) { + dst->x = 0.0f; + dst->y = 0.0f; + dst->z = 0.0f; + return; + } + + { int unused; } + + Vec multVec; + cMtx_multVec(*dComIfGd_getProjViewMtx(), src, &multVec); + + f32 calcFloat = (src->x * (*dComIfGd_getProjViewMtx())[3][0]) + + (src->y * (*dComIfGd_getProjViewMtx())[3][1]) + + (src->z * (*dComIfGd_getProjViewMtx())[3][2]) + + (*dComIfGd_getProjViewMtx())[3][3]; + if (multVec.z >= 0.0f) { + multVec.z = 0.0f; + } + if (calcFloat <= 0.0f) { + if (calcFloat == 0.0f) { + dst->z = multVec.z * 500000.0f; + } else { + dst->z = multVec.z * (0.5f / calcFloat); + } + calcFloat = 500000.0f; + } else { + calcFloat = 0.5f / calcFloat; + dst->z = multVec.z * calcFloat; + } + + f32 xOffset; + f32 yOffset; + f32 xSize; + f32 ySize; + if (viewport.i.x != 0.0f) { + xOffset = (0.5f * ((2.0f * viewport.i.x) + viewport.f.x)) - (int)(FB_WIDTH / 2); + xSize = FB_WIDTH; + } else { + xOffset = viewport.i.x; + xSize = viewport.f.x; + } + + if (viewport.i.y != 0.0f) { + yOffset = (0.5f * ((2.0f * viewport.i.y) + viewport.f.y)) - (int)(FB_HEIGHT / 2); + ySize = FB_HEIGHT; + } else { + yOffset = viewport.i.y; + ySize = viewport.f.y; + } + + dst->x = ((0.5f + (multVec.x * calcFloat)) * xSize) + xOffset; + dst->y = ((0.5f + (multVec.y * (-calcFloat))) * ySize) + yOffset; +} +#endif + void mDoLib_pos2camera(Vec* src, Vec* dst) { if (dComIfGd_getView() == NULL) { dst->x = 0.0f;