mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
mario object get optimizations (#840)
This commit is contained in:
parent
bee2b924bd
commit
27b7c3d823
13 changed files with 35 additions and 32 deletions
|
|
@ -204,7 +204,7 @@ void DynOS_Actor_Override(struct Object* obj, void** aSharedChild) {
|
||||||
if (it == _ValidActors.end()) { return; }
|
if (it == _ValidActors.end()) { return; }
|
||||||
|
|
||||||
// Check if the behavior uses a character specific model
|
// Check if the behavior uses a character specific model
|
||||||
if (obj && (obj->behavior == smlua_override_behavior(bhvMario) ||
|
if (obj && (obj->behavior == bhvMario ||
|
||||||
obj->behavior == smlua_override_behavior(bhvNormalCap) ||
|
obj->behavior == smlua_override_behavior(bhvNormalCap) ||
|
||||||
obj->behavior == smlua_override_behavior(bhvWingCap) ||
|
obj->behavior == smlua_override_behavior(bhvWingCap) ||
|
||||||
obj->behavior == smlua_override_behavior(bhvMetalCap) ||
|
obj->behavior == smlua_override_behavior(bhvMetalCap) ||
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ Gfx *geo_move_mario_part_from_parent(s32 run, UNUSED struct GraphNode *node, Mat
|
||||||
|
|
||||||
if (run == TRUE) {
|
if (run == TRUE) {
|
||||||
sp1C = (struct Object *) gCurGraphNodeObject;
|
sp1C = (struct Object *) gCurGraphNodeObject;
|
||||||
if (sp1C->behavior == smlua_override_behavior(bhvMario) && sp1C->prevObj != NULL) {
|
if (sp1C->behavior == bhvMario && sp1C->prevObj != NULL) {
|
||||||
create_transformation_from_matrices(sp20, mtx, *gCurGraphNodeCamera->matrixPtr);
|
create_transformation_from_matrices(sp20, mtx, *gCurGraphNodeCamera->matrixPtr);
|
||||||
obj_update_pos_from_parent_transformation(sp20, sp1C->prevObj);
|
obj_update_pos_from_parent_transformation(sp20, sp1C->prevObj);
|
||||||
obj_set_gfx_pos_from_pos(sp1C->prevObj);
|
obj_set_gfx_pos_from_pos(sp1C->prevObj);
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ void bhv_black_smoke_mario_loop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bhv_flame_mario_loop(void) {
|
void bhv_flame_mario_loop(void) {
|
||||||
if (o->parentObj == NULL || o->parentObj->behavior != smlua_override_behavior(bhvMario)) {
|
if (o->parentObj == NULL || o->parentObj->behavior != bhvMario) {
|
||||||
obj_mark_for_deletion(o);
|
obj_mark_for_deletion(o);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
void bhv_water_mist_spawn_loop(void) {
|
void bhv_water_mist_spawn_loop(void) {
|
||||||
clear_particle_flags(0x20000);
|
clear_particle_flags(0x20000);
|
||||||
if (o->parentObj == NULL || o->parentObj->behavior != smlua_override_behavior(bhvMario)) {
|
if (o->parentObj == NULL || o->parentObj->behavior != bhvMario) {
|
||||||
obj_mark_for_deletion(o);
|
obj_mark_for_deletion(o);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -11,7 +11,7 @@ void bhv_water_mist_spawn_loop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bhv_water_mist_loop(void) {
|
void bhv_water_mist_loop(void) {
|
||||||
if (o->parentObj == NULL || o->parentObj->behavior != smlua_override_behavior(bhvMario)) {
|
if (o->parentObj == NULL || o->parentObj->behavior != bhvMario) {
|
||||||
obj_mark_for_deletion(o);
|
obj_mark_for_deletion(o);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ void bhv_water_droplet_loop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bhv_idle_water_wave_loop(void) {
|
void bhv_idle_water_wave_loop(void) {
|
||||||
if (o->parentObj == NULL || o->parentObj->behavior != smlua_override_behavior(bhvMario)) {
|
if (o->parentObj == NULL || o->parentObj->behavior != bhvMario) {
|
||||||
obj_mark_for_deletion(o);
|
obj_mark_for_deletion(o);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2404,11 +2404,10 @@ void mario_update_wall(struct MarioState* m, struct WallCollisionData* wcd) {
|
||||||
|
|
||||||
struct MarioState *get_mario_state_from_object(struct Object *o) {
|
struct MarioState *get_mario_state_from_object(struct Object *o) {
|
||||||
if (!o) { return NULL; }
|
if (!o) { return NULL; }
|
||||||
for (s32 i = 0; i != MAX_PLAYERS; ++i) {
|
if (o->behavior != bhvMario) { return NULL; }
|
||||||
struct MarioState *m = &gMarioStates[i];
|
s32 stateIndex = o->oBehParams - 1;
|
||||||
if (m->marioObj == o) {
|
if (stateIndex >= 0 && stateIndex < MAX_PLAYERS) {
|
||||||
return m;
|
return &gMarioStates[stateIndex];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -359,7 +359,7 @@ s8 geo_get_processing_mario_index(void) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gCurGraphNodeProcessingObject->behavior != smlua_override_behavior(bhvMario)) {
|
if (gCurGraphNodeProcessingObject->behavior != bhvMario) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -558,7 +558,7 @@ void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo) {
|
||||||
object->respawnInfo = &spawnInfo->behaviorArg;
|
object->respawnInfo = &spawnInfo->behaviorArg;
|
||||||
|
|
||||||
// found a player
|
// found a player
|
||||||
if (spawnInfo->behaviorArg & ((u32)1 << 31) && object->behavior == smlua_override_behavior(bhvMario)) {
|
if (spawnInfo->behaviorArg & ((u32)1 << 31) && object->behavior == bhvMario) {
|
||||||
u16 playerIndex = (spawnInfo->behaviorArg & ~(1 << 31));
|
u16 playerIndex = (spawnInfo->behaviorArg & ~(1 << 31));
|
||||||
object->oBehParams = playerIndex + 1;
|
object->oBehParams = playerIndex + 1;
|
||||||
gMarioObjects[playerIndex] = object;
|
gMarioObjects[playerIndex] = object;
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
#include "game/first_person_cam.h"
|
#include "game/first_person_cam.h"
|
||||||
#include "course_table.h"
|
#include "course_table.h"
|
||||||
#include "skybox.h"
|
#include "skybox.h"
|
||||||
|
#include "mario.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This file contains the code that processes the scene graph for rendering.
|
* This file contains the code that processes the scene graph for rendering.
|
||||||
|
|
@ -1227,12 +1228,8 @@ static void geo_sanitize_object_gfx(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct MarioBodyState *get_mario_body_state_from_mario_object(struct Object *marioObj) {
|
static struct MarioBodyState *get_mario_body_state_from_mario_object(struct Object *marioObj) {
|
||||||
for (s32 i = 0; i < MAX_PLAYERS; ++i) {
|
struct MarioState *m = get_mario_state_from_object(marioObj);
|
||||||
struct MarioState *m = &gMarioStates[i];
|
if (m) { return m->marioBodyState; }
|
||||||
if (m->marioObj == marioObj) {
|
|
||||||
return m->marioBodyState;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1262,13 +1259,7 @@ static void geo_process_object(struct Object *node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->header.gfx.node.flags & GRAPH_RENDER_PLAYER) {
|
if (node->header.gfx.node.flags & GRAPH_RENDER_PLAYER) {
|
||||||
gCurGraphNodeMarioState = NULL;
|
gCurGraphNodeMarioState = get_mario_state_from_object(node);
|
||||||
for (s32 i = 0; i < MAX_PLAYERS; i++) {
|
|
||||||
if (gMarioStates[i].marioObj == node) {
|
|
||||||
gCurGraphNodeMarioState = &gMarioStates[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gCurGraphNodeMarioState != NULL) {
|
if (gCurGraphNodeMarioState != NULL) {
|
||||||
gCurGraphNodeMarioState->minimumBoneY = 9999;
|
gCurGraphNodeMarioState->minimumBoneY = 9999;
|
||||||
}
|
}
|
||||||
|
|
@ -1390,10 +1381,12 @@ static void geo_process_object(struct Object *node) {
|
||||||
gMatStackPrevFixed[gMatStackIndex] = mtxPrev;
|
gMatStackPrevFixed[gMatStackIndex] = mtxPrev;
|
||||||
|
|
||||||
if (node->header.gfx.sharedChild != NULL) {
|
if (node->header.gfx.sharedChild != NULL) {
|
||||||
|
if (node->header.gfx.node.flags & GRAPH_RENDER_PLAYER) {
|
||||||
gCurMarioBodyState = get_mario_body_state_from_mario_object(node);
|
gCurMarioBodyState = get_mario_body_state_from_mario_object(node);
|
||||||
if (gCurMarioBodyState) {
|
if (gCurMarioBodyState) {
|
||||||
gCurMarioBodyState->currAnimPart = MARIO_ANIM_PART_NONE;
|
gCurMarioBodyState->currAnimPart = MARIO_ANIM_PART_NONE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
gCurGraphNodeObject = (struct GraphNodeObject *) node;
|
gCurGraphNodeObject = (struct GraphNodeObject *) node;
|
||||||
node->header.gfx.sharedChild->parent = &node->header.gfx.node;
|
node->header.gfx.sharedChild->parent = &node->header.gfx.node;
|
||||||
geo_sanitize_object_gfx();
|
geo_sanitize_object_gfx();
|
||||||
|
|
|
||||||
|
|
@ -220,7 +220,7 @@ void unload_object(struct Object *obj) {
|
||||||
obj->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
|
obj->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
|
||||||
|
|
||||||
// Clear Mario object pointers
|
// Clear Mario object pointers
|
||||||
if (obj->behavior == smlua_override_behavior(bhvMario)) {
|
if (obj->behavior == bhvMario) {
|
||||||
u8 playerIndex = obj->oBehParams - 1;
|
u8 playerIndex = obj->oBehParams - 1;
|
||||||
if (playerIndex < MAX_PLAYERS) {
|
if (playerIndex < MAX_PLAYERS) {
|
||||||
gMarioObjects[playerIndex] = NULL;
|
gMarioObjects[playerIndex] = NULL;
|
||||||
|
|
|
||||||
|
|
@ -452,6 +452,12 @@ int smlua_hook_custom_bhv(BehaviorScript *bhvScript, const char *bhvName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 originalBehaviorId = get_id_from_behavior(bhvScript);
|
u32 originalBehaviorId = get_id_from_behavior(bhvScript);
|
||||||
|
|
||||||
|
if (originalBehaviorId == id_bhvMario) {
|
||||||
|
LOG_LUA_LINE("Cannot hook Mario's behavior. Use HOOK_MARIO_UPDATE and HOOK_BEFORE_MARIO_UPDATE.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
u8 newBehavior = originalBehaviorId >= id_bhv_max_count;
|
u8 newBehavior = originalBehaviorId >= id_bhv_max_count;
|
||||||
|
|
||||||
struct LuaHookedBehavior *hooked = &sHookedBehaviors[sHookedBehaviorsCount];
|
struct LuaHookedBehavior *hooked = &sHookedBehaviors[sHookedBehaviorsCount];
|
||||||
|
|
@ -507,6 +513,11 @@ int smlua_hook_behavior(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (overrideBehaviorId == id_bhvMario) {
|
||||||
|
LOG_LUA_LINE("Hook behavior: cannot hook Mario's behavior. Use HOOK_MARIO_UPDATE and HOOK_BEFORE_MARIO_UPDATE.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
lua_Integer objectList = smlua_to_integer(L, 2);
|
lua_Integer objectList = smlua_to_integer(L, 2);
|
||||||
if (objectList <= 0 || objectList >= NUM_OBJ_LISTS || !gSmLuaConvertSuccess) {
|
if (objectList <= 0 || objectList >= NUM_OBJ_LISTS || !gSmLuaConvertSuccess) {
|
||||||
LOG_LUA_LINE("Hook behavior: tried use invalid object list: %lld, %u", objectList, gSmLuaConvertSuccess);
|
LOG_LUA_LINE("Hook behavior: tried use invalid object list: %lld, %u", objectList, gSmLuaConvertSuccess);
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ void network_player_update_model(u8 localIndex) {
|
||||||
if (index >= CT_MAX) { index = 0; }
|
if (index >= CT_MAX) { index = 0; }
|
||||||
m->character = &gCharacters[index];
|
m->character = &gCharacters[index];
|
||||||
|
|
||||||
if (m->marioObj == NULL || m->marioObj->behavior != smlua_override_behavior(bhvMario)) { return; }
|
if (m->marioObj == NULL || m->marioObj->behavior != bhvMario) { return; }
|
||||||
obj_set_model(m->marioObj, m->character->modelId);
|
obj_set_model(m->marioObj, m->character->modelId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ void network_receive_spawn_star(struct Packet* p) {
|
||||||
void network_send_spawn_star_nle(struct Object* o, u32 params) {
|
void network_send_spawn_star_nle(struct Object* o, u32 params) {
|
||||||
if (!o) { return; }
|
if (!o) { return; }
|
||||||
u8 globalIndex = UNKNOWN_GLOBAL_INDEX;
|
u8 globalIndex = UNKNOWN_GLOBAL_INDEX;
|
||||||
if (o->behavior == smlua_override_behavior(bhvMario)) {
|
if (o->behavior == bhvMario) {
|
||||||
u8 localIndex = o->oBehParams - 1;
|
u8 localIndex = o->oBehParams - 1;
|
||||||
if (localIndex < MAX_PLAYERS) { globalIndex = gNetworkPlayers[localIndex].globalIndex; }
|
if (localIndex < MAX_PLAYERS) { globalIndex = gNetworkPlayers[localIndex].globalIndex; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue