#include #include "functions.h" #include "variables.h" #include "core2/playerModel.h" void func_80254008(void); extern void func_80256E24(f32[3], f32, f32, f32, f32, f32); void assetcache_release(void *); //assetcache_free extern void ml_vec3f_assign(f32[3], f32, f32, f32); void func_8033A280(f32); extern s32 osCicId; /* .data */ struct5Bs *D_80363780 = NULL; /* .bss */ void *playerModelBin; //playerModelPtr s16 playerModelId; //playerModel asset_id u8 playerModelEnvAlpha; u8 playerModelDirection; u8 playerModelIsVisible; f32 playerModelScale; f32 playerModelPitch; f32 playerModelRoll; f32 playerModelYaw; f32 D_8037C100[3]; f32 D_8037C110[3]; f32 playerModelDisplacement[3]; void (*playerModelPostDrawMethod)(Gfx **gfx, Mtx **mtx, Vtx **vtx); f32 D_8037C130[2][4]; struct { u8 unk0; f32 unk4[3]; } D_8037C150; //public void playerModel_set(enum asset_e asset_id); //.data static void _playerModel_updateModelYaw(void){ switch(playerModelDirection){ case PLAYER_MODEL_DIR_KAZOOIE: playerModelYaw = mlNormalizeAngle(yaw_get() + 180.0f); break; default: playerModelYaw = yaw_get(); break; case PLAYER_MODEL_DIR_GLOBAL: break; } } void playerModel_80291A50(s32 arg0, f32 dst[3]){ func_8034A174(D_80363780, arg0, dst); if(func_802582EC(dst)){ _player_getPosition(dst); } } int playerModel_80291AAC(s32 arg0, s32 arga, s32 arg2, s32 arg3){ return 0; } static void _playerModel_preDraw(int arg0){ _player_getMarker()->unk14_21 = 1; } void playerModel_draw(Gfx **gfx, Mtx **mtx, Vtx **vtx){ f32 rotation[3]; s32 env_color[3]; f32 plyr_pos[3]; //sp44 f32 sp38[3]; if(!playerModelIsVisible) return; _playerModel_updateModelYaw(); playerModelRoll = roll_get(); playerModelPitch = pitch_get(); _player_getPosition(plyr_pos); plyr_pos[1] += 2.0f; ml_vec3f_assign(rotation, playerModelPitch, playerModelYaw, playerModelRoll); func_8029A47C(env_color); ml_vec3f_copy(sp38, D_8037C100); plyr_pos[0] += playerModelDisplacement[0];\ plyr_pos[1] += playerModelDisplacement[1];\ plyr_pos[2] += playerModelDisplacement[2]; sp38[0] += playerModelDisplacement[0];\ sp38[1] += playerModelDisplacement[1];\ sp38[2] += playerModelDisplacement[2]; if(playerModelBin){ func_80289F30(); func_8029DD6C(); modelRender_setEnvColor(env_color[0], env_color[1], env_color[2], playerModelEnvAlpha); func_8033A280(2.0f); modelRender_preDraw((GenMethod_1)_playerModel_preDraw, 0); func_8033A450(D_80363780); modelRender_setDepthMode(MODEL_RENDER_DEPTH_FULL); if(D_8037C150.unk0){ D_8037C150.unk0 = 0; modelRender_draw(gfx, mtx, D_8037C150.unk4, rotation, playerModelScale, sp38, playerModelBin); } else{ modelRender_draw(gfx, mtx, plyr_pos, rotation, playerModelScale, sp38, playerModelBin); } }//L80291CD4 if(playerModelPostDrawMethod){ playerModelPostDrawMethod(gfx, mtx, vtx); } } void playerModel_updateModel(void){ playerModel_set(func_802985F0()); } void playerModel_reset(void){ f32 plyr_pos[3]; int i; for(i = 0; i < 2 ; i++){ playerModel_80292048(i, 0.0f, 0.0f, 0.0f); playerModel_80292078(i, 0.0f); } playerModelEnvAlpha = 0xFF; playerModelBin = NULL; playerModelId = 0; playerModelPostDrawMethod = NULL; D_80363780 = func_8034A2C8(); func_8034A130(D_80363780); ml_vec3f_clear(D_8037C100); ml_vec3f_clear(D_8037C110); ml_vec3f_clear(playerModelDisplacement); playerModelYaw = playerModelRoll = playerModelPitch = 0.0f; D_8037C150.unk0 = 0; playerModel_setVisible(TRUE); playerModel_setScale(1.0f); playerModelDirection = 0; playerModel_setDirection(PLAYER_MODEL_DIR_BANJO); if(!func_8028ADB4()) playerModel_updateModel(); player_getPosition(plyr_pos); __spawnQueue_add_4((GenMethod_4)func_802C4140, ACTOR_17_PLAYER_SHADOW, reinterpret_cast(s32, plyr_pos[0]), reinterpret_cast(s32, plyr_pos[1]), reinterpret_cast(s32, plyr_pos[2]) ); } void playerModel_free(void){ assetcache_release(playerModelBin); playerModelBin = NULL; playerModelId = 0; func_8034A2A8(D_80363780); D_80363780 = NULL; } void playerModel_update(void){ f32 sp1C; f32 temp_f0; sp1C = D_8037C110[1] - D_8037C100[1]; temp_f0 = mlAbsF(sp1C); if( temp_f0 < 0.01){ D_8037C100[1] = D_8037C110[1]; } else{ if(5.0f < temp_f0){ temp_f0 = 1.0f; } if(0.0f < sp1C){ D_8037C100[1] += temp_f0; } else{ D_8037C100[1] -= temp_f0; } {//L80291F7C _player_getMarker()->unk14_21 = 0; } } } BKModelBin *playerModel_getModelBin(void){ return playerModelBin; } enum asset_e playerModel_getModelId(void){ return playerModelId; } void playerModel_setEnvAlpha(s32 alpha){ playerModelEnvAlpha = alpha; } void playerModel_set(enum asset_e asset_id){ if(asset_id != playerModelId){ if(playerModelBin){ func_80254008(); assetcache_release(playerModelBin); playerModelBin = NULL; } playerModelId = asset_id; if(playerModelId) playerModelBin = assetcache_get(playerModelId); } } void playerModel_80292048(s32 arg0, f32 arg1, f32 arg2, f32 arg3){ D_8037C130[arg0][2] = arg1; D_8037C130[arg0][3] = arg2; D_8037C130[arg0][1] = arg3; } void playerModel_80292078(s32 arg0, f32 arg1){ D_8037C130[arg0][0] = arg1; } void playerModel_setDirection(enum player_model_direction_e direction){ if(direction != playerModelDirection){ if(direction == PLAYER_MODEL_DIR_KAZOOIE || PLAYER_MODEL_DIR_KAZOOIE == playerModelDirection){ //flip model yaw_setIdeal(mlNormalizeAngle(yaw_get() + 180.0f)); yaw_applyIdeal(); } } playerModelDirection = direction; } void playerModel_setScale(f32 scale){ if(osCicId + -6103){ scale = scale*0.25; } playerModelScale = scale; } void playerModel_setYaw(f32 angleDegrees){ playerModelYaw = mlNormalizeAngle(angleDegrees); } void playerModel_80292158(f32 arg0){ D_8037C100[1] = arg0; playerModel_8029217C(arg0); } void playerModel_8029217C(f32 arg0){ D_8037C110[1] = arg0; } void playerModel_setPostDraw(void (*draw_func)(Gfx **gfx, Mtx **mtx, Vtx **vtx)){ playerModelPostDrawMethod = draw_func; } void playerModel_setDisplacement(f32 arg0[3]){ ml_vec3f_copy(playerModelDisplacement, arg0); } void playerModel_setYDisplacement(f32 arg0){ playerModelDisplacement[1] = arg0; } void playerModel_setVisible(s32 arg0){ playerModelIsVisible = arg0; } void playerModel_802921D4(f32 arg0[3]){ if(func_8028EE84() == BSWATERGROUP_0_NONE){ D_8037C150.unk0 = 1; D_8037C150.unk4[0] = arg0[0]; D_8037C150.unk4[1] = arg0[1]; D_8037C150.unk4[2] = arg0[2]; } } f32 playerModel_getYaw(void){ return playerModelYaw; } f32 playerModel_80292230(void){ return D_8037C100[1]; } void playerModel_8029223C(f32 arg0[3]){ playerModel_80291A50(8, arg0); } void playerModel_80292260(f32 arg0[3]){ playerModel_80291A50(7, arg0); } void playerModel_80292284(f32 arg0[3], s32 arg1){ f32 sp44[3]; f32 sp38[3]; if(_player_getMarker()->unk14_21 && playerModelIsVisible){ switch(playerModel_getModelId()){ case 0x34D: case 0x34E: case ASSET_34F_MODEL_BANJO_TERMITE: //802922E8 case ASSET_359_MODEL_BANJO_WALRUS: //802922E8 case ASSET_362_MODEL_BANJO_BEE: case ASSET_36F_MODEL_BANJO_PUMPKIN: case ASSET_374_MODEL_BANJO_CROC: func_8034A174(D_80363780, arg1 + 1, arg0); if(func_802582EC(arg0)){ _player_getPosition(arg0); } arg0[1] += D_8037C130[arg1][0]; if(D_8037C130[arg1][1] != 0.0f){ func_80256E24(sp44, D_8037C130[arg1][2], mlNormalizeAngle(yaw_get() + D_8037C130[arg1][3]), 0.0f, 0.0f, D_8037C130[arg1][1]); arg0[0] += sp44[0]; arg0[1] += sp44[1]; arg0[2] += sp44[2]; } func_802976C0(sp38); arg0[0] = arg0[0] + sp38[0]; arg0[1] = arg0[1] + sp38[1]; arg0[2] = arg0[2] + sp38[2]; break; default: ////80292400 _player_getPosition(arg0); break; } } else{//L80292410 _player_getPosition(arg0); if(arg1){ arg0[1] += 33.0f; } else{ arg0[1] += 75.0f; } } } void playerModel_getPosition(f32* dst){ f32 tmp1[3]; f32 tmp2[3]; playerModel_80291A50(5,tmp1); playerModel_80291A50(6,tmp2); ml_vec3f_add(dst, tmp1, tmp2); ml_vec3f_scale(dst, 0.5); } void playerModel_802924B8(f32 arg0[3]){ playerModel_80291A50(0xA, arg0); } enum player_model_direction_e playerModel_getDirection(void){ return playerModelDirection; } void playerModel_802924E8(f32 arg0[3]){ switch(player_getTransformation()){ case TRANSFORM_5_CROC: playerModel_80291A50(5, arg0); break; case TRANSFORM_4_WALRUS: //L80292520 playerModel_80291A50(0xB, arg0); break; default: //L80292530 playerModel_80291A50(0x9, arg0); break; } } s32 playerModel_isVisible(void){ return playerModelIsVisible; } void playerModel_80292554(f32 arg0[3]){ playerModel_80291A50(0x9, arg0); } void playerModel_80292578(f32 arg0[3]){ playerModel_80291A50(0xA, arg0); } void playerModel_defrag(void){ if(D_80363780){ D_80363780 = func_8034A348(D_80363780); } }