actor init

This commit is contained in:
MegaMech
2025-03-02 19:35:02 -07:00
parent b5a7b69a42
commit 3d8367068e
13 changed files with 58 additions and 108 deletions
+15
View File
@@ -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
+1 -63
View File
@@ -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);
}
+9 -11
View File
@@ -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<struct Actor*>(reinterpret_cast<char*>(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
*/
+2 -1
View File
@@ -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();
-25
View File
@@ -1,25 +0,0 @@
#include <libultraship.h>
#include "framebuffer_effects.h"
#include "mk64.h"
#include <assets/common_data.h>
#include "port/Engine.h"
#include "math_util.h"
#include <stdio.h>
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() {
}
+1 -1
View File
@@ -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});
}
}
+4
View File
@@ -42,6 +42,10 @@ void Gizmo::Load() {
}
void Gizmo::Tick() {
if (!Enabled) {
return;
}
switch(SelectedHandle) {
case GizmoHandle::X_Axis:
Gizmo::Translate();
+1 -1
View File
@@ -52,7 +52,7 @@ public:
{-5, 0, 0} // Z-Axis (Blue)
};
FVector _ray;
GameObject* _selected;
GameObject* _selected = nullptr;
private:
bool _draw = false;
+2 -2
View File
@@ -50,7 +50,7 @@ void ObjectPicker::SelectObject(std::vector<GameObject>& 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();
}
}
+6 -2
View File
@@ -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() {
+2 -1
View File
@@ -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);
+15 -1
View File
@@ -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;
}