From b5a7b69a42b7b9ce735f26e7b0c42b6b197fc131 Mon Sep 17 00:00:00 2001 From: MegaMech <7255464+MegaMech@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:43:47 -0700 Subject: [PATCH] Impl objects for editor --- src/engine/World.cpp | 12 ++++ src/engine/courses/FrappeSnowland.cpp | 2 +- src/engine/editor/Editor.cpp | 6 +- src/engine/editor/EditorMath.cpp | 98 --------------------------- src/engine/editor/EditorMath.h | 1 - src/engine/editor/Gizmo.h | 2 +- src/engine/editor/ObjectPicker.cpp | 1 + src/engine/editor/ObjectPicker.h | 3 - src/engine/objects/Bat.h | 2 - src/engine/objects/BombKart.cpp | 28 ++++---- src/engine/objects/BombKart.h | 1 - src/engine/objects/ChainChomp.cpp | 2 +- src/engine/objects/Crab.h | 1 - src/engine/objects/Flagpole.h | 1 - src/engine/objects/Hedgehog.cpp | 1 + src/engine/objects/HotAirBalloon.h | 1 - src/engine/objects/Mole.h | 1 - src/engine/objects/Object.h | 1 + src/engine/objects/Penguin.h | 1 - src/engine/objects/Seagull.h | 1 - src/engine/objects/Snowman.cpp | 1 + src/engine/objects/Snowman.h | 1 - src/engine/objects/Thwomp.h | 1 - src/engine/objects/TrashBin.h | 1 - src/engine/objects/Trophy.h | 1 - 25 files changed, 34 insertions(+), 137 deletions(-) diff --git a/src/engine/World.cpp b/src/engine/World.cpp index be94ad3a5..146f6697c 100644 --- a/src/engine/World.cpp +++ b/src/engine/World.cpp @@ -174,6 +174,18 @@ void World::TickActors() { OObject* World::AddObject(OObject* object) { Objects.push_back(object); + + if (object->_objectIndex != -1) { + Object* cObj = &gObjectList[object->_objectIndex]; + printf("model 0x%llX\n", cObj->model); + + if (cObj->model != NULL) { + gEditor.AddObject((FVector*) &cObj->origin_pos[0], (Gfx*)LOAD_ASSET_RAW(cObj->model), 1.0f, CollisionType::VTX_INTERSECT, 0.0f); + } else { + gEditor.AddObject((FVector*) &cObj->origin_pos[0], NULL, 1.0f, CollisionType::VTX_INTERSECT, 0.0f); + } + } + return Objects.back(); } diff --git a/src/engine/courses/FrappeSnowland.cpp b/src/engine/courses/FrappeSnowland.cpp index 7383946d1..05bcf95cb 100644 --- a/src/engine/courses/FrappeSnowland.cpp +++ b/src/engine/courses/FrappeSnowland.cpp @@ -130,7 +130,7 @@ void FrappeSnowland::LoadTextures() { void FrappeSnowland::BeginPlay() { spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_frappe_snowland_tree_spawns)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_frappe_snowland_item_box_spawns)); - + if (gGamestate != CREDITS_SEQUENCE) { gWorldInstance.AddObject(new OSnowman(FVector(697, 0, -1684))); gWorldInstance.AddObject(new OSnowman(FVector(82, 0, -2245))); diff --git a/src/engine/editor/Editor.cpp b/src/engine/editor/Editor.cpp index f44e89633..a662a85ea 100644 --- a/src/engine/editor/Editor.cpp +++ b/src/engine/editor/Editor.cpp @@ -28,14 +28,12 @@ int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_widt uint8_t resize); Editor::Editor() { - s32 test = 1; - // gsSPSetFB(gDisplayListHead++, &test); } void Editor::Load() { eObjectPicker.Load(); for (auto& object : eGameObjects) { - //GenerateCollisionMesh(object, object.Model, 1.0f); + GenerateCollisionMesh(object, object.Model, 1.0f); } } @@ -84,7 +82,6 @@ void Editor::Tick() { void Editor::Draw() { eObjectPicker.Draw(); - DrawObj(); } void Editor::AddObject(FVector* pos, Gfx* model, float scale, CollisionType collision, float boundingBoxSize) { @@ -92,7 +89,6 @@ void Editor::AddObject(FVector* pos, Gfx* model, float scale, CollisionType coll if (model != NULL) { eGameObjects.push_back({pos, model, {}, collision, boundingBoxSize}); GenerateCollisionMesh(eGameObjects.back(), model, scale); - printf("\n"); } else { // to bounding box or sphere collision eGameObjects.push_back({pos, model, {}, CollisionType::BOUNDING_BOX, 2.0f}); } diff --git a/src/engine/editor/EditorMath.cpp b/src/engine/editor/EditorMath.cpp index e2c94c7db..82de0e575 100644 --- a/src/engine/editor/EditorMath.cpp +++ b/src/engine/editor/EditorMath.cpp @@ -225,16 +225,6 @@ bool IntersectRayTriangle(const Ray& ray, const Triangle& tri, const FVector& ob t = f * edge2.Dot(q); return t > EPSILON; } -extern Gfx box_Cube_mesh[]; -void DrawObj() { - Mat4 mtx; - Vec3f pos2 = { DebugPoss.x, DebugPoss.y, DebugPoss.z }; - mtxf_translate(mtx, pos2); - mtxf_scale(mtx, 0.03); - render_set_position(mtx, 0); - gSPDisplayList(gDisplayListHead++, box_Cube_mesh); -} - bool FindClosestObject(const Ray& ray, const std::vector& objects, GameObject& outObject, float& outDistance) { float closestDist = std::numeric_limits::max(); @@ -258,91 +248,3 @@ bool FindClosestObject(const Ray& ray, const std::vector& objects, G return false; } - - - - - - -Vtx box_Cube_mesh_vtx_cull[8] = { - {{ {-46, -46, -46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {-46, -46, 46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {-46, 46, 46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {-46, 46, -46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {46, -46, -46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {46, -46, 46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {46, 46, 46}, 0, {0, 0}, {0, 0, 0, 0} }}, - {{ {46, 46, -46}, 0, {0, 0}, {0, 0, 0, 0} }}, -}; - -Vtx box_Cube_mesh_vtx_0[24] = { - {{ {-46, -46, 46}, 0, {368, 1008}, {129, 0, 0, 255} }}, - {{ {-46, 46, 46}, 0, {624, 1008}, {129, 0, 0, 255} }}, - {{ {-46, 46, -46}, 0, {624, 752}, {129, 0, 0, 255} }}, - {{ {-46, -46, -46}, 0, {368, 752}, {129, 0, 0, 255} }}, - {{ {-46, -46, -46}, 0, {368, 752}, {0, 0, 129, 255} }}, - {{ {-46, 46, -46}, 0, {624, 752}, {0, 0, 129, 255} }}, - {{ {46, 46, -46}, 0, {624, 496}, {0, 0, 129, 255} }}, - {{ {46, -46, -46}, 0, {368, 496}, {0, 0, 129, 255} }}, - {{ {46, -46, -46}, 0, {368, 496}, {127, 0, 0, 255} }}, - {{ {46, 46, -46}, 0, {624, 496}, {127, 0, 0, 255} }}, - {{ {46, 46, 46}, 0, {624, 240}, {127, 0, 0, 255} }}, - {{ {46, -46, 46}, 0, {368, 240}, {127, 0, 0, 255} }}, - {{ {46, -46, 46}, 0, {368, 240}, {0, 0, 127, 255} }}, - {{ {46, 46, 46}, 0, {624, 240}, {0, 0, 127, 255} }}, - {{ {-46, 46, 46}, 0, {624, -16}, {0, 0, 127, 255} }}, - {{ {-46, -46, 46}, 0, {368, -16}, {0, 0, 127, 255} }}, - {{ {-46, -46, -46}, 0, {112, 496}, {0, 129, 0, 255} }}, - {{ {46, -46, -46}, 0, {368, 496}, {0, 129, 0, 255} }}, - {{ {46, -46, 46}, 0, {368, 240}, {0, 129, 0, 255} }}, - {{ {-46, -46, 46}, 0, {112, 240}, {0, 129, 0, 255} }}, - {{ {46, 46, -46}, 0, {624, 496}, {0, 127, 0, 255} }}, - {{ {-46, 46, -46}, 0, {880, 496}, {0, 127, 0, 255} }}, - {{ {-46, 46, 46}, 0, {880, 240}, {0, 127, 0, 255} }}, - {{ {46, 46, 46}, 0, {624, 240}, {0, 127, 0, 255} }}, -}; - -Gfx box_Cube_mesh_tri_0[8] = { - gsSPVertex(box_Cube_mesh_vtx_0 + 0, 24, 0), - gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), - gsSP2Triangles(4, 5, 6, 0, 4, 6, 7, 0), - gsSP2Triangles(8, 9, 10, 0, 8, 10, 11, 0), - gsSP2Triangles(12, 13, 14, 0, 12, 14, 15, 0), - gsSP2Triangles(16, 17, 18, 0, 16, 18, 19, 0), - gsSP2Triangles(20, 21, 22, 0, 20, 22, 23, 0), - gsSPEndDisplayList(), -}; - -Gfx mat_box_f3dlite_material[6] = { - gsSPClearGeometryMode(G_CLIPPING), - gsDPPipeSync(), - gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT), - gsDPSetAlphaDither(G_AD_NOISE), - gsSPTexture(65535, 65535, 0, 0, 1), - gsSPEndDisplayList(), -}; - -Gfx mat_revert_box_f3dlite_material[4] = { - gsSPSetGeometryMode(G_CLIPPING), - gsDPPipeSync(), - gsDPSetAlphaDither(G_AD_DISABLE), - gsSPEndDisplayList(), -}; - -Gfx box_Cube_mesh[13] = { - gsSPClearGeometryMode(G_LIGHTING), - gsSPVertex(box_Cube_mesh_vtx_cull + 0, 8, 0), - gsSPSetGeometryMode(G_LIGHTING), - gsSPCullDisplayList(0, 7), - gsSPDisplayList(mat_box_f3dlite_material), - gsSPDisplayList(box_Cube_mesh_tri_0), - gsSPDisplayList(mat_revert_box_f3dlite_material), - gsDPPipeSync(), - gsSPSetGeometryMode(G_LIGHTING), - gsSPClearGeometryMode(G_TEXTURE_GEN), - gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT), - gsSPTexture(65535, 65535, 0, 0, 0), - gsSPEndDisplayList(), -}; - - diff --git a/src/engine/editor/EditorMath.h b/src/engine/editor/EditorMath.h index df52adde1..7ff5fb6a6 100644 --- a/src/engine/editor/EditorMath.h +++ b/src/engine/editor/EditorMath.h @@ -45,7 +45,6 @@ FVector4 MultiplyMatrixVector(float matrix[4][4], float vector[4]); s32 Inverse(MtxF* src, MtxF* dest); void Copy(MtxF* src, MtxF* dest); void Clear(MtxF* mf); -void DrawObj(); bool IntersectRayTriangle(const Ray& ray, const Triangle& tri, const FVector& objectPos, float& t); diff --git a/src/engine/editor/Gizmo.h b/src/engine/editor/Gizmo.h index 942d3119d..8ec01f023 100644 --- a/src/engine/editor/Gizmo.h +++ b/src/engine/editor/Gizmo.h @@ -52,9 +52,9 @@ public: {-5, 0, 0} // Z-Axis (Blue) }; FVector _ray; + GameObject* _selected; private: bool _draw = false; - GameObject* _selected; Lights1 handle_f3dlite_material_lights = gdSPDefLights1( diff --git a/src/engine/editor/ObjectPicker.cpp b/src/engine/editor/ObjectPicker.cpp index f2590e94c..41baea238 100644 --- a/src/engine/editor/ObjectPicker.cpp +++ b/src/engine/editor/ObjectPicker.cpp @@ -50,6 +50,7 @@ void ObjectPicker::SelectObject(std::vector& objects) { } else { //eGizmo.Disable(); eGizmo.Enabled = false; + eGizmo._selected = NULL; } } diff --git a/src/engine/editor/ObjectPicker.h b/src/engine/editor/ObjectPicker.h index 1bf9afa1f..8af5a8bd8 100644 --- a/src/engine/editor/ObjectPicker.h +++ b/src/engine/editor/ObjectPicker.h @@ -25,7 +25,4 @@ class ObjectPicker { s32 Inverse(MtxF* src, MtxF* dest); void Copy(MtxF* src, MtxF* dest); void Clear(MtxF* mf); - - void DrawObj(float length); - }; diff --git a/src/engine/objects/Bat.h b/src/engine/objects/Bat.h index f9e0df074..383542231 100644 --- a/src/engine/objects/Bat.h +++ b/src/engine/objects/Bat.h @@ -51,10 +51,8 @@ public: void func_8007D794(s32 objectIndex); void func_8007DA4C(s32 objectIndex); - private: FVector _pos; static size_t _count; size_t _idx; - s32 _objectIndex; }; diff --git a/src/engine/objects/BombKart.cpp b/src/engine/objects/BombKart.cpp index fc27103ed..17d956dff 100644 --- a/src/engine/objects/BombKart.cpp +++ b/src/engine/objects/BombKart.cpp @@ -72,7 +72,7 @@ OBombKart::OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, WheelPos[3][2] = _pos[2]; check_bounding_collision(&_Collision, 2.0f, _pos[0], _pos[1], _pos[2]); - find_unused_obj_index(&ObjectIndex); + find_unused_obj_index(&_objectIndex); _count++; } @@ -329,7 +329,7 @@ void OBombKart::Tick() { void OBombKart::Draw(s32 cameraId) { if (gModeSelection == BATTLE) { for (size_t playerId = 0; playerId < NUM_BOMB_KARTS_BATTLE; playerId++) { - Object* object = &gObjectList[ObjectIndex]; + Object* object = &gObjectList[_objectIndex]; if (object->state != 0) { s32 primAlpha = object->primAlpha; Player* player = &gPlayerOne[playerId]; @@ -337,9 +337,9 @@ void OBombKart::Draw(s32 cameraId) { object->pos[1] = player->pos[1] - 2.0; object->pos[2] = player->pos[2]; object->surfaceHeight = player->unk_074; - func_800563DC(ObjectIndex, cameraId, primAlpha); - func_8005669C(ObjectIndex, cameraId, primAlpha); - func_800568A0(ObjectIndex, cameraId); + func_800563DC(_objectIndex, cameraId, primAlpha); + func_8005669C(_objectIndex, cameraId, primAlpha); + func_800568A0(_objectIndex, cameraId); } } return; @@ -358,27 +358,27 @@ void OBombKart::Draw(s32 cameraId) { } Camera* camera = &camera1[cameraId]; if (cameraId == PLAYER_ONE) { - if (is_obj_flag_status_active(ObjectIndex, 0x00200000) != 0) { + if (is_obj_flag_status_active(_objectIndex, 0x00200000) != 0) { Unk_4A = 0; } else if (gGamestate != ENDING) { Unk_4A = 1; } - clear_object_flag(ObjectIndex, 0x00200000); + clear_object_flag(_objectIndex, 0x00200000); } // huh??? s32 state = State; if (State != States::DISABLED) { - gObjectList[ObjectIndex].pos[0] = Pos[0]; - gObjectList[ObjectIndex].pos[1] = Pos[1]; - gObjectList[ObjectIndex].pos[2] = Pos[2]; - s32 temp_s4 = func_8008A364(ObjectIndex, cameraId, 0x31C4U, 0x000001F4); - if (is_obj_flag_status_active(ObjectIndex, VISIBLE) != 0) { - set_object_flag(ObjectIndex, 0x00200000); + gObjectList[_objectIndex].pos[0] = Pos[0]; + gObjectList[_objectIndex].pos[1] = Pos[1]; + gObjectList[_objectIndex].pos[2] = Pos[2]; + s32 temp_s4 = func_8008A364(_objectIndex, cameraId, 0x31C4U, 0x000001F4); + if (is_obj_flag_status_active(_objectIndex, VISIBLE) != 0) { + set_object_flag(_objectIndex, 0x00200000); D_80183E80[0] = 0; D_80183E80[1] = func_800418AC(Pos[0], Pos[2], camera->pos); D_80183E80[2] = 0x8000; - func_800563DC(ObjectIndex, cameraId, 0x000000FF); + func_800563DC(_objectIndex, cameraId, 0x000000FF); OBombKart::SomeRender(camera->pos); if (((u32) temp_s4 < 0x4E21U) && (state != BOMB_STATE_EXPLODED)) { OBombKart::LoadMtx(); diff --git a/src/engine/objects/BombKart.h b/src/engine/objects/BombKart.h index 3663ee664..d703a06a4 100644 --- a/src/engine/objects/BombKart.h +++ b/src/engine/objects/BombKart.h @@ -47,7 +47,6 @@ public: u16 Unk_4A = 0; s16 Unk_4C = 1; f32 CenterY; // Center of the circle - s32 ObjectIndex = 0; // Index into gObjectList Collision _Collision; // Set waypoint to NULL if using a spawn position and not a waypoint. diff --git a/src/engine/objects/ChainChomp.cpp b/src/engine/objects/ChainChomp.cpp index 1008aab52..a7222af23 100644 --- a/src/engine/objects/ChainChomp.cpp +++ b/src/engine/objects/ChainChomp.cpp @@ -19,7 +19,7 @@ size_t OChainChomp::_count = 0; OChainChomp::OChainChomp() { _idx = _count; init_object(indexObjectList2[_count], 0); - + _objectIndex = indexObjectList2[_count]; _count++; } diff --git a/src/engine/objects/Crab.h b/src/engine/objects/Crab.h index 2d1ef5e93..4cadd3b87 100644 --- a/src/engine/objects/Crab.h +++ b/src/engine/objects/Crab.h @@ -46,5 +46,4 @@ private: FVector2D _end; static size_t _count; s32 _idx; - s32 _objectIndex; }; diff --git a/src/engine/objects/Flagpole.h b/src/engine/objects/Flagpole.h index 034db865e..5824fcf18 100644 --- a/src/engine/objects/Flagpole.h +++ b/src/engine/objects/Flagpole.h @@ -42,5 +42,4 @@ private: s16 _direction; static size_t _count; size_t _idx; - s32 _objectIndex; }; diff --git a/src/engine/objects/Hedgehog.cpp b/src/engine/objects/Hedgehog.cpp index 133a1f38d..9f99cd34b 100644 --- a/src/engine/objects/Hedgehog.cpp +++ b/src/engine/objects/Hedgehog.cpp @@ -19,6 +19,7 @@ OHedgehog::OHedgehog(const FVector& pos, const FVector2D& patrolPoint, s16 unk) _pos = pos; s32 objectId = indexObjectList2[_idx]; + _objectIndex = objectId; init_object(objectId, 0); gObjectList[objectId].pos[0] = gObjectList[objectId].origin_pos[0] = pos.x * xOrientation; gObjectList[objectId].pos[1] = gObjectList[objectId].surfaceHeight = pos.y + 6.0; diff --git a/src/engine/objects/HotAirBalloon.h b/src/engine/objects/HotAirBalloon.h index 5dad406db..301e111c4 100644 --- a/src/engine/objects/HotAirBalloon.h +++ b/src/engine/objects/HotAirBalloon.h @@ -31,5 +31,4 @@ public: private: FVector _pos; bool *_visible; - s32 _objectIndex; }; diff --git a/src/engine/objects/Mole.h b/src/engine/objects/Mole.h index 7707b5383..1457c72cc 100644 --- a/src/engine/objects/Mole.h +++ b/src/engine/objects/Mole.h @@ -40,7 +40,6 @@ public: void func_80081790(s32 objectIndex); void func_8008153C(s32 objectIndex); - s32 _objectIndex; s32 _moleIndex; private: static size_t _count; diff --git a/src/engine/objects/Object.h b/src/engine/objects/Object.h index b78b27240..c5ffa072b 100644 --- a/src/engine/objects/Object.h +++ b/src/engine/objects/Object.h @@ -12,6 +12,7 @@ public: uint8_t uuid[16]; Object o; bool PendingDestroy = false; + s32 _objectIndex = -1; virtual ~OObject() = default; diff --git a/src/engine/objects/Penguin.h b/src/engine/objects/Penguin.h index 72ba16285..f8931a7d4 100644 --- a/src/engine/objects/Penguin.h +++ b/src/engine/objects/Penguin.h @@ -55,7 +55,6 @@ private: void InitOtherPenguin(s32 objectIndex); static bool _toggle; - s32 _objectIndex; PenguinType _type; Behaviour _bhv; }; diff --git a/src/engine/objects/Seagull.h b/src/engine/objects/Seagull.h index a0e5cd233..42474159e 100644 --- a/src/engine/objects/Seagull.h +++ b/src/engine/objects/Seagull.h @@ -38,7 +38,6 @@ public: void func_8008241C(s32 objectIndex, s32 arg1); void func_80082714(s32 objectIndex, s32 arg1); private: - s32 _objectIndex; FVector _pos; static size_t _count; s32 _idx; diff --git a/src/engine/objects/Snowman.cpp b/src/engine/objects/Snowman.cpp index 2052a8adb..c45bceff2 100644 --- a/src/engine/objects/Snowman.cpp +++ b/src/engine/objects/Snowman.cpp @@ -22,6 +22,7 @@ OSnowman::OSnowman(const FVector& pos) { find_unused_obj_index(&_headIndex); init_object(_headIndex, 0); + _objectIndex = _headIndex; gObjectList[_headIndex].origin_pos[0] = pos.x * xOrientation; gObjectList[_headIndex].origin_pos[1] = pos.y + 5.0 + 3.0; gObjectList[_headIndex].origin_pos[2] = pos.z; diff --git a/src/engine/objects/Snowman.h b/src/engine/objects/Snowman.h index ffa927769..f33ee3b53 100644 --- a/src/engine/objects/Snowman.h +++ b/src/engine/objects/Snowman.h @@ -50,7 +50,6 @@ private: FVector _pos; static size_t _count; size_t _idx; - s32 _objectIndex; s32 _headIndex; s32 _bodyIndex; }; diff --git a/src/engine/objects/Thwomp.h b/src/engine/objects/Thwomp.h index 75aeaf1a0..22c674bb5 100644 --- a/src/engine/objects/Thwomp.h +++ b/src/engine/objects/Thwomp.h @@ -113,7 +113,6 @@ public: private: static size_t _count; s32 _idx; - s32 _objectIndex; s16 _faceDirection; //! @todo Write this better. This effects the squish size and the bounding box size. // We should probably return to the programmer the pointer to the actor so they can do thwomp->squishSize = value. diff --git a/src/engine/objects/TrashBin.h b/src/engine/objects/TrashBin.h index 2ebe13e87..2ef500f92 100644 --- a/src/engine/objects/TrashBin.h +++ b/src/engine/objects/TrashBin.h @@ -41,6 +41,5 @@ private: FRotation _rot; float _scale; size_t _idx; - s32 _objectIndex; bool _drawBin = false; }; diff --git a/src/engine/objects/Trophy.h b/src/engine/objects/Trophy.h index c2bb937ab..89f130997 100644 --- a/src/engine/objects/Trophy.h +++ b/src/engine/objects/Trophy.h @@ -48,7 +48,6 @@ public: private: StarEmitter* _emitter; - s32 _objectIndex; TrophyType _trophy; FVector _spawnPos; Behaviour _bhv;