fix reticles (#89)

This commit is contained in:
qwertyquerty
2026-03-13 14:41:46 -07:00
committed by GitHub
parent 18c0df40dd
commit 168d1f7e10
4 changed files with 79 additions and 1 deletions
+8
View File
@@ -4,6 +4,10 @@
#include "JSystem/J3DU/J3DUClipper.h"
#include <dolphin/gx/GXStruct.h>
#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<f32> viewport);
#endif
u32 mDoLib_setResTimgObj(ResTIMG const* res, TGXTexObj* o_texObj, u32 tlut_name,
GXTlutObj* o_tlutObj);
void mDoLib_pos2camera(Vec* src, Vec* dst);
+6
View File
@@ -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;
}
+6 -1
View File
@@ -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);
+59
View File
@@ -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<f32> 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;