summaryrefslogtreecommitdiff
path: root/src/engine/sky/SkyStar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/sky/SkyStar.cpp')
-rw-r--r--src/engine/sky/SkyStar.cpp165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/engine/sky/SkyStar.cpp b/src/engine/sky/SkyStar.cpp
new file mode 100644
index 000000000..7f696d7bb
--- /dev/null
+++ b/src/engine/sky/SkyStar.cpp
@@ -0,0 +1,165 @@
+#include <libultraship.h>
+#include <libultra/gbi.h>
+#include "SkyStar.h"
+#include <vector>
+#include "engine/tracks/Track.h"
+#include "engine/World.h"
+
+#include "port/Engine.h"
+#include "port/Game.h"
+#include "port/interpolation/FrameInterpolation.h"
+
+extern "C" {
+#include "update_objects.h"
+#include "code_80057C60.h"
+#include "code_8006E9C0.h"
+#include "assets/models/common_data.h"
+#include "assets/textures/common_data.h"
+#include "math_util_2.h"
+#include "render_objects.h"
+}
+
+size_t SkyStar::_count = 0;
+
+SkyStar::SkyStar(ScreenContext* screen, u16 cloudVariant, u16 posY, u16 rotY, u16 scalePercent) : SkyActor(screen) {
+ _idx = _count;
+
+ // ItemWindowObjects* temp_v0;
+ //find_unused_obj_index(&_objectIndex);
+ //init_object(_objectIndex, 1);
+// temp_v0 = (ItemWindowObjects*) &gObjectList[_objectIndex];
+ mCloudVariant = cloudVariant;
+// temp_v0->unk_0D5 = cloudVariant;
+ // temp_v0->currentItem = ITEM_BANANA;
+ // temp_v0->direction_angle[1] = rotY;
+ mY = posY;
+// temp_v0->unk_09E = posY;
+ mScale = (f32) scalePercent / 100.0;
+// temp_v0->sizeScaling = (f32) scalePercent / 100.0;
+ mTexture = (u8*)D_0D0293D8;
+// temp_v0->activeTexture = (u8*)D_0D0293D8;
+ //func_80073404(_objectIndex, 0x10U, 0x10U, (Vtx*)common_vtx_rectangle);
+ mVtx = (Vtx*)common_vtx_rectangle;
+ mTextureWidth = 16;
+ mTextureHeight = 16;
+ mRotY = rotY;
+
+ mPrimAlpha = 0;
+ mUnk_0CF = 0;
+ mUnk_0AC = 0;
+ mUnk_0D0 = 0;
+
+
+ _count += 1;
+}
+
+void SkyStar::Tick() {
+ s16 cameraRot;
+
+ s16 mUnk200 = mScreen->camera->fieldOfView + 40.0f;
+ mUnk208 = ((mUnk200 / 2) * 0xB6) + 0x71C;
+ mUnk210 = (-(mUnk200 / 2) * 0xB6) - 0x71C;
+ mUnk1E8 = 1.7578125 / mUnk200;
+ mUnk218 = SCREEN_WIDTH / 2;
+
+ // Adjustable culling factor
+ const float cullingFactor = OTRGetAspectRatio();
+
+ // Calculate the cloud's rotation relative to the camera
+ cameraRot = (u16)mScreen->camera->rot[1] + (u16)mRotY;
+ // Adjust bounds based on the culling factor
+ s16 adjustedLowerBound = (s16) (mUnk210 * cullingFactor);
+ s16 adjustedUpperBound = (s16) (mUnk208 * cullingFactor);
+
+ // Check if the object is within the adjusted bounds
+ if ((cameraRot >= adjustedLowerBound) && (adjustedUpperBound >= cameraRot)) {
+ // Calculate and update the object's position
+ // 160 (SCREEN_WIDTH / 2) + (mUnk1E8 * cameraRot);
+ // Grab center of screen, scale by fov factor, offset based on camera rotation
+ mX = mUnk218 + (mUnk1E8 * cameraRot);
+
+ mVisible = true;
+ } else {
+ mVisible = false;
+ }
+
+ // Vary the star based on star index
+ switch (_idx % 5U) {
+ case 0:
+ star_func_80073B78(1, 0x00000028, 0x000000B4, 0x000000FF, 0, -1);
+ break;
+ case 1:
+ star_func_80073B78(1, 0x00000080, 0x000000FF, 0x000000FF, 0, -1);
+ break;
+ case 2:
+ star_func_80073B78(1, 0x00000050, 0x000000C8, 0x000000FF, 0, -1);
+ break;
+ case 3:
+ star_func_80073B78(1, 0, 0x0000009B, 0x000000FF, 0, -1);
+ break;
+ case 4:
+ star_func_80073B78(1, 0x0000005A, 0x00000080, 0x000000FF, 0, -1);
+ break;
+ }
+}
+
+void SkyStar::Draw(ScreenContext* screen, s32 arg0) { // render_stars
+ s32 posY = arg0 - mY;
+ func_8004B414(255, 255, 255, 255);
+ if (mVisible) {
+ FrameInterpolation_RecordOpenChild("render_stars", TAG_CLOUDS((_idx << 4) | (screen - gScreenOneCtx)));
+
+ func_80044DA0((u8*)mTexture, mTextureWidth, mTextureHeight);
+
+ func_8004B138(0xFF, 0xFF, 0xFF, mPrimAlpha);
+ func_80042330_unchanged(mX, posY, 0, mScale);
+ gSPVertex(gDisplayListHead++, (uintptr_t)mVtx, 4, 0);
+ gSPDisplayList(gDisplayListHead++, (Gfx*)common_rectangle_display);
+ FrameInterpolation_RecordCloseChild();
+ }
+}
+
+bool SkyStar::star_func_80073B78(s32 arg0, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7) {
+ s32 phi_t0;
+
+ phi_t0 = false;
+ if (mUnk_0CF == 0) { // s8
+ mUnk_0AC = arg6; // s16
+ if (arg0 != 0) {
+ mPrimAlpha = arg3;
+ }
+ mUnk_0D0 = arg7; // s8
+ //func_80073800(objectIndex, 1);
+ mUnk_0CF = 1;
+ } else {
+ mUnk_0AC--;
+ if (mUnk_0AC < 0) {
+ mUnk_0AC = arg6;
+ if (mUnk_0CF == 1) {
+ mPrimAlpha += arg5;
+ if (mPrimAlpha >= arg4) {
+ mPrimAlpha = arg4;
+ mUnk_0CF++;
+ }
+ } else {
+ mPrimAlpha -= arg5;
+ if (arg3 >= mPrimAlpha) {
+ mPrimAlpha = arg3;
+ if (mUnk_0D0 > 0) {
+ mUnk_0D0--;
+ }
+ if (mUnk_0D0 == 0) {
+ //func_80073800(objectIndex, 0);
+ mUnk_0CF = 0;
+ //func_8007381C(objectIndex); // does nothing? += unk_0DC
+ phi_t0 = true;
+ } else {
+ mUnk_0CF = 1;
+ }
+ }
+ }
+ }
+ }
+
+ return phi_t0;
+} \ No newline at end of file