diff --git a/include/actor_types.h b/include/actor_types.h index e4998ae4f..e9f8844de 100644 --- a/include/actor_types.h +++ b/include/actor_types.h @@ -133,6 +133,7 @@ struct Actor { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 // Duplicate declare for simplicity when externing actors & packed files. @@ -157,6 +158,7 @@ struct TrainCar { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct RailroadCrossing { @@ -170,6 +172,7 @@ struct RailroadCrossing { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 // crossingTrigger might ruin struct size when compiled on 32 bit @@ -187,6 +190,7 @@ struct FallingRock { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct ActorSpawnData { @@ -231,6 +235,7 @@ struct YoshiValleyEgg { // pathCenter[0] and pathCenter[2] are the X,Z coordinates of the center of the path /* 0x24 */ Vec3f pathCenter; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct KiwanoFruit { @@ -249,6 +254,7 @@ struct KiwanoFruit { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct PaddleWheelBoat { @@ -263,6 +269,7 @@ struct PaddleWheelBoat { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct PiranhaPlant { @@ -275,6 +282,7 @@ struct PiranhaPlant { /* 0x24 */ Vec4s timers; // A per-camera timer. Might be more appropriate to call this state /* 0x2C */ f32 unk_02C; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct PalmTree { @@ -289,6 +297,7 @@ struct PalmTree { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 typedef struct { @@ -305,6 +314,7 @@ typedef struct { /* 0x18 */ Vec3f unk_18; /* 0x24 */ Vec3f shellIndices; // Indices in gActorList for the shells "owned" by this parent /* 0x30 */ Collision unk30; + const char* model; } TripleShellParent; // size = 0x70 struct ShellActor { @@ -332,6 +342,7 @@ struct ShellActor { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; // All 0 until the shell is fired /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct ItemBox { @@ -350,6 +361,7 @@ struct ItemBox { /* 0x28 */ f32 unk_028; /* 0x2C */ f32 unk_02C; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct FakeItemBox { @@ -366,6 +378,7 @@ struct FakeItemBox { /* 0x28 */ f32 targetY; /* 0x2C */ f32 unk_02C; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct BananaBunchParent { @@ -381,6 +394,7 @@ struct BananaBunchParent { /* 0x1E */ s16 unk_1E; /* 0x20 */ f32 unk_20[4]; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 struct BananaActor { @@ -403,6 +417,7 @@ struct BananaActor { /* 0x18 */ Vec3f pos; /* 0x24 */ Vec3f velocity; /* 0x30 */ Collision unk30; + const char* model; }; // size = 0x70 // #pragma GCC diagnostic pop diff --git a/src/actors/falling_rock/render.inc.c b/src/actors/falling_rock/render.inc.c index b7a23088b..20c6a49b3 100644 --- a/src/actors/falling_rock/render.inc.c +++ b/src/actors/falling_rock/render.inc.c @@ -52,67 +52,5 @@ void render_actor_falling_rock(Camera* camera, struct FallingRock* rock) { if (render_set_position(sp4C, 0) == 0) { return; } - // gSPDisplayList(gDisplayListHead++, d_course_choco_mountain_dl_falling_rock); - //! @todo: Placeholder DLs weird vtx issues - gSPSetGeometryMode(gDisplayListHead++, G_LIGHTING); - gDPSetCycleType(gDisplayListHead++, G_CYC_2CYCLE); - gDPPipeSync(gDisplayListHead++); - gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); - gSPSetGeometryMode(gDisplayListHead++, G_FOG); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_PASS2); - gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gDPPipeSync(gDisplayListHead++); - gDPTileSync(gDisplayListHead++); - gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, - G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD); - gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, d_course_choco_mountain_wall_texture); - gDPTileSync(gDisplayListHead++); - gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); - gDPLoadSync(gDisplayListHead++); - gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_falling_rock_model, 15, 0); - gSP1Triangle(gDisplayListHead++, 0, 1, 2, 0); - gSP1Triangle(gDisplayListHead++, 3, 4, 5, 0); - gSP1Triangle(gDisplayListHead++, 6, 7, 8, 0); - gSP1Triangle(gDisplayListHead++, 9, 10, 11, 0); - gSP1Triangle(gDisplayListHead++, 12, 13, 14, 0); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006C28, 5, 0); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006D08, 10, 5); - gSP1Triangle(gDisplayListHead++, 0, 5, 6, 0); - gSP1Triangle(gDisplayListHead++, 1, 7, 8, 0); - gSP1Triangle(gDisplayListHead++, 2, 9, 10, 0); - gSP1Triangle(gDisplayListHead++, 3, 11, 12, 0); - gSP1Triangle(gDisplayListHead++, 4, 13, 14, 0); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006C78, 5, 0); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006DA8, 10, 5); - gSP1Triangle(gDisplayListHead++, 0, 5, 6, 0); - gSP1Triangle(gDisplayListHead++, 1, 7, 8, 0); - gSP1Triangle(gDisplayListHead++, 2, 9, 10, 0); - gSP1Triangle(gDisplayListHead++, 3, 11, 12, 0); - gSP1Triangle(gDisplayListHead++, 4, 13, 14, 0); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006CC8, 4, 0); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006E48, 8, 4); - gSP1Triangle(gDisplayListHead++, 0, 4, 5, 0); - gSP1Triangle(gDisplayListHead++, 1, 6, 7, 0); - gSP1Triangle(gDisplayListHead++, 2, 8, 9, 0); - gSP1Triangle(gDisplayListHead++, 3, 10, 11, 0); - gDPTileSync(gDisplayListHead++); - gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_MIRROR | G_TX_WRAP, - 5, G_TX_NOLOD, G_TX_MIRROR | G_TX_WRAP, 5, G_TX_NOLOD); - gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, d_course_choco_mountain_rock_texture); - gDPTileSync(gDisplayListHead++); - gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); - gDPLoadSync(gDisplayListHead++); - gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256); - gSPVertex(gDisplayListHead++, d_course_choco_mountain_6006EC8, 3, 0); - gSP1Triangle(gDisplayListHead++, 0, 1, 2, 0); - gSPClearGeometryMode(gDisplayListHead++, G_FOG | G_LIGHTING); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 1, 1, G_OFF); - gDPPipeSync(gDisplayListHead++); + gSPDisplayList(gDisplayListHead++, d_course_choco_mountain_dl_falling_rock); } diff --git a/src/engine/World.cpp b/src/engine/World.cpp index 146f6697c..dff7bab04 100644 --- a/src/engine/World.cpp +++ b/src/engine/World.cpp @@ -121,25 +121,23 @@ AActor* World::AddActor(AActor* actor) { return Actors.back(); } -struct Actor* World::AddBaseActor(s16 actorType) { +struct Actor* World::AddBaseActor() { Actors.push_back(new AActor()); AActor* actor = Actors.back(); - switch(actorType) { - case ACTOR_ITEM_BOX: - actor->Model = (Gfx*)LOAD_ASSET_RAW(D_0D003090); - break; - case ACTOR_PIRANHA_PLANT: - actor->Model = (Gfx*)LOAD_ASSET_RAW(d_course_mario_raceway_dl_piranha_plant); - break; - } - - gEditor.AddObject((FVector*) &actor->Pos, actor->Model, 1.0f, CollisionType::VTX_INTERSECT, 0.0f); // Skip C++ vtable to access variables in C return reinterpret_cast(reinterpret_cast(Actors.back()) + sizeof(void*)); } +void World::AddEditorObject(Actor* actor) { + if (actor->model != NULL) { + gEditor.AddObject((FVector*) &actor->pos, (Gfx*)LOAD_ASSET_RAW(actor->model), 1.0f, CollisionType::VTX_INTERSECT, 0.0f); + } else { + gEditor.AddObject((FVector*) &actor->pos, NULL, 1.0f, CollisionType::VTX_INTERSECT, 0.0f); + } +} + /** * Converts a C struct Actor* to its C++ AActor class */ diff --git a/src/engine/World.h b/src/engine/World.h index 4581d6ee4..b5c4efceb 100644 --- a/src/engine/World.h +++ b/src/engine/World.h @@ -48,7 +48,8 @@ public: void AddCourse(Course* course); AActor* AddActor(AActor* actor); - struct Actor* AddBaseActor(s16 actorType); + struct Actor* AddBaseActor(); + void AddEditorObject(Actor* actor); AActor* GetActor(size_t index); void TickActors(); diff --git a/src/engine/editor/ColourIdFramebuffer.cpp b/src/engine/editor/ColourIdFramebuffer.cpp deleted file mode 100644 index 12b96e318..000000000 --- a/src/engine/editor/ColourIdFramebuffer.cpp +++ /dev/null @@ -1,25 +0,0 @@ - -#include -#include "framebuffer_effects.h" -#include "mk64.h" -#include -#include "port/Engine.h" -#include "math_util.h" -#include - -int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, - uint8_t resize); - - -s32 gColourIdFramebuffer = -1; - -void CreateColourIdFramebuffer(void) { - if (gColourIdFramebuffer == -1) { - gColourIdFramebuffer = gfx_create_framebuffer(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT, true); - } -} - -void DrawAsColour() { - - -} \ No newline at end of file diff --git a/src/engine/editor/ColourIdFramebuffer.h b/src/engine/editor/ColourIdFramebuffer.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/engine/editor/Editor.cpp b/src/engine/editor/Editor.cpp index a662a85ea..1c6fbfe05 100644 --- a/src/engine/editor/Editor.cpp +++ b/src/engine/editor/Editor.cpp @@ -90,6 +90,6 @@ void Editor::AddObject(FVector* pos, Gfx* model, float scale, CollisionType coll eGameObjects.push_back({pos, model, {}, collision, boundingBoxSize}); GenerateCollisionMesh(eGameObjects.back(), model, scale); } else { // to bounding box or sphere collision - eGameObjects.push_back({pos, model, {}, CollisionType::BOUNDING_BOX, 2.0f}); + eGameObjects.push_back({pos, model, {}, CollisionType::BOUNDING_BOX, 22.0f}); } } diff --git a/src/engine/editor/Gizmo.cpp b/src/engine/editor/Gizmo.cpp index b46e50aa1..3725a5e2b 100644 --- a/src/engine/editor/Gizmo.cpp +++ b/src/engine/editor/Gizmo.cpp @@ -42,6 +42,10 @@ void Gizmo::Load() { } void Gizmo::Tick() { + if (!Enabled) { + return; + } + switch(SelectedHandle) { case GizmoHandle::X_Axis: Gizmo::Translate(); diff --git a/src/engine/editor/Gizmo.h b/src/engine/editor/Gizmo.h index 8ec01f023..6918653d6 100644 --- a/src/engine/editor/Gizmo.h +++ b/src/engine/editor/Gizmo.h @@ -52,7 +52,7 @@ public: {-5, 0, 0} // Z-Axis (Blue) }; FVector _ray; - GameObject* _selected; + GameObject* _selected = nullptr; private: bool _draw = false; diff --git a/src/engine/editor/ObjectPicker.cpp b/src/engine/editor/ObjectPicker.cpp index 41baea238..f8f723e2b 100644 --- a/src/engine/editor/ObjectPicker.cpp +++ b/src/engine/editor/ObjectPicker.cpp @@ -50,7 +50,7 @@ void ObjectPicker::SelectObject(std::vector& objects) { } else { //eGizmo.Disable(); eGizmo.Enabled = false; - eGizmo._selected = NULL; + eGizmo._selected = nullptr; } } @@ -102,7 +102,7 @@ void ObjectPicker::DragHandle() { } void ObjectPicker::Draw() { - if (_selected != nullptr) { + if (_selected != NULL) { eGizmo.Draw(); } } diff --git a/src/port/Game.cpp b/src/port/Game.cpp index 3816589c7..0de9c610b 100644 --- a/src/port/Game.cpp +++ b/src/port/Game.cpp @@ -669,8 +669,12 @@ void CM_CleanWorld(void) { gWorldInstance.Reset(); } -struct Actor* CM_AddBaseActor(s16 actorType) { - return (struct Actor*) gWorldInstance.AddBaseActor(actorType); +struct Actor* CM_AddBaseActor() { + return (struct Actor*) gWorldInstance.AddBaseActor(); +} + +void CM_AddEditorObject(struct Actor* actor) { + gWorldInstance.AddEditorObject(actor); } size_t CM_GetActorSize() { diff --git a/src/port/Game.h b/src/port/Game.h index 0a5c63c7f..9ec041d93 100644 --- a/src/port/Game.h +++ b/src/port/Game.h @@ -139,7 +139,8 @@ void SetCourseByClass(void* course); struct Actor* CM_GetActor(size_t index); void CM_DeleteActor(size_t index); -struct Actor* CM_AddBaseActor(s16 actorType); +struct Actor* CM_AddBaseActor(); +void CM_AddEditorObject(struct Actor* actor); size_t CM_GetActorSize(); size_t CM_FindActorIndex(struct Actor* actor); void CM_ActorCollision(Player* player, struct Actor* actor); diff --git a/src/racing/actors.c b/src/racing/actors.c index e9f46929d..e3d929892 100644 --- a/src/racing/actors.c +++ b/src/racing/actors.c @@ -135,6 +135,7 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f actor->state = 0; actor->unk_08 = 0.0f; actor->boundingBoxSize = 0.0f; + actor->model = NULL; func_802AAAAC(&actor->unk30); switch (actorType) { case ACTOR_BOX_TRUCK: @@ -151,6 +152,7 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f actor->velocity[0] = actor->pos[0]; actor->velocity[1] = actor->pos[1]; actor->velocity[2] = actor->pos[2] + 70.0f; + actor->model = d_course_yoshi_valley_dl_egg_lod0; break; case ACTOR_KIWANO_FRUIT: actor->state = 0; @@ -158,10 +160,12 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f actor->rot[1] = 0; actor->rot[2] = 0; actor->boundingBoxSize = 2.0f; + actor->model = d_course_dks_jungle_parkway_dl_kiwano_fruit; break; case ACTOR_FALLING_ROCK: actor->flags |= 0x4000; actor->boundingBoxSize = 10.0f; + actor->model = d_course_choco_mountain_dl_falling_rock; break; case ACTOR_TRAIN_ENGINE: actor->unk_08 = 10.0f; @@ -169,6 +173,7 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f case ACTOR_BANANA: actor->flags = actor->flags | 0x4000 | 0x1000; actor->boundingBoxSize = 2.0f; + actor->model = common_model_flat_banana; break; case ACTOR_GREEN_SHELL: gNumSpawnedShells += 1; @@ -194,27 +199,32 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f actor->state = 0x0043; actor->boundingBoxSize = 3.0f; actor->unk_08 = 20.0f; + actor->model = d_course_mario_raceway_dl_tree; break; case ACTOR_MARIO_SIGN: actor->flags |= 0x4000; + actor->model = d_course_mario_raceway_dl_sign; break; case ACTOR_TREE_YOSHI_VALLEY: actor->flags |= 0x4000; actor->state = 0x0043; actor->boundingBoxSize = 3.0f; actor->unk_08 = 23.0f; + actor->model = d_course_yoshi_valley_dl_tree; break; case ACTOR_TREE_ROYAL_RACEWAY: actor->flags |= 0x4000; actor->state = 0x0043; actor->boundingBoxSize = 3.0f; actor->unk_08 = 17.0f; + actor->model = d_course_royal_raceway_dl_tree; break; case ACTOR_TREE_MOO_MOO_FARM: actor->state = 0x0043; actor->flags = -0x8000; actor->boundingBoxSize = 3.0f; actor->unk_08 = 17.0f; + actor->model = d_course_moo_moo_farm_dl_tree; break; case 26: actor->flags |= 0x4000; @@ -275,17 +285,20 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f actor->unk_04 = 0; actor->state = 5; actor->boundingBoxSize = 5.5f; + actor->model = D_0D003090; break; case ACTOR_ITEM_BOX: actor->flags |= 0x4000; actor->unk_04 = 0; actor->state = 0; actor->boundingBoxSize = 5.5f; + actor->model = D_0D003090; break; case ACTOR_PIRANHA_PLANT: actor->flags |= 0x4000; actor->state = 0x001E; actor->boundingBoxSize = 5.0f; + actor->model = d_course_mario_raceway_dl_piranha_plant; break; default: break; @@ -1400,8 +1413,9 @@ s16 add_actor_to_empty_slot(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actorType) //} } gNumActors++; - struct Actor* actor = CM_AddBaseActor(actorType); + struct Actor* actor = CM_AddBaseActor(); actor_init(actor, pos, rot, velocity, actorType); + CM_AddEditorObject(actor); return (s16) CM_GetActorSize() - 1; // Return current index; }