marioparty4/src/game/board/model.c
2024-03-14 19:22:42 -05:00

1183 lines
No EOL
24 KiB
C

#include "game/board/main.h"
#include "game/board/model.h"
#include "game/chrman.h"
#include "game/hsfman.h"
#include "game/hsfmotion.h"
#include "game/memory.h"
#include "game/object.h"
#define BOARD_MODEL_MAX 256
#define BOARD_MOT_MAX 32
typedef struct board_model {
struct {
u8 visible : 1;
u8 visible_old : 1;
u8 field00_bit2 : 1;
u8 field00_bit3 : 1;
u8 field00_bit4 : 1;
};
s8 mot_count;
s8 character;
u8 alpha;
u8 layer;
u16 camera;
s16 index;
s16 id;
s16 mot_id[BOARD_MOT_MAX];
s16 curr_mot;
HsfData *data;
HsfData *mot_data[BOARD_MOT_MAX];
float unk_D4;
s32 data_num;
float mot_start;
float mot_end;
Vec pos;
Vec rot;
Vec scale;
} BoardModel;
static s16 modelDataNum;
static omObjData *modelMgrObj;
static BoardModel *modelDataList;
static void ModelMgrFunc(omObjData *object);
static BoardModel *SearchBoardModel(s16 id);
static void KillBoardModel(BoardModel *model);
static s32 CreateBoardModel(BoardModel *model, s32 data_num, s32 link);
static s32 CreateBoardModelMotion(BoardModel *model, s32 count, s32 *data_num);
void BoardModelDummyUpdate(void);
void BoardModelVisibilityUpdate(void);
typedef struct modelmgr_work {
u8 kill : 1;
} ModelMgrWork;
void BoardModelInit(void)
{
ModelMgrWork *work;
s32 i;
modelDataList = HuMemDirectMallocNum(HEAP_SYSTEM, BOARD_MODEL_MAX*sizeof(BoardModel), MEMORY_DEFAULT_NUM);
reflectMapNo = 0;
modelDataNum = 0;
memset(modelDataList, 0, BOARD_MODEL_MAX*sizeof(BoardModel));
for(i=0; i<BOARD_MODEL_MAX; i++) {
modelDataList[i].index = -1;
modelDataList[i].visible = 0;
}
modelMgrObj = omAddObjEx(boardObjMan, 32258, 0, 0, -1, ModelMgrFunc);
work = OM_GET_WORK_PTR(modelMgrObj, ModelMgrWork);
work->kill = 0;
omSetStatBit(modelMgrObj, OM_STAT_NOPAUSE|0x80);
}
void BoardModelKillAll(void)
{
if(modelMgrObj) {
ModelMgrWork *work = OM_GET_WORK_PTR(modelMgrObj, ModelMgrWork);
work->kill = 1;
}
if(modelDataList) {
BoardModel *model;
for(model=modelDataList; model < &modelDataList[BOARD_MODEL_MAX]; model++) {
KillBoardModel(model);
}
if(modelDataList) {
HuMemDirectFree(modelDataList);
modelDataList = NULL;
}
}
}
static void ModelMgrFunc(omObjData *object)
{
ModelMgrWork *work = OM_GET_WORK_PTR(modelMgrObj, ModelMgrWork);
if(work->kill || BoardIsKill()) {
modelMgrObj = NULL;
omDelObjEx(HuPrcCurrentGet(), object);
return;
}
BoardModelDummyUpdate();
BoardModelVisibilityUpdate();
}
void BoardModelDummyUpdate(void)
{
}
void BoardModelVisibilityUpdate(void)
{
s32 i;
BoardModel *model;
u32 temp[2];
Vec pos, target;
temp[1] = temp[0] = 0;
BoardCameraPosGet(&pos);
BoardCameraTargetGet(&target);
for(i=0, model = modelDataList; i<BOARD_MODEL_MAX; i++, model++) {
u32 attr;
if(model->index == -1) {
continue;
}
attr = Hu3DModelAttrGet(model->id);
if(!model->visible) {
if(!(attr & 0x1)) {
Hu3DModelAttrSet(model->id, 1);
}
} else {
if(attr & 0x1) {
Hu3DModelAttrReset(model->id, 1);
}
}
}
}
void BoardModelHideSetAll(s32 flag)
{
BoardModel *model;
if(!modelDataList) {
return;
}
for(model=modelDataList; model < &modelDataList[BOARD_MODEL_MAX]; model++) {
if(model->index == -1) {
continue;
}
if(flag) {
model->visible_old = model->visible;
model->visible = 0;
} else {
model->visible = model->visible_old;
}
}
}
void BoardModelAmbSetAll(float r, float g, float b)
{
BoardModel *model;
for(model=modelDataList; model < &modelDataList[BOARD_MODEL_MAX]; model++) {
if(model->index == -1) {
continue;
}
BoardModelAmbSet(model->index, r, g, b);
}
}
void BoardModelCameraSetAll(u16 camera)
{
BoardModel *model;
for(model=modelDataList; model < &modelDataList[BOARD_MODEL_MAX]; model++) {
if(model->index == -1) {
continue;
}
if(model->character != -1) {
continue;
}
Hu3DModelCameraSet(model->id, camera);
model->camera = camera;
}
}
static s16 CreateInstance(s32 character, s32 data_num, s32 *mot_list, s32 link, s32 arg4)
{
BoardModel *model;
s32 i;
model = NULL;
for(i=0; i<BOARD_MODEL_MAX; i++) {
if(modelDataList[i].index == -1) {
model = &modelDataList[i];
break;
}
}
if(!model) {
return -1;
}
memset(model, 0, sizeof(BoardModel));
model->index = i+1;
model->character = character;
modelDataNum++;
if(CreateBoardModel(model, data_num, link) == 0) {
s32 count;
count = 0;
if(mot_list) {
for(count=0; mot_list[count] >= 0; count++);
if(count >= BOARD_MOT_MAX) {
count = BOARD_MOT_MAX;
}
}
for(i=0; i<BOARD_MOT_MAX; i++) {
model->mot_id[i] = -1;
}
if(CreateBoardModelMotion(model, count, mot_list) == 0) {
model->visible = 1;
model->visible_old = model->visible;
model->field00_bit2 = 0;
model->field00_bit4 = 0;
model->unk_D4 = 100.0f;
model->scale.x = model->scale.y = model->scale.z = 1.0f;
model->curr_mot = 0;
Hu3DModelCameraSet(model->id, 1);
Hu3DModelLayerSet(model->id, 0);
model->field00_bit3 = 0;
model->alpha = 255;
BoardModelPosSet(model->index, 0.0f, 0.0f, 0.0f);
BoardModelRotSet(model->index, 0.0f, 0.0f, 0.0f);
BoardModelScaleSet(model->index, 1.0f, 1.0f, 1.0f);
BoardModelAmbSet(model->index, 1.0f, 1.0f, 1.0f);
return model->index;
}
}
BoardModelKill(model->index);
return -1;
}
s16 BoardModelCreate(s32 data_num, s32 *mot_list, s32 link)
{
return CreateInstance(-1, data_num, mot_list, link, 0);
}
s16 BoardModelCreateCharacter(s32 character, s32 data_num, s32 *mot_list, s32 link)
{
return CreateInstance(character, data_num, mot_list, link, 0);
}
s16 BoardModelCreateParam(BoardModelParam *param, Vec *pos, Vec *rot)
{
float unk_param;
s16 model = BoardModelCreate(param->data_num, NULL, param->unk4.link);
if(model == -1) {
return -1;
}
BoardModelMotionStart(model, 0, (param->unk4.pause) ? 0x40000001 : 0);
if(!param->unk4.start_mot) {
BoardModelMotionSpeedSet(model, 0.0f);
}
BoardModelExistDupe(model, param->unk4.field04_bit0);
BoardModelVisibilitySet(model, param->unk4.visible);
if(pos) {
BoardModelPosSetV(model, pos);
}
if(rot) {
BoardModelRotSetV(model, rot);
}
OSs16tof32(&param->unk6, &unk_param);
fn_8006DDE8(model, unk_param);
return model;
}
void BoardModelKill(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(model_ptr) {
KillBoardModel(model_ptr);
}
}
s16 BoardModelIDGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
return model_ptr->id;
}
}
s32 fn_8006DC1C(s16 model, s32 arg1)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
model_ptr->field00_bit3 = arg1;
return 0;
}
}
s32 BoardModelPassSet(s16 model, s32 pass)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(pass != 0) {
Hu3DModelAttrSet(model_ptr->id, 2);
} else {
Hu3DModelAttrReset(model_ptr->id, 2);
}
return 0;
}
}
s32 BoardModelAmbSet(s16 model, float r, float g, float b)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
Hu3DModelAmbSet(model_ptr->id, r, g, b);
return 0;
}
}
s32 BoardModelExistCheck(s16 model, s32 arg1)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
return 0;
}
}
s32 BoardModelExistDupe(s16 model, s32 arg1)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
return 0;
}
}
s32 fn_8006DDE8(s16 model, float arg1)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(arg1 < 0) {
arg1 = -1;
}
model_ptr->unk_D4 = arg1;
return 0;
}
}
s32 BoardModelMotionCreate(s16 model, s32 data_num)
{
BoardModel *model_ptr = SearchBoardModel(model);
s32 i;
if(!model_ptr) {
return -1;
} else {
s16 id;
if(model_ptr->mot_count >= BOARD_MOT_MAX) {
return -1;
}
for(i=1; i<BOARD_MOT_MAX; i++) {
if(model_ptr->mot_id[i] == -1) {
break;
}
}
if(model_ptr->character == -1) {
model_ptr->mot_data[i] = HuDataSelHeapReadNum(data_num, MEMORY_DEFAULT_NUM, HEAP_DATA);
if(!model_ptr->mot_data[i]) {
return -1;
}
model = Hu3DJointMotion(model_ptr->id, model_ptr->mot_data[i]);
} else {
model = CharModelMotionCreate(model_ptr->character, data_num);
CharModelMotionDataClose(model_ptr->character);
}
model_ptr->mot_id[i] = model;
model_ptr->mot_count++;
return i;
}
}
s32 BoardModelMotionKill(s16 model, s32 motion)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(motion >= BOARD_MOT_MAX || motion <= 0) {
return -1;
}
if(motion == model_ptr->curr_mot && model_ptr->curr_mot != 0) {
BoardModelMotionStart(model, 0, 0);
}
if(model_ptr->mot_id[motion] > 0) {
if(model_ptr->character == -1) {
Hu3DMotionKill(model_ptr->mot_id[motion]);
} else {
CharModelMotionKill(model_ptr->character, model_ptr->mot_id[motion]);
}
model_ptr->mot_id[motion] = -1;
}
model_ptr->mot_data[motion] = NULL;
model_ptr->mot_count--;
return 0;
}
}
s32 BoardModelMotionStartEndSet(s16 model, s16 start, s16 end)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(start >= 0) {
OSs16tof32(&start, &model_ptr->mot_start);
}
if(end >= 0) {
OSs16tof32(&end, &model_ptr->mot_end);
}
Hu3DMotionStartEndSet(model_ptr->id, model_ptr->mot_start, model_ptr->mot_end);
return 0;
}
}
s32 BoardModelMotionUpdateSet(s16 model, s32 flag)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(flag) {
Hu3DModelAttrSet(model_ptr->id, 0x40000001);
} else {
Hu3DModelAttrReset(model_ptr->id, 0x40000001);
}
return 0;
}
}
s32 BoardModelVoiceEnableSet(s16 model, s32 motion, s32 flag)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(motion >= BOARD_MOT_MAX || motion < 0) {
return 0;
}
if(model_ptr->character == -1) {
return 0;
}
CharModelVoiceEnableSet(model_ptr->character, model_ptr->mot_id[motion], flag);
return 0;
}
}
s32 BoardModelMotionStart(s16 model, s32 motion, u32 attr)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(motion >= BOARD_MOT_MAX || motion < 0) {
return 0;
}
Hu3DMotionSpeedSet(model_ptr->id, 1.0f);
if(model_ptr->character == -1) {
Hu3DMotionSet(model_ptr->id, model_ptr->mot_id[motion]);
} else {
CharModelMotionSet(model_ptr->character, model_ptr->mot_id[motion]);
}
model_ptr->mot_start = 0.0f;
if(model_ptr->character == -1) {
model_ptr->mot_end = Hu3DMotionMaxTimeGet(model_ptr->id);
} else {
model_ptr->mot_end = CharModelMotionMaxTimeGet(model_ptr->character);
}
model_ptr->field00_bit4 = 0;
if(attr & 0x40000024) {
if(model_ptr->character == -1) {
Hu3DMotionTimeSet(model_ptr->id, model_ptr->mot_end);
} else {
CharModelMotionTimeSet(model_ptr->character, model_ptr->mot_end);
}
}
Hu3DModelAttrReset(model_ptr->id, 0x40000003);
Hu3DModelAttrSet(model_ptr->id, attr);
model_ptr->curr_mot = motion;
return 0;
}
}
s32 BoardModelMotionShiftIDGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
return Hu3DMotionShiftIDGet(model_ptr->id);
}
}
s32 BoardModelMotionShiftSet(s16 model, s32 motion, float time, float shift_time, u32 attr)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(motion >= BOARD_MOT_MAX || motion < 0) {
return -1;
}
model_ptr->mot_start = 0.0f;
if(model_ptr->character == -1) {
model_ptr->mot_end = Hu3DMotionMaxTimeGet(model_ptr->id);
} else {
model_ptr->mot_end = CharModelMotionMaxTimeGet(model_ptr->character);
}
model_ptr->field00_bit4 = 0;
if(model_ptr->character == -1) {
Hu3DMotionShiftSet(model_ptr->id, model_ptr->mot_id[motion], time, shift_time, attr);
} else {
CharModelMotionShiftSet(model_ptr->character, model_ptr->mot_id[motion], time, shift_time, attr);
}
model_ptr->curr_mot = motion;
return 0;
}
}
s32 BoardModelAttrSet(s16 model, u32 attr)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
Hu3DModelAttrSet(model_ptr->id, attr);
return 0;
}
}
s32 BoardModelAttrReset(s16 model, u32 attr)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
Hu3DModelAttrReset(model_ptr->id, attr);
return 0;
}
}
s32 BoardModelMotionTimeSet(s16 model, float time)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(model_ptr->character == -1) {
Hu3DMotionTimeSet(model_ptr->id, time);
} else {
CharModelMotionTimeSet(model_ptr->character, time);
}
return 0;
}
}
float BoardModelMotionTimeGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
float time;
if(model_ptr->character == -1) {
time = Hu3DData[model_ptr->id].unk_64;
} else {
time = CharModelMotionTimeGet(model_ptr->character);
}
return time;
}
}
float BoardModelMotionMaxTimeGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
float time;
if(model_ptr->character == -1) {
time = Hu3DMotionMaxTimeGet(model_ptr->id);
} else {
time = CharModelMotionMaxTimeGet(model_ptr->character);
}
return time;
}
}
float BoardModelMotionSpeedGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model = &Hu3DData[model_ptr->id];
return hsf_model->unk_68;
}
}
s32 BoardModelMotionSpeedSet(s16 model, float speed)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
if(model_ptr->character == -1) {
Hu3DMotionSpeedSet(model_ptr->id, speed);
} else {
CharModelMotionSpeedSet(model_ptr->character, speed);
}
hsf_model = &Hu3DData[model_ptr->id];
hsf_model->unk_88 = speed;
return 0;
}
}
s32 BoardModelMotionEndCheck(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return 1;
} else {
s32 result;
if(model_ptr->character == -1) {
result = Hu3DMotionEndCheck(model_ptr->id);
} else {
result = CharModelMotionEndCheck(model_ptr->character);
}
return result;
}
}
s32 BoardModelMotionShapeSet(s16 model, s32 motion, u32 attr)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
if(model_ptr->character != -1) {
return -1;
}
if(motion >= BOARD_MOT_MAX) {
return -1;
}
hsf_model = &Hu3DData[model_ptr->id];
hsf_model->unk_98 = 1.0f;
Hu3DMotionShapeSet(model_ptr->id, model_ptr->mot_id[motion]);
if(attr & 0x40000100) {
float max_time = Hu3DMotionMaxTimeGet(model_ptr->id);
hsf_model->unk_94 = max_time;
}
Hu3DModelAttrSet(model_ptr->id, attr);
return 0;
}
}
float BoardModelMotionShapeTimeGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
if(model_ptr->character != -1) {
return -1;
}
hsf_model = &Hu3DData[model_ptr->id];
return hsf_model->unk_94;
}
}
float BoardModelMotionShapeMaxTimeGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
MotionData *motion;
HsfMotion *motion_hsf;
if(model_ptr->character != -1) {
return -1;
}
hsf_model = &Hu3DData[model_ptr->id];
if(hsf_model->unk_0E == -1) {
return 0;
}
motion = &Hu3DMotion[hsf_model->unk_0E];
motion_hsf = motion->unk_04->motion;
return motion_hsf->len;
}
}
s32 BoardModelMotionShapeSpeedSet(s16 model, float speed)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
if(model_ptr->character != -1) {
return -1;
}
hsf_model = &Hu3DData[model_ptr->id];
hsf_model->unk_98 = speed;
return 0;
}
}
float BoardModelMotionShapeSpeedGet(s16 model, float speed)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
hsf_model = &Hu3DData[model_ptr->id];
return hsf_model->unk_98;
}
}
s32 BoardModelMotionShapeEndCheck(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return 1;
} else {
ModelData *hsf_model;
if(model_ptr->character != -1) {
return 1;
}
hsf_model = &Hu3DData[model_ptr->id];
if(hsf_model->attr & 0x40000100) {
return hsf_model->unk_94 <= 0.0f;
}
return BoardModelMotionShapeMaxTimeGet(model) <= hsf_model->unk_94;
}
}
s32 BoardModelMotionShapeStartEndSet(s16 model, s16 start, s16 end)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
if(model_ptr->character != -1) {
return -1;
}
if(start >= 0) {
OSs16tof32(&start, &model_ptr->mot_start);
}
if(end >= 0) {
OSs16tof32(&end, &model_ptr->mot_end);
}
Hu3DMotionShapeStartEndSet(model_ptr->id, model_ptr->mot_start, model_ptr->mot_end);
return 0;
}
}
s32 BoardModelAlphaSet(s16 model, u8 alpha)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
float tp_lvl;
model_ptr->alpha = alpha;
OSu8tof32(&alpha, &tp_lvl);
tp_lvl = tp_lvl*(1.0f/255.0f);
Hu3DModelTPLvlSet(model_ptr->id, tp_lvl);
return 0;
}
}
s32 BoardModelMtxSet(s16 model, Mtx *src)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
if(!src) {
return -1;
}
hsf_model = &Hu3DData[model_ptr->id];
MTXCopy(*src, hsf_model->unk_F0);
return 0;
}
}
s32 BoardModelMtxGet(s16 model, Mtx *dst)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
ModelData *hsf_model;
if(!dst) {
return -1;
}
hsf_model = &Hu3DData[model_ptr->id];
MTXCopy(hsf_model->unk_F0, *dst);
return 0;
}
}
s32 BoardModelRotYSet(s16 model, float rot)
{
Vec rot_orig;
BoardModelRotGet(model, &rot_orig);
return BoardModelRotSet(model, rot_orig.x, BoardDAngleCalc(rot), rot_orig.z);
}
float BoardModelRotYGet(s16 model)
{
Vec rot;
BoardModelRotGet(model, &rot);
return rot.y;
}
s32 BoardModelPosSetV(s16 model, Vec *pos)
{
if(!pos) {
return -1;
} else {
return BoardModelPosSet(model, pos->x, pos->y, pos->z);
}
}
s32 BoardModelPosSet(s16 model, float x, float y, float z)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
model_ptr->pos.x = x;
model_ptr->pos.y = y;
model_ptr->pos.z = z;
Hu3DModelPosSetV(model_ptr->id, &model_ptr->pos);
return 0;
}
}
s32 BoardModelRotSetV(s16 model, Vec *pos)
{
if(!pos) {
return -1;
} else {
return BoardModelRotSet(model, pos->x, pos->y, pos->z);
}
}
s32 BoardModelRotSet(s16 model, float x, float y, float z)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
model_ptr->rot.x = x;
model_ptr->rot.y = y;
model_ptr->rot.z = z;
Hu3DModelRotSetV(model_ptr->id, &model_ptr->rot);
return 0;
}
}
s32 BoardModelScaleSetV(s16 model, Vec *pos)
{
if(!pos) {
return -1;
} else {
return BoardModelScaleSet(model, pos->x, pos->y, pos->z);
}
}
s32 BoardModelScaleSet(s16 model, float x, float y, float z)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
model_ptr->scale.x = x;
model_ptr->scale.y = y;
model_ptr->scale.z = z;
Hu3DModelScaleSetV(model_ptr->id, &model_ptr->scale);
return 0;
}
}
s32 BoardModelPosGet(s16 model, Vec *dst)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr || !dst) {
return -1;
} else {
*dst = model_ptr->pos;
return 0;
}
}
s32 BoardModelRotGet(s16 model, Vec *dst)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr || !dst) {
return -1;
} else {
*dst = model_ptr->rot;
return 0;
}
}
s32 BoardModelScaleGet(s16 model, Vec *dst)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr || !dst) {
return -1;
} else {
*dst = model_ptr->scale;
return 0;
}
}
s32 BoardModelVisibilitySet(s16 model, s32 visible)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
model_ptr->visible = visible;
return 0;
}
}
s32 BoardModelVisibilityGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return 0;
} else {
return model_ptr->visible;
}
}
s32 BoardModelCameraSet(s16 model, u16 camera)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
Hu3DModelCameraSet(model_ptr->id, camera);
model_ptr->camera = camera;
return 0;
}
}
s32 BoardModelLayerSet(s16 model, u8 layer)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
model_ptr->layer = layer;
Hu3DModelLayerSet(model_ptr->id, layer);
return 0;
}
}
s32 BoardModelLayerGet(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
return model_ptr->layer;
}
}
void BoardModelLayerSetAll(s32 layer)
{
BoardModel *model;
for(model=modelDataList; model < &modelDataList[BOARD_MODEL_MAX]; model++) {
if(model->index == -1 || model->character != -1) {
continue;
}
Hu3DModelLayerSet(model->id, layer);
}
}
s32 BoardModelHookSet(s16 model, char *name, s16 hook)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
BoardModel *hook_ptr = SearchBoardModel(hook);
if(!hook_ptr || !name) {
return -1;
}
Hu3DModelHookSet(model_ptr->id, name, hook_ptr->id);
BoardModelPosSet(hook, 0, 0, 0);
return 0;
}
}
s32 BoardModelHookReset(s16 model)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
Hu3DModelHookReset(model_ptr->id);
return 0;
}
}
s32 BoardModelHookObjReset(s16 model, char *name)
{
BoardModel *model_ptr = SearchBoardModel(model);
if(!model_ptr) {
return -1;
} else {
Hu3DModelHookObjReset(model_ptr->id, name);
return 0;
}
}
static BoardModel *SearchBoardModel(s16 id)
{
BoardModel *model;
if(id <= 0 || id > BOARD_MODEL_MAX || !modelDataList || BoardIsKill()) {
return NULL;
}
model = &modelDataList[id-1];
if(model->index != id) {
return NULL;
}
return model;
}
static void KillBoardModel(BoardModel *model)
{
s32 i;
if(model->index == -1) {
return;
}
if(model->character == -1) {
model->mot_id[0] = -1;
if(model->id >= 0) {
Hu3DModelKill(model->id);
model->id = -1;
}
for(i=1; i<BOARD_MOT_MAX; i++) {
if(model->mot_id[i] >= 0) {
if(i != 0) {
Hu3DMotionKill(model->mot_id[i]);
}
model->mot_id[i] = -1;
}
model->mot_data[i] = NULL;
}
model->data = NULL;
model->data_num = 0;
} else {
for(i=0; i<BOARD_MOT_MAX; i++) {
model->mot_id[i] = -1;
model->mot_data[i] = NULL;
}
if(model->data) {
if(model->id >= 0) {
model->id = -1;
}
model->data = NULL;
}
CharModelKill(model->character);
model->character = -1;
}
modelDataNum--;
model->index = -1;
model->visible = 0;
}
static BoardModel *FindLinkModel(s32 data_num)
{
BoardModel *model;
for(model=modelDataList; model < &modelDataList[BOARD_MODEL_MAX]; model++) {
if(model->data_num == data_num) {
return model;
}
}
return NULL;
}
static s32 CreateBoardModel(BoardModel *model, s32 data_num, s32 link)
{
BoardModel *linked_mdl = NULL;
if(link && model->character == -1) {
linked_mdl = FindLinkModel(data_num);
if(linked_mdl) {
model->id = Hu3DModelLink(linked_mdl->id);
model->data = NULL;
model->data_num = 0;
return 0;
}
}
if(model->character == -1) {
model->data = HuDataSelHeapReadNum(data_num, MEMORY_DEFAULT_NUM, HEAP_DATA);
if(!model->data) {
s32 size_data, size_dvd;
size_data = HuMemHeapSizeGet(HEAP_DATA)-HuMemUsedMallocSizeGet(HEAP_DATA);
size_dvd = HuMemHeapSizeGet(HEAP_DVD)-HuMemUsedMallocSizeGet(HEAP_DVD);
return -1;
}
} else {
model->data = NULL;
}
if(model->character == -1) {
model->id = Hu3DModelCreate(model->data);
} else {
model->id = CharModelCreate(model->character, 2);
}
Hu3DModelAttrSet(model->id, 0x4000);
if(model->id < 0) {
return -1;
} else {
model->data_num = data_num;
return 0;
}
}
static s32 CreateBoardModelMotion(BoardModel *model, s32 count, s32 *data_num)
{
void *data;
s32 i;
model->mot_id[0] = Hu3DData[model->id].unk_08;
if(!data_num) {
model->mot_count = 1;
return 0;
}
data = NULL;
for(i=0; i<count; i++) {
s16 index;
if(model->character == -1) {
data = HuDataSelHeapReadNum(data_num[i], MEMORY_DEFAULT_NUM, HEAP_DATA);
if(!data) {
return -1;
}
index = Hu3DJointMotion(model->id, data);
} else {
index = CharModelMotionCreate(model->character, data_num[i]);
}
if(index < 0) {
return -1;
}
model->mot_id[i+1] = index;
model->mot_data[i+1] = data;
}
model->mot_count = count+1;
return 0;
}