summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2026-09-22 11:12:18 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2026-09-22 11:17:09 -0400
commita6f0a58421cd39404cf97850cbf461d8431b14ea (patch)
tree010198ac69c8fc612b7f5735b51e401234243457 /src
parent83a06ced84253a3136210f4d43f1e50f1f1303b2 (diff)
d_t_view_clip OK - Linked
Diffstat (limited to 'src')
-rw-r--r--src/d/tg/d_t_view_clip.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/d/tg/d_t_view_clip.cpp b/src/d/tg/d_t_view_clip.cpp
new file mode 100644
index 00000000..30ef9cba
--- /dev/null
+++ b/src/d/tg/d_t_view_clip.cpp
@@ -0,0 +1,93 @@
+#include "d/t/d_t_view_clip.h"
+
+#include "common.h"
+#include "d/d_camera.h"
+#include "d/d_sc_game.h"
+#include "f/f_base.h"
+#include "toBeSorted/area_math.h"
+#include "toBeSorted/area_utils.h"
+
+SPECIAL_ACTOR_PROFILE(VIEW_CLIP_TAG, dTgViewClip_c, fProfile::VIEW_CLIP_TAG, 0xB, 0, 0);
+
+u8 dTgViewClip_c::sViewClips[dTgViewClip_c::sNumEntries] = {};
+
+int dTgViewClip_c::create() {
+ mIndex = getFromParams(0, 0x3F);
+ mType = getFromParams(8, 0xF);
+ if (mType == 0xF) {
+ mType = TYPE_FORCE_OFF;
+ }
+
+ mAreaIndex = getFromParams(12, 0xFF);
+ matrixCreateFromPosRotYScale(mArea, mPosition, mRotation.y, mScale, nullptr, 0.0f);
+
+ return SUCCEEDED;
+}
+
+int dTgViewClip_c::doDelete() {
+ return SUCCEEDED;
+}
+
+int dTgViewClip_c::actorExecute() {
+ return SUCCEEDED;
+}
+
+int dTgViewClip_c::draw() {
+ dCamera_c *pCamera = dScGame_c::getCamera();
+ if (!checkAreaBox(mArea, pCamera->getPosition())) {
+ if (mAreaIndex == 0xFF) {
+ return SUCCEEDED;
+ }
+ if (!checkPosInArea(mAreaIndex, mRoomID, pCamera->getPosition(), nullptr)) {
+ return SUCCEEDED;
+ }
+ }
+
+ switch (mType) {
+ case TYPE_FORCE_ON: setViewClip(FLAG_FORCE_ON); break;
+ case TYPE_FORCE_OFF: setViewClip(FLAG_FORCE_OFF); break;
+ }
+
+ return SUCCEEDED;
+}
+
+void dTgViewClip_c::setViewClip(u8 setBit) {
+ setViewClipBit(mIndex, setBit);
+}
+
+void dTgViewClip_c::resetViewClip() {
+ for (int i = 0; i < sNumEntries - 1; ++i) {
+ setViewClip(i, 0);
+ }
+}
+
+f32 dTgViewClip_c::getCull(s32 idx, f32 cullDistance) {
+ if (idx > ARRAY_LENGTH(sViewClips) - 2) {
+ return cullDistance;
+ }
+
+ if (getViewClipBit(idx, FLAG_FORCE_ON)) {
+ return FLOAT_MAX;
+ } else if (getViewClipBit(idx, FLAG_FORCE_OFF)) {
+ return -1.0f;
+ }
+
+ return cullDistance;
+}
+bool dTgViewClip_c::checkForceOn(s32 idx) {
+ if (idx <= ARRAY_LENGTH(sViewClips) - 2) {
+ return getViewClipBit(idx, FLAG_FORCE_ON);
+ }
+ return false;
+}
+
+u8 dTgViewClip_c::getViewClipBit(s32 idx, u8 setBit) {
+ return sViewClips[idx] & setBit;
+}
+void dTgViewClip_c::setViewClipBit(s32 idx, u8 setBit) {
+ sViewClips[idx] |= setBit;
+}
+
+void dTgViewClip_c::setViewClip(s32 idx, u8 value) {
+ sViewClips[idx] = value;
+}