mirror of https://github.com/zeldaret/tp.git
239 lines
6.1 KiB
C++
239 lines
6.1 KiB
C++
#include "d/dolzel.h" // IWYU pragma: keep
|
||
|
||
#include "d/d_simple_model.h"
|
||
#include "d/d_com_inf_game.h"
|
||
|
||
static void dSmplMdl_modelUpdateDL(J3DModel* i_model) {
|
||
JUT_ASSERT(61, i_model != NULL);
|
||
J3DModelData* modelData = i_model->getModelData();
|
||
if (modelData->getMaterialNodePointer(0)->getMaterialAnm() != NULL) {
|
||
OS_REPORT(
|
||
"\x1b[43;30mシンプルモデル描画:モデルは\'bmdg\'フォルダに置いていますか?\n\x1b[m");
|
||
}
|
||
i_model->calc();
|
||
i_model->entry();
|
||
i_model->viewCalc();
|
||
}
|
||
|
||
dSmplMdl_draw_c::dSmplMdl_draw_c() {
|
||
for (int i = 0; i < 8; i++) {
|
||
mModel[i].init();
|
||
}
|
||
|
||
for (int i = 0; i < 500; i++) {
|
||
mList[i].init();
|
||
}
|
||
|
||
mListCount = 0;
|
||
}
|
||
|
||
diff_model_c::diff_model_c() {
|
||
mpHeap = NULL;
|
||
mpModel = NULL;
|
||
mCreateNum = 0;
|
||
mpList = NULL;
|
||
mRoomNo = 63;
|
||
}
|
||
|
||
dSmplMdl_draw_c::~dSmplMdl_draw_c() {
|
||
for (int i = 0; i < 8; i++) {
|
||
if (mModel[i].getModel() != NULL) {
|
||
OS_REPORT("\x1b[43;30m差分DL用ダミーモデル削除忘れがあります!!\n");
|
||
OS_REPORT("差分DLモデル領域を強制的に削除します。\n", "\x1b[m");
|
||
mModel[i].remove(1);
|
||
}
|
||
}
|
||
}
|
||
|
||
void dSmplMdl_draw_c::draw() {
|
||
for (int i = 0; i < 8; i++) {
|
||
if (mModel[i].getModel() != NULL) {
|
||
mModel[i].draw();
|
||
}
|
||
}
|
||
mListCount = 0;
|
||
|
||
for (int i = 0; i < 500; i++) {
|
||
mList[i].init();
|
||
}
|
||
|
||
for (int i = 0; i < 8; i++) {
|
||
mModel[i].insert(NULL);
|
||
}
|
||
}
|
||
|
||
void dSmplMdl_draw_c::entry(J3DModel* i_model, int roomNo) {
|
||
if (i_model != NULL && mListCount < 500) {
|
||
mList[mListCount].set(i_model);
|
||
for (int i = 0; i < 8; i++) {
|
||
if (mModel[i].isSame(i_model->getModelData(), roomNo)) {
|
||
mModel[i].insert(&mList[mListCount]);
|
||
break;
|
||
}
|
||
}
|
||
mListCount++;
|
||
} else {
|
||
OS_REPORT("\x1b[43;30mシンプルモデル描画エントリ数オーバー!!(%s, %d)\n\x1b[m",
|
||
__FILE__, 278);
|
||
}
|
||
}
|
||
|
||
BOOL dSmplMdl_draw_c::addModel(J3DModelData* i_modelData, int roomNo, u8 drawBG) {
|
||
JUT_ASSERT(307, i_modelData != NULL);
|
||
if (roomNo == -1) {
|
||
OS_REPORT("\x1b[43;30mシンプルモデル描画差分DLモデル登録:部屋番号指定がありません!!!\n\x1b[m");
|
||
}
|
||
for (int i = 0; i < 8; i++) {
|
||
if (mModel[i].isSame(i_modelData, roomNo)) {
|
||
if (mModel[i].create(i_modelData, roomNo, drawBG)) {
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
for (int i = 0; i < 8; i++) {
|
||
if (mModel[i].getModelData() == NULL) {
|
||
if (mModel[i].create(i_modelData, roomNo, drawBG)) {
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
OS_REPORT(
|
||
"\x1b[43;30m差分DL用ダミーモデル空きエントリが見つかりませんでした!(%s, %d)\n\x1b[m",
|
||
__FILE__, 349);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int dSmplMdl_draw_c::removeModel(J3DModelData* i_modelData, int roomNo) {
|
||
if (i_modelData == NULL) {
|
||
return 0;
|
||
}
|
||
|
||
for (int i = 0; i < 8; i++) {
|
||
if (mModel[i].isSame(i_modelData, roomNo)) {
|
||
mModel[i].remove(0);
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
OS_REPORT_ERROR("シンプルモデルを登録してないのに削除に!\n");
|
||
return 0;
|
||
}
|
||
|
||
BOOL diff_model_c::create(J3DModelData* i_modelData, int roomNo, u8 drawBG) {
|
||
JUT_ASSERT(397, i_modelData != NULL);
|
||
if (mpHeap == NULL) {
|
||
mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x2000, 0x20);
|
||
|
||
if (mpHeap != NULL) {
|
||
mpModel = mDoExt_J3DModel__create(i_modelData, 0x80000, 0x11000084);
|
||
|
||
if (mpModel == NULL) {
|
||
OS_REPORT("差分DL用モデル モデル生成失敗!(%s, %d)\n", __FILE__, 413);
|
||
remove(1);
|
||
mDoExt_restoreCurrentHeap();
|
||
} else {
|
||
cXyz scale(0.0f, 0.0f, 0.0f);
|
||
mpModel->setBaseScale(scale);
|
||
mpModel->setBaseTRMtx(mDoMtx_getIdentity());
|
||
mCreateNum++;
|
||
int result = mDoExt_adjustSolidHeapToSystem(mpHeap);
|
||
mRoomNo = roomNo;
|
||
mDrawBG = drawBG;
|
||
#if DEBUG
|
||
field_0x12 = 0;
|
||
#endif
|
||
return 1;
|
||
}
|
||
}
|
||
} else {
|
||
mCreateNum++;
|
||
return 1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
J3DModelData* diff_model_c::getModelData() {
|
||
if (mpModel != NULL) {
|
||
return mpModel->getModelData();
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
void diff_model_c::remove(int param_0) {
|
||
mCreateNum--;
|
||
|
||
if (mCreateNum == 0 || param_0 != 0) {
|
||
if (mpHeap != NULL) {
|
||
#if DEBUG
|
||
if (field_0x12 != 0) {
|
||
JUT_WARN(510, "%s", "Simple Model Denger Remove !!\n");
|
||
}
|
||
#endif
|
||
|
||
mDoExt_destroySolidHeap(mpHeap);
|
||
init();
|
||
}
|
||
}
|
||
}
|
||
|
||
void diff_model_c::draw() {
|
||
modelList_c* list = mpList;
|
||
if (list != NULL && dComIfGp_roomControl_checkStatusFlag(getRoomNo(), 0x10)) {
|
||
g_env_light.setLightTevColorType_MAJI(mpModel, dComIfGp_roomControl_getTevStr(getRoomNo()));
|
||
|
||
if (mDrawBG == 1) {
|
||
dComIfGd_setListBG();
|
||
}
|
||
|
||
for (; list != NULL; list = list->field_0x4) {
|
||
dSmplMdl_modelUpdateDL(list->mpModel);
|
||
}
|
||
mDoExt_modelUpdateDL(mpModel);
|
||
dComIfGd_setList();
|
||
#if DEBUG
|
||
field_0x12 = 1;
|
||
#endif
|
||
} else {
|
||
#if DEBUG
|
||
field_0x12 = 0;
|
||
#endif
|
||
}
|
||
}
|
||
|
||
void diff_model_c::init() {
|
||
mpModel = NULL;
|
||
mpHeap = NULL;
|
||
mpList = NULL;
|
||
mCreateNum = 0;
|
||
mRoomNo = 63;
|
||
}
|
||
|
||
BOOL diff_model_c::isSame(J3DModelData* i_modelData, int roomNo) {
|
||
if (mpModel != NULL) {
|
||
return getModelData() == i_modelData && roomNo == getRoomNo();
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
s32 diff_model_c::getRoomNo() {
|
||
return mRoomNo;
|
||
}
|
||
|
||
void diff_model_c::insert(modelList_c* list) {
|
||
modelList_c* prev = mpList;
|
||
mpList = list;
|
||
|
||
if (list == NULL) {
|
||
return;
|
||
}
|
||
|
||
list->field_0x4 = prev;
|
||
}
|