diff --git a/src/CLOUD/classes/data_test.c b/src/CLOUD/classes/data_test.c index 5120d73d..c08a0067 100644 --- a/src/CLOUD/classes/data_test.c +++ b/src/CLOUD/classes/data_test.c @@ -59,7 +59,7 @@ classes_data data_test_classes[] = { }, { "Stage Test##Data Test", - (classes_enum)(CLASSES_INIT_AT_STARTUP | CLASSES_IN_CONTEXT_MENU), + CLASSES_IN_CONTEXT_MENU, data_test_stage_test_init, data_test_stage_test_ctrl, CLASSES_DATA_NO_FUNC, diff --git a/src/CLOUD/classes/data_test/auth_3d_test.c b/src/CLOUD/classes/data_test/auth_3d_test.c index 91657b89..6fa44e14 100644 --- a/src/CLOUD/classes/data_test/auth_3d_test.c +++ b/src/CLOUD/classes/data_test/auth_3d_test.c @@ -72,8 +72,6 @@ vector_old_func(data_test_auth_3d_test_uid) extern int32_t width; extern int32_t height; extern float_t frame_speed; -extern stage stage_stgtst; -extern stage stage_test_data; static const char* data_test_auth_3d_test_window_title = "Auth 3D Test##Data Test"; @@ -82,8 +80,6 @@ static void data_test_auth_3d_test_load_auth_file(data_test_auth_3d_test* auth_3 static int data_test_auth_3d_test_uid_quicksort_compare_func(void const* src1, void const* src2); bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { - bool ret = false; - lock_trylock(&pv_lock); data->data = force_malloc_s(data_test_auth_3d_test, 1); data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; @@ -125,20 +121,7 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { auth_3d_test->auth_3d_category_index = -1; auth_3d_test->auth_3d_category_index_prev = -1; auth_3d_test->auth_3d_index = -1; - auth_3d_test->stage_index = -1; - - stage* stg = (stage*)rctx->stage; - if (stg && !stg->modern && stg->stage_data) { - stage_data* stg_data = stg->stage_data; - data_struct* aft_data = rctx->data; - stage_database* aft_stage_data = &aft_data->data_ft.stage_data; - - for (stage_data* i = aft_stage_data->stage_data.begin; i != aft_stage_data->stage_data.end; i++) - if (stg_data == i) { - auth_3d_test->stage_index = (int32_t)(i - aft_stage_data->stage_data.begin); - break; - } - } + auth_3d_test->stage_index = 0; auth_3d_test->auth_3d_id = -1; auth_3d_test->auth_3d_uid = -1; @@ -180,9 +163,7 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { auth_3d_test->rot_y = 0.0f; auth_3d_test->obj_set_id = vector_old_empty(uint32_t); } - ret = true; - lock_unlock(&pv_lock); - return ret; + return true; } void data_test_auth_3d_test_ctrl(class_data* data) { @@ -228,11 +209,9 @@ void data_test_auth_3d_test_ctrl(class_data* data) { auth_3d_data_unload_category((char*)cat_prev->name); } - { - for (uint32_t* i = auth_3d_test->obj_set_id.begin; i != auth_3d_test->obj_set_id.end; i++) - object_storage_delete_object_set(*i); - vector_old_uint32_t_clear(&auth_3d_test->obj_set_id, 0); - } + for (uint32_t* i = auth_3d_test->obj_set_id.begin; i != auth_3d_test->obj_set_id.end; i++) + object_storage_delete_object_set(*i); + vector_old_uint32_t_clear(&auth_3d_test->obj_set_id, 0); data_test_auth_3d_test_category* cat = &auth_3d_test->category.begin[auth_3d_test->auth_3d_category_index]; @@ -244,13 +223,13 @@ void data_test_auth_3d_test_ctrl(class_data* data) { object_set_info* set_info; if (!memcmp(name_str, "ITMPV", 5) - && object_database_get_object_set_info(obj_db, name_str, &set_info)) { + && obj_db->get_object_set_info(name_str, &set_info)) { object_set_load_by_db_index(&set_info, rctx->data, obj_db, set_info->id); vector_old_uint32_t_push_back(&auth_3d_test->obj_set_id, &set_info->id); } if (!memcmp(name_str, "EFFCHRPV", 8) - && object_database_get_object_set_info(obj_db, name_str, &set_info)) { + && obj_db->get_object_set_info(name_str, &set_info)) { object_set_load_by_db_index(&set_info, rctx->data, obj_db, set_info->id); vector_old_uint32_t_push_back(&auth_3d_test->obj_set_id, &set_info->id); } @@ -270,13 +249,13 @@ void data_test_auth_3d_test_ctrl(class_data* data) { break; } - if (object_database_get_object_set_info(obj_db, string_data(&obj), &set_info)) { + if (obj_db->get_object_set_info(string_data(&obj), &set_info)) { object_set_load_by_db_index(&set_info, rctx->data, obj_db, set_info->id); vector_old_uint32_t_push_back(&auth_3d_test->obj_set_id, &set_info->id); } string_add_length(&obj, "HRC", 3); - if (object_database_get_object_set_info(obj_db, string_data(&obj), &set_info)) { + if (obj_db->get_object_set_info(string_data(&obj), &set_info)) { object_set_load_by_db_index(&set_info, rctx->data, obj_db, set_info->id); vector_old_uint32_t_push_back(&auth_3d_test->obj_set_id, &set_info->id); } @@ -294,20 +273,7 @@ void data_test_auth_3d_test_ctrl(class_data* data) { } if (auth_3d_test->stage_load) { - render_context* rctx = auth_3d_test->rctx; - - data_struct* aft_data = rctx->data; - auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; - object_database* aft_obj_db = &aft_data->data_ft.obj_db; - texture_database* aft_tex_db = &aft_data->data_ft.tex_db; - stage_database* aft_stage_data = &aft_data->data_ft.stage_data; - - stage_free(&stage_test_data, rctx); - stage_init(&stage_test_data); - stage_load(&stage_test_data, aft_data, aft_auth_3d_db, - aft_obj_db, aft_tex_db, aft_stage_data, - (char*)auth_3d_test->stage.begin[auth_3d_test->stage_index], rctx); - stage_set(&stage_test_data, rctx); + task_stage_set_stage_index(auth_3d_test->stage_index); auth_3d_test->stage_load = false; } } @@ -317,9 +283,7 @@ bool data_test_auth_3d_test_hide(class_data* data) { if (!auth_3d_test) return true; - lock_data_free(&stage_data_lock, (void(*)(void*))data_test_auth_3d_test_hide); - - render_context* rctx = auth_3d_test->rctx; + task_stage_unload(); for (uint32_t* i = auth_3d_test->obj_set_id.begin; i != auth_3d_test->obj_set_id.end; i++) @@ -372,7 +336,8 @@ void data_test_auth_3d_test_imgui(class_data* data) { } auth_3d* auth = auth_3d_data_get_auth_3d(auth_3d_test->auth_3d_id); - auth_3d_test->last_frame = auth->play_control.size; + if (auth) + auth_3d_test->last_frame = auth->play_control.size; if (auth_3d_data_check_id_not_empty(&auth_3d_test->auth_3d_id)) { auth_3d_test->enable = auth_3d_data_get_enable(&auth_3d_test->auth_3d_id); @@ -546,15 +511,18 @@ void data_test_auth_3d_test_imgui(class_data* data) { window_flags |= ImGuiWindowFlags_NoCollapse; if (igBegin("A3D STAGE", 0, window_flags)) { - stage* stg = (stage*)auth_3d_test->rctx->stage; - if (!stg) - if (stage_test_data.stage_data) - stg = &stage_test_data; - else - stg = &stage_stgtst; + stage* stg = task_stage_get_current_stage(); - igCheckbox("stage", &stg->display); - igCheckbox("stg auth", &stg->effects); + if (stg){ + igCheckbox("stage", &stg->stage_display); + igCheckbox("stg auth display", &stg->effects); + } + else { + bool stage = true; + igCheckbox("stage", &stage); + bool effects = true; + igCheckbox("stg auth display", &effects); + } int32_t stage_index = auth_3d_test->stage_index; @@ -614,13 +582,6 @@ bool data_test_auth_3d_test_show(class_data* data) { if (!auth_3d_test) return false; - bool ret = false; - lock_trylock(&pv_lock); - if (!lock_data_init(&stage_data_lock, &data->lock, data, (void(*)(void*))data_test_auth_3d_test_hide)) - goto End; - - ret = true; - auth_3d_test->enable = true; auth_3d_test->repeat = true; auth_3d_test->left_right_reverse = false; @@ -632,9 +593,9 @@ bool data_test_auth_3d_test_show(class_data* data) { auth_3d_test->trans_z = 0.0f; auth_3d_test->rot_y = 0.0f; -End: - lock_unlock(&pv_lock); - return ret; + task_stage_load("A3D_STAGE"); + task_stage_set_stage_index(auth_3d_test->stage_index); + return true; } bool data_test_auth_3d_test_dispose(class_data* data) { diff --git a/src/CLOUD/classes/data_test/glitter_test.c b/src/CLOUD/classes/data_test/glitter_test.c index ba9d3d18..0500af6d 100644 --- a/src/CLOUD/classes/data_test/glitter_test.c +++ b/src/CLOUD/classes/data_test/glitter_test.c @@ -18,7 +18,8 @@ #include "../data_test.h" #include "../imgui_helper.h" -typedef struct data_test_glitter_test_struct { +class data_test_glitter_test_struct { +public: uint64_t hash; glitter_scene_counter scene_counter; float_t frame; @@ -34,7 +35,10 @@ typedef struct data_test_glitter_test_struct { bool stage_test; render_context* rctx; -} data_test_glitter_test_struct; + + data_test_glitter_test_struct(); + ~data_test_glitter_test_struct(); +}; extern int32_t width; extern int32_t height; @@ -45,11 +49,7 @@ extern bool draw_grid_3d; static const char* data_test_glitter_test_window_title = "Glitter Test##Data Test"; bool data_test_glitter_test_init(class_data* data, render_context* rctx) { - if (!lock_data_init(&glitter_data_lock, &data->lock, data, (void(*)(void*))data_test_glitter_test_dispose)) - return false; - - lock_trylock(&pv_lock); - data->data = force_malloc_s(data_test_glitter_test_struct, 1); + data->data = new data_test_glitter_test_struct; LARGE_INTEGER time; QueryPerformanceCounter(&time); @@ -57,11 +57,11 @@ bool data_test_glitter_test_init(class_data* data, render_context* rctx) { data_test_glitter_test_struct* glt_test = (data_test_glitter_test_struct*)data->data; if (glt_test) { - data_struct_get_directory_files(&data_list[DATA_AFT], "rom/particle/", &glt_test->files); + data_list[DATA_AFT].get_directory_files("rom/particle/", &glt_test->files); for (data_struct_file* i = glt_test->files.begin()._Ptr; i != glt_test->files.end()._Ptr;) if (str_utils_check_ends_with(i->name.c_str(), ".farc")) { char* temp = str_utils_get_without_extension(i->name.c_str()); - i->name = std::string(temp); + i->name = temp ? std::string(temp) : std::string(); free(temp); i++; } @@ -77,7 +77,6 @@ bool data_test_glitter_test_init(class_data* data, render_context* rctx) { GPM_VAL.draw_all_mesh = false; draw_grid_3d = false; } - lock_unlock(&pv_lock); return true; } @@ -150,8 +149,8 @@ void data_test_glitter_test_imgui(class_data* data) { ImGuiStyle* style = igGetStyle(); ImFont* font = igGetFont(); - float_t w = min((float_t)width, 320.0f); - float_t h = min((float_t)height, 278.0f); + float_t w = 280.0f; + float_t h = 278.0f; igSetNextWindowPos(ImVec2_Empty, ImGuiCond_Appearing, ImVec2_Empty); igSetNextWindowSize({ w, h }, ImGuiCond_Always); @@ -291,21 +290,22 @@ bool data_test_glitter_test_dispose(class_data* data) { GPM_VAL.FreeScenes(); GPM_VAL.SetPause(false); - lock_data_free(&glitter_data_lock, (void(*)(void*))data_test_glitter_test_dispose); - data_test_glitter_test_struct* glt_test = (data_test_glitter_test_struct*)data->data; + delete glt_test; draw_grid_3d = false; - if (glt_test) { - glt_test->files = {}; - glt_test->file = 0; - glt_test->input_play = false; - glt_test->input_stop = false; - glt_test->frame = 0.0f; - } - free(data->data); data->flags = (class_flags)(CLASS_HIDDEN | CLASS_DISPOSED); data->imgui_focus = false; return true; } + +data_test_glitter_test_struct::data_test_glitter_test_struct() : hash(), +scene_counter(), frame(), auto_and_repeat(), reload(), pv_mode(), +input_play(), input_stop(), delta_frame(), file(), stage_test(), rctx() { + +} + +data_test_glitter_test_struct::~data_test_glitter_test_struct() { + +} diff --git a/src/CLOUD/classes/data_test/stage_test.c b/src/CLOUD/classes/data_test/stage_test.c index d0534eec..7ab530c3 100644 --- a/src/CLOUD/classes/data_test/stage_test.c +++ b/src/CLOUD/classes/data_test/stage_test.c @@ -22,41 +22,42 @@ class data_test_stage_test_stage_pv { public: int32_t pv_id; - std::vector stage; + std::vector stage; data_test_stage_test_stage_pv(int32_t pv_id); ~data_test_stage_test_stage_pv(); }; -typedef struct data_test_stage_test { +class data_test_stage_test { +public: int32_t pv_id; int32_t pv_index; int32_t ns_index; int32_t other_index; int32_t stage_index; - const char* stage_name; + int32_t stage_index_load; bool stage_load; render_context* rctx; std::vector stage_pv; - std::vector stage_ns; - std::vector stage_other; -} data_test_stage_test; + std::vector stage_ns; + std::vector stage_other; + + data_test_stage_test(); + ~data_test_stage_test(); +}; extern int32_t width; extern int32_t height; -extern stage stage_stgtst; -extern stage stage_test_data; static const char* data_test_stage_test_window_title = "Stage Test##Data Test"; static int data_test_stage_test_stage_pv_quicksort_compare_func(void const* src1, void const* src2); -static void data_test_stage_test_stage_pv_free(data_test_stage_test_stage_pv* pv); bool data_test_stage_test_init(class_data* data, render_context* rctx) { - data->data = force_malloc_s(data_test_stage_test, 1); + data->data = new data_test_stage_test; data_test_stage_test* stage_test = (data_test_stage_test*)data->data; if (stage_test) { @@ -68,7 +69,7 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { stage_test->other_index = -1; stage_test->stage_index = -1; - stage_test->stage_name = 0; + stage_test->stage_index_load = -1; stage_test->stage_load = false; stage_test->rctx = rctx; @@ -93,9 +94,9 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { stg_other_count++; } - std::vector stage_pv = {}; - std::vector stage_ns = {}; - std::vector stage_other = {}; + std::vector stage_pv; + std::vector stage_ns; + std::vector stage_other; stage_pv.reserve(stg_pv_count); stage_ns.reserve(stg_ns_count); @@ -121,7 +122,7 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { if (stgpv) ret = sscanf_s(string_data(&i->name) + 5, "%03d", &pv_id); else - ret = sscanf_s(string_data(&i->name) + 8, "%03d", &pv_id); + ret = sscanf_s(string_data(&i->name) + 7, "%03d", &pv_id); if (ret != 1) continue; @@ -136,8 +137,7 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { stg_pv = &stage_pv.end()[-1]; } - std::string stg = std::string(string_data(&i->name), i->name.length); - stg_pv->stage.push_back(stg); + stg_pv->stage.push_back(i->id); } else if (stgns || stgd2ns) { int32_t ns_id = 0; @@ -145,17 +145,16 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { if (stgns) ret = sscanf_s(string_data(&i->name) + 5, "%03d", &ns_id); else - ret = sscanf_s(string_data(&i->name) + 8, "%03d", &ns_id); + ret = sscanf_s(string_data(&i->name) + 7, "%03d", &ns_id); if (ret != 1) continue; - std::string stg = std::string(string_data(&i->name), i->name.length); - stage_ns.push_back(stg); + stage_ns.push_back(i->id); } else { std::string stg = std::string(string_data(&i->name), i->name.length); - stage_other.push_back(stg); + stage_other.push_back(i->id); } } @@ -164,26 +163,16 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { sizeof(data_test_stage_test_stage_pv), data_test_stage_test_stage_pv_quicksort_compare_func); - if (stage_pv.size()) + if (stage_pv.size()) stage_test->pv_id = stage_pv[0].pv_id; stage_test->stage_pv = stage_pv; stage_test->stage_ns = stage_ns; stage_test->stage_other = stage_other; - stage* stg = (stage*)rctx->stage; - if ((stg && !stg->modern && stg->stage_data) || !stg) { - if (!stg) { - stg = &stage_stgtst; - stage_set(&stage_stgtst, rctx); - } - - stage_data* data = stg->stage_data; - if (data - stg_data->begin >= 0 && data - stg_data->begin < vector_old_length(*stg_data)) { - stage_test->stage_index = (int32_t)(data - stg_data->begin); - stage_test->stage_name = string_data(&data->name); - } - } + stage_test->stage_index = 0; + stage_test->stage_load = false; + stage_test->stage_index_load = 0; } return true; } @@ -192,21 +181,7 @@ void data_test_stage_test_ctrl(class_data* data) { data_test_stage_test* stage_test = (data_test_stage_test*)data->data; if (stage_test->stage_load) { - render_context* rctx = stage_test->rctx; - stage_free(&stage_test_data, rctx); - - data_struct* aft_data = rctx->data; - auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; - object_database* aft_obj_db = &aft_data->data_ft.obj_db; - texture_database* aft_tex_db = &aft_data->data_ft.tex_db; - stage_database* aft_stage_data = &aft_data->data_ft.stage_data; - - stage_set(&stage_stgtst, rctx); - - stage_init(&stage_test_data); - stage_load(&stage_test_data, aft_data, aft_auth_3d_db, - aft_obj_db, aft_tex_db, aft_stage_data, stage_test->stage_name, rctx); - stage_set(&stage_test_data, rctx); + task_stage_set_stage_index(stage_test->stage_index_load); stage_test->stage_load = false; } } @@ -216,7 +191,8 @@ bool data_test_stage_test_hide(class_data* data) { if (!stage_test) return false; - lock_data_free(&stage_data_lock, (void(*)(void*))data_test_stage_test_hide); + task_stage_set_stage_index(-1); + task_stage_unload(); enum_and(data->flags, ~CLASS_HIDE); enum_or(data->flags, CLASS_HIDDEN); @@ -254,9 +230,9 @@ void data_test_stage_test_imgui(class_data* data) { vector_old_stage_data* stg_data = &stage_test->rctx->data->data_ft.stage_data.stage_data; - std::vector* stage_pv = &stage_test->stage_pv; - std::vector* stage_ns = &stage_test->stage_ns; - std::vector* stage_other = &stage_test->stage_other; + std::vector& stage_pv = stage_test->stage_pv; + std::vector& stage_ns = stage_test->stage_ns; + std::vector& stage_other = stage_test->stage_other; int32_t pv_id = stage_test->pv_id; @@ -267,7 +243,7 @@ void data_test_stage_test_imgui(class_data* data) { igSameLine(0.0f, 1.0f); igSetNextItemWidth(48.0f); if (igBeginCombo("##PV:", buf, 0)) { - for (data_test_stage_test_stage_pv& i : *stage_pv) { + for (data_test_stage_test_stage_pv& i : stage_pv) { igPushID_Ptr(&i); sprintf_s(buf, sizeof(buf), "%03d", i.pv_id); if (igSelectable_Bool(buf, pv_id == i.pv_id, 0, ImVec2_Empty) @@ -294,17 +270,18 @@ void data_test_stage_test_imgui(class_data* data) { igSameLine(0.0f, 1.0f); igSetNextItemWidth(160.0f); bool pv_id_found = false; - for (data_test_stage_test_stage_pv& i : *stage_pv) { + for (data_test_stage_test_stage_pv& i : stage_pv) { if (pv_id != i.pv_id) continue; if (igBeginCombo("##PV Index", pv_index > -1 - ? i.stage[pv_index].c_str() : "", 0)) { - for (std::string& j : i.stage) { - int32_t pv_idx = (int32_t)(&j - i.stage.begin()._Ptr); + ? string_data(&stg_data->begin[i.stage[pv_index]].name) : "", 0)) { + for (int32_t& j : i.stage) { + int32_t pv_idx = (int32_t)(&j - i.stage.data()); - igPushID_Ptr(&j); - if (igSelectable_Bool(j.c_str(), pv_index == pv_idx, 0, ImVec2_Empty) + igPushID_Int(j); + if (igSelectable_Bool(string_data(&stg_data->begin[j].name), + pv_index == pv_idx, 0, ImVec2_Empty) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (igIsItemFocused() && pv_index != pv_idx)) { stage_test->pv_index = -1; @@ -321,7 +298,7 @@ void data_test_stage_test_imgui(class_data* data) { if (pv_index != stage_test->pv_index) { stage_test->stage_load = true; - stage_test->stage_name = i.stage[pv_index].c_str(); + stage_test->stage_index_load = i.stage[pv_index]; stage_test->pv_index = pv_index; } pv_id_found = true; @@ -339,12 +316,13 @@ void data_test_stage_test_imgui(class_data* data) { igSameLine(0.0f, 1.0f); igSetNextItemWidth(160.0f); if (igBeginCombo("##NS Index", ns_index > -1 - ? (*stage_ns)[ns_index].c_str() : "", 0)) { - for (std::string& i : *stage_ns) { - int32_t ns_idx = (int32_t)(&i - stage_ns->begin()._Ptr); + ? string_data(&stg_data->begin[(stage_ns)[ns_index]].name) : "", 0)) { + for (int32_t& i : stage_ns) { + int32_t ns_idx = (int32_t)(&i - stage_ns.data()); - igPushID_Ptr(&i); - if (igSelectable_Bool(i.c_str(), ns_index == ns_idx, 0, ImVec2_Empty) + igPushID_Int(i); + if (igSelectable_Bool(string_data(&stg_data->begin[stage_ns[i]].name), + ns_index == ns_idx, 0, ImVec2_Empty) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (igIsItemFocused() && ns_index != ns_idx)) { stage_test->ns_index = -1; @@ -362,7 +340,7 @@ void data_test_stage_test_imgui(class_data* data) { if (ns_index != stage_test->ns_index) { stage_test->stage_load = true; - stage_test->stage_name = (*stage_ns)[ns_index].c_str(); + stage_test->stage_index_load = stage_ns[ns_index]; stage_test->ns_index = ns_index; } @@ -372,12 +350,13 @@ void data_test_stage_test_imgui(class_data* data) { igSameLine(0.0f, 1.0f); igSetNextItemWidth(160.0f); if (igBeginCombo("##Other Index", other_index > -1 - ? (*stage_other)[other_index].c_str() : "", 0)) { - for (std::string& i : *stage_other) { - int32_t other_idx = (int32_t)(&i - stage_other->begin()._Ptr); + ? string_data(&stg_data->begin[stage_other[ns_index]].name) : "", 0)) { + for (int32_t& i : stage_other) { + int32_t other_idx = (int32_t)(&i - stage_other.data()); - igPushID_Ptr(&i); - if (igSelectable_Bool(i.c_str(), other_index == other_idx, 0, ImVec2_Empty) + igPushID_Int(i); + if (igSelectable_Bool(string_data(&stg_data->begin[stage_other[i]].name), + other_index == other_idx, 0, ImVec2_Empty) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (igIsItemFocused() && other_index != other_idx)) { stage_test->other_index = -1; @@ -395,7 +374,7 @@ void data_test_stage_test_imgui(class_data* data) { if (other_index != stage_test->other_index) { stage_test->stage_load = true; - stage_test->stage_name = (*stage_other)[other_index].c_str(); + stage_test->stage_index_load = stage_other[other_index]; stage_test->other_index = other_index; } @@ -428,22 +407,31 @@ void data_test_stage_test_imgui(class_data* data) { if (stage_index != stage_test->stage_index) { stage_test->stage_load = true; - stage_test->stage_name = string_data(&stg_data->begin[stage_index].name); + stage_test->stage_index_load = stage_index; stage_test->stage_index = stage_index; } - stage* stg = (stage*)stage_test->rctx->stage; - if (!stg) - if (stage_test_data.stage_data) - stg = &stage_test_data; - else - stg = &stage_stgtst; + stage* stg = task_stage_get_current_stage(); + if (stg) { + igCheckbox("Stage display", &stg->stage_display); + igCheckbox("[Ring]", &stg->ring); + igCheckbox("[Ground]", &stg->ground); + igCheckbox("[Sky]", &stg->sky); + igCheckbox("Effects display", &stg->effects); - igCheckbox("Stage display", &stg->display); - igCheckbox("[Ring]", &stg->ring); - igCheckbox("[Ground]", &stg->ground); - igCheckbox("[Sky]", &stg->sky); - igCheckbox("Effects display", &stg->effects); + } + else { + bool stage_display = true; + igCheckbox("Stage display", &stage_display); + bool ring = true; + igCheckbox("[Ring]", &ring); + bool ground = true; + igCheckbox("[Ground]", &ground); + bool sky = true; + igCheckbox("[Sky]", &sky); + bool effects_display = true; + igCheckbox("Effects display", &effects_display); + } data->imgui_focus |= igIsWindowFocused(0); igEnd(); @@ -454,28 +442,15 @@ bool data_test_stage_test_show(class_data* data) { if (!stage_test) return false; - bool ret = false; - lock_trylock(&pv_lock); - if (!lock_data_init(&stage_data_lock, &data->lock, data, (void(*)(void*))data_test_stage_test_hide)) - goto End; + task_stage_load("DATA_TEST_STG_STAGE"); + task_stage_set_stage_index(stage_test->stage_index); - ret = true; - -End: - lock_unlock(&pv_lock); - return ret; + return true; } bool data_test_stage_test_dispose(class_data* data) { - lock_data_free(&stage_data_lock, (void(*)(void*))data_test_stage_test_dispose); - data_test_stage_test* stage_test = (data_test_stage_test*)data->data; - if (stage_test) { - stage_test->stage_pv = {}; - stage_test->stage_ns = {}; - stage_test->stage_other = {}; - } - free(data->data); + delete stage_test; data->flags = (class_flags)(CLASS_HIDDEN | CLASS_DISPOSED); data->imgui_focus = false; @@ -488,10 +463,6 @@ static int data_test_stage_test_stage_pv_quicksort_compare_func(void const* src1 return pv1 > pv2 ? 1 : (pv1 < pv2 ? -1 : 0); } -static void data_test_stage_test_stage_pv_free(data_test_stage_test_stage_pv* pv) { - pv->stage = {}; -} - data_test_stage_test_stage_pv::data_test_stage_test_stage_pv(int32_t pv_id) { this->pv_id = pv_id; } @@ -499,3 +470,12 @@ data_test_stage_test_stage_pv::data_test_stage_test_stage_pv(int32_t pv_id) { data_test_stage_test_stage_pv::~data_test_stage_test_stage_pv() { } + +data_test_stage_test::data_test_stage_test() : pv_id(), pv_index(), ns_index(), +other_index(), stage_index(), stage_index_load(), stage_load(), rctx() { + +} + +data_test_stage_test::~data_test_stage_test() { + +} diff --git a/src/CLOUD/classes/data_view/auth_3d.c b/src/CLOUD/classes/data_view/auth_3d.c index 91c87224..02740f36 100644 --- a/src/CLOUD/classes/data_view/auth_3d.c +++ b/src/CLOUD/classes/data_view/auth_3d.c @@ -136,7 +136,7 @@ void data_view_auth_3d_imgui(class_data* data) { if (auth->camera_root.size() > 1 && igTreeNodeEx_Str("Camera Root", tree_node_flags)) { for (auth_3d_camera_root& l : auth->camera_root) - data_view_auth_3d_imgui_auth_3d_camera_root(&l, &l - auth->camera_root.begin()._Ptr); + data_view_auth_3d_imgui_auth_3d_camera_root(&l, &l - auth->camera_root.data()); igTreePop(); } else if (auth->camera_root.size() == 1) diff --git a/src/CLOUD/classes/glitter_editor.c b/src/CLOUD/classes/glitter_editor.c index 56151781..fe6d4c60 100644 --- a/src/CLOUD/classes/glitter_editor.c +++ b/src/CLOUD/classes/glitter_editor.c @@ -432,11 +432,6 @@ static bool glitter_editor_hash_input(glitter_editor_struct* glt_edt, const char* label, uint64_t* hash); bool glitter_editor_init(class_data* data, render_context* rctx) { - if (!lock_data_init(&glitter_data_lock, &data->lock, data, (void(*)(void*))glitter_editor_dispose)) - return false; - - bool ret = false; - lock_trylock(&pv_lock); data->data = force_malloc_s(glitter_editor_struct, 1); LARGE_INTEGER time; @@ -460,8 +455,6 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { glitter_editor_reset(glt_edt); glitter_editor_gl_load(glt_edt); } - ret = true; - lock_unlock(&pv_lock); /*char* path_x = "VRFL\\"; vector_old_string files_x = vector_old_empty(string); @@ -478,7 +471,7 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { glitter_file_reader* fr = 0; if (files_x.begin) { stream s; - io_wopen(&s, L"name_VRFL.glitter.txt", L"rb"); + io_open(&s, L"name_VRFL.glitter.txt", L"rb"); size_t length = s.length; uint8_t* data = force_malloc(length); io_read(&s, data, length); @@ -626,7 +619,7 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { } stream s; - io_wopen(&s, L"name_F2.glitter.txt", L"rb"); + io_open(&s, L"name_F2.glitter.txt", L"rb"); size_t length = s.length; uint8_t* data = force_malloc(length); io_read(&s, data, length); @@ -704,7 +697,7 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { vector_old_string_free(&files_ft); free(data); glt_edt->effect_group = 0;*/ - return ret; + return true; } void glitter_editor_ctrl(class_data* data) { @@ -767,7 +760,7 @@ void glitter_editor_ctrl(class_data* data) { if (j > -1) { uint64_t hash = eg->resource_hashes[j]; eg->resource_hashes.erase(eg->resource_hashes.begin() + j); - vector_old_txp_erase(&eg->resources_tex, j, txp_free); + eg->resources_tex.textures.erase(eg->resources_tex.textures.begin() + j); eg->resources_count--; uint64_t empty_hash = eg->type != GLITTER_FT @@ -808,7 +801,7 @@ void glitter_editor_ctrl(class_data* data) { else if (glt_edt->resource_flags & GLITTER_EDITOR_MOVE_UP) { size_t rc = eg->resources_count; uint64_t* rh = eg->resource_hashes.data(); - txp* rt = eg->resources_tex.begin; + txp* rt = eg->resources_tex.textures.data(); ssize_t j = -1; for (size_t i = 0; i < rc; i++) @@ -831,7 +824,7 @@ void glitter_editor_ctrl(class_data* data) { else if (glt_edt->resource_flags & GLITTER_EDITOR_MOVE_DOWN) { size_t rc = eg->resources_count; uint64_t* rh = eg->resource_hashes.data(); - txp* rt = eg->resources_tex.begin; + txp* rt = eg->resources_tex.textures.data(); ssize_t j = -1; for (size_t i = 0; i < rc; i++) @@ -1105,19 +1098,19 @@ void glitter_editor_ctrl(class_data* data) { if (e->data.name_hash == hash_murmurhash_empty) continue; - uint32_t* hash = 0; - for (uint32_t j : hashes) - if (e->data.name_hash == j) { - hash = &j; + std::vector::iterator hash = hashes.end(); + for (std::vector::iterator j = hashes.begin(); j != hashes.end(); j++) + if (e->data.name_hash == *j) { + hash = j; break; } - if (hash == hashes.end()._Ptr) { + if (hash == hashes.end()) { load_success = false; continue; } - std::string* s = &ds->glitter_list_names[hash - hashes.data()]; + std::string* s = &ds->glitter_list_names[hash - hashes.begin()]; size_t len = s->size(); memcpy(e->name, s->c_str(), min(len, 0x7F)); } @@ -1144,17 +1137,19 @@ void glitter_editor_ctrl(class_data* data) { if (e->data.name_hash == hash_fnv1a64m_empty) continue; - uint64_t* hash = 0; - for (uint64_t j : hashes) - if (e->data.name_hash == j) + std::vector::iterator hash = hashes.end(); + for (std::vector::iterator j = hashes.begin(); j != hashes.end(); j++) + if (e->data.name_hash == *j) { + hash = j; break; + } - if (hash == hashes.end()._Ptr) { + if (hash == hashes.end()) { load_success = false; continue; } - std::string* s = &ds->glitter_list_names[hash - hashes.data()]; + std::string* s = &ds->glitter_list_names[hash - hashes.begin()]; size_t len = s->size(); memcpy(e->name, s->c_str(), min(len, 0x7F)); } @@ -1308,8 +1303,6 @@ void glitter_editor_input(class_data* data) { bool glitter_editor_dispose(class_data* data) { GPM_VAL.FreeScenes(); - lock_data_free(&glitter_data_lock, (void(*)(void*))glitter_editor_dispose); - glitter_editor_struct* glt_edt = (glitter_editor_struct*)data->data; if (glt_edt) { glitter_editor_gl_free(glt_edt); @@ -1799,7 +1792,7 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, char* path, farc f; if (glitter_diva_effect_unparse_file(glt_type, glt_edt->effect_group, &st)) { - f2_struct_mwrite(&st, &ff_dve.data, &ff_dve.size, true, false); + f2_struct_write(&st, &ff_dve.data, &ff_dve.size, true, false); ff_dve.name = std::string(file); ff_dve.name += ".dve"; f2_struct_free(&st); @@ -1808,7 +1801,7 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, char* path, goto End; if (glitter_diva_resource_unparse_file(glt_edt->effect_group, &st)) { - f2_struct_mwrite(&st, &ff_drs.data, &ff_drs.size, true, false); + f2_struct_write(&st, &ff_drs.data, &ff_drs.size, true, false); ff_drs.name = std::string(file); ff_drs.name += ".drs"; } @@ -1816,7 +1809,7 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, char* path, if (glt_type == GLITTER_FT) if (glitter_diva_list_unparse_file(glt_edt->effect_group, &st)) { - f2_struct_mwrite(&st, &ff_lst.data, &ff_lst.size, true, false); + f2_struct_write(&st, &ff_lst.data, &ff_lst.size, true, false); ff_lst.name = std::string(file); ff_lst.name += ".lst"; } @@ -1881,7 +1874,7 @@ static bool glitter_editor_list_open_window(glitter_effect_group* eg) { ofn.lpstrTitle = L"File to Open"; if (GetOpenFileNameW(&ofn)) { stream s; - io_wopen(&s, file, L"rb"); + io_open(&s, file, L"rb"); size_t length = s.length; uint8_t* data = force_malloc_s(uint8_t, length); io_read(&s, data, length); @@ -1983,13 +1976,13 @@ static bool glitter_editor_resource_import(glitter_editor_struct* glt_edt) { if (d->width == 0 || d->height == 0 || d->mipmaps_count == 0 || vector_old_length(d->data) < 1) goto DDSEnd; - tex = vector_old_txp_reserve_back(&eg->resources_tex); + eg->resources_tex.textures.push_back({}); + tex = &eg->resources_tex.textures.end()[-1]; tex->array_size = d->has_cube_map ? 6 : 1; tex->has_cube_map = d->has_cube_map; tex->mipmaps_count = d->mipmaps_count; - vector_old_txp_mipmap_reserve(&tex->data, - (tex->has_cube_map ? 6LL : 1LL) * tex->mipmaps_count); + tex->mipmaps.reserve((tex->has_cube_map ? 6LL : 1LL) * tex->mipmaps_count); index = 0; do for (uint32_t i = 0; i < tex->mipmaps_count; i++) { @@ -1999,12 +1992,11 @@ static bool glitter_editor_resource_import(glitter_editor_struct* glt_edt) { tex_mip.height = max(d->height >> i, 1); tex_mip.format = d->format; - uint32_t size = txp_get_size(tex_mip.format, - tex_mip.width, tex_mip.height); + uint32_t size = txp::get_size(tex_mip.format, tex_mip.width, tex_mip.height); tex_mip.size = size; - tex_mip.data = force_malloc(size); - memcpy(tex_mip.data, d->data.begin[index], size); - vector_old_txp_mipmap_push_back(&tex->data, &tex_mip); + tex_mip.data.resize(size); + memcpy(tex_mip.data.data(), d->data.begin[index], size); + tex->mipmaps.push_back(tex_mip); index++; } while (index / tex->mipmaps_count < tex->array_size); @@ -2048,11 +2040,11 @@ static bool glitter_editor_resource_export(glitter_editor_struct* glt_edt) { dds* d = dds_init(); glitter_effect_group* eg = glt_edt->effect_group; - txp tex = eg->resources_tex.begin[sel_rsrc]; + txp& tex = eg->resources_tex.textures[sel_rsrc]; - txp_format format = tex.data.begin[0].format; - uint32_t width = tex.data.begin[0].width; - uint32_t height = tex.data.begin[0].height; + txp_format format = tex.mipmaps[0].format; + uint32_t width = tex.mipmaps[0].width; + uint32_t height = tex.mipmaps[0].height; d->format = format; d->width = width; @@ -2065,9 +2057,9 @@ static bool glitter_editor_resource_export(glitter_editor_struct* glt_edt) { uint32_t index = 0; do for (uint32_t i = 0; i < tex.mipmaps_count; i++) { - uint32_t size = txp_get_size(format, max(width >> i, 1), max(height >> i, 1)); + uint32_t size = txp::get_size(format, max(width >> i, 1), max(height >> i, 1)); void* data = force_malloc(size); - memcpy(data, tex.data.begin[index].data, size); + memcpy(data, tex.mipmaps[index].data.data(), size); vector_old_ptr_void_push_back(&d->data, &data); index++; } @@ -2090,10 +2082,8 @@ static void glitter_editor_test_window(glitter_editor_struct* glt_edt, class_dat float_t x; float_t y; - float_t w = min((float_t)width, 360.0f); - float_t h = min((float_t)height, 326.0f); - - float_t frame_counter; + float_t w = 280.0f; + float_t h = 326.0f; igSetNextWindowPos(ImVec2_Empty, ImGuiCond_FirstUseEver, ImVec2_Empty); igSetNextWindowSize({ w, h }, ImGuiCond_Always); @@ -2138,13 +2128,12 @@ static void glitter_editor_test_window(glitter_editor_struct* glt_edt, class_dat igSeparator(); - frame_counter = glt_edt->frame_counter; glt_edt->old_frame_counter = glt_edt->frame_counter; imguiColumnSliderFloat("Frame", &glt_edt->frame_counter, 1.0f, (float_t)glt_edt->start_frame, (float_t)glt_edt->end_frame, "%.0f", 0, true); glt_edt->input_pause_temp = imgui_is_item_activated; - igText("Start/End Frame: %d/%d %d", glt_edt->start_frame, glt_edt->end_frame, (int32_t)glt_edt->input_pause_temp); + igText("Start/End Frame: %d/%d", glt_edt->start_frame, glt_edt->end_frame); imguiColumnSliderFloat("Emission", &GPM_VAL.emission, 0.01f, 1.0f, 2.0f, "%.2f", 0, true); @@ -2638,7 +2627,7 @@ static void glitter_editor_resources(glitter_editor_struct* glt_edt) { texture** r = eg->resources; int32_t rc = eg->resources_count; uint64_t* rh = eg->resource_hashes.data(); - txp* rt = eg->resources_tex.begin; + txp* rt = eg->resources_tex.textures.data(); igPushID_Ptr(eg); ssize_t i_idx = 1; for (int32_t i = 0; i < rc; i++, i_idx++) { @@ -2646,7 +2635,7 @@ static void glitter_editor_resources(glitter_editor_struct* glt_edt) { igPushID_Int(i); igSelectable_Bool(buf, i == sel_rsrc, 0, { 0.0f, 0.0f }); if (igIsItemHovered(0)) { - txp_mipmap* rtm = rt[i].data.begin; + txp_mipmap* rtm = rt[i].mipmaps.data(); float_t aspect = (float_t)rtm->width / (float_t)rtm->height; ImVec2 size = { 192.0f, 192.0f }; @@ -2787,8 +2776,9 @@ static void glitter_editor_play_manager(glitter_editor_struct* glt_edt) { igSeparator(); glt_edt->old_frame_counter = glt_edt->frame_counter; - glt_edt->input_pause_temp = imguiColumnSliderFloat("Frame", &glt_edt->frame_counter, 1.0f, + imguiColumnSliderFloat("Frame", &glt_edt->frame_counter, 1.0f, (float_t)glt_edt->start_frame, (float_t)glt_edt->end_frame, "%.0f", 0, true); + glt_edt->input_pause_temp = imgui_is_item_activated; igText("Start/End Frame: %d/%d", glt_edt->start_frame, glt_edt->end_frame); @@ -4250,7 +4240,7 @@ static bool glitter_editor_property_particle_texture(glitter_editor_struct* glt_ size_t rc = eg->resources_count; texture** r = eg->resources; uint64_t* rh = eg->resource_hashes.data(); - txp* rt = eg->resources_tex.begin; + txp* rt = eg->resources_tex.textures.data(); const uint64_t empty_hash = eg->type != GLITTER_FT ? hash_murmurhash_empty : hash_fnv1a64m_empty; @@ -4362,7 +4352,7 @@ static bool glitter_editor_property_particle_texture(glitter_editor_struct* glt_ } - txp_mipmap* rtm = rt[n - 1].data.begin; + txp_mipmap* rtm = rt[n - 1].mipmaps.data(); float_t aspect1 = (float_t)rtm->width / (float_t)rtm->height; float_t aspect2 = aspect1; if (particle->data.split_u * particle->data.split_v > 1) diff --git a/src/CLOUD/classes/graphics/post_process.c b/src/CLOUD/classes/graphics/post_process.c index adff8fac..850ceb1a 100644 --- a/src/CLOUD/classes/graphics/post_process.c +++ b/src/CLOUD/classes/graphics/post_process.c @@ -198,8 +198,12 @@ void graphics_post_process_imgui(class_data* data) { } imguiColumnSliderFloat("distance to focus[m]", &dof->data.debug.distance_to_focus, 0.01f, 0.01f, 30.0f, "%.2f", 0, true); + + float_t focal_length = dof->data.debug.focal_length * 1000.0f; imguiColumnSliderFloat("focal length[mm]", - &dof->data.debug.focal_length, 0.01f, 0.1f, 100.0f, "%.2f", 0, true); + &focal_length, 0.01f, 0.1f, 100.0f, "%.2f", 0, true); + dof->data.debug.focal_length = focal_length / 1000.0f; + imguiColumnSliderFloat("F-Number", &dof->data.debug.f_number, 0.01f, 0.1f, 40.0f, "%.2f", 0, true); if (!phys) { @@ -227,12 +231,9 @@ void graphics_post_process_imgui(class_data* data) { igTreePop(); } - if (imguiButton("Reset Post Process", ImVec2_Empty) && rctx->stage) { - stage* stg = (stage*)rctx->stage; - //light_param_data* light_param = light_param_storage_get_light_param_data(stg->light_param_name); - post_process_reset(pp); - //if (light_param->glow.ready) - //render_context_light_param_data_glow_set(rctx, &light_param->glow); + if (imguiButton("Reset Post Process", ImVec2_Empty)) { + stage* stg = task_stage_get_current_stage(); + light_param_storage_data_set_stage(stg->index); } data->imgui_focus |= igIsWindowFocused(0); diff --git a/src/CLOUD/classes/graphics/render_settings.c b/src/CLOUD/classes/graphics/render_settings.c index b4710105..34d21982 100644 --- a/src/CLOUD/classes/graphics/render_settings.c +++ b/src/CLOUD/classes/graphics/render_settings.c @@ -16,6 +16,7 @@ extern timer render_timer; extern timer sound_timer; extern timer input_timer; +extern size_t render_scale_table_count; extern double_t render_get_scale(); extern void render_set_scale(double_t value); extern int32_t render_get_scale_index(); @@ -43,11 +44,11 @@ void graphics_render_settings_imgui(class_data* data) { ImGuiStyle* style = igGetStyle(); ImFont* font = igGetFont(); - float_t w = min((float_t)width / 4.0f, 280.0f); + float_t w = 280.0f; #if defined(CLOUD_DEV) - float_t h = min((float_t)height, 196.0f); + float_t h = 196.0f; #else - float_t h = min((float_t)height, 86.0f); + float_t h = 86.0f; #endif igSetNextWindowPos(ImVec2_Empty, ImGuiCond_Appearing, ImVec2_Empty); @@ -73,7 +74,7 @@ void graphics_render_settings_imgui(class_data* data) { int32_t scale_index = render_get_scale_index(); char buf[0x80]; snprintf(buf, sizeof(buf), "%g%%%%", scale); - if (imguiColumnSliderInt("Scale", &scale_index, 0, 7, buf, ImGuiSliderFlags_NoInput, true)) + if (imguiColumnSliderInt("Scale", &scale_index, 0, (int32_t)render_scale_table_count, buf, ImGuiSliderFlags_NoInput, true)) render_set_scale_index(scale_index); #if defined(CLOUD_DEV) diff --git a/src/CLOUD/classes/information.c b/src/CLOUD/classes/information.c index da8422d2..1fdc39a8 100644 --- a/src/CLOUD/classes/information.c +++ b/src/CLOUD/classes/information.c @@ -5,6 +5,7 @@ #include "information.h" #include "information/frame_speed.h" +#include "information/task.h" classes_data information_classes[] = { { @@ -29,4 +30,26 @@ classes_data information_classes[] = { 0, 0, }, + { + "Task##Information", + CLASSES_IN_CONTEXT_MENU, + information_task_init, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + information_task_imgui, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + CLASSES_DATA_NO_FUNC, + information_task_dispose, + { + {}, + (class_flags)(CLASS_DISPOSED | CLASS_HIDDEN), + false, + CLASS_DATA_NO_DATA, + }, + 0, + 0, + }, }; diff --git a/src/CLOUD/classes/information/frame_speed.c b/src/CLOUD/classes/information/frame_speed.c index 2cbe2018..d9ee67a8 100644 --- a/src/CLOUD/classes/information/frame_speed.c +++ b/src/CLOUD/classes/information/frame_speed.c @@ -4,7 +4,6 @@ */ #include "frame_speed.h" -#include "../../../KKdLib/vec.h" #include "../imgui_helper.h" extern int32_t width; @@ -45,11 +44,6 @@ void information_frame_speed_imgui(class_data* data) { return; } - ImGuiColorEditFlags color_edit_flags = 0; - color_edit_flags |= ImGuiColorEditFlags_NoLabel; - color_edit_flags |= ImGuiColorEditFlags_NoSidePreview; - color_edit_flags |= ImGuiColorEditFlags_NoDragDrop; - imguiGetContentRegionAvailSetNextItemWidth(); imguiColumnSliderFloat("frame speed", &frame_speed, 0.01f, 0.0f, 3.0f, "%.2f", 0, true); diff --git a/src/CLOUD/classes/information/task.c b/src/CLOUD/classes/information/task.c new file mode 100644 index 00000000..ddad604a --- /dev/null +++ b/src/CLOUD/classes/information/task.c @@ -0,0 +1,148 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "task.h" +#include "../../../KKdLib/sort.h" +#include "../../../KKdLib/str_utils.h" +#include "../../../CRE/task.h" +#include "../imgui_helper.h" + +extern int32_t width; +extern int32_t height; +extern float_t task; + +static const char* information_task_window_title = "Task##Information"; + +static int32_t task_sort_by_calc(void const* src1, void const* src2); +static int32_t task_sort_by_disp(void const* src1, void const* src2); +static int32_t task_sort_by_name(void const* src1, void const* src2); + +bool information_task_init(class_data* data, render_context* rctx) { + data->data = force_malloc_s(int32_t, 1); + information_task_dispose(data); + return true; +} + +void information_task_imgui(class_data* data) { + int32_t& task_sort = *(int32_t*)data->data; + if (!data->data) + return; + + ImGuiIO* io = igGetIO(); + ImGuiStyle* style = igGetStyle(); + ImFont* font = igGetFont(); + + float_t w = 496.0f; + float_t h = 240.0f; + + igSetNextWindowPos(ImVec2_Empty, ImGuiCond_Appearing, ImVec2_Empty); + igSetNextWindowSize({ w, h }, ImGuiCond_Always); + + ImGuiWindowFlags window_flags = 0; + window_flags |= ImGuiWindowFlags_NoResize; + + data->imgui_focus = false; + bool open = data->flags & CLASS_HIDDEN ? false : true; + bool collapsed = !igBegin(information_task_window_title, &open, window_flags); + if (!open) { + enum_or(data->flags, CLASS_HIDE); + igEnd(); + return; + } + else if (collapsed) { + igEnd(); + return; + } + + std::vector vec; + for (int32_t i = 0; ; i++) { + Task* t = TaskWork::GetTaskByIndex(i); + if (!t) + break; + + vec.push_back(t); + } + + switch (task_sort) { + case 2: + quicksort_custom(vec.data(), vec.size(), sizeof(Task*), task_sort_by_name); + break; + case 3: + quicksort_custom(vec.data(), vec.size(), sizeof(Task*), task_sort_by_calc); + break; + case 4: + quicksort_custom(vec.data(), vec.size(), sizeof(Task*), task_sort_by_disp); + break; + } + + ImVec2 size; + igGetContentRegionAvail(&size); + size.y -= font->FontSize + style->ItemSpacing.y; + igBeginListBox("#Tasks", size); + for (Task*& i : vec) { + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "%-32s % 7d(% 7d) % 7d(% 7d)", + i->GetName(), i->GetCalcTime(), i->GetCalcTimeMax(), i->GetDispTime(), i->GetDispTimeMax()); + igSelectable_Bool((const char*)buf, false, 0, ImVec2_Empty); + } + igEndListBox(); + vec.clear(); + + int32_t task_sort_new = task_sort; + igText("(%c)exec", task_sort == 0 ? '*' : ' '); + if (igIsItemClicked(ImGuiMouseButton_Left)) + task_sort_new = 0; + + igSameLine(0.0f, -1.0f); + + igText("(%c)tree", task_sort == 1 ? '*' : ' '); + if (igIsItemClicked(ImGuiMouseButton_Left)) + task_sort_new = 1; + + igSameLine(0.0f, -1.0f); + + igText("(%c)name", task_sort == 2 ? '*' : ' '); + if (igIsItemClicked(ImGuiMouseButton_Left)) + task_sort_new = 2; + + igSameLine(0.0f, -1.0f); + + igText("(%c)calc", task_sort == 3 ? '*' : ' '); + if (igIsItemClicked(ImGuiMouseButton_Left)) + task_sort_new = 3; + + igSameLine(0.0f, -1.0f); + + igText("(%c)disp", task_sort == 4 ? '*' : ' '); + if (igIsItemClicked(ImGuiMouseButton_Left)) + task_sort_new = 4; + + task_sort = task_sort_new; + + data->imgui_focus |= igIsWindowFocused(0); + igEnd(); +} + +bool information_task_dispose(class_data* data) { + return true; +} + +static int32_t task_sort_by_calc(void const* src1, void const* src2) { + Task* t1 = *(Task**)src1; + Task* t2 = *(Task**)src2; + return t2->calc_time - t1->calc_time; +} + +static int32_t task_sort_by_disp(void const* src1, void const* src2) { + Task* t1 = *(Task**)src1; + Task* t2 = *(Task**)src2; + return t2->disp_time - t1->disp_time; +} + +static int32_t task_sort_by_name(void const* src1, void const* src2) { + Task* t1 = *(Task**)src1; + Task* t2 = *(Task**)src2; + return str_utils_compare(t1->name, t2->name); +} diff --git a/src/CLOUD/classes/information/task.h b/src/CLOUD/classes/information/task.h new file mode 100644 index 00000000..1ff97aac --- /dev/null +++ b/src/CLOUD/classes/information/task.h @@ -0,0 +1,13 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../../KKdLib/default.h" +#include "../../classes.h" + +extern bool information_task_init(class_data* data, render_context* rctx); +extern void information_task_imgui(class_data* data); +extern bool information_task_dispose(class_data* data); diff --git a/src/CLOUD/input.c b/src/CLOUD/input.c index 001860a5..454740b5 100644 --- a/src/CLOUD/input.c +++ b/src/CLOUD/input.c @@ -141,6 +141,13 @@ static void input_poll() { if (input_is_down('D')) input_move.y += speed; + if (input_is_down(VK_SHIFT)) + speed = input_movement_speed * 2.0; + else if (input_is_down(VK_CONTROL)) + speed = input_movement_speed / 2.0; + else + speed = input_movement_speed; + speed *= freq / freq_hist; speed *= 10.0; if (input_is_down(VK_UP)) diff --git a/src/CLOUD/main.c b/src/CLOUD/main.c index 7370da9b..e67a732a 100644 --- a/src/CLOUD/main.c +++ b/src/CLOUD/main.c @@ -132,7 +132,7 @@ static void a3da_to_dft_dsc(const char* a3da_path, int32_t pv_id) { io_free(&s_dsc); stream s_dft; - io_mopen(&s_dft, 0, 0); + io_open(&s_dft); uint32_t off; vector_old_enrs_entry e = vector_old_empty(enrs_entry); enrs_entry ee; @@ -159,7 +159,7 @@ static void a3da_to_dft_dsc(const char* a3da_path, int32_t pv_id) { memset(&st, 0, sizeof(f2_struct)); io_align_write(&s_dft, 0x10); - io_mcopy(&s_dft, &st.data, &st.length); + io_copy(&s_dft, &st.data, &st.length); io_free(&s_dft); st.enrs = e; diff --git a/src/CLOUD/render.c b/src/CLOUD/render.c index 873e1660..1a31fa32 100644 --- a/src/CLOUD/render.c +++ b/src/CLOUD/render.c @@ -33,6 +33,7 @@ #include "../CRE/timer.h" #include "../CRE/post_process.h" #include "../KKdLib/io/path.h" +#include "../KKdLib/database/item_table.h" #include"classes/imgui_helper.h" #include @@ -40,6 +41,9 @@ #define OPENGL_DEBUG 0 #endif +#define CUBE_LINE_SIZE (0.0025f) +#define CUBE_LINE_POINT_SIZE (CUBE_LINE_SIZE * 1.5f) + shader_glsl cube_line_shader; shader_glsl cube_line_point_shader; shader_glsl grid_shader; @@ -52,10 +56,10 @@ size_t grid_vertex_count = ((size_t)(grid_size / grid_spacing) * 2 + 1) * 4; GLuint cube_line_vao; GLuint cube_line_vbo; +GLuint cube_line_point_vao; +GLuint cube_line_point_instance_vbo; GLuint grid_vbo; static GLuint common_data_ubo = 0; -stage stage_stgtst; -stage stage_test_data; #define COMMON_DATA_SIZE (int32_t)(sizeof(vec4) + sizeof(mat4) * 3 + sizeof(vec4)) @@ -64,15 +68,24 @@ bool draw_grid_3d = false; const double_t render_scale_table[] = { 1.0 / 4.0, // 25% + 2.0 / 6.0, // 33.3% 2.0 / 4.0, // 50% + 4.0 / 6.0, // 66.6% 3.0 / 4.0, // 75% + 5.0 / 6.0, // 83.3% 4.0 / 4.0, // 100% + 7.0 / 6.0, // 116.6% 5.0 / 4.0, // 125% + 8.0 / 6.0, // 133.3% 6.0 / 4.0, // 150% + 10.0 / 6.0, // 166.6% 7.0 / 4.0, // 175% + 11.0 / 6.0, // 183.3% 8.0 / 4.0, // 200% }; +size_t render_scale_table_count = sizeof(render_scale_table) / sizeof(double_t); + static float_t old_scale, scale; static vec2i old_internal_2d_res; @@ -96,7 +109,7 @@ static void render_ctrl(render_context* rctx); static void render_draw(render_context* rctx); static void render_dispose(render_context* rctx); -static bool render_load_shaders(void* data, char* path, char* file, uint32_t hash); +static bool render_load_shaders(void* data, const char* path, const char* file, uint32_t hash); static void render_imgui(render_context* rctx); @@ -123,7 +136,6 @@ ImGuiContext* imgui_context; lock imgui_context_lock; bool global_context_menu; extern size_t frame_counter; -wind* wind_ptr; object_database* obj_db_ptr; render_context* rctx_ptr; int32_t stage_index = -1; @@ -160,8 +172,8 @@ int32_t render_main(void* arg) { width = ris->res.x > 0 && ris->res.x < 8192 ? ris->res.x : mode->width; height = ris->res.y > 0 && ris->res.y < 8192 ? ris->res.y : mode->height; - width = (int32_t)(width / 1.5f); - height = (int32_t)(height / 1.5f); + width = (int32_t)(width / 2.0f); + height = (int32_t)(height / 2.0f); glfwWindowHint(GLFW_RED_BITS, mode->redBits); glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits); @@ -228,8 +240,6 @@ int32_t render_main(void* arg) { glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &sv_max_texture_max_anisotropy); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); - lock_init(&pv_lock); - lock_lock(&state_lock); state = RENDER_INITIALIZING; lock_unlock(&state_lock); @@ -290,8 +300,6 @@ int32_t render_main(void* arg) { state = RENDER_DISPOSED; lock_unlock(&state_lock); - lock_free(&pv_lock); - #pragma region GLFW Dispose glfwDestroyWindow(window); glfwTerminate(); @@ -307,41 +315,40 @@ double_t render_get_scale() { void render_set_scale(double_t value) { size_t i; - const size_t c = sizeof(render_scale_table) / sizeof(double_t); - for (i = 0; i < c; i++) + for (i = 0; i < render_scale_table_count; i++) if (value <= render_scale_table[i]) break; - if (i < c) + if (i < render_scale_table_count) value = render_scale_table[i]; + else if (render_scale_table_count - 1 > -1) + value = render_scale_table[render_scale_table_count - 1]; else - value = render_scale_table[c - 1]; + value = 1.0; scale = (float_t)value; } int32_t render_get_scale_index() { size_t i; - const size_t c = sizeof(render_scale_table) / sizeof(double_t); - for (i = 0; i < c; i++) + for (i = 0; i < render_scale_table_count; i++) if (scale <= render_scale_table[i]) break; int32_t index; - if (i < c) + if (i < render_scale_table_count) index = (int32_t)i; else - index = (int32_t)(c - 1); + index = (int32_t)(render_scale_table_count - 1); return index; } void render_set_scale_index(int32_t index) { - const size_t c = sizeof(render_scale_table) / sizeof(double_t); double_t value; if (index < 0) value = render_scale_table[0]; - else if (index < c) + else if (index < render_scale_table_count) value = render_scale_table[index]; else - value = render_scale_table[c - 1]; + value = render_scale_table[render_scale_table_count - 1]; scale = (float_t)value; } @@ -390,15 +397,10 @@ static render_context* render_load() { "} result;\n" "\n" "uniform mat4 vp;\n" - "uniform vec3 trans[4];\n" - "uniform float scale;\n" "uniform vec4 color;\n" "\n" "void main() {\n" - " vec4 pos;\n" - " pos.xyz = trans[gl_VertexID];\n" - " pos.w = 1.0;\n" - " gl_Position = vp * pos;\n" + " gl_Position = vp * a_position;\n" " result.color = color;\n" "}\n"; @@ -416,20 +418,24 @@ static render_context* render_load() { const char* cube_line_point_vert_shader = "#version 430 core\n" - "layout(location = 0) in vec4 a_position;\n" + "layout(location = 0) in vec3 i_trans;\n" "\n" "out VertexData {\n" - " vec4 color;\n" + " vec2 uv;\n" "} result;\n" "\n" "uniform mat4 vp;\n" - "uniform mat4 mat;\n" - "uniform vec4 color;\n" + "uniform vec3 trans[4];\n" "\n" "void main() {\n" - " vec4 pos = mat * a_position;\n" + " vec4 pos;\n" + " pos.xyz = trans[gl_VertexID] + i_trans;\n" + " pos.w = 1.0;\n" " gl_Position = vp * pos;\n" - " result.color = color;\n" + " vec2 uv;\n" + " uv.x = float(gl_VertexID / 2);\n" + " uv.y = float(gl_VertexID % 2);\n" + " result.uv = uv;\n" "}\n"; const char* cube_line_point_frag_shader = @@ -437,11 +443,16 @@ static render_context* render_load() { "layout(location = 0) out vec4 result;\n" "\n" "in VertexData {\n" - " vec4 color;\n" + " vec2 uv;\n" "} frg;\n" "\n" + "uniform float dark_border_end;\n" + "uniform float dark_border_start;\n" + "\n" "void main() {\n" - " result = frg.color;\n" + " float blend = step(dark_border_end, frg.uv.x) * (1.0 - step(dark_border_start, frg.uv.x))" + " * step(dark_border_end, frg.uv.y) * (1.0 - step(dark_border_start, frg.uv.y));\n" + " result = vec4(blend, blend, blend, 1.0);\n" "}\n"; const char* grid_vert_shader = @@ -532,8 +543,9 @@ static render_context* render_load() { render_resize_fb(rctx, true); - rob_chara_array_init(); - rob_chara_pv_data_array_init(); + task_auth_3d_append_task(); + TaskWork::AppendTask(&glt_particle_manager, "GLITTER_TASK", 2); + task_rob_manager_append_task(); data_struct* aft_data = &data_list[DATA_AFT]; auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; @@ -545,18 +557,25 @@ static render_context* render_load() { rctx->data = aft_data; + { + farc chritm_prop; + aft_data->load_file(&chritm_prop, "rom/", "chritm_prop.farc", farc::load_file); + + farc_file* ff = chritm_prop.read_file("mikitm_tbl.txt"); + if (ff && ff->size) { + itm_table itm; + itm.read(ff->data, ff->size); + itm.write("mikitm_tbl.tst"); + } + } + + rob_mot_tbl_init(); + rob_thread_handler_init(); + pv_osage_manager_array_ptr_init(); + light_param_data_storage::load(aft_data); auth_3d_data_load_auth_3d_db(aft_auth_3d_db); - stage_init(&stage_stgtst); - stage_load(&stage_stgtst, aft_data, aft_auth_3d_db, - aft_obj_db, aft_tex_db, aft_stage_data, "STGTST", rctx); - stage_set(&stage_stgtst, rctx); - - stage_init(&stage_test_data); - stage_test_data.set_id = -1; - stage_test_data.stage_set_id = -1; - object_set_info* set_info; object_set_load_db_entry(&set_info, aft_data, aft_obj_db, "MIKITM000"); object_set_load_db_entry(&set_info, aft_data, aft_obj_db, "MIKITM001"); @@ -571,33 +590,44 @@ static render_context* render_load() { motion_set_load_motion(aft_mot_db->get_motion_set_id("PV824"), 0, aft_mot_db); rob_chara_pv_data pv_data; - rob_chara_pv_data_init(&pv_data); - pv_data.field_0 = 2; int32_t chara_id = rob_chara_array_init_chara_index(CHARA_MIKU, &pv_data, 0, false); rob_chara_id_array[0] = chara_id; if (chara_id >= 0 && chara_id < ROB_CHARA_COUNT) { - rob_chara_reset_data(&rob_chara_array[chara_id], &rob_chara_array[chara_id].pv_data, aft_bone_data, aft_mot_db); - rob_chara_reset(&rob_chara_array[chara_id], aft_bone_data, aft_data, aft_obj_db); - rob_chara_load_motion(&rob_chara_array[chara_id], - aft_mot_db->get_motion_id("PV824_STF_P1_00"), 2, aft_bone_data, aft_mot_db); - rob_chara_set_visibility(&rob_chara_array[chara_id], true); - //rob_chara_set_frame(&rob_chara_array[chara_id], 1000.0f); - } + for (int32_t i = 0; i < 120; i++) + TaskWork::Ctrl(); - float_t cube_line_verts[] = { - -1.0, 1.0, - 1.0, 1.0, - -1.0, -1.0, - 1.0, -1.0, - }; + int32_t motion_id = aft_mot_db->get_motion_id("PV824_STF_P1_00"); + rob_chara_set_motion_id(&rob_chara_array[chara_id], motion_id, 0.0f, + motion_storage_get_mot_data_frame_count(motion_id, aft_mot_db), + false, true, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chara_set_visibility(&rob_chara_array[chara_id], true); + rob_chara_set_frame(&rob_chara_array[chara_id], 0.0f); + rob_chara_item_equip* rob_item_equip = rob_chara_array[chara_id].item_equip; + for (int32_t j = rob_item_equip->first_item_equip_object; + j < rob_item_equip->max_item_equip_object; j++) { + rob_chara_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[j]; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + if (i) + i->rob.osage_reset = true; + } + } glGenVertexArrays(1, &cube_line_vao); glGenBuffers(1, &cube_line_vbo); gl_state_bind_vertex_array(cube_line_vao); gl_state_bind_array_buffer(cube_line_vbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(cube_line_verts), (void*)cube_line_verts, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * 4, 0, GL_STREAM_DRAW); glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float_t) * 2, 0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vec3), 0); + gl_state_bind_array_buffer(0); + + glGenVertexArrays(1, &cube_line_point_vao); + glGenBuffers(1, &cube_line_point_instance_vbo); + gl_state_bind_vertex_array(cube_line_point_vao); + gl_state_bind_array_buffer(cube_line_point_instance_vbo); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(std::pair), 0); + glVertexAttribDivisor(0, 1); gl_state_bind_array_buffer(0); gl_state_bind_vertex_array(0); @@ -674,9 +704,6 @@ static render_context* render_load() { shader_env_vert_set_ptr(&shaders_ft, 3, (vec4*)&vec4_identity); shader_env_vert_set_ptr(&shaders_ft, 4, (vec4*)&vec4_null); classes_process_init(classes, classes_count, rctx); - - TaskWork::AppendTask(&task_auth_3d, "AUTH_3D"); - TaskWork::AppendTask(&glt_particle_manager, "GLITTER_TASK", 2); return rctx; } @@ -789,20 +816,22 @@ static void cube_line_draw(shader_glsl* shader, camera* cam, vec3* trans, float_ mat4 mat[2]; mat4_translate(trans[0].x, trans[0].y, trans[0].z, &mat[0]); mat4_translate(trans[1].x, trans[1].y, trans[1].z, &mat[1]); - mat4_mult(&cam->inv_view_rot, &mat[0], &mat[0]); - mat4_mult(&cam->inv_view_rot, &mat[1], &mat[1]); - mat4_get_translation(&mat[0], &trans[0]); - mat4_get_translation(&mat[1], &trans[1]); + mat4_mult(&cam->view, &mat[0], &mat[0]); + mat4_mult(&cam->view, &mat[1], &mat[1]); + + vec3 t[2]; + mat4_get_translation(&mat[0], &t[0]); + mat4_get_translation(&mat[1], &t[1]); + + vec3 d; + vec2_sub(*(vec2*)&t[1], *(vec2*)&t[0], *(vec2*)&d); + vec2_normalize(*(vec2*)&d, *(vec2*)&d); + vec2_mult_scalar(*(vec2*)&d, line_size, *(vec2*)&d); + d.z = 0.0f; - float_t dx = trans[1].x - trans[0].x; - float_t dy = trans[1].y - trans[0].y; vec3 norm[2]; - norm[0] = { -dy, dx, 0.0f }; - norm[1] = { dy, -dx, 0.0f }; - vec3_normalize(norm[0], norm[0]); - vec3_normalize(norm[1], norm[1]); - vec3_mult_scalar(norm[0], line_size, norm[0]); - vec3_mult_scalar(norm[1], line_size, norm[1]); + norm[0] = { -d.y, d.x, 0.0f }; + norm[1] = { d.y, -d.x, 0.0f }; mat4_mult_vec3(&cam->inv_view_rot, &norm[0], &norm[0]); mat4_mult_vec3(&cam->inv_view_rot, &norm[1], &norm[1]); @@ -811,27 +840,21 @@ static void cube_line_draw(shader_glsl* shader, camera* cam, vec3* trans, float_ vec3_add(trans[0], norm[1], vert_trans[1]); vec3_add(trans[1], norm[0], vert_trans[2]); vec3_add(trans[1], norm[1], vert_trans[3]); - shader_glsl_set_vec3_array(shader, "trans", 4, vert_trans); + shader_glsl_set_vec4(shader, "color", *color); + + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vert_trans), vert_trans); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } -static void cube_line_point_draw(shader_glsl* shader, camera* cam, vec3* trans, - float_t size, float_t dark_size, vec4* color, vec4* dark_color) { - mat4 mat; - mat4_scale(dark_size, dark_size, dark_size, &mat); - mat4_set_translation(&mat, trans); - mat4_mult(&cam->inv_view_rot, &mat, &mat); - shader_glsl_set_mat4(&cube_line_point_shader, "mat", false, mat); - shader_glsl_set_vec4(&cube_line_point_shader, "color", *dark_color); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +#include "../KKdLib/sort.h" +#include "../KKdLib/str_utils.h" - mat4_scale(size, size, size, &mat); - mat4_set_translation(&mat, trans); - mat4_mult(&cam->inv_view_rot, &mat, &mat); - shader_glsl_set_mat4(&cube_line_point_shader, "mat", false, mat); - shader_glsl_set_vec4(&cube_line_point_shader, "color", *color); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +static int cube_line_points_sort(void const* src1, void const* src2) { + std::pair* t2 = (std::pair*)src2; + float_t d1 = ((std::pair*)src1)->second; + float_t d2 = ((std::pair*)src2)->second; + return d1 > d2 ? -1 : (d1 < d2 ? 1 : 0); } static void render_draw(render_context* rctx) { @@ -886,40 +909,33 @@ static void render_draw(render_context* rctx) { static bool rob_draw = false; gl_state_disable_cull_face(); - gl_state_bind_vertex_array(cube_line_vao); - const float_t line_size = 0.0025f; - const float_t line_point_size = line_size * 1.125f; - const float_t line_point_dark_size = line_size * 1.5f; vec4 bone_color = { 1.0f, 0.0f, 0.0f, 1.0f }; vec4 cns_color = { 1.0f, 1.0f, 0.0f, 1.0f }; vec4 exp_color = { 0.0f, 1.0f, 0.0f, 1.0f }; vec4 osg_color = { 0.0f, 0.0f, 1.0f, 1.0f }; vec4 osg_node_color = { 1.0f, 0.0f, 1.0f, 1.0f }; - vec4 point_color = { 1.0f, 1.0f, 1.0f, 1.0f }; - vec4 point_dark_color = { 0.0f, 0.0f, 0.0f, 1.0f }; for (int32_t i = 0; i < ROB_CHARA_COUNT && rob_draw; i++) { - if (rob_chara_pv_data_array[i].field_0 == -1) + if (rob_chara_pv_data_array[i].type == ROB_CHARA_TYPE_NONE) continue; + gl_state_bind_vertex_array(cube_line_vao); + gl_state_bind_array_buffer(cube_line_vbo); rob_chara* rob_chr = &rob_chara_array[i]; rob_chara_bone_data* rob_bone_data = rob_chr->bone_data; size_t object_bone_count = rob_bone_data->object_bone_count; size_t total_bone_count = rob_bone_data->total_bone_count; size_t ik_bone_count = rob_bone_data->ik_bone_count; - vector_old_bone_node* nodes = &rob_bone_data->nodes; shader_glsl_use(&cube_line_shader); - for (bone_node* j = nodes->begin; j != nodes->end; j++) { - if (!j->parent) + for (bone_node& j : rob_bone_data->nodes) { + if (!j.parent) continue; vec3 trans[2]; - mat4_get_translation(j->parent->mat, &trans[0]); - mat4_get_translation(j->mat, &trans[1]); + mat4_get_translation(j.parent->mat, &trans[0]); + mat4_get_translation(j.mat, &trans[1]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; - - cube_line_draw(&cube_line_shader, cam, trans, line_size, &bone_color); + if (memcmp(&trans[0], &trans[1], sizeof(vec3))) + cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &bone_color); } rob_chara_item_equip* rob_item_equip = rob_chr->item_equip; @@ -927,156 +943,171 @@ static void render_draw(render_context* rctx) { j < rob_item_equip->max_item_equip_object; j++) { rob_chara_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[j]; - vector_old_ptr_ExExpressionBlock* expression_blocks = &itm_eq_obj->expression_blocks; - for (ExExpressionBlock** k = expression_blocks->begin; k != expression_blocks->end; k++) { - if (!*k) - continue; - - ExExpressionBlock* exp = *k; - - if (!exp->bone_node_ptr || !exp->parent_bone_node) + for (ExExpressionBlock*& k : itm_eq_obj->expression_blocks) { + ExExpressionBlock* exp = k; + if (!exp || !exp->bone_node_ptr || !exp->parent_bone_node) continue; vec3 trans[2]; mat4_get_translation(exp->parent_bone_node->mat, &trans[0]); mat4_get_translation(exp->bone_node_ptr->mat, &trans[1]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; - - cube_line_draw(&cube_line_shader, cam, trans, line_size, &cns_color); + if (memcmp(&trans[0], &trans[1], sizeof(vec3))) + cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &cns_color); } - vector_old_ptr_ExConstraintBlock* constraint_blocks = &itm_eq_obj->constraint_blocks; - for (ExConstraintBlock** k = constraint_blocks->begin; k != constraint_blocks->end; k++) { - if (!*k) - continue; - - ExConstraintBlock* cns = *k; - - if (!cns->bone_node_ptr || !cns->parent_bone_node) + for (ExConstraintBlock*& k : itm_eq_obj->constraint_blocks) { + ExConstraintBlock* cns = k; + if (!cns || !cns->bone_node_ptr || !cns->parent_bone_node) continue; vec3 trans[2]; mat4_get_translation(cns->parent_bone_node->mat, &trans[0]); mat4_get_translation(cns->bone_node_ptr->mat, &trans[1]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; - - cube_line_draw(&cube_line_shader, cam, trans, line_size, &exp_color); + if (memcmp(&trans[0], &trans[1], sizeof(vec3))) + cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &exp_color); } - vector_old_ptr_ExOsageBlock* osage_blocks = &itm_eq_obj->osage_blocks; - for (ExOsageBlock** k = osage_blocks->begin; k != osage_blocks->end; k++) { - if (!*k) - continue; - - ExOsageBlock* osg = *k; - - if (!osg->bone_node_ptr || !osg->parent_bone_node) + for (ExOsageBlock*& k : itm_eq_obj->osage_blocks) { + ExOsageBlock* osg = k; + if (!osg || !osg->bone_node_ptr || !osg->parent_bone_node) continue; vec3 trans[2]; mat4_get_translation(osg->parent_bone_node->mat, &trans[0]); mat4_get_translation(osg->bone_node_ptr->mat, &trans[1]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; + if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) { + mat4_get_translation(osg->parent_bone_node->parent->mat, &trans[0]); + if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) + continue; + } - cube_line_draw(&cube_line_shader, cam, trans, line_size, &osg_color); + cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &osg_color); rob_osage* rob_osg = &osg->rob; - vector_old_rob_osage_node* nodes = &osg->rob.nodes; rob_osage_node* parent_node = &osg->rob.node; - for (rob_osage_node* l = nodes->begin; l != nodes->end; parent_node = l++) { - if (!l->bone_node_ptr || !parent_node->bone_node_ptr) + for (rob_osage_node& l : osg->rob.nodes) { + if (!l.bone_node_ptr || !parent_node->bone_node_ptr) { + parent_node = &l; continue; + } vec3 trans[2]; mat4_get_translation(parent_node->bone_node_ptr->mat, &trans[0]); - mat4_get_translation(l->bone_node_ptr->mat, &trans[1]); + mat4_get_translation(l.bone_node_ptr->mat, &trans[1]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; - - cube_line_draw(&cube_line_shader, cam, trans, line_size, &osg_node_color); + if (memcmp(&trans[0], &trans[1], sizeof(vec3))) + cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &osg_node_color); + else { + mat4_get_translation(parent_node->bone_node_ptr->parent->mat, &trans[0]); + if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) + continue; + cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &osg_node_color); + } + parent_node = &l; } } } + gl_state_bind_array_buffer(0); - shader_glsl_use(&cube_line_point_shader); - for (bone_node* j = nodes->begin; j != nodes->end; j++) { + std::vector> cube_line_points; + for (bone_node& j : rob_bone_data->nodes) { vec3 trans; - mat4_get_translation(j->mat, &trans); - cube_line_point_draw(&cube_line_point_shader, cam, &trans, - line_point_size, line_point_dark_size, &point_color, &point_dark_color); + mat4_get_translation(j.mat, &trans); + cube_line_points.push_back({ trans, 0.0f }); } for (int32_t j = rob_item_equip->first_item_equip_object; j < rob_item_equip->max_item_equip_object; j++) { rob_chara_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[j]; - vector_old_ptr_ExExpressionBlock* expression_blocks = &itm_eq_obj->expression_blocks; - for (ExExpressionBlock** k = expression_blocks->begin; k != expression_blocks->end; k++) { - if (!*k) - continue; - - ExExpressionBlock* exp = *k; - - if (!exp->bone_node_ptr) + for (ExExpressionBlock*& k : itm_eq_obj->expression_blocks) { + ExExpressionBlock* exp = k; + if (!exp || !exp->bone_node_ptr) continue; vec3 trans; mat4_get_translation(exp->bone_node_ptr->mat, &trans); - cube_line_point_draw(&cube_line_point_shader, cam, &trans, - line_point_size, line_point_dark_size, &point_color, &point_dark_color); + cube_line_points.push_back({ trans, 0.0f }); } - vector_old_ptr_ExConstraintBlock* constraint_blocks = &itm_eq_obj->constraint_blocks; - for (ExConstraintBlock** k = constraint_blocks->begin; k != constraint_blocks->end; k++) { - if (!*k) - continue; - - ExConstraintBlock* cns = *k; - - if (!cns->bone_node_ptr) + for (ExConstraintBlock*& k : itm_eq_obj->constraint_blocks) { + ExConstraintBlock* cns = k; + if (!cns || !cns->bone_node_ptr) continue; vec3 trans; mat4_get_translation(cns->bone_node_ptr->mat, &trans); - cube_line_point_draw(&cube_line_point_shader, cam, &trans, - line_point_size, line_point_dark_size, &point_color, &point_dark_color); + cube_line_points.push_back({ trans, 0.0f }); } - vector_old_ptr_ExOsageBlock* osage_blocks = &itm_eq_obj->osage_blocks; - for (ExOsageBlock** k = osage_blocks->begin; k != osage_blocks->end; k++) { - if (!*k) - continue; - - ExOsageBlock* osg = *k; - - if (!osg->bone_node_ptr) + for (ExOsageBlock*& k : itm_eq_obj->osage_blocks) { + ExOsageBlock* osg = k; + if (!osg || !osg->bone_node_ptr) continue; vec3 trans; mat4_get_translation(osg->bone_node_ptr->mat, &trans); - cube_line_point_draw(&cube_line_point_shader, cam, &trans, - line_point_size, line_point_dark_size, &point_color, &point_dark_color); + cube_line_points.push_back({ trans, 0.0f }); rob_osage* rob_osg = &osg->rob; - vector_old_rob_osage_node* nodes = &osg->rob.nodes; - for (rob_osage_node* l = nodes->begin; l != nodes->end; l++) { - if (!l->bone_node_ptr) + rob_osage_node* parent_node = &osg->rob.node; + for (rob_osage_node& l : osg->rob.nodes) { + if (!l.bone_node_ptr) { + parent_node = &l; continue; + } vec3 trans; - mat4_get_translation(l->bone_node_ptr->mat, &trans); - cube_line_point_draw(&cube_line_point_shader, cam, &trans, - line_point_size, line_point_dark_size, &point_color, &point_dark_color); + mat4_get_translation(l.bone_node_ptr->mat, &trans); + cube_line_points.push_back({ trans, 0.0f }); + parent_node = &l; } } } + + for (std::pair& i : cube_line_points) { + vec3 trans; + mat4_mult_vec3(&cam->view_projection, &i.first, &trans); + i.second = trans.z; + } + + quicksort_custom(cube_line_points.data(), cube_line_points.size(), + sizeof(std::pair), cube_line_points_sort); + + gl_state_bind_array_buffer(cube_line_point_instance_vbo); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(sizeof(std::pair) + * cube_line_points.size()), cube_line_points.data(), GL_STREAM_DRAW); + gl_state_bind_array_buffer(0); + + vec3 trans[4]; + trans[0] = { -1.0, 1.0, 0.0 }; + trans[1] = { 1.0, 1.0, 0.0 }; + trans[2] = { -1.0, -1.0, 0.0 }; + trans[3] = { 1.0, -1.0, 0.0 }; + + vec3_mult_scalar(trans[0], CUBE_LINE_POINT_SIZE, trans[0]); + vec3_mult_scalar(trans[1], CUBE_LINE_POINT_SIZE, trans[1]); + vec3_mult_scalar(trans[2], CUBE_LINE_POINT_SIZE, trans[2]); + vec3_mult_scalar(trans[3], CUBE_LINE_POINT_SIZE, trans[3]); + + mat4_mult_vec3(&cam->inv_view_rot, &trans[0], &trans[0]); + mat4_mult_vec3(&cam->inv_view_rot, &trans[1], &trans[1]); + mat4_mult_vec3(&cam->inv_view_rot, &trans[2], &trans[2]); + mat4_mult_vec3(&cam->inv_view_rot, &trans[3], &trans[3]); + + gl_state_bind_vertex_array(cube_line_point_vao); + shader_glsl_use(&cube_line_point_shader); + shader_glsl_set_vec3_array(&cube_line_point_shader, "trans", 4, trans); + shader_glsl_set_float(&cube_line_point_shader, "dark_border_end", + ((CUBE_LINE_POINT_SIZE - (CUBE_LINE_SIZE * 1.125f)) / (2.0f * CUBE_LINE_POINT_SIZE))); + shader_glsl_set_float(&cube_line_point_shader, "dark_border_start", + (1.0f - ((CUBE_LINE_POINT_SIZE - (CUBE_LINE_SIZE * 1.125f)) / (2.0f * CUBE_LINE_POINT_SIZE)))); + glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, (GLsizei)cube_line_points.size()); + cube_line_points.clear(); + cube_line_points.shrink_to_fit(); } gl_state_bind_vertex_array(0); gl_state_enable_cull_face(); @@ -1099,9 +1130,6 @@ static void render_dispose(render_context* rctx) { igDestroyContext(imgui_context); lock_free(&imgui_context_lock); - stage_free(&stage_test_data, rctx); - stage_free(&stage_stgtst, rctx); - data_struct_free(); render_shaders_free(); @@ -1112,10 +1140,14 @@ static void render_dispose(render_context* rctx) { glDeleteBuffers(1, &common_data_ubo); glDeleteBuffers(1, &grid_vbo); + glDeleteBuffers(1, &cube_line_point_instance_vbo); + glDeleteVertexArrays(1, &cube_line_point_vao); glDeleteBuffers(1, &cube_line_vbo); glDeleteVertexArrays(1, &cube_line_vao); - rob_chara_array_free(); + pv_osage_manager_array_ptr_free(); + rob_thread_handler_free(); + rob_mot_tbl_free(); motion_storage_free(); @@ -1124,6 +1156,8 @@ static void render_dispose(render_context* rctx) { render_texture_data_free(); render_context_free(rctx); + file_handler_storage_free_thread(); + object_storage_free(); texture_storage_free(); } @@ -1135,7 +1169,7 @@ static void render_imgui(render_context* rctx) { lock_unlock(&imgui_context_lock); } -static bool render_load_shaders(void* data, char* path, char* file, uint32_t hash) { +static bool render_load_shaders(void* data, const char* path, const char* file, uint32_t hash) { string s; string_init(&s, path); string_add(&s, file); @@ -1252,7 +1286,7 @@ static void render_imgui_context_menu(classes_data* classes, } inline static void render_shaders_load() { - data_struct_load_file(&data_list[DATA_AFT], &shaders_ft, + data_list[DATA_AFT].load_file(&shaders_ft, "rom/", "ft_shaders.farc", render_load_shaders); } diff --git a/src/CLOUD/shared.c b/src/CLOUD/shared.c index 102f733e..5bbd3413 100644 --- a/src/CLOUD/shared.c +++ b/src/CLOUD/shared.c @@ -97,7 +97,7 @@ classes_data classes[] = { CLASS_DATA_NO_DATA, }, information_classes, - 1, + 2, }, #if defined(CLOUD_DEV) { @@ -130,6 +130,5 @@ const size_t classes_count = sizeof(classes) / sizeof(classes_data); render_state state; lock state_lock; -lock_data glitter_data_lock; -lock_data stage_data_lock; -lock pv_lock; +bool stage_control; +lock stage_control_lock; diff --git a/src/CLOUD/shared.h b/src/CLOUD/shared.h index 4099f17f..65d35006 100644 --- a/src/CLOUD/shared.h +++ b/src/CLOUD/shared.h @@ -21,6 +21,3 @@ extern classes_data classes[]; extern const size_t classes_count; extern render_state state; extern lock state_lock; -extern lock_data glitter_data_lock; -extern lock_data stage_data_lock; -extern lock pv_lock; diff --git a/src/CLOUD/x_pv_player.c b/src/CLOUD/x_pv_player.c index 2e21872c..6ad4fb79 100644 --- a/src/CLOUD/x_pv_player.c +++ b/src/CLOUD/x_pv_player.c @@ -5,6 +5,7 @@ Some code is from LearnOpenGL */ +#if defined(CLOUD_DEV) #include "x_pv_player.h" #include "../KKdLib/dsc.h" #include "../KKdLib/farc.h" @@ -40,11 +41,11 @@ void x_pv_player::Load(int32_t pv_id, int32_t stage_id) { sprintf_s(file_buf, sizeof(file_buf), "pv%03d.pvpp", pv_id); pp = new pvpp; - data_struct_load_file(x_data, pp, "rom/pv/", file_buf, pvpp_load_file); + x_data->load_file(pp, "rom/pv/", file_buf, pvpp::load_file); sprintf_s(file_buf, sizeof(file_buf), "stgpv%03d_param.pvsr", stage_id); pvsr_init(&sr); - data_struct_load_file(x_data, &sr, "rom/pv_stage_rsrc/", file_buf, pvsr_load_file); + x_data->load_file(&sr, "rom/pv_stage_rsrc/", file_buf, pvsr_load_file); glt_particle_manager.data = x_data; @@ -64,7 +65,7 @@ void x_pv_player::Load(int32_t pv_id, int32_t stage_id) { farc dsc_common_farc; sprintf_s(path_buf, sizeof(path_buf), "rom/pv_script/pv%03d/", pv_id); sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_common.farc", pv_id); - data_struct_load_file(x_data, &dsc_common_farc, path_buf, file_buf, farc::load_file); + x_data->load_file(&dsc_common_farc, path_buf, file_buf, farc::load_file); sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_scene.dsc", pv_id); farc_file* dsc_scene_ff = dsc_common_farc.read_file(file_buf); @@ -78,7 +79,7 @@ void x_pv_player::Load(int32_t pv_id, int32_t stage_id) { sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_easy.dsc", pv_id); dsc_easy.type = DSC_X; - data_struct_load_file(x_data, &dsc_easy, path_buf, file_buf, dsc_load_file); + x_data->load_file(&dsc_easy, path_buf, file_buf, dsc_load_file); dsc dsc_m; dsc_merge(&dsc_m, 3, &dsc_scene, &dsc_system, &dsc_easy); @@ -87,7 +88,8 @@ void x_pv_player::Load(int32_t pv_id, int32_t stage_id) { dsc_free(&dsc_system); dsc_free(&dsc_easy); - this->frame_data = {}; + this->frame_data.clear(); + this->frame_data.shrink_to_fit(); int32_t end_func_id = dsc_x_get_func_id("END"); int32_t time_func_id = dsc_x_get_func_id("TIME"); @@ -174,3 +176,4 @@ x_pv_player_glitter::x_pv_player_glitter(char* name) { x_pv_player_glitter::~x_pv_player_glitter() { } +#endif diff --git a/src/CLOUD/x_pv_player.h b/src/CLOUD/x_pv_player.h index 26ee5da3..c1dc1242 100644 --- a/src/CLOUD/x_pv_player.h +++ b/src/CLOUD/x_pv_player.h @@ -3,6 +3,7 @@ GitHub/GitLab: korenkonder */ +#if defined(CLOUD_DEV) #pragma once #include @@ -60,3 +61,4 @@ public: void Load(int32_t pv_id, int32_t stage_id); } x_pv_player; +#endif diff --git a/src/CRE/Glitter/effect.c b/src/CRE/Glitter/effect.c index 6d9fd769..df383787 100644 --- a/src/CRE/Glitter/effect.c +++ b/src/CRE/Glitter/effect.c @@ -111,13 +111,12 @@ void glitter_effect_dispose(glitter_effect* e) { } object_info glitter_effect_ext_anim_get_object_info(uint64_t hash) { - vector_old_object_set_info* object_set = &obj_db_ptr->object_set; - for (object_set_info* i = object_set->begin; i != object_set->end; i++) { - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (hash == j->name_hash_murmurhash || hash == j->name_hash_fnv1a64m_upper) - return { j->id, i->id }; + for (object_set_info& i : obj_db_ptr->object_set) { + for (object_info_data& j : i.object) + if (hash == j.name_hash_murmurhash || hash == j.name_hash_fnv1a64m_upper) + return { j.id, i.id }; } - return object_info_null; + return object_info(); } static bool glitter_effect_pack_file(GLT, f2_struct* st, glitter_effect* a2) { diff --git a/src/CRE/Glitter/effect_group.c b/src/CRE/Glitter/effect_group.c index fd65f815..88d6c776 100644 --- a/src/CRE/Glitter/effect_group.c +++ b/src/CRE/Glitter/effect_group.c @@ -29,7 +29,6 @@ resources_count(), resources_tex(), resources(), field_3C(), scene_init(), buffe glitter_effect_group::~glitter_effect_group() { vector_old_ptr_glitter_effect_free(&this->effects, glitter_effect_dispose); glitter_texture_unload(this); - txp_set_free(&resources_tex); #if defined(CRE_DEV) glitter_effect_group_free_model(this); #endif @@ -125,15 +124,14 @@ void glitter_effect_group_load_model(glitter_effect_group* eg, void* ds) { for (uint32_t& i : eg->object_set_ids) { object_database obj_db; texture_database tex_db; - object_database_init(&obj_db); object_set_load_by_hash(ds, &obj_db, &tex_db, i); - object_database_free(&obj_db); } } void glitter_effect_group_free_model(glitter_effect_group* eg) { for (uint32_t& i : eg->object_set_ids) object_storage_delete_object_set(i); - eg->object_set_ids = {}; + eg->object_set_ids.clear(); + eg->object_set_ids.shrink_to_fit(); } #endif diff --git a/src/CRE/Glitter/effect_inst.c b/src/CRE/Glitter/effect_inst.c index bd3144c0..826e6625 100644 --- a/src/CRE/Glitter/effect_inst.c +++ b/src/CRE/Glitter/effect_inst.c @@ -48,7 +48,7 @@ glitter_effect_inst* glitter_effect_inst_init(GPM, GLT, inst_ext_anim->mesh_index = -1; inst_ext_anim->a3da_id = -1; inst_ext_anim->object_is_hrc = false; - inst_ext_anim->object = object_info_null; + inst_ext_anim->object = object_info(); inst_ext_anim->mesh_name = 0; inst_ext_anim->mat = mat4_identity; @@ -421,9 +421,9 @@ static int32_t glitter_effect_inst_get_ext_anim_bone_index( return -1; bone_database* bone_data = (bone_database*)GPM_VAL.bone_data; - vector_old_string* motion_bone_names = 0; - if (!bone_data || vector_old_length(bone_data->skeleton) < 1 - || !bone_database_get_skeleton_motion_bones(bone_data, + std::vector* motion_bone_names = 0; + if (!bone_data || bone_data->skeleton.size() < 1 + || !bone_data->get_skeleton_motion_bones( (char*)bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), &motion_bone_names)) return -1; @@ -449,9 +449,9 @@ static int32_t glitter_effect_inst_get_ext_anim_bone_index( }; char* bone_name = (char*)bone_names[node]; - for (string* i = motion_bone_names->begin; i != motion_bone_names->end; i++) - if (!str_utils_compare(bone_name, string_data(i))) - return (int32_t)(i - motion_bone_names->begin); + for (std::string& i : *motion_bone_names) + if (!str_utils_compare(bone_name, i.c_str())) + return (int32_t)(&i - motion_bone_names->data()); return -1; } diff --git a/src/CRE/Glitter/file_reader.c b/src/CRE/Glitter/file_reader.c index 48af6e5d..1ff4046c 100644 --- a/src/CRE/Glitter/file_reader.c +++ b/src/CRE/Glitter/file_reader.c @@ -55,7 +55,7 @@ glitter_file_reader::~glitter_file_reader() { bool glitter_file_reader::Read(GPM, float_t emission) { ::farc f; char* farc_file_temp = str_utils_add(this->file.c_str(), ".farc"); - bool ret = data_struct_load_file((data_struct*)GPM_VAL->data, + bool ret = ((data_struct*)GPM_VAL->data)->load_file( &f, this->path.c_str(), farc_file_temp, farc::load_file); free(farc_file_temp); @@ -70,7 +70,7 @@ bool glitter_file_reader::Read(GPM, float_t emission) { return false; f2_struct st; - f2_struct_mread(&st, dve_ff->data, dve_ff->size); + f2_struct_read(&st, dve_ff->data, dve_ff->size); if (st.header.signature == reverse_endianness_uint32_t('DVEF')) ret = glitter_diva_effect_parse_file(GPM_VAL, this, &st, emission); else @@ -86,7 +86,7 @@ bool glitter_file_reader::Read(GPM, float_t emission) { if (drs_ff) { f2_struct st; - f2_struct_mread(&st, drs_ff->data, drs_ff->size); + f2_struct_read(&st, drs_ff->data, drs_ff->size); if (st.header.signature == reverse_endianness_uint32_t('DVRS')) glitter_diva_resource_parse_file(GPM_VAL, this->effect_group, &st); f2_struct_free(&st); @@ -98,7 +98,7 @@ bool glitter_file_reader::Read(GPM, float_t emission) { if (lst_ff) { f2_struct st; - f2_struct_mread(&st, lst_ff->data, lst_ff->size); + f2_struct_read(&st, lst_ff->data, lst_ff->size); if (st.header.signature == reverse_endianness_uint32_t('LIST')) glitter_diva_list_parse_file(this->effect_group, &st); f2_struct_free(&st); @@ -127,7 +127,7 @@ bool glitter_file_reader_load_farc(glitter_file_reader* fr, std::string file_temp = fr->file + ".farc"; - if (data_struct_load_file((data_struct*)(GPM_VAL.data), + if (((data_struct*)(GPM_VAL.data))->load_file( fr->farc, path, file_temp.c_str(), farc::load_file)) { fr->hash = hash; fr->load_count = 1; diff --git a/src/CRE/Glitter/glitter.h b/src/CRE/Glitter/glitter.h index 84d462fc..2b3dd261 100644 --- a/src/CRE/Glitter/glitter.h +++ b/src/CRE/Glitter/glitter.h @@ -533,7 +533,7 @@ public: float_t emission; uint32_t resources_count; std::vector resource_hashes; - vector_old_txp resources_tex; + txp_set resources_tex; texture** resources; #if defined(CRE_DEV) || defined(CLOUD_DEV) std::vector object_set_ids; diff --git a/src/CRE/Glitter/particle_manager.c b/src/CRE/Glitter/particle_manager.c index 05a2564a..0a085958 100644 --- a/src/CRE/Glitter/particle_manager.c +++ b/src/CRE/Glitter/particle_manager.c @@ -11,21 +11,12 @@ #include "render_group.h" #include "scene.h" -GltParticleManager::GltParticleManager() { - scenes = {}; - file_readers = {}; - sys_frame_rate = 0; - flags = (glitter_particle_manager_flag)0; - scene_counter = 0; - emission = 1.5; - delta_frame = 2.0; - texture_counter = 0; - scenes = {}; +GltParticleManager::GltParticleManager() :scene(), effect(), emitter(), particle(), rctx(), +data(), bone_data(), sys_frame_rate(), flags(), scene_counter(), emission(1.5f), delta_frame(2.0f), +texture_counter(), random(), counter(), cam_projection(), cam_view(), cam_inv_view(), cam_inv_view_mat3(), +cam_view_point(), cam_rotation_y(), draw_all(true), draw_all_mesh(true), draw_selected() { scenes.reserve(0x100); - file_readers = {}; file_readers.reserve(0x100); - draw_all = true; - draw_all_mesh = true; } GltParticleManager::~GltParticleManager() { @@ -40,10 +31,10 @@ bool GltParticleManager::Init() { bool GltParticleManager::Ctrl() { if (flags & GLITTER_PARTICLE_MANAGER_READ_FILES) { for (glitter_file_reader** i = file_readers.begin()._Ptr; i != file_readers.end()._Ptr;) - if (!*i || (*i)->ReadFarc(this, this->emission)) { + if (!*i || (*i)->ReadFarc(this, emission)) { delete* i; *i = 0; - file_readers.erase(file_readers.begin() + (i - file_readers.begin()._Ptr)); + file_readers.erase(file_readers.begin() + (i - file_readers.data())); } else i++; @@ -52,33 +43,8 @@ bool GltParticleManager::Ctrl() { enum_and(flags, ~GLITTER_PARTICLE_MANAGER_READ_FILES); } - if (flags & GLITTER_PARTICLE_MANAGER_PAUSE) - return false; - - delta_frame = get_delta_frame(); - if (sys_frame_rate) - delta_frame *= sys_frame_rate->frame_speed; - - for (glitter_scene** i = scenes.begin()._Ptr; i != scenes.end()._Ptr;) { - if (!*i || glitter_scene_has_ended(*i, 1)) { - delete* i; - *i = 0; - scenes.erase(scenes.begin() + (i - scenes.begin()._Ptr)); - } -#if defined(CRE_DEV) - else if (~(*i)->flags & GLITTER_SCENE_EDITOR) { - glitter_scene_ctrl(this, *i, delta_frame); - i++; - } - else - i++; -#else - else { - glitter_scene_ctrl(this, *i, delta_frame); - i++; - } -#endif - } + if (~flags & GLITTER_PARTICLE_MANAGER_PAUSE) + CtrlScenes(); return false; } @@ -131,7 +97,7 @@ void GltParticleManager::BasicEffectGroups() { delete* j; *j = 0; - scenes.erase(scenes.begin() + (j - scenes.begin()._Ptr)); + scenes.erase(scenes.begin() + (j - scenes.data())); } i = effect_groups.erase(i); } @@ -155,6 +121,33 @@ bool GltParticleManager::CheckNoFileReaders(uint64_t hash) { return false; } +void GltParticleManager::CtrlScenes() { + delta_frame = get_delta_frame(); + if (sys_frame_rate) + delta_frame *= sys_frame_rate->frame_speed; + + for (glitter_scene** i = scenes.begin()._Ptr; i != scenes.end()._Ptr;) { + if (!*i || glitter_scene_has_ended(*i, 1)) { + delete* i; + *i = 0; + scenes.erase(scenes.begin() + (i - scenes.data())); + } +#if defined(CRE_DEV) + else if (~(*i)->flags & GLITTER_SCENE_EDITOR) { + glitter_scene_ctrl(this, *i, delta_frame); + i++; + } + else + i++; +#else + else { + glitter_scene_ctrl(this, *i, delta_frame); + i++; + } +#endif + } +} + void GltParticleManager::Disp(draw_pass_3d_type draw_pass_type) { if (flags & GLITTER_PARTICLE_MANAGER_NOT_DISP) return; @@ -188,7 +181,7 @@ void GltParticleManager::FreeSceneEffect(glitter_scene_counter scene_counter, ui && (glitter_scene_free_effect(this, *i, scene_counter.index, true), glitter_scene_has_ended(*i, 0))) { delete *i; *i = 0; - scenes.erase(scenes.begin() + (i - scenes.begin()._Ptr)); + scenes.erase(scenes.begin() + (i - scenes.data())); } } } @@ -621,7 +614,7 @@ void GltParticleManager::SetFrame(glitter_effect_group* effect_group, continue; } - scenes.erase(scenes.begin() + (i - scenes.begin()._Ptr)); + scenes.erase(scenes.begin() + (i - scenes.data())); break; } @@ -664,7 +657,7 @@ void GltParticleManager::UnloadEffectGroup(uint64_t hash) { if (!*i || (*i)->hash == hash) { delete* i; *i = 0; - file_readers.erase(file_readers.begin() + (i - file_readers.begin()._Ptr)); + file_readers.erase(file_readers.begin() + (i - file_readers.data())); } else i++; diff --git a/src/CRE/Glitter/scene.c b/src/CRE/Glitter/scene.c index c11fc3b1..9c41140c 100644 --- a/src/CRE/Glitter/scene.c +++ b/src/CRE/Glitter/scene.c @@ -8,7 +8,6 @@ #include "effect_inst.h" glitter_scene::glitter_scene(glitter_scene_counter counter, uint64_t hash, glitter_effect_group* a4, bool a5) : counter(0) { - effects = {}; this->counter = counter; this->hash = hash; flags = GLITTER_SCENE_NONE; @@ -17,6 +16,7 @@ glitter_scene::glitter_scene(glitter_scene_counter counter, uint64_t hash, glitt effect_group = a4; delta_frame_history = 0.0f; skip = false; + effects = {}; if (a4) { vector_old_glitter_scene_effect_reserve(&effects, vector_old_length(a4->effects)); emission = a4->emission; diff --git a/src/CRE/Glitter/texture.c b/src/CRE/Glitter/texture.c index 0c1a62f1..779cb1e8 100644 --- a/src/CRE/Glitter/texture.c +++ b/src/CRE/Glitter/texture.c @@ -87,15 +87,15 @@ bool glitter_texture_hashes_unpack_file(glitter_effect_group* a1, f2_struct* st) } bool glitter_texture_resource_pack_file(glitter_effect_group* a1, f2_struct* st) { - if (vector_old_length(a1->resources_tex) < 1) + if (a1->resources_tex.textures.size() < 1) return false; memset(st, 0, sizeof(f2_struct)); - if (!txp_set_produce_enrs(&a1->resources_tex, &st->enrs)) + if (!a1->resources_tex.produce_enrs(&st->enrs)) return false; - txp_set_pack_file(&a1->resources_tex, &st->data, &st->length, false); + a1->resources_tex.pack_file(&st->data, &st->length, false); st->header.signature = reverse_endianness_uint32_t('TXPC'); st->header.length = 0x20; @@ -108,7 +108,7 @@ bool glitter_texture_resource_unpack_file(GPM, glitter_effect_group* a1, f2_stru if (!st || !st->header.data_size) return false; - txp_set_unpack_file(&a1->resources_tex, st->data, st->header.use_big_endian); + a1->resources_tex.unpack_file(st->data, st->header.use_big_endian); return glitter_texture_load(GPM_VAL, a1); } @@ -116,7 +116,7 @@ bool glitter_texture_load(GPM, glitter_effect_group* a1) { if (!a1->resources_count) return false; - size_t count = vector_old_length(a1->resources_tex); + size_t count = a1->resources_tex.textures.size(); if (count < 1 || a1->resources_count < 1 || a1->resources_count != count) return false; diff --git a/src/CRE/GlitterX/effect_inst_x.c b/src/CRE/GlitterX/effect_inst_x.c index 9ab24879..5c64de98 100644 --- a/src/CRE/GlitterX/effect_inst_x.c +++ b/src/CRE/GlitterX/effect_inst_x.c @@ -306,9 +306,9 @@ static int32_t glitter_x_effect_inst_get_ext_anim_bone_index(GPM, return -1; bone_database* bone_data = (bone_database*)GPM_VAL->bone_data; - vector_old_string* motion_bone_names = 0; - if (!bone_data || vector_old_length(bone_data->skeleton) < 1 - || !bone_database_get_skeleton_motion_bones(bone_data, + std::vector* motion_bone_names = 0; + if (!bone_data || bone_data->skeleton.size() < 1 + || !bone_data->get_skeleton_motion_bones( (char*)bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), &motion_bone_names)) return -1; @@ -334,9 +334,9 @@ static int32_t glitter_x_effect_inst_get_ext_anim_bone_index(GPM, }; char* bone_name = (char*)bone_names[node]; - for (string* i = motion_bone_names->begin; i != motion_bone_names->end; i++) - if (!str_utils_compare(bone_name, string_data(i))) - return (int32_t)(i - motion_bone_names->begin); + for (std::string& i : *motion_bone_names) + if (!str_utils_compare(bone_name, i.c_str())) + return (int32_t)(&i - motion_bone_names->data()); return -1; } diff --git a/src/CRE/auth_3d.c b/src/CRE/auth_3d.c index 59b7b4df..a6944280 100644 --- a/src/CRE/auth_3d.c +++ b/src/CRE/auth_3d.c @@ -10,6 +10,17 @@ #include "draw_task.h" #include "object.h" +namespace auth_3d_detail { + class TaskAuth3d : public Task { + public: + TaskAuth3d(); + virtual ~TaskAuth3d() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual void Disp() override; + }; +} + typedef a3da_ambient auth_3d_ambient_file; typedef a3da_camera_auxiliary auth_3d_camera_auxiliary_file; typedef a3da_camera_root auth_3d_camera_root_file; @@ -140,6 +151,7 @@ static void auth_3d_post_process_restore_prev_value(auth_3d_post_process* pp, re static void auth_3d_post_process_set(auth_3d_post_process* pp, render_context* rctx); static bool auth_3d_data_struct_init(auth_3d_data_struct* auth_3d_data, render_context* rctx); +static bool auth_3d_data_struct_check_category_loaded(auth_3d_data_struct* auth_3d_data, char* category_name); static bool auth_3d_data_struct_ctrl(auth_3d_data_struct* auth_3d_data, render_context* rctx); static void auth_3d_data_struct_disp(auth_3d_data_struct* auth_3d_data, render_context* rctx); static auth_3d_farc* auth_3d_data_struct_get_farc(auth_3d_data_struct* auth_3d_data, const char* category_name); @@ -150,7 +162,7 @@ static void auth_3d_data_struct_unload_category(auth_3d_data_struct* auth_3d_dat static void auth_3d_farc_free_data(auth_3d_farc* a3da_farc); static void auth_3d_farc_load(auth_3d_farc* a3da_farc, char* mdata_dir); static void auth_3d_farc_read_file(auth_3d_farc* a3da_farc, char* mdata_dir); -static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, void* data); +static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, void* data, size_t size); static void auth_3d_farc_unload(auth_3d_farc* a3da_farc); static void auth_3d_uid_file_load(auth_3d_uid_file* uid_file); @@ -159,7 +171,7 @@ static void auth_3d_uid_file_unload(auth_3d_uid_file* uid_file); static void auth_3d_uid_file_unload_file(auth_3d_uid_file* uid_file); auth_3d_data_struct auth_3d_data; -TaskAuth3d task_auth_3d; +auth_3d_detail::TaskAuth3d task_auth_3d; static int16_t auth_3d_load_counter; extern render_context* rctx_ptr; @@ -509,7 +521,7 @@ void auth_3d::load(a3da* auth_file, if (i.parent_node != k.name) continue; - int32_t node_index = (int32_t)(&k - j.node.begin()._Ptr); + int32_t node_index = (int32_t)(&k - j.node.data()); j.childer_object_parent_node.push_back(node_index); j.children_object.push_back(&i); break; @@ -541,7 +553,7 @@ void auth_3d::load(a3da* auth_file, if (i.parent_node != k.name) continue; - int32_t node_index = (int32_t)(&k - j.node.begin()._Ptr); + int32_t node_index = (int32_t)(&k - j.node.data()); j.childer_object_hrc_parent_node.push_back(node_index); j.children_object_hrc.push_back(&i); break; @@ -605,26 +617,43 @@ void auth_3d::reset() { frame_offset = 0.0f; last_frame = 0.0f; paused = true; - ambient = {}; - auth_2d = {}; + ambient.clear(); + ambient.shrink_to_fit(); + auth_2d.clear(); + auth_2d.shrink_to_fit(); camera_auxiliary.reset(); - camera_root = {}; - chara = {}; - curve = {}; + camera_root.clear(); + camera_root.shrink_to_fit(); + chara.clear(); + chara.shrink_to_fit(); + curve.clear(); + curve.shrink_to_fit(); dof.reset(); - event = {}; - fog = {}; - light = {}; - m_object_hrc = {}; - m_object_hrc_list = {}; - material_list = {}; - motion = {}; - object = {}; - object_hrc = {}; - object_hrc_list = {}; - object_list = {}; + event.clear(); + event.shrink_to_fit(); + fog.clear(); + fog.shrink_to_fit(); + light.clear(); + light.shrink_to_fit(); + m_object_hrc.clear(); + m_object_hrc.shrink_to_fit(); + m_object_hrc_list.clear(); + m_object_hrc_list.shrink_to_fit(); + material_list.clear(); + material_list.shrink_to_fit(); + motion.clear(); + motion.shrink_to_fit(); + object.clear(); + object.shrink_to_fit(); + object_hrc.clear(); + object_hrc.shrink_to_fit(); + object_hrc_list.clear(); + object_hrc_list.shrink_to_fit(); + object_list.clear(); + object_list.shrink_to_fit(); play_control.reset(); - point = {}; + point.clear(); + point.shrink_to_fit(); post_process.reset(); } @@ -667,7 +696,8 @@ inline void auth_3d_key::reset() { ep_type_post = (auth_3d_ep_type)0; frame_delta = 0.0f; value_delta = 0.0f; - keys_vec = {}; + keys_vec.clear(); + keys_vec.shrink_to_fit(); length = 0; keys = 0; frame = 0.0f; @@ -738,7 +768,8 @@ auth_3d_ambient::auth_3d_ambient() : flags() { void auth_3d_ambient::reset() { flags = (auth_3d_ambient_flags)0; light_diffuse.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); rim_light_diffuse.reset(); } @@ -817,7 +848,8 @@ auth_3d_chara::auth_3d_chara() { void auth_3d_chara::reset() { model_transform.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); } auth_3d_chara::~auth_3d_chara() { @@ -830,7 +862,8 @@ auth_3d_curve::auth_3d_curve() : value() { void auth_3d_curve::reset() { curve.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); value = 0.0f; } @@ -861,9 +894,12 @@ void auth_3d_event::reset() { clip_begin = 0.0f; clip_end = 0.0f; end = 0.0f; - name = {}; - param_1 = {}; - ref = {}; + name.clear(); + name.shrink_to_fit(); + param_1.clear(); + param_1.shrink_to_fit(); + ref.clear(); + ref.shrink_to_fit(); time_ref_scale = 0.0f; type = (auth_3d_event_type)0; } @@ -924,7 +960,8 @@ void auth_3d_light::reset() { specular.reset(); spot_direction.reset(); tone_curve.reset(); - type = {}; + type.clear(); + type.shrink_to_fit(); cone_angle_value = 0.0f; constant_value = 0.0f; drop_off_value = 0.0f; @@ -956,12 +993,15 @@ auth_3d_m_object_hrc::auth_3d_m_object_hrc() { void auth_3d_m_object_hrc::reset() { for (auth_3d_object_instance& i : instance) i.reset(); - instance = {}; + instance.clear(); + instance.shrink_to_fit(); model_transform.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); for (auth_3d_object_node& i : node) i.reset(); - node = {}; + node.clear(); + node.shrink_to_fit(); } auth_3d_m_object_hrc::~auth_3d_m_object_hrc() { @@ -977,7 +1017,8 @@ void auth_3d_material_list::reset() { blend_color.reset(); glow_intensity.reset(); incandescence.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); glow_intensity_value = 0.0f; } @@ -992,27 +1033,35 @@ auth_3d_object::auth_3d_object() : object_info(), object_hash(), reflect(), refr void auth_3d_object::reset() { for (auth_3d_object*& i : children_object) i = 0; - children_object = {}; + children_object.clear(); + children_object.shrink_to_fit(); for (auth_3d_object_hrc*& i : children_object_hrc) i = 0; - children_object_hrc = {}; + children_object_hrc.clear(); + children_object_hrc.shrink_to_fit(); model_transform.reset(); morph.reset(); - object_info = object_info_null; + object_info = ::object_info(); object_hash = (uint32_t)-1; - name = {}; - parent_name = {}; - parent_node = {}; + name.clear(); + name.shrink_to_fit(); + parent_name.clear(); + parent_name.shrink_to_fit(); + parent_node.clear(); + parent_node.shrink_to_fit(); pattern.reset(); reflect = false; refract = false; for (auth_3d_object_texture_pattern& i : texture_pattern) i.reset(); - texture_pattern = {}; + texture_pattern.clear(); + texture_pattern.shrink_to_fit(); for (auth_3d_object_texture_transform& i : texture_transform) i.reset(); - texture_transform = {}; - uid_name = {}; + texture_transform.clear(); + texture_transform.shrink_to_fit(); + uid_name.clear(); + uid_name.shrink_to_fit(); } auth_3d_object::~auth_3d_object() { @@ -1025,7 +1074,8 @@ auth_3d_object_curve::auth_3d_object_curve() : curve(), frame_offset(), value() void auth_3d_object_curve::reset() { curve = 0; - name = {}; + name.clear(); + name.shrink_to_fit(); frame_offset = 0.0f; value = 0.0f; } @@ -1042,25 +1092,35 @@ object_hash(), reflect(), refract(), shadow() { void auth_3d_object_hrc::reset() { for (auth_3d_object*& i : children_object) i = 0; - children_object = {}; + children_object.clear(); + children_object.shrink_to_fit(); for (auth_3d_object_hrc*& i : children_object_hrc) i = 0; - children_object_hrc = {}; - childer_object_hrc_parent_node = {}; - childer_object_parent_node = {}; - mats = {}; - name = {}; + children_object_hrc.clear(); + children_object_hrc.shrink_to_fit(); + childer_object_hrc_parent_node.clear(); + childer_object_hrc_parent_node.shrink_to_fit(); + childer_object_parent_node.clear(); + childer_object_parent_node .shrink_to_fit(); + mats.clear(); + mats.shrink_to_fit(); + name.clear(); + name.shrink_to_fit(); for (auth_3d_object_node& i : node) i.reset(); - node = {}; - object_info = object_info_null; + node.clear(); + node.shrink_to_fit(); + object_info = ::object_info(); object_hash = (uint32_t)-1; - parent_name = {}; - parent_node = {}; + parent_name.clear(); + parent_name.shrink_to_fit(); + parent_node.clear(); + parent_node.shrink_to_fit(); reflect = false; refract = false; shadow = false; - uid_name = {}; + uid_name.clear(); + uid_name.shrink_to_fit(); } auth_3d_object_hrc::~auth_3d_object_hrc() { @@ -1072,14 +1132,18 @@ auth_3d_object_instance::auth_3d_object_instance() : object_info(), object_hash( } void auth_3d_object_instance::reset() { - mats = {}; + mats.clear(); + mats.shrink_to_fit(); model_transform.reset(); - name = {}; - object_bone_indices = {}; - object_info = object_info_null; + name.clear(); + name.shrink_to_fit(); + object_bone_indices.clear(); + object_bone_indices.shrink_to_fit(); + object_info = ::object_info(); object_hash = (uint32_t)-1; shadow = false; - uid_name = {}; + uid_name.clear(); + uid_name.shrink_to_fit(); } auth_3d_object_instance::~auth_3d_object_instance() { @@ -1127,7 +1191,8 @@ void auth_3d_object_node::reset() { joint_orient_mat = mat4u_identity; mat = 0; model_transform.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); parent = -1; } @@ -1140,7 +1205,8 @@ auth_3d_object_texture_pattern::auth_3d_object_texture_pattern() : texture_id() } void auth_3d_object_texture_pattern::reset() { - name = {}; + name.clear(); + name.shrink_to_fit(); pattern.reset(); texture_id = -1; } @@ -1158,7 +1224,8 @@ void auth_3d_object_texture_transform::reset() { coverage_u.reset(); coverage_v.reset(); mat = mat4u_identity; - name = {}; + name.clear(); + name.shrink_to_fit(); offset_u.reset(); offset_v.reset(); repeat_u.reset(); @@ -1198,7 +1265,8 @@ auth_3d_point::auth_3d_point() { void auth_3d_point::reset() { model_transform.reset(); - name = {}; + name.clear(); + name.shrink_to_fit(); } auth_3d_point::~auth_3d_point() { @@ -1601,6 +1669,10 @@ bool auth_3d_data_check_id_not_empty(int32_t* id) { return false; } +bool auth_3d_data_check_category_loaded(char* category_name) { + return auth_3d_data_struct_check_category_loaded(&auth_3d_data, category_name); +} + auth_3d* auth_3d_data_get_auth_3d(int32_t id) { int32_t index = 0; while (auth_3d_data.data[index].id != id) @@ -1708,14 +1780,14 @@ float_t auth_3d_data_get_play_control_size(int32_t* id) { } void auth_3d_data_load_auth_3d_db(auth_3d_database* auth_3d_db) { - auth_3d_data.farcs = {}; + auth_3d_data.farcs.clear(); auth_3d_data.farcs.resize(auth_3d_db->category.size()); size_t cat_index = 0; for (auth_3d_farc& i : auth_3d_data.farcs) i.name = auth_3d_db->category[cat_index++].name.c_str(); - auth_3d_data.uid_files = {}; + auth_3d_data.uid_files.clear(); auth_3d_data.uid_files.resize(auth_3d_db->uid.size()); size_t uid_index = 0; @@ -1945,6 +2017,10 @@ void auth_3d_data_unload_category(char* category_name) { auth_3d_data_struct_unload_category(&auth_3d_data, category_name); } +void task_auth_3d_append_task() { + TaskWork::AppendTask(&task_auth_3d, "AUTH_3D"); +} + void auth_3d_data_unload_id(int32_t id, render_context* rctx) { if (id < 0 || (id & 0x7FFF) >= AUTH_3D_DATA_COUNT) return; @@ -1959,29 +2035,29 @@ void auth_3d_data_unload_id(int32_t id, render_context* rctx) { continue; auth_3d_data.loaded_ids.erase(auth_3d_data.loaded_ids.begin() - + (&i - auth_3d_data.loaded_ids.begin()._Ptr)); + + (&i - auth_3d_data.loaded_ids.data())); auth->unload(rctx); break; } } -TaskAuth3d::TaskAuth3d() { +auth_3d_detail::TaskAuth3d::TaskAuth3d() { } -TaskAuth3d:: ~TaskAuth3d() { +auth_3d_detail::TaskAuth3d:: ~TaskAuth3d() { } -bool TaskAuth3d::Init() { +bool auth_3d_detail::TaskAuth3d::Init() { return auth_3d_data_struct_init(&auth_3d_data, rctx_ptr); } -bool TaskAuth3d::Ctrl() { +bool auth_3d_detail::TaskAuth3d::Ctrl() { return auth_3d_data_struct_ctrl(&auth_3d_data, rctx_ptr); } -void TaskAuth3d::Disp() { +void auth_3d_detail::TaskAuth3d::Disp() { auth_3d_data_struct_disp(&auth_3d_data, rctx_ptr); } @@ -2313,7 +2389,7 @@ static int32_t auth_3d_get_auth_3d_object_index_by_object_info(auth_3d* auth, for (auth_3d_object& i : auth->object) if (obj_info == i.object_info) { if (obj_instance == instance) - return (int32_t)(&i - auth->object.begin()._Ptr); + return (int32_t)(&i - auth->object.data()); obj_instance++; } return -1; @@ -2325,7 +2401,7 @@ static int32_t auth_3d_get_auth_3d_object_index_by_hash(auth_3d* auth, for (auth_3d_object& i : auth->object) if (object_hash == i.object_hash) { if (obj_instance == instance) - return (int32_t)(&i - auth->object.begin()._Ptr); + return (int32_t)(&i - auth->object.data()); obj_instance++; } return -1; @@ -2343,7 +2419,7 @@ static int32_t auth_3d_get_auth_3d_object_hrc_index_by_object_info(auth_3d* auth for (auth_3d_object_hrc& i : auth->object_hrc) if (obj_info == i.object_info) { if (obj_instance == instance) - return (int32_t)(&i - auth->object_hrc.begin()._Ptr); + return (int32_t)(&i - auth->object_hrc.data()); obj_instance++; } return -1; @@ -2355,7 +2431,7 @@ static int32_t auth_3d_get_auth_3d_object_hrc_index_by_hash(auth_3d* auth, for (auth_3d_object_hrc& i : auth->object_hrc) if (object_hash == i.object_hash) { if (obj_instance == instance) - return (int32_t)(&i - auth->object_hrc.begin()._Ptr); + return (int32_t)(&i - auth->object_hrc.data()); obj_instance++; } return -1; @@ -3134,7 +3210,7 @@ static void auth_3d_object_load(auth_3d* auth, auth_3d_object* o, o->reflect = strstr(o->uid_name.c_str(), "_REFLECT") ? true : false; o->refract = strstr(o->uid_name.c_str(), "_REFRACT") ? true : false; - o->object_info = object_database_get_object_info(obj_db, o->uid_name.c_str()); + o->object_info = obj_db->get_object_info(o->uid_name.c_str()); o->object_hash = hash_string_murmurhash(&o->uid_name, 0, false); } @@ -3239,22 +3315,22 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context morph = fmodf(morph, 1.0f); if (morph > 0.0f && morph < 1.0f) { sprintf_s(buf, sizeof(buf), "%.*s%03d", uid_name_length - 3, uid_name, morph_int + 1); - object_info morph_obj_info = object_database_get_object_info(obj_db, buf); + object_info morph_obj_info = obj_db->get_object_info(buf); if (morph_obj_info.is_null()) morph_obj_info = o->object_info; object_data_set_morph(object_data, morph_obj_info, morph); sprintf_s(buf, sizeof(buf), "%.*s%03d", uid_name_length - 3, uid_name, morph_int); - object_info obj_info = object_database_get_object_info(obj_db, buf); + object_info obj_info = obj_db->get_object_info(buf); draw_task_add_draw_object_by_object_info_opaque(rctx, &mat, obj_info); - object_data_set_morph(object_data, object_info_null, 0.0f); + object_data_set_morph(object_data, object_info(), 0.0f); } else { if (morph >= 1.0f) morph_int++; sprintf_s(buf, sizeof(buf), "%.*s%03d", uid_name_length - 3, uid_name, morph_int); - object_info obj_info = object_database_get_object_info(obj_db, buf); + object_info obj_info = obj_db->get_object_info(buf); if (obj_info.is_null()) obj_info = o->object_info; draw_task_add_draw_object_by_object_info_opaque(rctx, &mat, obj_info); @@ -3268,7 +3344,7 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context pat = (float_t)(int32_t)(pat - 0.5f); sprintf_s(buf, sizeof(buf), "%.*s%03d", uid_name_length - 3, uid_name, (int32_t)pat); - object_info obj_info = object_database_get_object_info(obj_db, buf); + object_info obj_info = obj_db->get_object_info(buf); draw_task_add_draw_object_by_object_info_opaque(rctx, &mat, obj_info); } else @@ -3321,7 +3397,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh, oh->reflect = strstr(oh->uid_name.c_str(), "_REFLECT") ? true : false; oh->refract = strstr(oh->uid_name.c_str(), "_REFRACT") ? true : false; - oh->object_info = object_database_get_object_info(obj_db, oh->uid_name.c_str()); + oh->object_info = obj_db->get_object_info(oh->uid_name.c_str()); oh->object_hash = hash_string_murmurhash(&oh->uid_name, 0, false); object* obj = object_storage_get_object(oh->object_info); @@ -3446,7 +3522,7 @@ static void auth_3d_object_instance_load(auth_3d* auth, auth_3d_object_instance* oi->shadow = oif->shadow; oi->uid_name = oif->uid_name; - oi->object_info = object_database_get_object_info(obj_db, oi->uid_name.c_str()); + oi->object_info = obj_db->get_object_info(oi->uid_name.c_str()); oi->object_hash = hash_string_murmurhash(&oi->uid_name, 0, false); object* obj = object_storage_get_object(oi->object_info); @@ -3466,7 +3542,7 @@ static void auth_3d_object_instance_load(auth_3d* auth, auth_3d_object_instance* if (!str_utils_compare(j.name.c_str(), string_data(&skin->bones[i].name))) { int32_t bone_id = skin->bones[i].id; if (!(bone_id & 0x8000)) - object_bone_indices[bone_id] = (int32_t)(&j - moh->node.begin()._Ptr); + object_bone_indices[bone_id] = (int32_t)(&j - moh->node.data()); break; } } @@ -3892,12 +3968,22 @@ static void auth_3d_post_process_set(auth_3d_post_process* pp, render_context* r } static bool auth_3d_data_struct_init(auth_3d_data_struct* auth_3d_data, render_context* rctx) { - auth_3d_data->loaded_ids = {}; + auth_3d_data->loaded_ids.clear(); + auth_3d_data->loaded_ids.shrink_to_fit(); for (int32_t i = 0; i < AUTH_3D_DATA_COUNT; i++) auth_3d_data->data[i].reset(); return true; } +static bool auth_3d_data_struct_check_category_loaded(auth_3d_data_struct* auth_3d_data, char* category_name) { + if (category_name) { + auth_3d_farc* a3da_farc = auth_3d_data_struct_get_farc(auth_3d_data, category_name); + if (a3da_farc) + return a3da_farc->state == 2; + } + return true; +} + static bool auth_3d_data_struct_ctrl(auth_3d_data_struct* auth_3d_data, render_context* rctx) { for (int32_t& i : auth_3d_data->loaded_ids) if (i >= 0 && (i & 0x7FFF) < AUTH_3D_DATA_COUNT) { @@ -3955,8 +4041,10 @@ static void auth_3d_farc_free_data(auth_3d_farc* a3da_farc) { a3da_farc->file_handler.free_data(); } - a3da_farc->path = {}; - a3da_farc->file = {}; + a3da_farc->path.clear(); + a3da_farc->path.shrink_to_fit(); + a3da_farc->file.clear(); + a3da_farc->file.shrink_to_fit(); a3da_farc->data = 0; a3da_farc->size = 0; a3da_farc->state = 0; @@ -3988,16 +4076,16 @@ static void auth_3d_farc_read_file(auth_3d_farc* a3da_farc, char* mdata_dir) { if (a3da_farc->file_handler.read_file_path((char*)a3da_farc->path.c_str(), (char*)a3da_farc->file.c_str())) a3da_farc->file_handler.set_read_free_func_data(0, - (void(*)(void*, void*))auth_3d_farc_read_func, a3da_farc); + (void(*)(void*, void*, size_t))auth_3d_farc_read_func, a3da_farc); else a3da_farc->state = 2; } -static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, void* data) { +static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, void* data, size_t size) { if (a3da_farc->state == 1) { a3da_farc->state = 2; a3da_farc->data = data; - a3da_farc->size = a3da_farc->file_handler.get_size(); + a3da_farc->size = size; } a3da_farc->farc = new farc; diff --git a/src/CRE/auth_3d.h b/src/CRE/auth_3d.h index 48d8b6f1..129380cf 100644 --- a/src/CRE/auth_3d.h +++ b/src/CRE/auth_3d.h @@ -661,7 +661,6 @@ class auth_3d { public: int32_t uid; int32_t id; - mat4u mat; bool enable; bool camera_root_update; bool visible; @@ -669,6 +668,7 @@ public: bool ended; bool left_right_reverse; bool once; + mat4u mat; float_t alpha; draw_task_flags draw_task_flags; int32_t chara_id; @@ -763,19 +763,10 @@ public: ~auth_3d_data_struct(); }; -class TaskAuth3d : public Task { -public: - TaskAuth3d(); - virtual ~TaskAuth3d() override; - virtual bool Init() override; - virtual bool Ctrl() override; - virtual void Disp() override; -}; - extern auth_3d_data_struct auth_3d_data; -extern TaskAuth3d task_auth_3d; extern bool auth_3d_data_check_id_not_empty(int32_t* id); +extern bool auth_3d_data_check_category_loaded(char* category_name); extern auth_3d* auth_3d_data_get_auth_3d(int32_t id); extern int32_t auth_3d_data_get_chara_id(int32_t id); extern int32_t auth_3d_data_get_auth_3d_id_by_object_info(object_info obj_info, @@ -811,3 +802,5 @@ extern void auth_3d_data_set_shadow(int32_t* id, bool value); extern void auth_3d_data_set_visibility(int32_t* id, bool value); extern void auth_3d_data_unload_category(char* category_name); extern void auth_3d_data_unload_id(int32_t id, render_context* rctx); + +extern void task_auth_3d_append_task(); diff --git a/src/CRE/data.c b/src/CRE/data.c index 1a5678a9..f76ced7d 100644 --- a/src/CRE/data.c +++ b/src/CRE/data.c @@ -9,57 +9,171 @@ #include "../KKdLib/hash.h" #include "../KKdLib/str_utils.h" -data_struct data_list[DATA_MAX]; +data_struct* data_list; static char default_config[] = "#AFT\n\n\n"; static void data_free_inner(data_struct* ds); static void data_load_inner(stream* s); #if defined(CRE_DEV) -static void data_load_glitter_list(data_struct* ds, char* path); +static void data_load_glitter_list(data_struct* ds, const char* path); #endif void data_struct_init() { + data_list = new data_struct[8]; for (int32_t i = DATA_AFT; i < DATA_MAX; i++) data_list[i].type = (data_type)i; } -void data_struct_load(char* path) { +void data_struct_load(const char* path) { stream s; io_open(&s, path, "rb"); if (s.io.stream) data_load_inner(&s); else { io_free(&s); - io_mopen(&s, default_config, 7); + io_open(&s, default_config, 7); data_load_inner(&s); } io_free(&s); } -inline void data_struct_load(const char* path) { - data_struct_load((char*)path); -} - -void data_struct_load(wchar_t* path) { +void data_struct_load(const wchar_t* path) { stream s; - io_wopen(&s, path, L"rb"); + io_open(&s, path, L"rb"); if (s.io.stream) data_load_inner(&s); else { io_free(&s); - io_mopen(&s, default_config, 7); + io_open(&s, default_config, 7); data_load_inner(&s); } io_free(&s); } -inline void data_struct_load(const wchar_t* path) { - data_struct_load((wchar_t*)path); +void data_struct_free() { + if (data_list[DATA_AFT].ready) { + data_struct* ds = &data_list[DATA_AFT]; + data_ft* d = &ds->data_ft; + + stage_database_free(&d->stage_data); + + stage_database_free(&d->base_stage_data); + } +#if defined(CRE_DEV) + if (data_list[DATA_F2BE].ready) { + data_struct* ds = &data_list[DATA_F2BE]; + data_f2* d = &ds->data_f2; + } + + if (data_list[DATA_F2LE].ready) { + data_struct* ds = &data_list[DATA_F2LE]; + data_f2* d = &ds->data_f2; + } + + if (data_list[DATA_FT].ready) { + data_struct* ds = &data_list[DATA_FT]; + data_ft* d = &ds->data_ft; + } + + if (data_list[DATA_M39].ready) { + data_struct* ds = &data_list[DATA_M39]; + data_ft* d = &ds->data_ft; + } + + if (data_list[DATA_VRFL].ready) { + data_struct* ds = &data_list[DATA_VRFL]; + data_x* d = &ds->data_x; + } + + if (data_list[DATA_X].ready) { + data_struct* ds = &data_list[DATA_X]; + data_x* d = &ds->data_x; + } + + if (data_list[DATA_XHD].ready) { + data_struct* ds = &data_list[DATA_XHD]; + data_x* d = &ds->data_x; + } +#endif + + for (int32_t i = DATA_AFT; i < DATA_MAX; i++) + data_free_inner(&data_list[i]); + delete[] data_list; } -void data_struct_get_directory_files(data_struct* ds, char* dir, std::vector* data_files) { - *data_files = {}; +bool data_struct::check_file_exists(const char* dir, const char* file) { + if (path_check_directory_exists(dir)) { + const char* t = strrchr(file, '.'); + size_t t_len; + if (t) + t_len = t - file; + else + t_len = utf8_length(file); + + uint32_t h = hash_murmurhash(file, t_len, 0, false, false); + std::string path = std::string(dir) + file; + if (path_check_file_exists(path.c_str())) + return true; + } + + size_t dir_len = utf8_length(dir); + if (dir_len >= 2 && !memcmp(dir, "./", 2)) { + dir += 2; + dir_len -= 2; + } + + if (dir_len < 3 || memcmp(dir, "rom", 3)) + return false; + + dir += 3; + dir_len -= 3; + + while (*dir == '/' || *dir == '\\') { + dir++; + dir_len--; + } + + size_t max_len = 0; + for (data_struct_path& i : data_paths) + for (data_struct_directory& j : i.data) + if (max_len < j.path.size()) + max_len = j.path.size(); + + char* dir_temp = force_malloc_s(char, dir_len + 1); + memcpy(dir_temp, dir, dir_len + 1); + + char* t = dir_temp; + while (t = strchr(t, '/')) + *t = '\\'; + + char* temp = force_malloc_s(char, max_len + dir_len + 2); + for (data_struct_path& i : data_paths) + for (data_struct_directory& j : i.data) { + const char* path = j.path.c_str(); + size_t path_len = j.path.size(); + + memcpy(temp, path, path_len); + memcpy(&temp[path_len], "\\", 2); + if (dir_len) + memcpy(&temp[path_len + 1], dir_temp, dir_len + 1); + + std::string path_temp = std::string(temp) + file; + if (path_check_file_exists(path_temp.c_str())) { + free(dir_temp); + free(temp); + return true; + } + } + + free(dir_temp); + free(temp); + return false; +} + +void data_struct::get_directory_files(const char* dir, std::vector* data_files) { + data_files->clear(); + data_files->shrink_to_fit(); size_t dir_len = utf8_length(dir); if (dir_len >= 2 && !memcmp(dir, "./", 2)) { @@ -79,7 +193,7 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, std::vectordata_paths) + for (data_struct_path& i : data_paths) for (data_struct_directory& j : i.data) if (max_len < j.path.size()) max_len = j.path.size(); @@ -92,7 +206,7 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, std::vectordata_paths) + for (data_struct_path& i : data_paths) for (data_struct_directory& j : i.data) { const char* path = j.path.c_str(); size_t path_len = j.path.size(); @@ -102,14 +216,12 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, std::vector files; path_get_files(&files, temp); - for (string* k = files.begin; k != files.end; k++) { - char* k_str = string_data(k); - size_t len = k->length; + for (std::string& k : files) { bool found = false; for (data_struct_file& l : *data_files) - if (!memcmp(k_str, l.name.c_str(), min(len, l.name.size()) + 1)) { + if (k == l.name) { found = true; break; } @@ -119,25 +231,19 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, std::vectorlength); - *k = string_empty; + f.name = k; data_files->push_back(f); } - vector_old_string_free(&files, string_free); } free(dir_temp); free(temp); } -inline void data_struct_get_directory_files(data_struct* ds, const char* dir, std::vector* data_files) { - data_struct_get_directory_files(ds, (char*)dir, data_files); -} - -bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)) { +bool data_struct::load_file(void* data, const char* dir, const char* file, + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)) { if (path_check_directory_exists(dir)) { - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); size_t t_len; if (t) t_len = t - file; @@ -168,7 +274,7 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, } size_t max_len = 0; - for (data_struct_path& i : ds->data_paths) + for (data_struct_path& i : data_paths) for (data_struct_directory& j : i.data) if (max_len < j.path.size()) max_len = j.path.size(); @@ -181,7 +287,7 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, *t = '\\'; char* temp = force_malloc_s(char, max_len + dir_len + 2); - for (data_struct_path& i : ds->data_paths) + for (data_struct_path& i : data_paths) for (data_struct_directory& j : i.data) { const char* path = j.path.c_str(); size_t path_len = j.path.size(); @@ -191,25 +297,18 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, if (dir_len) memcpy(&temp[path_len + 1], dir_temp, dir_len + 1); - vector_old_string files = vector_old_empty(string); - path_get_files(&files, temp); - + std::string path_temp = std::string(temp) + file; bool ret = false; - for (string* l = files.begin; l != files.end; l++) { - if (str_utils_compare(string_data(l), file)) - continue; - - char* l_str = string_data(l); - char* t = strrchr(l_str, '.'); - size_t l_len = l->length; + if (path_check_file_exists(path_temp.c_str())) { + const char* l_str = file; + const char* t = strrchr(l_str, '.'); + size_t l_len = utf8_length(file); if (t) l_len = t - l_str; uint32_t h = hash_murmurhash(l_str, l_len, 0, false, false); ret = load_func(data, temp, l_str, h); - break; } - vector_old_string_free(&files, string_free); if (ret) { free(dir_temp); @@ -223,23 +322,8 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, return false; } -inline bool data_struct_load_file(data_struct* c, void* data, char* dir, const char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)) { - return data_struct_load_file(c, data, dir, (char*)file, load_func); -} - -inline bool data_struct_load_file(data_struct* c, void* data, const char* dir, char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)) { - return data_struct_load_file(c, data, (char*)dir, file, load_func); -} - -inline bool data_struct_load_file(data_struct* c, void* data, const char* dir, const char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)) { - return data_struct_load_file(c, data, (char*)dir, (char*)file, load_func); -} - -bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint32_t hash, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)) { +bool data_struct::load_file_by_hash(void* data, const char* dir, uint32_t hash, + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)) { size_t dir_len = utf8_length(dir); if (dir_len >= 2 && !memcmp(dir, "./", 2)) { dir += 2; @@ -258,7 +342,7 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 } size_t max_len = 0; - for (data_struct_path& i : ds->data_paths) + for (data_struct_path& i : data_paths) for (data_struct_directory& j : i.data) if (max_len < j.path.size()) max_len = j.path.size(); @@ -271,7 +355,7 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 *t = '\\'; char* temp = force_malloc_s(char, max_len + dir_len + 2); - for (data_struct_path& i : ds->data_paths) + for (data_struct_path& i : data_paths) for (data_struct_directory& j : i.data) { const char* path = j.path.c_str(); size_t path_len = j.path.size(); @@ -281,31 +365,28 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 if (dir_len) memcpy(&temp[path_len + 1], dir_temp, dir_len + 1); - vector_old_string files = vector_old_empty(string); + std::vector files; path_get_files(&files, temp); - vector_old_uint32_t files_murmurhash = vector_old_empty(uint32_t); - vector_old_uint32_t_reserve(&files_murmurhash, vector_old_length(files)); - for (string* l = files.begin; l != files.end; l++) { - char* t = strrchr(string_data(l), '.'); - size_t t_len = l->length; + std::vector files_murmurhash; + files_murmurhash.reserve(files.size()); + for (std::string& l : files) { + const char* t = strrchr(l.c_str(), '.'); + size_t t_len = l.size(); if (t) - t_len = t - string_data(l); - t = string_data(l); + t_len = t - l.c_str(); + t = l.c_str(); - uint32_t h = hash_murmurhash(t, t_len, 0, false, false); - vector_old_uint32_t_push_back(&files_murmurhash, &h); + files_murmurhash.push_back(hash_murmurhash(t, t_len, 0, false, false)); } bool ret = false; - for (uint32_t* l = files_murmurhash.begin; l != files_murmurhash.end; l++) - if (*l == hash) { - string* file = &files.begin[l - files_murmurhash.begin]; - ret = load_func(data, temp, string_data(file), hash); + for (uint32_t& l : files_murmurhash) + if (l == hash) { + std::string& file = files[&l - files_murmurhash.data()]; + ret = load_func(data, temp, (char*)file.c_str(), hash); break; } - vector_old_string_free(&files, string_free); - vector_old_uint32_t_free(&files_murmurhash, 0); if (ret) { free(dir_temp); @@ -319,70 +400,6 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 return false; } -inline bool data_struct_load_file_by_hash(data_struct* c, void* data, const char* dir, uint32_t hash, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)) { - return data_struct_load_file_by_hash(c, data, (char*)dir, hash, load_func); -} - -void data_struct_free() { - if (data_list[DATA_AFT].ready) { - data_struct* ds = &data_list[DATA_AFT]; - data_ft* d = &ds->data_ft; - - bone_database_free(&d->bone_data); - object_database_free(&d->obj_db); - stage_database_free(&d->stage_data); - - object_database_free(&d->base_obj_db); - stage_database_free(&d->base_stage_data); - } -#if defined(CRE_DEV) - if (data_list[DATA_F2BE].ready) { - data_struct* ds = &data_list[DATA_F2BE]; - data_f2* d = &ds->data_f2; - } - - if (data_list[DATA_F2LE].ready) { - data_struct* ds = &data_list[DATA_F2LE]; - data_f2* d = &ds->data_f2; - } - - if (data_list[DATA_FT].ready) { - data_struct* ds = &data_list[DATA_FT]; - data_ft* d = &ds->data_ft; - } - - if (data_list[DATA_M39].ready) { - data_struct* ds = &data_list[DATA_M39]; - data_ft* d = &ds->data_ft; - } - - if (data_list[DATA_VRFL].ready) { - data_struct* ds = &data_list[DATA_VRFL]; - data_x* d = &ds->data_x; - - bone_database_free(&d->bone_data); - } - - if (data_list[DATA_X].ready) { - data_struct* ds = &data_list[DATA_X]; - data_x* d = &ds->data_x; - - bone_database_free(&d->bone_data); - } - - if (data_list[DATA_XHD].ready) { - data_struct* ds = &data_list[DATA_XHD]; - data_x* d = &ds->data_x; - - bone_database_free(&d->bone_data); - } -#endif - - for (int32_t i = DATA_AFT; i < DATA_MAX; i++) - data_free_inner(&data_list[i]); -} - data_struct::data_struct() : type(), ready() { } @@ -415,51 +432,56 @@ data_struct_path::~data_struct_path() { } -data_f2::data_f2() : bone_data() { +#if defined(CRE_DEV) +data_f2::data_f2() { } data_f2::~data_f2() { - bone_database_free(&bone_data); -} -data_ft::data_ft() : bone_data(), obj_db(), stage_data(), base_obj_db(), base_stage_data() { +} +#endif + +data_ft::data_ft() : obj_db(), stage_data(), base_obj_db(), base_stage_data() { } data_ft::~data_ft() { - bone_database_free(&bone_data); - object_database_free(&obj_db); stage_database_free(&stage_data); - object_database_free(&base_obj_db); stage_database_free(&base_stage_data); } -data_x::data_x() : bone_data() { +#if defined(CRE_DEV) +data_x::data_x() { } data_x::~data_x() { - bone_database_free(&bone_data); + } +#endif static void data_free_inner(data_struct* ds) { - ds->data_paths = {}; + ds->data_paths.clear(); + ds->data_paths.shrink_to_fit(); #if defined(CRE_DEV) - ds->glitter_list_names = {}; + ds->glitter_list_names.clear(); + ds->glitter_list_names.shrink_to_fit(); switch (ds->type) { case DATA_F2LE: case DATA_F2BE: case DATA_VRFL: case DATA_X: case DATA_XHD: - ds->glitter_list_murmurhash = {}; + ds->glitter_list_murmurhash.clear(); + ds->glitter_list_murmurhash.shrink_to_fit(); break; case DATA_AFT: case DATA_FT: case DATA_M39: - ds->glitter_list_fnv1a64m = {}; + ds->glitter_list_fnv1a64m.clear(); + ds->glitter_list_fnv1a64m.shrink_to_fit(); break; } #endif @@ -641,45 +663,43 @@ static void data_load_inner(stream* s) { add_data_rom_path_len--; } - vector_old_string data_directories = vector_old_empty(string); + std::vector data_directories; path_get_directories(&data_directories, add_data_rom_path, &main_rom_path, 1); max_len = 0; - for (string* k = data_directories.begin; k != data_directories.end; k++) { - size_t len = k->length; + for (std::string& k : data_directories) { + size_t len = k.size(); if (max_len < len) max_len = len; } char* data_dir_path_temp = force_malloc_s(char, add_data_rom_path_len + max_len + add_data_rom_len + 3); if (data_dir_path_temp) { - j.data.reserve(vector_old_length(data_directories) + 1); + j.data.reserve(data_directories.size() + 1); memcpy(data_dir_path_temp, add_data_rom_path, add_data_rom_path_len); data_dir_path_temp[add_data_rom_path_len] = '\\'; - for (string* k = data_directories.end - 1; k != data_directories.begin - 1; k--) { - memcpy(&data_dir_path_temp[add_data_rom_path_len + 1], string_data(k), k->length + 1); + for (std::vector::reverse_iterator k = data_directories.rbegin(); + k != data_directories.rend(); k++) { + memcpy(&data_dir_path_temp[add_data_rom_path_len + 1], k->c_str(), k->size() + 1); if (add_data_rom_len) { - data_dir_path_temp[add_data_rom_path_len + 1 + k->length] = '\\'; - memcpy(&data_dir_path_temp[add_data_rom_path_len + 1 + k->length + 1], + data_dir_path_temp[add_data_rom_path_len + 1 + k->size()] = '\\'; + memcpy(&data_dir_path_temp[add_data_rom_path_len + 1 + k->size() + 1], add_data_rom, add_data_rom_len + 1); } data_struct_directory data_dir; data_dir.path = std::string(data_dir_path_temp); - data_dir.name = std::string(string_data(k), k->length); + data_dir.name = *k; j.data.push_back(data_dir); } - vector_old_string_free(&data_directories, 0); } - else { + else j.data.reserve(1); - vector_old_string_free(&data_directories, string_free); - } free(data_dir_path_temp); data_struct_directory data_dir; data_dir.path = std::string(main_rom_path); - data_dir.name = {}; + data_dir.name = std::string(); j.data.push_back(data_dir); free(data_dir_path_temp); } @@ -696,12 +716,12 @@ static void data_load_inner(stream* s) { { auth_3d_database_file* base_auth_3d_db = &d->base_auth_3d_db; - *base_auth_3d_db = {}; - data_struct_load_file(ds, base_auth_3d_db, "rom/auth_3d/", + *base_auth_3d_db = auth_3d_database_file(); + ds->load_file(base_auth_3d_db, "rom/auth_3d/", "auth_3d_db.bin", auth_3d_database_file::load_file); auth_3d_database_file mdata_auth_3d_db; - data_struct_load_file(ds, &mdata_auth_3d_db, "rom/auth_3d/", + ds->load_file(&mdata_auth_3d_db, "rom/auth_3d/", "mdata_auth_3d_db.bin", auth_3d_database_file::load_file); d->auth_3d_db.merge_mdata(base_auth_3d_db, &mdata_auth_3d_db); @@ -709,19 +729,19 @@ static void data_load_inner(stream* s) { { bone_database* bone_data = &d->bone_data; - bone_database_init(bone_data); + *bone_data = bone_database(); bone_data->modern = false; - data_struct_load_file(ds, bone_data, "rom/", - "bone_data.bin", bone_database_load_file); + ds->load_file(bone_data, "rom/", + "bone_data.bin", bone_database::load_file); } { motion_database* base_mot_db = &d->base_mot_db; - data_struct_load_file(ds, base_mot_db, "rom/rob/", + ds->load_file(base_mot_db, "rom/rob/", "mot_db.farc", motion_database::load_file); motion_database mdata_mot_db; - data_struct_load_file(ds, &mdata_mot_db, "rom/rob/", + ds->load_file(&mdata_mot_db, "rom/rob/", "mdata_mot_db.farc", motion_database::load_file); d->mot_db.merge_mdata(base_mot_db, &mdata_mot_db); @@ -729,34 +749,32 @@ static void data_load_inner(stream* s) { { object_database* base_obj_db = &d->base_obj_db; - object_database_init(base_obj_db); + *base_obj_db = object_database(); base_obj_db->modern = false; - data_struct_load_file(ds, base_obj_db, "rom/objset/", - "obj_db.bin", object_database_load_file); + ds->load_file(base_obj_db, "rom/objset/", + "obj_db.bin", object_database::load_file); object_database mdata_obj_db; - object_database_init(&mdata_obj_db); mdata_obj_db.modern = false; - data_struct_load_file(ds, &mdata_obj_db, "rom/objset/", - "mdata_obj_db.bin", object_database_load_file); + ds->load_file(&mdata_obj_db, "rom/objset/", + "mdata_obj_db.bin", object_database::load_file); object_database* obj_db = &d->obj_db; - object_database_init(obj_db); - object_database_merge_mdata(obj_db, base_obj_db, &mdata_obj_db); - object_database_free(&mdata_obj_db); + *obj_db = object_database(); + obj_db->merge_mdata(base_obj_db, &mdata_obj_db); } { stage_database* base_stage_data = &d->base_stage_data; stage_database_init(base_stage_data); base_stage_data->modern = false; - data_struct_load_file(ds, base_stage_data, "rom/", + ds->load_file(base_stage_data, "rom/", "stage_data.bin", stage_database_load_file); stage_database mdata_stage_data; stage_database_init(&mdata_stage_data); mdata_stage_data.modern = false; - data_struct_load_file(ds, &mdata_stage_data, "rom/", + ds->load_file(&mdata_stage_data, "rom/", "mdata_stage_data.bin", stage_database_load_file); stage_database* stage_data = &d->stage_data; @@ -767,14 +785,14 @@ static void data_load_inner(stream* s) { { texture_database* base_tex_db = &d->base_tex_db; - *base_tex_db = {}; + *base_tex_db = texture_database(); base_tex_db->modern = false; - data_struct_load_file(ds, base_tex_db, "rom/objset/", + ds->load_file(base_tex_db, "rom/objset/", "tex_db.bin", texture_database::load_file); texture_database mdata_tex_db; mdata_tex_db.modern = false; - data_struct_load_file(ds, &mdata_tex_db, "rom/objset/", + ds->load_file(&mdata_tex_db, "rom/objset/", "mdata_tex_db.bin", texture_database::load_file); d->tex_db.merge_mdata(base_tex_db, &mdata_tex_db); @@ -804,10 +822,10 @@ static void data_load_inner(stream* s) { { bone_database* bone_data = &d->bone_data; - bone_database_init(bone_data); + *bone_data = bone_database(); bone_data->modern = true; - data_struct_load_file(ds, bone_data, "rom/", - "bone_data.bon", bone_database_load_file); + ds->load_file(bone_data, "rom/", + "bone_data.bon", bone_database::load_file); } } @@ -817,10 +835,10 @@ static void data_load_inner(stream* s) { { bone_database* bone_data = &d->bone_data; - bone_database_init(bone_data); + *bone_data = bone_database(); bone_data->modern = true; - data_struct_load_file(ds, bone_data, "rom/", - "bone_data.bon", bone_database_load_file); + ds->load_file(bone_data, "rom/", + "bone_data.bon", bone_database::load_file); } } @@ -830,17 +848,17 @@ static void data_load_inner(stream* s) { { bone_database* bone_data = &d->bone_data; - bone_database_init(bone_data); + *bone_data = bone_database(); bone_data->modern = true; - data_struct_load_file(ds, bone_data, "rom/", - "bone_data.bon", bone_database_load_file); + ds->load_file(bone_data, "rom/", + "bone_data.bon", bone_database::load_file); } } #endif } #if defined(CRE_DEV) -static void data_load_glitter_list(data_struct* ds, char* path) { +static void data_load_glitter_list(data_struct* ds, const char* path) { stream s; io_open(&s, path, "rb"); size_t length = s.length; diff --git a/src/CRE/data.h b/src/CRE/data.h index c31b16dc..c58a8126 100644 --- a/src/CRE/data.h +++ b/src/CRE/data.h @@ -116,29 +116,20 @@ public: data_struct(); ~data_struct(); + + bool check_file_exists(const char* dir, const char* file); + void get_directory_files(const char* dir, std::vector* data_files); + bool load_file(void* data, const char* dir, const char* file, + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)); + bool load_file_by_hash(void* data, const char* dir, uint32_t hash, + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)); }; -extern data_struct data_list[]; +extern data_struct* data_list; #define DATA_LOAD_FILE_FUNC(f) extern void data_struct_init(); -extern void data_struct_load(char* path); extern void data_struct_load(const char* path); -extern void data_struct_load(wchar_t* path); extern void data_struct_load(const wchar_t* path); -extern void data_struct_get_directory_files(data_struct* c, char* dir, std::vector* data_files); -extern void data_struct_get_directory_files(data_struct* c, const char* dir, std::vector* data_files); -extern bool data_struct_load_file(data_struct* c, void* data, char* dir, char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)); -extern bool data_struct_load_file(data_struct* c, void* data, char* dir, const char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)); -extern bool data_struct_load_file(data_struct* c, void* data, const char* dir, char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)); -extern bool data_struct_load_file(data_struct* c, void* data, const char* dir, const char* file, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)); -extern bool data_struct_load_file_by_hash(data_struct* c, void* data, char* dir, uint32_t hash, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)); -extern bool data_struct_load_file_by_hash(data_struct* c, void* data, const char* dir, uint32_t hash, - bool (*load_func)(void* data, char* path, char* file, uint32_t hash)); extern void data_struct_free(); diff --git a/src/CRE/draw_object.c b/src/CRE/draw_object.c index fdf2ede9..1e52dc53 100644 --- a/src/CRE/draw_object.c +++ b/src/CRE/draw_object.c @@ -11,40 +11,40 @@ #define enable_vertex_attrib_array(index) \ glEnableVertexAttribArray(index); \ -disp->vertex_attrib_array[index] = true +draw->vertex_attrib_array[index] = true static bool draw_object_blend_set(render_context* rctx, - draw_object* disp, object_material_shader_lighting_type lighting_type); + draw_object* draw, object_material_shader_lighting_type lighting_type); static void draw_object_chara_color_fog_set(render_context* rctx, - draw_object* disp, bool disable_fog); + draw_object* draw, bool disable_fog); static void draw_object_material_reset_default(object_material_data* mat_data); static void draw_object_material_reset_reflect(); static void draw_object_material_set_default(render_context* rctx, - draw_object* disp, bool use_shader); + draw_object* draw, bool use_shader); static void draw_object_material_set_parameter(render_context* rctx, object_material_data* mat_data); -static void draw_object_material_set_reflect(render_context* rctx, draw_object* disp); +static void draw_object_material_set_reflect(render_context* rctx, draw_object* draw); static void draw_object_material_set_uniform(render_context* rctx, object_material_data* mat_data, bool disable_color_l); -static void draw_object_vertex_attrib_reset_default(draw_object* disp); -static void draw_object_vertex_attrib_reset_default_compressed(draw_object* disp); -static void draw_object_vertex_attrib_reset_reflect(draw_object* disp); -static void draw_object_vertex_attrib_reset_reflect_compressed(draw_object* disp); -static void draw_object_vertex_attrib_set_default(draw_object* disp); -static void draw_object_vertex_attrib_set_default_compressed(draw_object* disp); -static void draw_object_vertex_attrib_set_reflect(draw_object* disp); -static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* disp); +static void draw_object_vertex_attrib_reset_default(draw_object* draw); +static void draw_object_vertex_attrib_reset_default_compressed(draw_object* draw); +static void draw_object_vertex_attrib_reset_reflect(draw_object* draw); +static void draw_object_vertex_attrib_reset_reflect_compressed(draw_object* draw); +static void draw_object_vertex_attrib_set_default(draw_object* draw); +static void draw_object_vertex_attrib_set_default_compressed(draw_object* draw); +static void draw_object_vertex_attrib_set_reflect(draw_object* draw); +static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* draw); -void draw_object_draw(render_context* rctx, draw_object* disp, mat4* model, - void(*draw_object_func)(render_context* rctx, draw_object* disp), int32_t show_vector_old) { - if (disp->mats) { - mat4u* mats = disp->mats; - if (disp->mat_count == 2) { +void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, + void(*draw_object_func)(render_context* rctx, draw_object* draw), int32_t show_vector_old) { + if (draw->mats) { + mat4u* mats = draw->mats; + if (draw->mat_count == 2) { mat4 mat = *mats;; shader_state_matrix_set_program(&shaders_ft, 7, &mat); } - for (int32_t i = 0; i < disp->mat_count; i++, mats++) { + for (int32_t i = 0; i < draw->mat_count; i++, mats++) { mat4 mat = *mats; mat4_transpose(&mat, &mat); shader_buffer_set_ptr_array(&shaders_ft, (size_t)i * 3, 3, (vec4*)&mat); @@ -58,60 +58,60 @@ void draw_object_draw(render_context* rctx, draw_object* disp, mat4* model, } mat4 mat; - if (disp->mesh->flags & OBJECT_MESH_BILLBOARD) + if (draw->mesh->flags & OBJECT_MESH_BILLBOARD) model_mat_face_camera_view(&rctx->camera->inv_view_rot, model, &mat); - else if (disp->mesh->flags & OBJECT_MESH_BILLBOARD_Y_AXIS) + else if (draw->mesh->flags & OBJECT_MESH_BILLBOARD_Y_AXIS) model_mat_face_camera_position(&rctx->camera->view, model, &mat); else mat = *model; draw_object_model_mat_load(rctx, &mat); if (!show_vector_old) - draw_object_func(rctx, disp); + draw_object_func(rctx, draw); uniform_value[U_BONE_MAT] = 0; } -void draw_object_draw_default(render_context* rctx, draw_object* disp) { - if (disp->set_blend_color) { - vec4 blend_color = disp->blend_color; +void draw_object_draw_default(render_context* rctx, draw_object* draw) { + if (draw->set_blend_color) { + vec4 blend_color = draw->blend_color; shader_env_vert_set_ptr(&shaders_ft, 3, &blend_color); shader_env_vert_set_ptr(&shaders_ft, 4, (vec4*)&vec4_null); } - if (!disp->draw_object_func) - draw_object_vertex_attrib_set_default(disp); + if (!draw->draw_object_func) + draw_object_vertex_attrib_set_default(draw); - draw_object_material_set_default(rctx, disp, rctx->draw_state.shader); - if (!disp->instances_count) + draw_object_material_set_default(rctx, draw, rctx->draw_state.shader); + if (!draw->instances_count) object_sub_mesh_draw(rctx, - disp->sub_mesh->primitive_type, - disp->sub_mesh->indices_count, - disp->sub_mesh->first_index, - disp->sub_mesh->last_index, - disp->sub_mesh->index_format, - disp->sub_mesh->indices_offset); + draw->sub_mesh->primitive_type, + draw->sub_mesh->indices_count, + draw->sub_mesh->first_index, + draw->sub_mesh->last_index, + draw->sub_mesh->index_format, + draw->sub_mesh->indices_offset); else - for (int32_t i = 0; i < disp->instances_count; i++) { + for (int32_t i = 0; i < draw->instances_count; i++) { mat4 mat; - mat4_transpose(&disp->instances_mat[i], &mat); + mat4_transpose(&draw->instances_mat[i], &mat); glVertexAttrib4fv(12, (const GLfloat*)&mat.row0); glVertexAttrib4fv(13, (const GLfloat*)&mat.row1); glVertexAttrib4fv(14, (const GLfloat*)&mat.row2); glVertexAttrib4fv(15, (const GLfloat*)&mat.row3); object_sub_mesh_draw(rctx, - disp->sub_mesh->primitive_type, - disp->sub_mesh->indices_count, - disp->sub_mesh->first_index, - disp->sub_mesh->last_index, - disp->sub_mesh->index_format, - disp->sub_mesh->indices_offset); + draw->sub_mesh->primitive_type, + draw->sub_mesh->indices_count, + draw->sub_mesh->first_index, + draw->sub_mesh->last_index, + draw->sub_mesh->index_format, + draw->sub_mesh->indices_offset); } - draw_object_material_reset_default(disp->material); - if (!disp->draw_object_func) - draw_object_vertex_attrib_reset_default(disp); + draw_object_material_reset_default(draw->material); + if (!draw->draw_object_func) + draw_object_vertex_attrib_reset_default(draw); - if (disp->set_blend_color) { + if (draw->set_blend_color) { shader_env_vert_set_ptr(&shaders_ft, 3, (vec4*)&vec4_identity); shader_env_vert_set_ptr(&shaders_ft, 4, (vec4*)&vec4_null); } @@ -119,16 +119,16 @@ void draw_object_draw_default(render_context* rctx, draw_object* disp) { rctx->draw_state.stats.object_draw_count++; } -void draw_object_draw_sss(render_context* rctx, draw_object* disp) { - object_material_blend_flags blend_flags = disp->material->material.blend_flags; - uniform_value[U_ALPHA_TEST] = (!blend_flags.flag_28 && (disp->blend_color.w < 1.0f +void draw_object_draw_sss(render_context* rctx, draw_object* draw) { + object_material_blend_flags blend_flags = draw->material->material.blend_flags; + uniform_value[U_ALPHA_TEST] = (!blend_flags.flag_28 && (draw->blend_color.w < 1.0f || (blend_flags.alpha_texture || blend_flags.alpha_material) && !blend_flags.punch_through - || disp->sub_mesh->flags & OBJECT_SUB_MESH_TRANSPARENT) + || draw->sub_mesh->flags & OBJECT_SUB_MESH_TRANSPARENT) || blend_flags.punch_through) ? 1 : 0; uniform_value[U26] = 1; bool aniso = false; - object_material_data* material = disp->material; + object_material_data* material = draw->material; switch (material->material.shader_index) { case SHADER_FT_CLOTH: if (!rctx->draw_pass.npr_param && material->material.ambient.w < 1.0f @@ -157,19 +157,19 @@ void draw_object_draw_sss(render_context* rctx, draw_object* disp) { shader_env_frag_set(&shaders_ft, 25, sss_param.x, sss_param.y, sss_param.z, 0.5f); uniform_value[U37] = 0; } - draw_object_draw_default(rctx, disp); + draw_object_draw_default(rctx, draw); } -void draw_object_draw_reflect(render_context* rctx, draw_object* disp) { - object_material_data* material = disp->material; - draw_object_vertex_attrib_set_reflect(disp); +void draw_object_draw_reflect(render_context* rctx, draw_object* draw) { + object_material_data* material = draw->material; + draw_object_vertex_attrib_set_reflect(draw); object_material_shader_lighting_type lighting_type = object_material_shader_get_lighting_type(&material->material.shader_flags); - bool disable_fog = draw_object_blend_set(rctx, disp, lighting_type); - draw_object_chara_color_fog_set(rctx, disp, disable_fog); - draw_object_material_set_reflect(rctx, disp); + bool disable_fog = draw_object_blend_set(rctx, draw, lighting_type); + draw_object_chara_color_fog_set(rctx, draw, disable_fog); + draw_object_material_set_reflect(rctx, draw); - object_sub_mesh* sub_mesh = disp->sub_mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; if (sub_mesh->index_format != OBJECT_INDEX_U8) object_sub_mesh_draw(rctx, sub_mesh->primitive_type, @@ -180,17 +180,17 @@ void draw_object_draw_reflect(render_context* rctx, draw_object* disp) { sub_mesh->indices_offset); draw_object_material_reset_reflect(); - draw_object_vertex_attrib_reset_reflect(disp); + draw_object_vertex_attrib_reset_reflect(draw); uniform_value_reset(); rctx->draw_state.stats.object_reflect_draw_count++; } -void draw_object_draw_reflect_reflect_map(render_context* rctx, draw_object* disp) { - draw_object_vertex_attrib_set_reflect(disp); - draw_object_material_set_reflect(rctx, disp); +void draw_object_draw_reflect_reflect_map(render_context* rctx, draw_object* draw) { + draw_object_vertex_attrib_set_reflect(draw); + draw_object_material_set_reflect(rctx, draw); - object_sub_mesh* sub_mesh = disp->sub_mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; if (sub_mesh->index_format != OBJECT_INDEX_U8) object_sub_mesh_draw(rctx, sub_mesh->primitive_type, @@ -201,29 +201,29 @@ void draw_object_draw_reflect_reflect_map(render_context* rctx, draw_object* dis sub_mesh->indices_offset); draw_object_material_reset_reflect(); - draw_object_vertex_attrib_reset_reflect(disp); + draw_object_vertex_attrib_reset_reflect(draw); rctx->draw_state.stats.object_reflect_draw_count++; } -void draw_object_draw_shadow(render_context* rctx, draw_object* disp) { - object_material_blend_flags blend_flags = disp->material->material.blend_flags; - if (!blend_flags.flag_28 && (disp->blend_color.w < 1.0f +void draw_object_draw_shadow(render_context* rctx, draw_object* draw) { + object_material_blend_flags blend_flags = draw->material->material.blend_flags; + if (!blend_flags.flag_28 && (draw->blend_color.w < 1.0f || (blend_flags.alpha_texture || blend_flags.alpha_material) && !blend_flags.punch_through - || disp->sub_mesh->flags & OBJECT_SUB_MESH_TRANSPARENT) + || draw->sub_mesh->flags & OBJECT_SUB_MESH_TRANSPARENT) || blend_flags.punch_through) { uniform_value[U_ALPHA_TEST] = 1; - draw_object_draw_translucent(rctx, disp); + draw_object_draw_translucent(rctx, draw); } else { uniform_value[U_ALPHA_TEST] = 0; - draw_object_draw_translucent(rctx, disp); + draw_object_draw_translucent(rctx, draw); } } -void draw_object_draw_translucent(render_context* rctx, draw_object* disp) { - object_material_data* material = disp->material; - GLuint* textures = disp->textures; +void draw_object_draw_translucent(render_context* rctx, draw_object* draw) { + object_material_data* material = draw->material; + GLuint* textures = draw->textures; if (rctx->draw_state.shader_index != -1) { vec4 emission = material->material.emission; shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); @@ -233,8 +233,8 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* disp) { shader_set(&shaders_ft, rctx->draw_state.shader_index); } - draw_object_vertex_attrib_set_default(disp); - if (disp->material->material.blend_flags.double_sided) + draw_object_vertex_attrib_set_default(draw); + if (draw->material->material.blend_flags.double_sided) gl_state_disable_cull_face(); GLuint tex_id = -1; @@ -265,9 +265,9 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* disp) { } if (texture_id != -1) { - for (int32_t j = 0; j < disp->texture_pattern_count; j++) - if (disp->texture_pattern_array[j].src == texture_id) { - texture* tex = texture_storage_get_texture(disp->texture_pattern_array[j].dst); + for (int32_t j = 0; j < draw->texture_pattern_count; j++) + if (draw->texture_pattern_array[j].src == texture_id) { + texture* tex = texture_storage_get_texture(draw->texture_pattern_array[j].dst); if (tex) tex_id = tex->texture; break; @@ -283,7 +283,7 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* disp) { } } - object_sub_mesh* sub_mesh = disp->sub_mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; if (sub_mesh->index_format != OBJECT_INDEX_U8) object_sub_mesh_draw(rctx, sub_mesh->primitive_type, @@ -297,7 +297,7 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* disp) { gl_state_active_bind_texture_2d(tex_index, 0); gl_state_enable_cull_face(); - draw_object_vertex_attrib_reset_default(disp); + draw_object_vertex_attrib_reset_default(draw); if (rctx->draw_state.shader_index != -1) uniform_value_reset(); @@ -381,7 +381,8 @@ void object_sub_mesh_draw(render_context* rctx, object_primitive_type primitive_ rctx->draw_state.stats.draw_triangle_count += count - 2; } -static bool draw_object_blend_set(render_context* rctx, draw_object* disp, object_material_shader_lighting_type lighting_type) { +static bool draw_object_blend_set(render_context* rctx, + draw_object* draw, object_material_shader_lighting_type lighting_type) { GLenum blend_factor_table[] = { GL_ZERO, GL_ONE, @@ -401,14 +402,14 @@ static bool draw_object_blend_set(render_context* rctx, draw_object* disp, objec GL_ZERO, }; - object_material_data* material = disp->material; + object_material_data* material = draw->material; object_material_blend_flags blend_flags = material->material.blend_flags; if ((!blend_flags.alpha_texture && !blend_flags.alpha_material) || blend_flags.punch_through) return false; GLenum src_blend_factor = blend_factor_table[blend_flags.src_blend_factor & 0xF]; GLenum dst_blend_factor = blend_factor_table[blend_flags.dst_blend_factor & 0xF]; - if (disp->chara_color) { + if (draw->chara_color) { light_set* set = &rctx->light_set_data[LIGHT_SET_MAIN]; light_data* chara_color = &set->lights[LIGHT_CHARA_COLOR]; vec4 specular; @@ -443,9 +444,9 @@ static bool draw_object_blend_set(render_context* rctx, draw_object* disp, objec return dst_blend_factor == GL_ONE; } -static void draw_object_chara_color_fog_set(render_context* rctx, draw_object* disp, bool disable_fog) { +static void draw_object_chara_color_fog_set(render_context* rctx, draw_object* draw, bool disable_fog) { uniform_value[U_CHARA_COLOR] = 0; - if (disp->chara_color) { + if (draw->chara_color) { light_set* set = &rctx->light_set_data[LIGHT_SET_MAIN]; light_data* chara_color = &set->lights[LIGHT_CHARA_COLOR]; vec4 specular; @@ -454,7 +455,7 @@ static void draw_object_chara_color_fog_set(render_context* rctx, draw_object* d uniform_value[U_CHARA_COLOR] = 1; } - object_material_blend_flags blend_flags = disp->material->material.blend_flags; + object_material_blend_flags blend_flags = draw->material->material.blend_flags; if (!blend_flags.no_fog && !disable_fog) { if (blend_flags.has_fog_height) uniform_value[U_FOG_HEIGHT] = 2 + blend_flags.fog_height; @@ -480,33 +481,33 @@ static void draw_object_material_reset_reflect() { uniform_value_reset(); } -static void draw_object_material_set_default(render_context* rctx, draw_object* disp, bool use_shader) { - GLuint* textures = disp->textures; - object_material_data* material = disp->material; +static void draw_object_material_set_default(render_context* rctx, draw_object* draw, bool use_shader) { + GLuint* textures = draw->textures; + object_material_data* material = draw->material; object_material_shader_lighting_type lighting_type = object_material_shader_get_lighting_type(&material->material.shader_flags); - bool disable_fog = draw_object_blend_set(rctx, disp, lighting_type); + bool disable_fog = draw_object_blend_set(rctx, draw, lighting_type); draw_object_material_set_uniform(rctx, material, false); if (!rctx->draw_state.light) uniform_value[U_LIGHT_0] = 0; - else if (disp->self_shadow) - uniform_value[U_LIGHT_0] = disp->self_shadow ? 1 : 1; + else if (draw->self_shadow) + uniform_value[U_LIGHT_0] = draw->self_shadow ? 1 : 1; else - uniform_value[U_LIGHT_0] = disp->sub_mesh->flags & OBJECT_SUB_MESH_RECIEVE_SHADOW ? 1 : 0; + uniform_value[U_LIGHT_0] = draw->sub_mesh->flags & OBJECT_SUB_MESH_RECIEVE_SHADOW ? 1 : 0; uniform_value[U_SHADOW] = 0; uniform_value[U_SELF_SHADOW] = rctx->draw_state.self_shadow ? 1 : 0; object_material_texture* mat_tex = material->material.textures; - uniform_value[U_SHADOW] = disp->shadow > SHADOW_CHARA; + uniform_value[U_SHADOW] = draw->shadow > SHADOW_CHARA; for (int32_t i = 0, j = 0; i < 8; i++, mat_tex++) { if (mat_tex->texture_id == -1) continue; GLuint tex_id = -1; uint32_t texture_id = mat_tex->texture_id; - for (int32_t j = 0; j < disp->texture_pattern_count; j++) - if (disp->texture_pattern_array[j].src == texture_id) { - texture* tex = texture_storage_get_texture(disp->texture_pattern_array[j].dst); + for (int32_t j = 0; j < draw->texture_pattern_count; j++) + if (draw->texture_pattern_array[j].src == texture_id) { + texture* tex = texture_storage_get_texture(draw->texture_pattern_array[j].dst); if (tex) tex_id = tex->texture; break; @@ -603,7 +604,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* vec4 diffuse = material->material.diffuse; vec4 emission = material->material.emission; - draw_object_chara_color_fog_set(rctx, disp, disable_fog); + draw_object_chara_color_fog_set(rctx, draw, disable_fog); shader_state_material_set_ambient_ptr(&shaders_ft, false, &ambient); shader_state_material_set_diffuse_ptr(&shaders_ft, false, &diffuse); shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); @@ -616,7 +617,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* float_t luma; vec3 luma_coeff = { 0.30f, 0.59f, 0.11f }; vec3_dot(*(vec3*)&specular, luma_coeff, luma); - if (luma >= 0.0099999998f || disp->texture_color_coeff.w >= 0.1f) + if (luma >= 0.0099999998f || draw->texture_color_coeff.w >= 0.1f) uniform_value[U_SPECULAR_IBL] = 1; else uniform_value[U_SPECULAR_IBL] = 0; @@ -672,10 +673,10 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* switch (material->material.shader_index) { case SHADER_FT_SKIN: { - vec4 texture_color_coeff = disp->texture_color_coeff; - vec4 texture_color_offset = disp->texture_color_offset; - vec4 texture_specular_coeff = disp->texture_specular_coeff; - vec4 texture_specular_offset = disp->texture_specular_offset; + vec4 texture_color_coeff = draw->texture_color_coeff; + vec4 texture_color_offset = draw->texture_color_offset; + vec4 texture_specular_coeff = draw->texture_specular_coeff; + vec4 texture_specular_offset = draw->texture_specular_offset; texture_color_coeff.w *= 0.015f; texture_specular_coeff.w *= 0.015f; @@ -688,8 +689,8 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* case SHADER_FT_HAIR: case SHADER_FT_CLOTH: case SHADER_FT_TIGHTS: - shader_local_frag_set(&shaders_ft, 5, 1.0f - disp->texture_color_coeff.w * 0.4f, - 0.0f, 0.0f, disp->texture_color_coeff.w * 0.02f); + shader_local_frag_set(&shaders_ft, 5, 1.0f - draw->texture_color_coeff.w * 0.4f, + 0.0f, 0.0f, draw->texture_color_coeff.w * 0.02f); break; } } @@ -737,9 +738,9 @@ static void draw_object_material_set_parameter(render_context* rctx, object_mate shader_env_vert_set_ptr(&shaders_ft, 18, &specular); } -static void draw_object_material_set_reflect(render_context* rctx, draw_object* disp) { - object_material_data* material = disp->material; - GLuint* textures = disp->textures; +static void draw_object_material_set_reflect(render_context* rctx, draw_object* draw) { + object_material_data* material = draw->material; + GLuint* textures = draw->textures; if (material->material.blend_flags.double_sided) gl_state_disable_cull_face(); @@ -750,9 +751,9 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* break; GLuint tex_id = -1; - for (int32_t j = 0; j < disp->texture_pattern_count; j++) - if (disp->texture_pattern_array[j].src == texture_id) { - texture* tex = texture_storage_get_texture(disp->texture_pattern_array[j].dst); + for (int32_t j = 0; j < draw->texture_pattern_count; j++) + if (draw->texture_pattern_array[j].src == texture_id) { + texture* tex = texture_storage_get_texture(draw->texture_pattern_array[j].dst); if (tex) tex_id = tex->texture; break; @@ -807,7 +808,7 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* shader_state_material_set_diffuse_ptr(&shaders_ft, false, &diffuse); shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); shader_state_material_set_specular_ptr(&shaders_ft, false, &specular); - draw_object_material_set_parameter(rctx, disp->material); + draw_object_material_set_parameter(rctx, draw->material); } static void draw_object_material_set_uniform(render_context* rctx, object_material_data* mat_data, bool disable_color_l) { @@ -863,25 +864,25 @@ static void draw_object_material_set_uniform(render_context* rctx, object_materi uniform_value[U45] = 1; } -static void draw_object_vertex_attrib_reset_default(draw_object* disp) { - object_mesh* mesh = disp->mesh; +static void draw_object_vertex_attrib_reset_default(draw_object* draw) { + object_mesh* mesh = draw->mesh; object_vertex_flags vertex_flags = mesh->vertex_flags; if (mesh->compressed) { - draw_object_vertex_attrib_reset_default_compressed(disp); + draw_object_vertex_attrib_reset_default_compressed(draw); return; } for (int32_t i = 0; i < 16; i++) { - if (disp->vertex_attrib_array[i]) + if (draw->vertex_attrib_array[i]) glDisableVertexAttribArray(i); - disp->vertex_attrib_array[i] = false; + draw->vertex_attrib_array[i] = false; } if (vertex_flags & OBJECT_VERTEX_BONE_DATA) uniform_value[U_BONE_MAT] = 0; - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 0; uniform_value[U_MORPH_COLOR] = 0; } @@ -893,20 +894,20 @@ static void draw_object_vertex_attrib_reset_default(draw_object* disp) { gl_state_active_texture(0); } -static void draw_object_vertex_attrib_reset_default_compressed(draw_object* disp) { - object_mesh* mesh = disp->mesh; +static void draw_object_vertex_attrib_reset_default_compressed(draw_object* draw) { + object_mesh* mesh = draw->mesh; object_vertex_flags vertex_flags = mesh->vertex_flags; for (int32_t i = 0; i < 16; i++) { - if (disp->vertex_attrib_array[i]) + if (draw->vertex_attrib_array[i]) glDisableVertexAttribArray(i); - disp->vertex_attrib_array[i] = false; + draw->vertex_attrib_array[i] = false; } if (vertex_flags & OBJECT_VERTEX_BONE_DATA) uniform_value[U_BONE_MAT] = 0; - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 0; uniform_value[U_MORPH_COLOR] = 0; } @@ -918,25 +919,25 @@ static void draw_object_vertex_attrib_reset_default_compressed(draw_object* disp gl_state_active_texture(0); } -static void draw_object_vertex_attrib_reset_reflect(draw_object* disp) { - object_mesh* mesh = disp->mesh; +static void draw_object_vertex_attrib_reset_reflect(draw_object* draw) { + object_mesh* mesh = draw->mesh; object_vertex_flags vertex_flags = mesh->vertex_flags; if (mesh->compressed) { - draw_object_vertex_attrib_reset_reflect_compressed(disp); + draw_object_vertex_attrib_reset_reflect_compressed(draw); return; } for (int32_t i = 0; i < 16; i++) { - if (disp->vertex_attrib_array[i]) + if (draw->vertex_attrib_array[i]) glDisableVertexAttribArray(i); - disp->vertex_attrib_array[i] = false; + draw->vertex_attrib_array[i] = false; } if (vertex_flags & OBJECT_VERTEX_BONE_DATA) uniform_value[U_BONE_MAT] = 0; - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 0; uniform_value[U_MORPH_COLOR] = 0; } @@ -946,20 +947,20 @@ static void draw_object_vertex_attrib_reset_reflect(draw_object* disp) { gl_state_active_texture(0); } -inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_object* disp) { - object_mesh* mesh = disp->mesh; +inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_object* draw) { + object_mesh* mesh = draw->mesh; object_vertex_flags vertex_flags = mesh->vertex_flags; for (int32_t i = 0; i < 16; i++) { - if (disp->vertex_attrib_array[i]) + if (draw->vertex_attrib_array[i]) glDisableVertexAttribArray(i); - disp->vertex_attrib_array[i] = false; + draw->vertex_attrib_array[i] = false; } if (vertex_flags & OBJECT_VERTEX_BONE_DATA) uniform_value[U_BONE_MAT] = 0; - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 0; uniform_value[U_MORPH_COLOR] = 0; } @@ -969,18 +970,18 @@ inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_objec gl_state_active_texture(0); } -static void draw_object_vertex_attrib_set_default(draw_object* disp) { - object_mesh* mesh = disp->mesh; - object_sub_mesh* sub_mesh = disp->sub_mesh; +static void draw_object_vertex_attrib_set_default(draw_object* draw) { + object_mesh* mesh = draw->mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; GLsizei vertex_size = (GLsizei)mesh->vertex_size; object_vertex_flags vertex_flags = mesh->vertex_flags; if (mesh->compressed) { - draw_object_vertex_attrib_set_default_compressed(disp); + draw_object_vertex_attrib_set_default_compressed(draw); return; } - gl_state_bind_array_buffer(disp->array_buffer); + gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1011,7 +1012,7 @@ static void draw_object_vertex_attrib_set_default(draw_object* disp) { offset += 12; bool texcoord_mat_set[4] = { false }; - object_material_data* material = disp->material; + object_material_data* material = draw->material; for (int32_t i = 0, j = 0, l = 0; i < 4; i++) { if (material->material.textures[i].texture_id == -1) continue; @@ -1039,9 +1040,9 @@ static void draw_object_vertex_attrib_set_default(draw_object* disp) { mat4 mat = material->material.textures[i].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); if (material->material.textures[i].texture_flags.type == OBJECT_MATERIAL_TEXTURE_COLOR) - for (int32_t k = 0; k < disp->texture_transform_count; k++) - if (disp->texture_transform_array[k].id == texture_id) { - mat = disp->texture_transform_array[k].mat; + for (int32_t k = 0; k < draw->texture_transform_count; k++) + if (draw->texture_transform_array[k].id == texture_id) { + mat = draw->texture_transform_array[k].mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); texcoord_mat_set[texcoord_index] = true; break; @@ -1049,7 +1050,7 @@ static void draw_object_vertex_attrib_set_default(draw_object* disp) { } for (int32_t i = 0; i < 4; i++) - if (!disp->vertex_attrib_array[8 + i]) + if (!draw->vertex_attrib_array[8 + i]) glVertexAttrib4f(8 + i, 0.0f, 0.0f, 0.0f, 1.0f); if (vertex_flags & OBJECT_VERTEX_TEXCOORD0) @@ -1096,10 +1097,10 @@ static void draw_object_vertex_attrib_set_default(draw_object* disp) { else glVertexAttrib4f(7, 0.0f, 0.0f, 0.0f, 1.0f); - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 1; - gl_state_bind_array_buffer(disp->morph_array_buffer); + gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1169,23 +1170,23 @@ static void draw_object_vertex_attrib_set_default(draw_object* disp) { if (vertex_flags & OBJECT_VERTEX_UNKNOWN) offset += 16; - shader_env_vert_set(&shaders_ft, 13, disp->morph_value, 1.0f - disp->morph_value, 0.0f, 0.0f); + shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); - gl_state_bind_element_array_buffer(disp->element_array_buffer); + gl_state_bind_element_array_buffer(draw->element_array_buffer); - if (disp->instances_count) + if (draw->instances_count) uniform_value[U_INSTANCE] = 1; } -inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* disp) { - object_mesh* mesh = disp->mesh; - object_sub_mesh* sub_mesh = disp->sub_mesh; +inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* draw) { + object_mesh* mesh = draw->mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; GLsizei vertex_size = (GLsizei)mesh->vertex_size; object_vertex_flags vertex_flags = mesh->vertex_flags; - gl_state_bind_array_buffer(disp->array_buffer); + gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1213,7 +1214,7 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* glVertexAttrib4f(6, 0.0f, 0.0f, 0.0f, 1.0f); bool texcoord_mat_set[4] = { false }; - object_material_data* material = disp->material; + object_material_data* material = draw->material; for (int32_t i = 0, j = 0, l = 0; i < 4; i++) { if (material->material.textures[i].texture_id == -1) continue; @@ -1248,9 +1249,9 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* mat4 mat = material->material.textures[i].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); if (material->material.textures[i].texture_flags.type == OBJECT_MATERIAL_TEXTURE_COLOR) - for (int32_t k = 0; k < disp->texture_transform_count; k++) - if (disp->texture_transform_array[k].id == texture_id) { - mat = disp->texture_transform_array[k].mat; + for (int32_t k = 0; k < draw->texture_transform_count; k++) + if (draw->texture_transform_array[k].id == texture_id) { + mat = draw->texture_transform_array[k].mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); texcoord_mat_set[texcoord_index] = true; break; @@ -1258,7 +1259,7 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* } for (int32_t i = 0; i < 4; i++) - if (!disp->vertex_attrib_array[8 + i]) + if (!draw->vertex_attrib_array[8 + i]) glVertexAttrib4f(8 + i, 0.0f, 0.0f, 0.0f, 1.0f); if (vertex_flags & OBJECT_VERTEX_TEXCOORD0) @@ -1294,10 +1295,10 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* glVertexAttrib4f(15, 0.0f, 0.0f, 0.0f, 1.0f); } - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 1; - gl_state_bind_array_buffer(disp->morph_array_buffer); + gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1358,28 +1359,28 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* if (vertex_flags & OBJECT_VERTEX_BONE_DATA) offset += 16; - shader_env_vert_set(&shaders_ft, 13, disp->morph_value, 1.0f - disp->morph_value, 0.0f, 0.0f); + shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); - gl_state_bind_element_array_buffer(disp->element_array_buffer); + gl_state_bind_element_array_buffer(draw->element_array_buffer); - if (disp->instances_count) + if (draw->instances_count) uniform_value[U_INSTANCE] = 1; } -static void draw_object_vertex_attrib_set_reflect(draw_object* disp) { - object_mesh* mesh = disp->mesh; - object_sub_mesh* sub_mesh = disp->sub_mesh; +static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { + object_mesh* mesh = draw->mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; GLsizei vertex_size = (GLsizei)mesh->vertex_size; object_vertex_flags vertex_flags = mesh->vertex_flags; if (mesh->compressed) { - draw_object_vertex_attrib_set_reflect_compressed(disp); + draw_object_vertex_attrib_set_reflect_compressed(draw); return; } - gl_state_bind_array_buffer(disp->array_buffer); + gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1404,7 +1405,7 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* disp) { if (vertex_flags & OBJECT_VERTEX_BINORMAL) offset += 12; - object_material_data* material = disp->material; + object_material_data* material = draw->material; if (material->material.textures[0].texture_id != -1) { if (vertex_flags & OBJECT_VERTEX_TEXCOORD0) { enable_vertex_attrib_array(8); @@ -1419,9 +1420,9 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* disp) { mat4 mat = material->material.textures[0].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); if (material->material.textures[0].texture_flags.type == OBJECT_MATERIAL_TEXTURE_COLOR) - for (int32_t j = 0; j < disp->texture_transform_count; j++) - if (disp->texture_transform_array[j].id == texture_id) { - mat = disp->texture_transform_array[j].mat; + for (int32_t j = 0; j < draw->texture_transform_count; j++) + if (draw->texture_transform_array[j].id == texture_id) { + mat = draw->texture_transform_array[j].mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); break; } @@ -1469,10 +1470,10 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* disp) { if (vertex_flags & OBJECT_VERTEX_UNKNOWN) offset += 16; - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 1; - gl_state_bind_array_buffer(disp->morph_array_buffer); + gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1542,20 +1543,20 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* disp) { if (vertex_flags & OBJECT_VERTEX_UNKNOWN) offset += 16; - shader_env_vert_set(&shaders_ft, 13, disp->morph_value, 1.0f - disp->morph_value, 0.0f, 0.0f); + shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); - gl_state_bind_element_array_buffer(disp->element_array_buffer); + gl_state_bind_element_array_buffer(draw->element_array_buffer); } -inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* disp) { - object_mesh* mesh = disp->mesh; - object_sub_mesh* sub_mesh = disp->sub_mesh; +inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* draw) { + object_mesh* mesh = draw->mesh; + object_sub_mesh* sub_mesh = draw->sub_mesh; GLsizei vertex_size = (GLsizei)mesh->vertex_size; object_vertex_flags vertex_flags = mesh->vertex_flags; - gl_state_bind_array_buffer(disp->array_buffer); + gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1577,7 +1578,7 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* if (vertex_flags & OBJECT_VERTEX_TANGENT) offset += 8; - object_material_data* material = disp->material; + object_material_data* material = draw->material; if (material->material.textures[0].texture_id != -1) { if (vertex_flags & OBJECT_VERTEX_TEXCOORD0) { enable_vertex_attrib_array(8); @@ -1592,9 +1593,9 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* mat4 mat = material->material.textures[0].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); if (material->material.textures[0].texture_flags.type == OBJECT_MATERIAL_TEXTURE_COLOR) - for (int32_t j = 0; j < disp->texture_transform_count; j++) - if (disp->texture_transform_array[j].id == texture_id) { - mat = disp->texture_transform_array[j].mat; + for (int32_t j = 0; j < draw->texture_transform_count; j++) + if (draw->texture_transform_array[j].id == texture_id) { + mat = draw->texture_transform_array[j].mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); break; } @@ -1636,10 +1637,10 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* glVertexAttrib4f(15, 0.0f, 0.0f, 0.0f, 1.0f); } - if (disp->morph_array_buffer) { + if (draw->morph_array_buffer) { uniform_value[U_MORPH] = 1; - gl_state_bind_array_buffer(disp->morph_array_buffer); + gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; if (vertex_flags & OBJECT_VERTEX_POSITION) { @@ -1700,9 +1701,9 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* if (vertex_flags & OBJECT_VERTEX_BONE_DATA) offset += 16; - shader_env_vert_set(&shaders_ft, 13, disp->morph_value, 1.0f - disp->morph_value, 0.0f, 0.0f); + shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); - gl_state_bind_element_array_buffer(disp->element_array_buffer); + gl_state_bind_element_array_buffer(draw->element_array_buffer); } diff --git a/src/CRE/draw_object.h b/src/CRE/draw_object.h index a5b942d8..b033a45d 100644 --- a/src/CRE/draw_object.h +++ b/src/CRE/draw_object.h @@ -20,14 +20,14 @@ typedef struct texture_data_struct { vec3 texture_specular_offset; } texture_data_struct; -extern void draw_object_draw(render_context* rctx, draw_object* disp, mat4* model, - void(*draw_object_func)(render_context* rctx, draw_object* disp), int32_t show_vector_old); -extern void draw_object_draw_default(render_context* rctx, draw_object* disp); -extern void draw_object_draw_sss(render_context* rctx, draw_object* disp); -extern void draw_object_draw_reflect(render_context* rctx, draw_object* disp); -extern void draw_object_draw_reflect_reflect_map(render_context* rctx, draw_object* disp); -extern void draw_object_draw_shadow(render_context* rctx, draw_object* disp); -extern void draw_object_draw_translucent(render_context* rctx, draw_object* disp); +extern void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, + void(*draw_object_func)(render_context* rctx, draw_object* draw), int32_t show_vector_old); +extern void draw_object_draw_default(render_context* rctx, draw_object* draw); +extern void draw_object_draw_sss(render_context* rctx, draw_object* draw); +extern void draw_object_draw_reflect(render_context* rctx, draw_object* draw); +extern void draw_object_draw_reflect_reflect_map(render_context* rctx, draw_object* draw); +extern void draw_object_draw_shadow(render_context* rctx, draw_object* draw); +extern void draw_object_draw_translucent(render_context* rctx, draw_object* draw); extern void draw_object_model_mat_load(render_context* rctx, mat4* mat); extern void model_mat_face_camera_position(mat4* view, mat4* src, mat4* dst); extern void model_mat_face_camera_view(mat4* view, mat4* src, mat4* dst); diff --git a/src/CRE/draw_pass.c b/src/CRE/draw_pass.c index 263cf652..3d10fc2d 100644 --- a/src/CRE/draw_pass.c +++ b/src/CRE/draw_pass.c @@ -249,21 +249,7 @@ static void draw_pass_shadow(render_context* rctx, draw_pass* a1) { mat4_mult(&proj, &temp, &proj); shader_state_matrix_set_projection(&shaders_ft, &proj, false); - vec3 up = { 0.0f, 1.0f, 0.0f }; - vec3 dir; - float_t length; - vec3_sub(*interest, *view_point, dir); - vec3_length_squared(dir, length); - if (length <= 0.000001f) { - up.x = 0.0f; - up.y = 0.0f; - if (dir.z < 0.0f) - up.z = 1.0f; - else - up.z = -1.0f; - } - - mat4_look_at(view_point, interest, &up, &rctx->view_mat); + mat4_look_at(view_point, interest, &rctx->view_mat); rctx->draw_state.shader_index = SHADER_FT_SIL; uniform_value[U0A] = 0; @@ -637,7 +623,7 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data_struct* a1) { v46[i] = interest; v14[i] = 999999.0f; rob_chara_bone_data* v16 = rob_chara_array[i].bone_data; - if (rob_chara_pv_data_array[i].field_0 != -1 && rob_chara_array[i].data.field_0 & 1) { + if (rob_chara_pv_data_array[i].type != ROB_CHARA_TYPE_NONE && rob_chara_array[i].data.field_0 & 1) { mat4* v17 = rob_chara_bone_data_get_mats_mat(v16, MOTION_BONE_N_HARA_CP); if (v17) { mat4_get_translation(v17, &v46[i]); @@ -1039,20 +1025,6 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { view_point = &shad->view_point_shared; } - vec3 up = { 0.0f, 1.0f, 0.0f }; - vec3 dir; - float_t length; - vec3_sub(*interest, *view_point, dir); - vec3_length_squared(dir, length); - if (length <= 0.000001f) { - up.x = 0.0f; - up.y = 0.0f; - if (dir.z < 0.0f) - up.z = 1.0f; - else - up.z = -1.0f; - } - mat4 temp; mat4_translate(0.5f, 0.5f, 0.5f, &temp); mat4_scale_rot(&temp, 0.5f, 0.5f, 0.5f, &temp); @@ -1063,7 +1035,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { mat4_mult(&proj, &temp, &proj); mat4 view; - mat4_look_at(view_point, interest, &up, &view); + mat4_look_at(view_point, interest, &view); mat4_mult(&view, &proj, &view); shader_state_matrix_set_texture(&shaders_ft, 6ULL + i, &view); } diff --git a/src/CRE/draw_task.c b/src/CRE/draw_task.c index 65fd3253..6f30050d 100644 --- a/src/CRE/draw_task.c +++ b/src/CRE/draw_task.c @@ -34,7 +34,7 @@ void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type, int32_t alpha_test = 0; float_t min_alpha = 1.0f; bool reflect = uniform_value[U_REFLECT] == 1; - void(*draw_object_func)(render_context* rctx, draw_object* disp) = draw_object_draw_default; + void(*draw_object_func)(render_context* rctx, draw_object* draw) = draw_object_draw_default; for (int32_t i = 0; i < 6; i++) gl_state_active_bind_texture_2d(i, 0); @@ -645,7 +645,7 @@ inline bool draw_task_add_draw_object_by_object_info_color_vec4(render_context* } void draw_task_add_draw_object_by_object_info_object_skin(render_context* rctx, object_info obj_info, - vector_old_texture_pattern_struct* texture_pattern, texture_data_struct* texture_data, float_t alpha, + std::vector* texture_pattern, texture_data_struct* texture_data, float_t alpha, mat4* matrices, mat4* ex_data_matrices, mat4* mat, mat4* global_mat) { object_skin* skin = object_storage_get_object_skin(obj_info); if (!skin) @@ -681,9 +681,9 @@ void draw_task_add_draw_object_by_object_info_object_skin(render_context* rctx, object_data_set_texture_specular_offset(object_data, &value); } - size_t texture_pattern_count = texture_pattern ? vector_old_length(*texture_pattern) : 0; + size_t texture_pattern_count = texture_pattern ? texture_pattern->size() : 0; if (texture_pattern && texture_pattern_count) - object_data_set_texture_pattern(object_data, (int32_t)texture_pattern_count, texture_pattern->begin); + object_data_set_texture_pattern(object_data, (int32_t)texture_pattern_count, texture_pattern->data()); if (fabsf(alpha - 1.0f) > 0.000001f) draw_task_add_draw_object_by_object_info_alpha_bone_mat(rctx, @@ -830,7 +830,7 @@ int32_t object_axis_aligned_bounding_box_check_visibility( int32_t object_bounding_sphere_check_visibility(object_bounding_sphere* sphere, object_data* object_data, camera* cam, mat4* mat) { if (object_data->object_bounding_sphere_check_func) - return object_data->object_bounding_sphere_check_func(sphere); + return object_data->object_bounding_sphere_check_func(sphere, cam); vec3 center; mat4_mult_vec3_trans(mat, &sphere->center, ¢er); @@ -891,35 +891,35 @@ inline static void draw_task_object_init(draw_task* task, object_data* object_da task->data.object.element_array_buffer = element_array_buffer; task->data.object.morph_array_buffer = morph_array_buffer; - draw_object* disp = &task->data.object; - disp->texture_pattern_count = object_data->texture_pattern_count; + draw_object* draw = &task->data.object; + draw->texture_pattern_count = object_data->texture_pattern_count; for (int32_t i = 0; i < object_data->texture_pattern_count && i < TEXTURE_PATTERN_COUNT; i++) - disp->texture_pattern_array[i] = object_data->texture_pattern_array[i]; + draw->texture_pattern_array[i] = object_data->texture_pattern_array[i]; - disp->texture_transform_count = object_data->texture_transform_count; + draw->texture_transform_count = object_data->texture_transform_count; for (int32_t i = 0; i < object_data->texture_transform_count && i < TEXTURE_TRANSFORM_COUNT; i++) - disp->texture_transform_array[i] = object_data->texture_transform_array[i]; + draw->texture_transform_array[i] = object_data->texture_transform_array[i]; if (blend_color) { - disp->set_blend_color = true; - disp->blend_color = *blend_color; + draw->set_blend_color = true; + draw->blend_color = *blend_color; } else { - disp->set_blend_color = false; - disp->blend_color = vec4u_identity; + draw->set_blend_color = false; + draw->blend_color = vec4u_identity; } - disp->chara_color = object_data->chara_color; - disp->self_shadow = object_data->draw_task_flags & (DRAW_TASK_8 | DRAW_TASK_4) ? 1 : 0; - disp->shadow = object_data->shadow_type; - disp->texture_color_coeff = object_data->texture_color_coeff; - disp->texture_color_coeff.w = object_data->wet_param; - disp->texture_color_offset = object_data->texture_color_offset; - disp->texture_specular_coeff = object_data->texture_specular_coeff; - disp->texture_specular_offset = object_data->texture_specular_offset; - disp->instances_count = instances_count; - disp->instances_mat = instances_mat; - disp->draw_object_func = draw_object_func; + draw->chara_color = object_data->chara_color; + draw->self_shadow = object_data->draw_task_flags & (DRAW_TASK_8 | DRAW_TASK_4) ? 1 : 0; + draw->shadow = object_data->shadow_type; + draw->texture_color_coeff = object_data->texture_color_coeff; + draw->texture_color_coeff.w = object_data->wet_param; + draw->texture_color_offset = object_data->texture_color_offset; + draw->texture_specular_coeff = object_data->texture_specular_coeff; + draw->texture_specular_offset = object_data->texture_specular_offset; + draw->instances_count = instances_count; + draw->instances_mat = instances_mat; + draw->draw_object_func = draw_object_func; } inline static void draw_task_object_translucent_init(draw_task* task, mat4* mat, diff --git a/src/CRE/draw_task.h b/src/CRE/draw_task.h index ff509ec9..b27e608c 100644 --- a/src/CRE/draw_task.h +++ b/src/CRE/draw_task.h @@ -36,7 +36,7 @@ extern bool draw_task_add_draw_object_by_object_info_color(render_context* rctx, extern bool draw_task_add_draw_object_by_object_info_color_vec4(render_context* rctx, mat4* mat, object_info obj_info, vec4* blend_color); extern void draw_task_add_draw_object_by_object_info_object_skin(render_context* rctx, object_info obj_info, - vector_old_texture_pattern_struct* texture_pattern, texture_data_struct* texture_data, float_t alpha, + std::vector* texture_pattern, texture_data_struct* texture_data, float_t alpha, mat4* matrices, mat4* ex_data_matrices, mat4* mat, mat4* global_mat); extern bool draw_task_add_draw_object_by_object_info_opaque(render_context* rctx, mat4* mat, object_info obj_info); diff --git a/src/CRE/file_handler.c b/src/CRE/file_handler.c index f74acec4..3fea6271 100644 --- a/src/CRE/file_handler.c +++ b/src/CRE/file_handler.c @@ -3,6 +3,7 @@ GitHub/GitLab: korenkonder */ +#include #include "file_handler.h" #include "data.h" #include "render_context.h" @@ -13,11 +14,11 @@ public: std::list list; farc_read_handler* farc_read_handler; std::deque deque; - std::mutex(farc_mtx); + std::mutex farc_mtx; std::thread* thread; - std::mutex(mtx); + std::mutex mtx; std::condition_variable cnd; - bool field_60; + bool exit; bool field_61; int32_t field_64; bool read_in_thread; @@ -32,10 +33,10 @@ public: file_handler_storage file_handler_storage_data; -static bool file_handler_load_file(void* data, char* path, char* file, uint32_t hash); -static bool file_handler_load_farc_file(void* data, char* path, char* file, uint32_t hash); +static bool file_handler_load_file(void* data, const char* path, const char* file, uint32_t hash); +static bool file_handler_load_farc_file(void* data, const char* path, const char* file, uint32_t hash); static void file_handler_storage_ctrl_list(); -static int32_t file_handler_storage_thread_ctrl(); +static void file_handler_storage_thread_ctrl(); static size_t farc_read_handler_get_file_size(farc_read_handler* frh, std::string* file); static bool farc_read_handler_read(farc_read_handler* frh, std::string* file_path, bool cache); static bool farc_read_handler_read_data(farc_read_handler* frh, void* data, size_t size, std::string* file); @@ -55,20 +56,14 @@ void file_handler::call_read_free_func(int32_t index) { std::unique_lock u_lock(mtx); void* data = this->data; - void(*read_free_func_func)(void*, void*) = this->read_free_func[index].func; + void(*read_free_func_func)(void*, void*, size_t) = this->read_free_func[index].func; void* read_free_func_data = this->read_free_func[index].data; bool ready = this->read_free_func[index].ready; this->read_free_func[index].ready = true; u_lock.unlock(); if (!ready && read_free_func_func) - read_free_func_func(read_free_func_data, data); -} - -void file_handler::set_file(char* file) { - std::unique_lock u_lock(mtx); - this->file = std::string(file); - u_lock.unlock(); + read_free_func_func(read_free_func_data, data, this->size); } void file_handler::set_file(const char* file) { @@ -77,13 +72,6 @@ void file_handler::set_file(const char* file) { u_lock.unlock(); } -void file_handler::set_farc_file(char* farc_file, bool cache) { - std::unique_lock u_lock(mtx); - this->farc_file = std::string(farc_file); - this->cache = cache; - u_lock.unlock(); -} - void file_handler::set_farc_file(const char* farc_file, bool cache) { std::unique_lock u_lock(mtx); this->farc_file = std::string(farc_file); @@ -91,19 +79,13 @@ void file_handler::set_farc_file(const char* farc_file, bool cache) { u_lock.unlock(); } -void file_handler::set_path(char* path) { - std::unique_lock u_lock(mtx); - this->path = std::string(path); - u_lock.unlock(); -} - void file_handler::set_path(const char* path) { std::unique_lock u_lock(mtx); this->path = std::string(path); u_lock.unlock(); } -void file_handler::set_read_free_func_data(int32_t index, void(* func)(void*, void*), void* data) { +void file_handler::set_read_free_func_data(int32_t index, void(* func)(void*, void*, size_t), void* data) { std::unique_lock u_lock(mtx); if (index < 2) { read_free_func[index].func = func; @@ -134,13 +116,13 @@ farc_read_handler::~farc_read_handler() { delete farc; } -file_handler_storage::file_handler_storage() : farc_read_handler(), thread(), cnd(), field_60(), +file_handler_storage::file_handler_storage() : farc_read_handler(), thread(), cnd(), exit(), field_61(), field_64(), read_in_thread(), field_69(), field_6C(), field_70(), field_74() { - thread = new std::thread(file_handler_storage_thread_ctrl); + } file_handler_storage::~file_handler_storage() { - delete thread; + } void file_handler_storage_ctrl() { @@ -162,14 +144,26 @@ void file_handler_storage_ctrl() { u_lock.unlock(); } +void file_handler_storage_free_thread() { + std::unique_lock u_lock(file_handler_storage_data.mtx); + file_handler_storage_data.exit = true; + file_handler_storage_data.cnd.notify_one(); + u_lock.unlock(); + + file_handler_storage_data.thread->join(); + delete file_handler_storage_data.thread; + file_handler_storage_data.thread = 0; +} + void file_handler_storage_init_thread() { + file_handler_storage_data.thread = new std::thread(file_handler_storage_thread_ctrl); if (file_handler_storage_data.thread) { SetThreadDescription((HANDLE)file_handler_storage_data.thread->native_handle(), L"File Thread"); - file_handler_storage_data.thread->detach(); + //file_handler_storage_data.thread->detach(); } } -static bool file_handler_load_file(void* data, char* path, char* file, uint32_t hash) { +static bool file_handler_load_file(void* data, const char* path, const char* file, uint32_t hash) { std::string file_path = std::string(path); file_path += file; @@ -192,7 +186,7 @@ static bool file_handler_load_file(void* data, char* path, char* file, uint32_t return ret; } -static bool file_handler_load_farc_file(void* data, char* path, char* file, uint32_t hash) { +static bool file_handler_load_farc_file(void* data, const char* path, const char* file, uint32_t hash) { std::string file_path = std::string(path); file_path += file; @@ -230,7 +224,6 @@ static bool file_handler_load_farc_file(void* data, char* path, char* file, uint } static void file_handler_storage_ctrl_list() { - for (std::list::iterator i = file_handler_storage_data.list.begin(); i != file_handler_storage_data.list.end();) { file_handler* pfhndl = i._Ptr->_Myval; @@ -248,10 +241,12 @@ static void file_handler_storage_ctrl_list() { extern render_context* rctx_ptr; -static int32_t file_handler_storage_thread_ctrl() { - while (true) { - std::unique_lock u_lock(file_handler_storage_data.mtx); +static void file_handler_storage_thread_ctrl() { + std::unique_lock u_lock(file_handler_storage_data.mtx); + while (!file_handler_storage_data.exit) { file_handler_storage_data.cnd.wait(u_lock); + if (file_handler_storage_data.exit) + break; for (file_handler*& i : file_handler_storage_data.deque) { if (i->not_ready) { @@ -259,11 +254,11 @@ static int32_t file_handler_storage_thread_ctrl() { i->reading = true; if (i->not_ready) { if (i->farc_file.size()) - data_struct_load_file((data_struct*)rctx_ptr->data, - i, i->path.c_str(), i->farc_file.c_str(), file_handler_load_farc_file); + rctx_ptr->data->load_file(i, + i->path.c_str(), i->farc_file.c_str(), file_handler_load_farc_file); else - data_struct_load_file((data_struct*)rctx_ptr->data, - i, i->path.c_str(), i->file.c_str(), file_handler_load_file); + rctx_ptr->data->load_file(i, + i->path.c_str(), i->file.c_str(), file_handler_load_file); i->not_ready = false; } i->reading = false; @@ -272,9 +267,9 @@ static int32_t file_handler_storage_thread_ctrl() { i->free_data_lock(); } file_handler_storage_data.deque.clear(); - u_lock.unlock(); } - return 0; + file_handler_storage_data.exit = false; + u_lock.unlock(); } static size_t farc_read_handler_get_file_size(farc_read_handler* frh, std::string* file) { @@ -375,7 +370,7 @@ ssize_t p_file_handler::get_size() { return ptr->size; } -bool p_file_handler::read_file(char* path, char* farc_file, char* file, bool cache) { +bool p_file_handler::read_file(const char* path, const char* farc_file, const char* file, bool cache) { if (!path || !file) return false; @@ -385,6 +380,9 @@ bool p_file_handler::read_file(char* path, char* farc_file, char* file, bool cac free_data(); } + if (!rctx_ptr->data->check_file_exists(path, farc_file ? farc_file : file)) + return false; + ptr = new file_handler; if (!ptr) return false; @@ -405,7 +403,7 @@ bool p_file_handler::read_file(char* path, char* farc_file, char* file, bool cac return true; } -bool p_file_handler::read_file_path(char* path, char* file) { +bool p_file_handler::read_file_path(const char* path, const char* file) { return read_file(path, 0, file, false); } @@ -420,10 +418,10 @@ void p_file_handler::read_now() { if (ptr->not_ready) { bool ret; if (ptr->farc_file.size()) - ret = data_struct_load_file((data_struct*)rctx_ptr->data, + ret = ((data_struct*)rctx_ptr->data)->load_file( ptr, ptr->path.c_str(), ptr->farc_file.c_str(), file_handler_load_farc_file); else - ret = data_struct_load_file((data_struct*)rctx_ptr->data, + ret = ((data_struct*)rctx_ptr->data)->load_file( ptr, ptr->path.c_str(), ptr->file.c_str(), file_handler_load_file); if (ret) @@ -437,7 +435,7 @@ void p_file_handler::read_now() { } } -void p_file_handler::set_read_free_func_data(int32_t index, void(*func)(void*, void*), void* data) { +void p_file_handler::set_read_free_func_data(int32_t index, void(*func)(void*, void*, size_t), void* data) { if (ptr) ptr->set_read_free_func_data(index, func, data); } diff --git a/src/CRE/file_handler.h b/src/CRE/file_handler.h index 495b9c17..f14e1d60 100644 --- a/src/CRE/file_handler.h +++ b/src/CRE/file_handler.h @@ -14,7 +14,7 @@ #include "../KKdLib/farc.h" typedef struct file_handler_read_func_data { - void(*func)(void*, void*); + void(*func)(void*, void*, size_t); void* data; bool ready; } file_handler_read_func_data; @@ -22,7 +22,7 @@ typedef struct file_handler_read_func_data { class file_handler { public: int32_t count; - std::mutex(mtx); + std::mutex mtx; bool not_ready; bool reading; std::string path; @@ -38,13 +38,10 @@ public: void call_read_free_func(int32_t index); void free_data_lock(); - void set_file(char* file); void set_file(const char* file); - void set_farc_file(char* farc_file, bool cache); void set_farc_file(const char* farc_file, bool cache); - void set_path(char* path); void set_path(const char* path); - void set_read_free_func_data(int32_t index, void(*func)(void*, void*), void* data); + void set_read_free_func_data(int32_t index, void(*func)(void*, void*, size_t), void* data); }; class p_file_handler { @@ -59,10 +56,10 @@ public: void free_data(); void* get_data(); ssize_t get_size(); - bool read_file(char* path, char* farc_file, char* file, bool cache); - bool read_file_path(char* path, char* file); + bool read_file(const char* path, const char* farc_file, const char* file, bool cache); + bool read_file_path(const char* path, const char* file); void read_now(); - void set_read_free_func_data(int32_t index, void(* func)(void*, void*), void* data); + void set_read_free_func_data(int32_t index, void(* func)(void*, void*, size_t), void* data); }; class farc_read_handler { @@ -76,4 +73,5 @@ public: }; extern void file_handler_storage_ctrl(); +extern void file_handler_storage_free_thread(); extern void file_handler_storage_init_thread(); diff --git a/src/CRE/light_param.c b/src/CRE/light_param.c index 700c2ff1..04237ff3 100644 --- a/src/CRE/light_param.c +++ b/src/CRE/light_param.c @@ -8,59 +8,26 @@ #include "../KKdLib/str_utils.h" #include "render_context.h" -class light_param_storage { -public: - bool pv; - uint64_t hash; - uint32_t pv_id; - int32_t count; - light_param_data data; - - light_param_storage(); - ~light_param_storage(); -}; - static void light_param_data_get_stage_name_string(std::string* str, int32_t stage_index); static int32_t light_param_data_load_file(light_param_data* a1, p_file_handler* a2); static void light_param_data_load_file_pv_cut(std::map* tree, farc* f, light_param_data* default_light_param, int32_t pv_id); static void light_param_data_load_pv_cut_file_names(light_param_data* light_param, int32_t cut_id, std::string* name); static void light_param_data_load_stage_file_names(light_param_data* light_param, std::string* name); +static void light_param_data_set(light_param_data* a1, light_param_data_storage* storage); +static void light_param_storage_free_file_handlers(light_param_data_storage* a1); static void light_param_storage_load_stages(light_param_data_storage* a1, std::vector* stage_indices); static int32_t light_param_storage_load_file(light_param_data_storage* a1, bool read_now); static void light_param_storage_set_default_light_param(light_param_data_storage* a1, int32_t stage_index); static void light_param_storage_set_stage(light_param_data_storage* a1, std::map::iterator* elem, int32_t stage_index); -std::vector light_param_storage_data; light_param_data_storage light_param_data_storage_data; -light_param_data::light_param_data() : id(), not_loaded() { +extern render_context* rctx_ptr; -} +light_param_data::light_param_data() : not_loaded() { -void light_param_data_load(light_param_data* light_param, data_struct* data, char* name) { - char buf[_MAX_PATH]; - - light_param->id = 0; - - sprintf_s(buf, sizeof(buf), "light_%s.txt", name); - data_struct_load_file(data, &light_param->light, "rom/light_param/", buf, light_param_light_load_file); - - sprintf_s(buf, sizeof(buf), "fog_%s.txt", name); - data_struct_load_file(data, &light_param->fog, "rom/light_param/", buf, light_param_fog_load_file); - - sprintf_s(buf, sizeof(buf), "glow_%s.txt", name); - data_struct_load_file(data, &light_param->glow, "rom/light_param/", buf, light_param_glow_load_file); - - sprintf_s(buf, sizeof(buf), "%s.ibl", name); - data_struct_load_file(data, &light_param->ibl, "rom/ibl/", buf, light_param_ibl_load_file); - - sprintf_s(buf, sizeof(buf), "wind_%s.txt", name); - data_struct_load_file(data, &light_param->wind, "rom/light_param/", buf, light_param_wind_load_file); - - sprintf_s(buf, sizeof(buf), "face_%s.txt", name); - data_struct_load_file(data, &light_param->face, "rom/light_param/", buf, light_param_face_load_file); } light_param_data::~light_param_data() { @@ -91,88 +58,12 @@ void light_param_data_storage::unload() { glDeleteTextures(5, light_param_data_storage_data.textures); } -char* light_param_get_stage_name_string(char* name) { - size_t length = utf8_length(name); - if (str_utils_compare_length(name, length, "STG", 3)) - return 0; - - name += 3; - length -= 3; - - char* str = force_malloc_s(char, length + 1); - for (size_t i = 0; i < length; i++) { - char c = name[i]; - if (c > 0x40 && c < 0x5B) - c += 0x20; - str[i] = c; - } - str[length] = 0; - return str; +void light_param_storage_data_free_file_handlers() { + light_param_storage_free_file_handlers(&light_param_data_storage_data); } -inline void light_param_storage_init() { - light_param_storage_data = {}; -} - -inline void light_param_storage_append_light_param_data(char* name) { - uint64_t hash = hash_utf8_fnv1a64m(name, false); - for (light_param_storage& i : light_param_storage_data) - if (!i.pv && i.hash == hash) { - i.count++; - return; - } -} - -inline void light_param_storage_load_light_param_data(data_struct* data, char* name) { - light_param_data light_param; - light_param_data_load(&light_param, data, name); - light_param_storage_insert_light_param_data(&light_param, name); -} - -inline void light_param_storage_insert_light_param_data(light_param_data* data, char* name) { - uint64_t hash = hash_utf8_fnv1a64m(name, false); - for (light_param_storage& i : light_param_storage_data) - if (!i.pv && i.hash == hash) { - i.count++; - i.data = *data; - return; - } - - light_param_storage lit_param_set_storage; - lit_param_set_storage.pv = false; - lit_param_set_storage.hash = hash; - lit_param_set_storage.count = 1; - lit_param_set_storage.data = *data; - light_param_storage_data.push_back(lit_param_set_storage); -} - -inline light_param_data* light_param_storage_get_light_param_data(char* name) { - uint64_t hash = hash_utf8_fnv1a64m(name, false); - for (light_param_storage& i : light_param_storage_data) - if (!i.pv && i.hash == hash) - return &i.data; - return 0; -} - -inline void light_param_storage_delete_light_param_data(char* name) { - uint64_t hash = hash_utf8_fnv1a64m(name, false); - for (light_param_storage* i = light_param_storage_data.begin()._Ptr; - i != light_param_storage_data.end()._Ptr;) - if (!i->pv && i->hash == hash) { - i->count--; - if (i->count > 0) - break; - - light_param_storage_data.erase(light_param_storage_data.begin() - + (i - light_param_storage_data.data())); - break; - } - else - i++; -} - -inline void light_param_storage_free() { - light_param_storage_data = {}; +int32_t light_param_storage_data_load_file() { + return light_param_storage_load_file(&light_param_data_storage_data, false); } void light_param_storage_data_load_stage(int32_t stage_index) { @@ -184,20 +75,16 @@ void light_param_storage_data_load_stages(std::vector* stage_indices) { light_param_storage_load_stages(&light_param_data_storage_data, stage_indices); } +void light_param_storage_data_set_default_light_param() { + light_param_data_set(&light_param_data_storage_data.default_light_param, &light_param_data_storage_data); +} + void light_param_storage_data_set_stage(int32_t stage_id) { std::map::iterator elem; light_param_storage_set_stage(&light_param_data_storage_data, &elem, stage_id); } -light_param_storage::light_param_storage() : pv(), hash(), pv_id(), count() { - -} - -light_param_storage::~light_param_storage() { - -} - -int32_t light_param_storage_load_file(light_param_data_storage* a1, bool read_now) { +static int32_t light_param_storage_load_file(light_param_data_storage* a1, bool read_now) { if (a1->state == 1) { light_param_data* light_param = &a1->stage_light_param_iterator->second; std::string* paths = light_param->paths; @@ -234,38 +121,37 @@ int32_t light_param_storage_load_file(light_param_data_storage* a1, bool read_no } return 1; } - else if (a1->state - 3) { - char DstBuf[256]; // [rsp+90h] [rbp-138h] BYREF - sprintf_s(DstBuf, 0x100ui64, "light_pv%03d.farc", a1->pv_id); - if (a1->farc_file_handler.read_file_path((char*)"./rom/light_param/", DstBuf)) + else if (a1->state == 3) { + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "light_pv%03d.farc", a1->pv_id); + if (a1->farc_file_handler.read_file_path((char*)"./rom/light_param/", buf)) a1->state = 4; else { a1->farc_file_handler.free_data(); a1->state = 0; - return false; + return 0; } - return true; + return 1; } else if (a1->state == 4) { if (read_now) a1->farc_file_handler.read_now(); else if (a1->farc_file_handler.check_not_ready()) - return true; + return 1; farc a1a; a1a.read(a1->farc_file_handler.get_data(), a1->farc_file_handler.get_size(), true); if (a1a.files.size()) light_param_data_load_file_pv_cut(&a1->pv_cut, &a1a, &a1->default_light_param, a1->pv_id); a1->state = 0; - return false; + return 0; } - return false; + return 0; } -extern render_context* rctx_ptr; - static void light_param_data_get_stage_name_string(std::string* str, int32_t stage_index) { - *str = {}; + str->clear(); + str->shrink_to_fit();; stage_database* data = &rctx_ptr->data->data_ft.stage_data; char* stage_name = stage_index < vector_old_length(data->stage_data) ? string_data(&data->stage_data.begin[stage_index].name) : 0; @@ -299,32 +185,32 @@ static void light_param_data_get_stage_name_string(std::string* str, int32_t sta static int32_t light_param_data_load_file(light_param_data* a1, p_file_handler* a2) { if (a2[0].ptr) { - a1->ibl = {}; + a1->ibl = light_param_ibl(); a1->ibl.read(a2[0].get_data(), a2[0].get_size()); } if (a2[1].ptr) { - a1->light = {}; + a1->light = light_param_light(); a1->light.read(a2[1].get_data(), a2[1].get_size()); } if (a2[2].ptr) { - a1->fog = {}; + a1->fog = light_param_fog(); a1->fog.read(a2[2].get_data(), a2[2].get_size()); } if (a2[3].ptr) { - a1->glow = {}; + a1->glow = light_param_glow(); a1->glow.read(a2[3].get_data(), a2[3].get_size()); } if (a2[4].ptr) { - a1->wind = {}; + a1->wind = light_param_wind(); a1->wind.read(a2[4].get_data(), a2[4].get_size()); } if (a2[5].ptr) { - a1->face = {}; + a1->face = light_param_face(); a1->face.read(a2[5].get_data(), a2[5].get_size()); } @@ -443,23 +329,23 @@ static void light_param_data_load_file_pv_cut(std::maplight = {}; + light_param->light = light_param_light(); light_param->light.read(i.data, i.size); } else if (type == 2) { - light_param->fog = {}; + light_param->fog = light_param_fog(); light_param->fog.read(i.data, i.size); } else if (type == 3) { - light_param->glow = {}; + light_param->glow = light_param_glow(); light_param->glow.read(i.data, i.size); } else if (type == 4) { - light_param->wind = {}; + light_param->wind = light_param_wind(); light_param->wind.read(i.data, i.size); } else if (type == 5) { - light_param->face = {}; + light_param->face = light_param_face(); light_param->face.read(i.data, i.size); } } @@ -526,6 +412,12 @@ void light_param_data_load_stage_file_names(light_param_data* light_param, std:: light_param->files[5] = std::string(buf); } +static void light_param_storage_free_file_handlers(light_param_data_storage* a1) { + for (int32_t i = 0; i < 6; ++i) + a1->file_handlers[i].free_data(); + a1->farc_file_handler.free_data(); +} + static void light_param_storage_load_stages(light_param_data_storage* a1, std::vector* stage_indices) { if (a1->state) for (int32_t i = 0; i < 6; ++i) @@ -562,7 +454,7 @@ static void light_param_storage_set_default_light_param(light_param_data_storage a1->default_light_param = elem->second; } -void light_param_data_set(light_param_data* a1, light_param_data_storage* storage) { +static void light_param_data_set(light_param_data* a1, light_param_data_storage* storage) { if (!a1->not_loaded || a1->light.ready) render_context_light_param_data_light_set(rctx_ptr, &a1->light); if (!a1->not_loaded || a1->fog.ready) diff --git a/src/CRE/light_param.h b/src/CRE/light_param.h index 0757fcd9..3a7dd493 100644 --- a/src/CRE/light_param.h +++ b/src/CRE/light_param.h @@ -27,7 +27,6 @@ public: std::string paths[6]; std::string files[6]; bool not_loaded; - int32_t id; light_param_light light; light_param_fog fog; light_param_glow glow; @@ -37,8 +36,6 @@ public: light_param_data(); ~light_param_data(); - - static int32_t load_file(); }; class light_param_data_storage { @@ -63,18 +60,9 @@ public: static void unload(); }; -extern void light_param_data_load(light_param_data* light_param, data_struct* data, char* name); - -extern char* light_param_get_stage_name_string(char* name); - -extern void light_param_storage_init(); -extern void light_param_storage_append_light_param_data(char* name); -extern void light_param_storage_load_light_param_data(data_struct* data, char* name); -extern void light_param_storage_insert_light_param_data(light_param_data* data, char* name); -extern light_param_data* light_param_storage_get_light_param_data(char* name); -extern void light_param_storage_delete_light_param_data(char* name); -extern void light_param_storage_free(); - +extern void light_param_storage_data_free_file_handlers(); +extern int32_t light_param_storage_data_load_file(); extern void light_param_storage_data_load_stage(int32_t stage_index); extern void light_param_storage_data_load_stages(std::vector* stage_indices); +extern void light_param_storage_data_set_default_light_param(); extern void light_param_storage_data_set_stage(int32_t stage_id); diff --git a/src/CRE/light_param/wind.c b/src/CRE/light_param/wind.c index e89ba811..0970c3a3 100644 --- a/src/CRE/light_param/wind.c +++ b/src/CRE/light_param/wind.c @@ -5,15 +5,88 @@ #include "wind.h" -static float_t wind_apply_spc(wind* wind, float_t frame); +static float_t wind_apply_spc(wind* w, float_t frame); +static void wind_ctrl(wind* w); -wind* wind_init() { - wind* w = force_malloc_s(wind, 1); - w->count = 16; - return w; +TaskWind task_wind; + +wind::wind() : scale(), cycle(), rot_y(), rot_z(), +bias(), spc(), wind_direction(), frame(), strength() { + count = 16; } -void wind_ctrl(wind* w) { +wind::~wind() { + +} + +float_t wind::get_scale() { + return scale; +} + +void wind::set_scale(float_t value) { + scale = value; +} + +float_t wind::get_cycle() { + return cycle; +} + +void wind::set_cycle(float_t value) { + cycle = value; +} + +void wind::get_rot(vec2* value) { + value->x = rot_y; + value->y = rot_z; +} + +void wind::set_rot(vec2* value) { + rot_y = value->x; + rot_z = value->y; +} + +float_t wind::get_rot_y() { + return rot_y; +} + +void wind::set_rot_y(float_t value) { + rot_y = value; +} + +float_t wind::get_rot_z() { + return rot_z; +} + +void wind::set_rot_z(float_t value) { + rot_z = value; +} + +float_t wind::get_bias() { + return bias; +} + +void wind::set_bias(float_t value) { + bias = value; +} + +void wind::reset() { + strength = 0.0f; + frame = 0.0f; + wind_direction = vec3_null; +} + +static float_t wind_apply_spc(wind* w, float_t frame) { + size_t count = w->count; + float_t value = 0.0f; + wind_spc* spc = w->spc; + for (size_t i = 0; i < count; i++, spc++) { + float_t power = (float_t)(1 << (int32_t)i) * frame; + value += cosf(power) * spc->cos + sinf(power) * spc->sin; + } + return value + w->bias; +} + +static void wind_ctrl(wind* w) { float_t value = wind_apply_spc(w, w->cycle * w->frame) * w->scale; mat4 mat = mat4_identity; mat4_rotate_y_mult(&mat, w->rot_y * DEG_TO_RAD_FLOAT, &mat); @@ -32,72 +105,29 @@ void wind_ctrl(wind* w) { w->frame = 0.0f; } -float_t wind_get_scale(wind* w) { - return w->scale; +TaskWind::TaskWind() { + ptr = new wind; } -void wind_set_scale(wind* w, float_t value) { - w->scale = value; +TaskWind:: ~TaskWind() { + delete ptr; } -float_t wind_get_cycle(wind* w) { - return w->cycle; +bool TaskWind::Init() { + return true; } -void wind_set_cycle(wind* w, float_t value) { - w->cycle = value; +bool TaskWind::Ctrl() { + //if (!pv_osage_manager_array_ptr_get_disp()) + wind_ctrl(ptr); + return false; } -void wind_get_rot(wind* w, vec2* value) { - value->x = w->rot_y; - value->y = w->rot_z; +bool TaskWind::Dest() { + ptr->reset(); + return true; } -void wind_set_rot(wind* w, vec2* value) { - w->rot_y = value->x; - w->rot_z = value->y; -} - -float_t wind_get_rot_y(wind* w) { - return w->rot_y; -} - -void wind_set_rot_y(wind* w, float_t value) { - w->rot_y = value; -} - -float_t wind_get_rot_z(wind* w) { - return w->rot_z; -} - -void wind_set_rot_z(wind* w, float_t value) { - w->rot_z = value; -} - -float_t wind_get_bias(wind* w) { - return w->bias; -} - -void wind_set_bias(wind* w, float_t value) { - w->bias = value; -} - -void wind_reset(wind* w) { - w->strength = 0.0f; - w->frame = 0.0f; -} - -void wind_free(wind* w) { - free(w); -} - -static float_t wind_apply_spc(wind* wind, float_t frame) { - size_t count = wind->count; - float_t value = 0.0f; - wind_spc* spc = wind->spc; - for (size_t i = 0; i < count; i++, spc++) { - float_t power = (float_t)(1 << (int32_t)i) * frame; - value += cosf(power) * spc->cos + sinf(power) * spc->sin; - } - return value + wind->bias; +void TaskWind::Disp() { + //pv_osage_manager_array_ptr_get_disp(); } diff --git a/src/CRE/light_param/wind.h b/src/CRE/light_param/wind.h index cf5263fb..dc5c9023 100644 --- a/src/CRE/light_param/wind.h +++ b/src/CRE/light_param/wind.h @@ -9,13 +9,15 @@ #include "../../KKdLib/light_param/wind.h" #include "../../KKdLib/vec.h" #include "../static_var.h" +#include "../task.h" typedef struct wind_spc { float_t cos; float_t sin; } wind_spc; -typedef struct wind { +class wind { +public: float_t scale; float_t cycle; float_t rot_y; @@ -26,21 +28,35 @@ typedef struct wind { vec3 wind_direction; float_t frame; float_t strength; -} wind; -extern wind* wind_init(); -extern void wind_ctrl(wind* w); -extern float_t wind_get_scale(wind* w); -extern void wind_set_scale(wind* w, float_t value); -extern float_t wind_get_cycle(wind* w); -extern void wind_set_cycle(wind* w, float_t value); -extern void wind_get_rot(wind* w, vec2* value); -extern void wind_set_rot(wind* w, vec2* value); -extern float_t wind_get_rot_y(wind* w); -extern void wind_set_rot_y(wind* w, float_t value); -extern float_t wind_get_rot_z(wind* w); -extern void wind_set_rot_z(wind* w, float_t value); -extern float_t wind_get_bias(wind* w); -extern void wind_set_bias(wind* w, float_t value); -extern void wind_reset(wind* w); -extern void wind_free(wind* w); + wind(); + ~wind(); + + float_t get_scale(); + void set_scale(float_t value); + float_t get_cycle(); + void set_cycle(float_t value); + void get_rot(vec2* value); + void set_rot(vec2* value); + float_t get_rot_y(); + void set_rot_y(float_t value); + float_t get_rot_z(); + void set_rot_z(float_t value); + float_t get_bias(); + void set_bias(float_t value); + void reset(); +}; + +class TaskWind : public Task { +public: + wind* ptr; + + TaskWind(); + virtual ~TaskWind() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; +}; + +extern TaskWind task_wind; diff --git a/src/CRE/lock.c b/src/CRE/lock.c index 53108e86..deec2d44 100644 --- a/src/CRE/lock.c +++ b/src/CRE/lock.c @@ -18,33 +18,3 @@ inline void lock_free(lock* l) { DeleteCriticalSection(&l->cs); l->init = FALSE; } - -inline bool lock_data_init(lock_data* ld, lock* l, - void* data, void(*free_func)(void* data)) { - if (ld->lock_free && ld->lock_free != free_func) { - lock* lock = ld->lock; - lock_lock(lock); - ld->lock_free(ld->lock_data); - lock_unlock(lock); - - if (ld->lock_free) - return false; - } - else if (ld->lock_free) - ld->lock_free(ld->lock_data); - - ld->lock = l; - ld->lock_data = data; - ld->lock_free = free_func; - return true; -} - -inline bool lock_data_free(lock_data* ld, void(*free_func)(void* data)) { - if (ld->lock_free != free_func) - return false; - - ld->lock = 0; - ld->lock_data = 0; - ld->lock_free = 0; - return true; -} \ No newline at end of file diff --git a/src/CRE/lock.h b/src/CRE/lock.h index 53abc3bd..21876357 100644 --- a/src/CRE/lock.h +++ b/src/CRE/lock.h @@ -32,7 +32,3 @@ LeaveCriticalSection(&(val)->cs); \ extern void lock_init(lock* l); extern bool lock_check_init(lock* l); extern void lock_free(lock* l); - -extern bool lock_data_init(lock_data* ld, lock* l, - void* data, void(*free_func)(void* data)); -extern bool lock_data_free(lock_data* ld, void(*free_func)(void* data)); diff --git a/src/CRE/object.c b/src/CRE/object.c index b42ad319..b334913b 100644 --- a/src/CRE/object.c +++ b/src/CRE/object.c @@ -70,8 +70,8 @@ static size_t obj_vertex_flags_get_vertex_size(obj_vertex_flags flags); static size_t obj_vertex_flags_get_vertex_size_comp(obj_vertex_flags flags); static size_t object_vertex_flags_get_vertex_size(object_vertex_flags flags); static size_t object_vertex_flags_get_vertex_size_comp(object_vertex_flags flags); -static bool object_set_load_file(void* data, char* path, char* file, uint32_t hash); -static bool object_set_load_file_modern(void* data, char* path, char* file, uint32_t hash); +static bool object_set_load_file(void* data, const char* path, const char* file, uint32_t hash); +static bool object_set_load_file_modern(void* data, const char* path, const char* file, uint32_t hash); vector_old_func(object_storage) @@ -85,7 +85,7 @@ void object_set_init(object_set* set) { } void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_file, - texture_database* tex_db, string* name, uint32_t id, bool compressed) { + texture_database* tex_db, const char* name, uint32_t id, bool compressed) { if (!set || !obj_set_file || !txp_set_file || !tex_db || !name) return; @@ -124,7 +124,7 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi string_init_length(name, buf, len); } - string_copy(name, &set->name); + string_init(&set->name, name); set->id = id; set->hash = hash_string_murmurhash(&set->name, 0, false); @@ -668,8 +668,8 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi osage->nodes_count = nodes_count; osage->nodes = force_malloc_s(object_skin_osage_node, nodes_count); for (int32_t k = 0; k < nodes_count; k++) { - object_skin_osage_node* node = &osage->nodes[j]; - object_skin_osage_node_file* node_file = &osage_file->nodes[j]; + object_skin_osage_node* node = &osage->nodes[k]; + object_skin_osage_node_file* node_file = &osage_file->nodes[k]; node->name_index = node_file->name_index; node->length = node_file->length; @@ -693,12 +693,12 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi osage_sibling_info->name_index = osage_sibling_info_file->name_index; osage_sibling_info->sibling_name_index = osage_sibling_info_file->sibling_name_index; - osage_sibling_info->distance = osage_sibling_info_file->distance; + osage_sibling_info->max_distance = osage_sibling_info_file->max_distance; } skin->ex_data_init = true; } - int32_t textures_count = (int32_t)vector_old_length(*txp_set_file); + int32_t textures_count = (int32_t)txp_set_file->textures.size(); set->textures_count = textures_count; set->textures = force_malloc_s(GLuint, textures_count); texture_txp_set_load(txp_set_file, &set->texture_data, set->texture_ids); @@ -715,7 +715,7 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi bool object_set_load_db_entry(object_set_info** set_info, void* data, object_database* obj_db, char* name) { - if (!object_database_get_object_set_info(obj_db, name, set_info)) + if (!obj_db->get_object_set_info(name, set_info)) return false; else if (object_storage_get_object_set((*set_info)->id)) { object_storage_append_object_set((*set_info)->id); @@ -725,13 +725,13 @@ bool object_set_load_db_entry(object_set_info** set_info, size_t temp[2]; temp[0] = (size_t)data; temp[1] = (size_t)*set_info; - return data_struct_load_file((data_struct*)data, temp, "rom/objset/", - string_data(&(*set_info)->archive_file_name), object_set_load_file); + return ((data_struct*)data)->load_file(temp, "rom/objset/", + (*set_info)->archive_file_name.c_str(), object_set_load_file); } bool object_set_load_db_entry(object_set_info** set_info, void* data, object_database* obj_db, const char* name) { - if (!object_database_get_object_set_info(obj_db, name, set_info)) + if (!obj_db->get_object_set_info(name, set_info)) return false; else if (object_storage_get_object_set((*set_info)->id)) { object_storage_append_object_set((*set_info)->id); @@ -741,8 +741,8 @@ bool object_set_load_db_entry(object_set_info** set_info, size_t temp[2]; temp[0] = (size_t)data; temp[1] = (size_t)*set_info; - return data_struct_load_file((data_struct*)data, temp, "rom/objset/", - string_data(&(*set_info)->archive_file_name), object_set_load_file); + return ((data_struct*)data)->load_file(temp, "rom/objset/", + (*set_info)->archive_file_name.c_str(), object_set_load_file); } bool object_set_load_by_db_entry(object_set_info* set_info, @@ -755,13 +755,13 @@ bool object_set_load_by_db_entry(object_set_info* set_info, size_t temp[2]; temp[0] = (size_t)data; temp[1] = (size_t)set_info; - return data_struct_load_file((data_struct*)data, temp, "rom/objset/", - string_data(&set_info->archive_file_name), object_set_load_file); + return ((data_struct*)data)->load_file(temp, "rom/objset/", + set_info->archive_file_name.c_str(), object_set_load_file); } bool object_set_load_by_db_index(object_set_info** set_info, void* data, object_database* obj_db, uint32_t set_id) { - if (!object_database_get_object_set_info_by_set_id(obj_db, set_id, set_info)) + if (!obj_db->get_object_set_info_by_set_id(set_id, set_info)) return false; else if (object_storage_get_object_set(set_id)) { object_storage_append_object_set(set_id); @@ -771,8 +771,8 @@ bool object_set_load_by_db_index(object_set_info** set_info, size_t temp[2]; temp[0] = (size_t)data; temp[1] = (size_t)*set_info; - return data_struct_load_file((data_struct*)data, temp, "rom/objset/", - string_data(&(*set_info)->archive_file_name), object_set_load_file); + return ((data_struct*)data)->load_file(temp, "rom/objset/", + (*set_info)->archive_file_name.c_str(), object_set_load_file); } bool object_set_load_by_hash(void* data, @@ -780,7 +780,7 @@ bool object_set_load_by_hash(void* data, size_t temp[2]; temp[0] = (size_t)obj_db; temp[1] = (size_t)tex_db; - return data_struct_load_file_by_hash((data_struct*)data, temp, "rom/objset/", + return ((data_struct*)data)->load_file_by_hash(temp, "rom/objset/", hash, object_set_load_file_modern); } @@ -1250,6 +1250,13 @@ inline GLuint* object_storage_get_textures(uint32_t set_id) { return 0; } +inline int32_t object_storage_get_textures_count(uint32_t set_id) { + for (object_storage* i = object_storage_data.begin; i != object_storage_data.end; i++) + if (i->set_id == set_id) + return i->set.textures_count; + return 0; +} + inline uint32_t* object_storage_get_texture_ids(uint32_t set_id) { for (object_storage* i = object_storage_data.begin; i != object_storage_data.end; i++) if (i->set_id == set_id) @@ -1257,6 +1264,13 @@ inline uint32_t* object_storage_get_texture_ids(uint32_t set_id) { return 0; } +inline int32_t object_storage_get_texture_ids_count(uint32_t set_id) { + for (object_storage* i = object_storage_data.begin; i != object_storage_data.end; i++) + if (i->set_id == set_id) + return i->set.texture_ids_count; + return 0; +} + inline void object_storage_delete_object_set(uint32_t set_id) { for (object_storage* i = object_storage_data.begin; i != object_storage_data.end; i++) if (i->set_id == set_id) { @@ -1543,7 +1557,7 @@ inline static size_t object_vertex_flags_get_vertex_size_comp(object_vertex_flag return size; } -static bool object_set_load_file(void* data, char* path, char* file, uint32_t hash) { +static bool object_set_load_file(void* data, const char* path, const char* file, uint32_t hash) { data_struct* ds = (data_struct*)((size_t*)data)[0]; data_ft* d = &ds->data_ft; @@ -1553,32 +1567,27 @@ static bool object_set_load_file(void* data, char* path, char* file, uint32_t ha if (!farc::load_file(&f, path, file, hash)) return false; - farc_file* obj = f.read_file(string_data(&set_info->object_file_name)); - farc_file* tex = f.read_file(string_data(&set_info->texture_file_name)); + farc_file* obj = f.read_file(set_info->object_file_name.c_str()); + farc_file* tex = f.read_file(set_info->texture_file_name.c_str()); if (obj && tex) { obj_set obj_set; - obj_init(&obj_set); - obj_mread(&obj_set, obj->data, obj->size, false); + obj_set.unpack_file(obj->data, obj->size, false); txp_set txp_set; - txp_set_init(&txp_set); - txp_set_unpack_file(&txp_set, tex->data, false); + txp_set.unpack_file(tex->data, false); if (obj_set.ready) { object_set object_set; object_set_init(&object_set); - object_set_load(&object_set, &obj_set, &txp_set, &d->tex_db, &set_info->name, set_info->id, false); + object_set_load(&object_set, &obj_set, &txp_set, &d->tex_db, set_info->name.c_str(), set_info->id, false); object_storage_insert_object_set(&object_set, set_info->id); } - - obj_free(&obj_set); - txp_set_free(&txp_set); } return true; } -static bool object_set_load_file_modern(void* data, char* path, char* file, uint32_t hash) { +static bool object_set_load_file_modern(void* data, const char* path, const char* file, uint32_t hash) { object_database* obj_db = (object_database*)((size_t*)data)[0]; texture_database* tex_db = (texture_database*)((size_t*)data)[1]; @@ -1608,21 +1617,19 @@ static bool object_set_load_file_modern(void* data, char* path, char* file, uint if (osd && txd && osi && txi) { obj_set obj_set; - obj_init(&obj_set); - obj_mread(&obj_set, osd->data, osd->size, true); + obj_set.unpack_file(osd->data, osd->size, true); txp_set txp_set; - txp_set_init(&txp_set); - txp_set_unpack_file_modern(&txp_set, txd->data, txd->size); + txp_set.unpack_file_modern(txd->data, txd->size); - object_database_mread(obj_db, osi->data, osi->size, true); + obj_db->read(osi->data, osi->size, true); tex_db->read(txi->data, txi->size, true); - string* name = 0; + std::string* name = 0; if (obj_db->ready) - for (object_set_info* m = obj_db->object_set.begin; m != obj_db->object_set.end; m++) - if (m->id == hash) { - name = &m->name; + for (object_set_info& m : obj_db->object_set) + if (m.id == hash) { + name = &m.name; break; } @@ -1630,14 +1637,11 @@ static bool object_set_load_file_modern(void* data, char* path, char* file, uint if (!object_storage_get_object_set(hash)) { object_set object_set; object_set_init(&object_set); - object_set_load(&object_set, &obj_set, &txp_set, tex_db, name, hash, false); + object_set_load(&object_set, &obj_set, &txp_set, tex_db, name->c_str(), hash, false); object_storage_insert_object_set(&object_set, hash); } else object_storage_append_object_set(hash); - - obj_free(&obj_set); - txp_set_free(&txp_set); } return true; } diff --git a/src/CRE/object.h b/src/CRE/object.h index 9cb197cf..4ee7b3ca 100644 --- a/src/CRE/object.h +++ b/src/CRE/object.h @@ -469,8 +469,6 @@ typedef struct object_skin_osage_node { uint32_t name_index; float_t length; vec3 rotation; - uint32_t sibling_name_index; - float_t sibling_max_distance; } object_skin_osage_node; typedef struct object_skin_block_osage { @@ -499,7 +497,7 @@ typedef struct object_skin_block { typedef struct object_skin_osage_sibling_info { uint32_t name_index; uint32_t sibling_name_index; - float_t distance; + float_t max_distance; } object_skin_osage_sibling_info; typedef struct object_skin_ex_data { @@ -582,7 +580,7 @@ typedef struct object_set { extern void object_set_init(object_set* set); extern void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_file, - texture_database* tex_db, string* name, uint32_t id, bool compressed); + texture_database* tex_db, const char* name, uint32_t id, bool compressed); extern bool object_set_load_db_entry(object_set_info** set_info, void* data, object_database* obj_db, char* name); extern bool object_set_load_db_entry(object_set_info** set_info, @@ -629,6 +627,8 @@ extern object_mesh_index_buffer* object_storage_get_object_mesh_index_buffer(obj extern object_vertex_buffer* object_storage_get_object_vertex_buffers(uint32_t set_id); extern object_mesh_vertex_buffer* object_storage_get_object_mesh_vertex_buffer(object_info obj_info); extern GLuint* object_storage_get_textures(uint32_t set_id); +extern int32_t object_storage_get_textures_count(uint32_t set_id); extern uint32_t* object_storage_get_texture_ids(uint32_t set_id); +extern int32_t object_storage_get_texture_ids_count(uint32_t set_id); extern void object_storage_delete_object_set(uint32_t set_id); extern void object_storage_free(); diff --git a/src/CRE/post_process.c b/src/CRE/post_process.c index 601049c1..08bdd6a3 100644 --- a/src/CRE/post_process.c +++ b/src/CRE/post_process.c @@ -89,7 +89,7 @@ void post_process_apply(post_process_struct* pp, camera* cam, texture* light_pro (mat4*)&mat4_identity, (mat4*)&mat4_identity, (mat4*)&mat4_identity); post_process_get_blur(pp->blur, &pp->rend_texture); - post_process_get_exposure(pp->exposure, pp->reset_exposure, + post_process_get_exposure(pp->exposure, cam, pp->render_width, pp->render_height, pp->reset_exposure, pp->blur->tex[4].color_texture->texture, pp->blur->tex[2].color_texture->texture); post_process_apply_tone_map(pp->tone_map, &pp->rend_texture, light_proj_tex, 0, &pp->rend_texture, &pp->buf_texture, &pp->sss_contour_texture, @@ -295,6 +295,7 @@ void post_process_reset(post_process_struct* pp) { vec3 tone_trans_end = { 1.0f, 1.0f, 1.0f }; post_process_tone_map_initialize_data(pp->tone_map, 2.0f, true, 1.0f, 1, 1.0f, &scene_fade_color, 0.0f, 0, &tone_trans_start, &tone_trans_end, TONE_MAP_YCC_EXPONENT); + pp->reset_exposure = true; } void post_process_update(post_process_struct* pp, camera* cam) { diff --git a/src/CRE/post_process.h b/src/CRE/post_process.h index 56f09cf3..eadb3199 100644 --- a/src/CRE/post_process.h +++ b/src/CRE/post_process.h @@ -47,6 +47,16 @@ typedef struct post_process_struct { post_process_tone_map* tone_map; GLuint samplers[2]; shader_glsl alpha_layer_shader; + GLuint lens_flare_texture; + GLuint lens_shaft_texture; + GLuint lens_ghost_texture; + int32_t lens_flare_count; + vec3 lens_flare_pos; + float_t lens_shaft_scale; + float_t lens_shaft_inv_scale; + float_t lens_flare_power; + float_t field_A10; + float_t lens_flare_appear_power; int32_t render_width; int32_t render_height; vec3 view_point; diff --git a/src/CRE/post_process/dof.c b/src/CRE/post_process/dof.c index 89816f9c..a2563198 100644 --- a/src/CRE/post_process/dof.c +++ b/src/CRE/post_process/dof.c @@ -6,7 +6,7 @@ #include "dof.h" #include "../../KKdLib/str_utils.h" #include "../gl_state.h" -#include "../camera.h" +#include "../rob.h" typedef struct post_process_dof_shader_data { vec4 g_depth_params; @@ -573,7 +573,7 @@ static const char* dof_frag_shader_step_5 = static const dof_debug dof_debug_default = { (dof_debug_flags)0, 10.0f, - 40.0f, + 0.04f, 1.4f, { 10.0f, @@ -617,6 +617,8 @@ static void post_process_dof_update_data(post_process_dof* dof, float_t min_dist float_t max_dist, float_t fov, float_t dist, float_t focal_length, float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio); +static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat); + post_process_dof* post_process_dof_init() { post_process_dof* dof = force_malloc_s(post_process_dof, 1); post_process_dof_load_shaders(dof); @@ -633,25 +635,38 @@ void post_process_apply_dof(post_process_dof* dof, if (dof->data.debug.flags & DOF_DEBUG_ENABLE_DOF) { if (dof->data.debug.flags & DOF_DEBUG_ENABLE_PHYS_DOF) { float_t dist_to_focus = dof->data.debug.distance_to_focus; - if (dof->data.debug.flags & DOF_DEBUG_AUTO_FOCUS && false) { - mat4 view_transpose; - mat4_transpose(&cam->view, &view_transpose); - vec3 chara_trans = vec3_null; - vec3_dot(cam->view_point, chara_trans, dist_to_focus); - dist_to_focus = -dist_to_focus - 0.1f; + if (dof->data.debug.flags & DOF_DEBUG_AUTO_FOCUS) { + rob_chara* rob_chr = 0; + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { + rob_chara* rob_chr = rob_chara_array_get(i); + if (!(rob_chr->data.field_0 & 1)) + continue; + + mat4 mat; + sub_1405163C0(rob_chr, 4, &mat); + + vec3 chara_trans = vec3_null; + mat4_get_translation(&mat, &chara_trans); + + mat4 view_transpose; + mat4_transpose(&cam->view, &view_transpose); + vec3_dot(*(vec3*)&view_transpose.row2, chara_trans, dist_to_focus); + dist_to_focus = -dist_to_focus - view_transpose.row2.w - 0.1f; + break; + } } dist_to_focus = max(dist_to_focus, (float_t)cam->min_distance); post_process_apply_dof_physical(dof, rt, samplers, rt->color_texture->texture, rt->depth_texture->texture, - (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov, dist_to_focus, - dof->data.debug.focal_length, dof->data.debug.f_number); + (float_t)cam->min_distance, (float_t)cam->max_distance, dist_to_focus, + dof->data.debug.focal_length, (float_t)cam->fov_rad, dof->data.debug.f_number); } else { float_t fuzzing_range = max(dof->data.debug.f2.fuzzing_range, 0.01f); post_process_apply_dof_f2(dof, rt, samplers, rt->color_texture->texture, rt->depth_texture->texture, - (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov, + (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov_rad, dof->data.debug.f2.distance_to_focus, dof->data.debug.f2.focus_range, fuzzing_range, dof->data.debug.f2.ratio); use_dof_f2 = true; @@ -662,7 +677,7 @@ void post_process_apply_dof(post_process_dof* dof, float_t fuzzing_range = max(dof->data.pv.f2.fuzzing_range, 0.01f); post_process_apply_dof_f2(dof, rt, samplers, rt->color_texture->texture, rt->depth_texture->texture, - (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov, + (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov_rad, dof->data.pv.f2.distance_to_focus, dof->data.pv.f2.focus_range, fuzzing_range, dof->data.pv.f2.ratio); enum_or(dof->data.debug.flags, DOF_DEBUG_ENABLE_DOF); @@ -1022,14 +1037,14 @@ static void post_process_dof_update_data(post_process_dof* dof, float_t min_dist float_t fl = focal_length; if (dist <= focal_length) fl = dist + 0.1f; - fl *= fl * (1.0f / ((dist - fl) * f_number)); + fl = fl / (dist - fl) * fl / f_number; post_process_dof_shader_data data; - data.g_depth_params.x = (min_dist - max_dist) / (min_dist * max_dist); + data.g_depth_params.x = 1.0f / (min_dist * max_dist) * (min_dist - max_dist); data.g_depth_params.y = 1.0f / min_dist; - data.g_depth_params.z = -dist * data.g_depth_params.x * fl; - data.g_depth_params.w = (1.0f - dist * data.g_depth_params.y) * fl; - data.g_spread_scale.x = 720.0f / (tanf(fov * 0.5f) * 2.0f * min_dist); + data.g_depth_params.z = -((fl * dist * (min_dist - max_dist)) * (1.0f / (min_dist * max_dist))); + data.g_depth_params.w = (1.0f - 1.0f / min_dist * dist) * fl; + data.g_spread_scale.x = 720.0f / (tanf(fov * 0.5f) * (min_dist * 2.0f)); data.g_spread_scale.y = data.g_spread_scale.x * (float_t)(1.0 / 3.0); data.g_spread_scale.z = (float_t)(1.0 / 3.0); data.g_spread_scale.w = 3.0f; @@ -1042,6 +1057,11 @@ static void post_process_dof_update_data(post_process_dof* dof, float_t min_dist glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(post_process_dof_shader_data), &data); } +static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat) { + if (a2 >= 0 && a2 <= 26) + *mat = rob_chr->data.field_1E68.field_78[a2]; +} + void post_process_dof_initialize_data(post_process_dof* dof, dof_debug* debug, dof_pv* pv) { post_process_dof_set_dof_debug(dof, debug); post_process_dof_set_dof_pv(dof, pv); diff --git a/src/CRE/post_process/exposure.c b/src/CRE/post_process/exposure.c index afccd56f..6fe135d7 100644 --- a/src/CRE/post_process/exposure.c +++ b/src/CRE/post_process/exposure.c @@ -7,31 +7,161 @@ #include "../fbo.h" #include "../gl_state.h" #include "../post_process.h" +#include "../rob.h" #include "../shader_ft.h" +typedef struct struc_188 { + vec4u field_0[8]; + float_t field_80; + GLuint field_84[3]; + GLuint field_90[3]; +} struc_188; + static void post_process_exposure_free_fbo(post_process_exposure* exp); +static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat); post_process_exposure* post_process_exposure_init() { post_process_exposure* exp = force_malloc_s(post_process_exposure, 1); return exp; } -void post_process_get_exposure(post_process_exposure* exp, - bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1) { +void post_process_get_exposure(post_process_exposure* exp, camera* cam, int32_t render_width, + int32_t render_height, bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1) { if (!exp) return; - uniform_value[U_EXPOSURE] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); + struc_188 field_648[ROB_CHARA_COUNT]; + for (struc_188& i : field_648) + i = {}; + + bool v2 = false; + float_t v18 = (float_t)render_height / (float_t)render_width; + float_t v20 = powf(tanf((float_t)(cam->fov_rad * 0.5f)) * 3.4f, 2.0f); if (reset_exposure) - glViewport(0, 0, 32, 1); - else - glViewport(exp->exposure_history_counter, 0, 1, 1); - render_texture_bind(&exp->exposure_history, 0); - gl_state_active_bind_texture_2d(0, in_tex_0); - gl_state_active_bind_texture_2d(1, in_tex_1); - render_texture_draw_params(&shaders_ft, 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + goto LABEL_30; + + for (struc_188& i : field_648) { + rob_chara* rob_chr = rob_chara_array_get((int32_t)(&i - field_648)); + if (!rob_chr || !(rob_chr->data.field_0 & 1)) + continue; + + vec4 v34 = { 0.05f, 0.0f, -0.04f, 1.0f }; + vec4 v33 = { 1.0f, 0.0f, 0.0f, 0.0f }; + + mat4 v44; + sub_1405163C0(rob_chr, 4, &v44); + + mat4 v42 = cam->view; + mat4 v43 = cam->projection; + mat4_mult(&v44, &v42, &v42); + mat4_mult(&v42, &v43, &v43); + + vec4 v41; + mat4_mult_vec(&v42, &v34, &v41); + + vec4 v40; + mat4_mult_vec(&v43, &v34, &v40); + + float_t v11 = v41.z; + float_t v12 = 1.0f / v40.w; + float_t v13 = v40.x * v12; + float_t v14 = v40.y * v12; + if (v41.z >= 0.0f || fabsf(v13) >= 1.0f || fabsf(v14) >= 1.0f) + continue; + + float_t v31 = 0.5f - (fabsf(v14) - 1.0f) * 2.5f; + float_t v32 = 0.5f - (fabsf(v13) - 1.0f) * 2.5f; + float_t v16; + if (v32 <= v31) + v16 = v32; + else + v16 = v31; + v16 = min(v16, 1.0f); + + vec4 v39; + mat4_mult_vec(&v42, &v33, &v39); + + float_t v17 = (v39.z + 1.0f) * 0.5f; + v17 = clamp(v17, 0.0f, 0.8f); + float_t v21 = 0.25f / sqrtf(v20 * (v11 * v11)); + + float_t v22; + if (v21 >= 0.055f) { + v22 = 1.0f; + if (v21 > 0.5f) + v22 = 1.0f - (v21 - 0.5f) * (float_t)(10.0 / 3.0f); + } + else + v22 = (v21 - 0.035f) * 50.0f; + v22 = max(v22, 0.0f); + + float_t v23 = (v13 + 1.0f) * 0.5f; + float_t v24 = (v21 * -0.5f + v14 + 1.0f) * 0.5f; + float_t v25 = (v14 - v21 * 0.1f + 1.0f) * 0.5f; + + i.field_80 = v16 * 1.6f * v17 * v22; + i.field_0[0].x = v23; + i.field_0[0].y = (v21 * 0.1f + v14 + 1.0f) * 0.5f; + i.field_0[0].z = 0.0f; + i.field_0[0].w = 4.0f; + i.field_0[1].x = v23; + i.field_0[1].y = (v14 - v21 * 0.3f + 1.0f) * 0.5f; + i.field_0[1].z = 0.0f; + i.field_0[1].w = 4.0f; + i.field_0[2].x = (v21 * -0.5f * v18 + v13 + 1.0f) * 0.5f; + i.field_0[2].y = v24; + i.field_0[2].z = 0.0f; + i.field_0[2].w = 3.0f; + i.field_0[3].x = (v13 - v21 * 0.6f * v18 + 1.0f) * 0.5f; + i.field_0[3].y = v25; + i.field_0[3].z = 0.0f; + i.field_0[3].w = 2.0f; + i.field_0[4].x = (v21 * 0.6f * v18 + v13 + 1.0f) * 0.5f; + i.field_0[4].y = v25; + i.field_0[4].z = 0.0f; + i.field_0[4].w = 2.0f; + i.field_0[5].x = (v21 * 0.5f * v18 + v13 + 1.0f) * 0.5f; + i.field_0[5].y = v24; + i.field_0[5].z = 0.0f; + i.field_0[5].w = 3.0f; + i.field_0[6].x = v23; + i.field_0[6].y = (v14 - v21 * 0.8f + 1.0f) * 0.5f; + i.field_0[6].z = 0.0f; + i.field_0[6].w = 3.0f; + if (i.field_80 > 0.0f && false/*!i.field_90[pp->field_9F4]*/) + v2 = true; + } + + if (!v2 || reset_exposure) { + LABEL_30: + uniform_value[U_EXPOSURE] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); + shader_local_frag_set(&shaders_ft, 1, + field_648[0].field_80, + field_648[1].field_80, + field_648[2].field_80, + field_648[3].field_80); + + int32_t index = 0; + for (struc_188& i : field_648) { + shader_local_frag_set_ptr_array(&shaders_ft, 4ULL + index * 8ULL, 8, (vec4*)field_648->field_0); + if (++index >= 4) + break; + } + + if (reset_exposure) + glViewport(0, 0, 32, 1); + else + glViewport(exp->exposure_history_counter, 0, 1, 1); + render_texture_bind(&exp->exposure_history, 0); + gl_state_active_bind_texture_2d(0, in_tex_0); + gl_state_active_bind_texture_2d(1, in_tex_1); + render_texture_draw_params(&shaders_ft, + reset_exposure ? 32 : 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + exp->exposure_history_counter++; + exp->exposure_history_counter %= 32; + } uniform_value[U_EXPOSURE] = 2; render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); @@ -40,9 +170,6 @@ void post_process_get_exposure(post_process_exposure* exp, render_texture_bind(&exp->exposure, 0); gl_state_active_bind_texture_2d(0, exp->exposure_history.color_texture->texture); render_texture_draw_params(&shaders_ft, 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - - exp->exposure_history_counter++; - exp->exposure_history_counter %= 32; } void post_process_exposure_init_fbo(post_process_exposure* exp) { @@ -69,3 +196,8 @@ static void post_process_exposure_free_fbo(post_process_exposure* exp) { render_texture_free(&exp->exposure_history); render_texture_free(&exp->exposure); } + +static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat) { + if (a2 >= 0 && a2 <= 26) + *mat = rob_chr->data.field_1E68.field_78[a2]; +} diff --git a/src/CRE/post_process/exposure.h b/src/CRE/post_process/exposure.h index b6184d19..2b5ad74c 100644 --- a/src/CRE/post_process/exposure.h +++ b/src/CRE/post_process/exposure.h @@ -7,8 +7,9 @@ #include "../../KKdLib/default.h" #include "../../KKdLib/vec.h" -#include "../shared.h" +#include "../camera.h" #include "../render_texture.h" +#include "../shared.h" typedef struct post_process_exposure { render_texture exposure_history; @@ -17,7 +18,7 @@ typedef struct post_process_exposure { } post_process_exposure; extern post_process_exposure* post_process_exposure_init(); -extern void post_process_get_exposure(post_process_exposure* exp, - bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1); +extern void post_process_get_exposure(post_process_exposure* exp, camera* cam, int32_t render_width, + int32_t render_height, bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1); extern void post_process_exposure_init_fbo(post_process_exposure* exp); extern void post_process_exposure_dispose(post_process_exposure* exp); diff --git a/src/CRE/render_context.c b/src/CRE/render_context.c index d2f01593..d6bbb02b 100644 --- a/src/CRE/render_context.c +++ b/src/CRE/render_context.c @@ -280,6 +280,11 @@ inline void object_data_set_morph(object_data* object_data, object_info object, object_data->morph.object = object; } +inline void object_data_set_object_bounding_sphere_check_func(object_data* object_data, + bool(*func)(object_bounding_sphere*, camera*)) { + object_data->object_bounding_sphere_check_func = func; +} + inline void object_data_set_shadow_type(object_data* object_data, shadow_type_enum type) { if (type == SHADOW_CHARA || type == SHADOW_STAGE) object_data->shadow_type = type; @@ -348,7 +353,6 @@ inline render_context* render_context_init() { fog_init(&rctx->fog_data[i]); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) light_set_init(&rctx->light_set_data[i]); - rctx->wind = wind_init(); post_process_init(&rctx->post_process); return rctx; @@ -356,18 +360,26 @@ inline render_context* render_context_init() { extern float_t rob_frame; extern render_context* rctx_ptr; -extern wind* wind_ptr; inline void render_context_ctrl(render_context* rctx) { for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { - if (rob_chara_pv_data_array[i].field_0 == -1) + if (rob_chara_pv_data_array[i].type == ROB_CHARA_TYPE_NONE) continue; float_t frame = rob_chara_get_frame(&rob_chara_array[i]); float_t frame_count = rob_chara_get_frame_count(&rob_chara_array[i]); - frame += get_delta_frame(); - if (frame >= frame_count) - frame -= frame_count; + //frame += get_delta_frame(); + if (frame >= frame_count) { + frame = 0.0f; + rob_chara_item_equip* rob_item_equip = rob_chara_array[i].item_equip; + for (int32_t j = rob_item_equip->first_item_equip_object; + j < rob_item_equip->max_item_equip_object; j++) { + rob_chara_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[j]; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + if (i) + i->rob.osage_reset = true; + } + } //rob_chara_set_frame(&rob_chara_array[i], frame); rob_chara_set_frame(&rob_chara_array[i], rob_frame); rob_chara_array[i].item_equip->shadow_type = SHADOW_CHARA; @@ -385,17 +397,9 @@ inline void render_context_ctrl(render_context* rctx) { rctx_ptr = rctx; TaskWork::Ctrl(); - wind_ctrl(rctx->wind); - - wind_ptr = rctx->wind; - for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) - if (rob_chara_pv_data_array[i].field_0 != -1) - rob_chara_calc(&rob_chara_array[i]); file_handler_storage_ctrl(); - stage_ctrl((stage*)rctx->stage, rctx); - shadow_ctrl(rctx->draw_pass.shadow_ptr, rctx); draw_state_stats_update(&rctx->draw_state); object_data_reset(&rctx->object_data); @@ -405,12 +409,6 @@ inline void render_context_disp(render_context* rctx) { rctx_ptr = rctx; TaskWork::Disp(); - for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) - if (rob_chara_pv_data_array[i].field_0 != -1) - rob_chara_disp(&rob_chara_array[i], rctx); - - stage_disp((stage*)rctx->stage, rctx); - post_process_update(&rctx->post_process, rctx->camera); draw_pass_main(rctx); TaskWork::Basic(); @@ -612,7 +610,7 @@ void render_context_light_param_data_ibl_set(render_context* rctx, } void render_context_light_param_data_wind_set(render_context* rctx, light_param_wind* w) { - wind* wind = rctx->wind; + wind* wind = task_wind.ptr; if (w->has_scale) wind->scale = w->scale; @@ -677,7 +675,6 @@ inline void render_context_free(render_context* rctx) { object_data_free(&rctx->object_data); glDeleteVertexArrays(1, &rctx->vao); - wind_free(rctx->wind); post_process_free(&rctx->post_process); free(rctx); } @@ -754,7 +751,7 @@ static void object_data_init(object_data* data) { data->object_sort = true; data->chara_color = true; data->morph.value = 0.0f; - data->morph.object = object_info_null; + data->morph.object = object_info(); data->object_bounding_sphere_check_func = 0; data->buffer.offset = 0; diff --git a/src/CRE/render_context.h b/src/CRE/render_context.h index fa85f92a..d5914b62 100644 --- a/src/CRE/render_context.h +++ b/src/CRE/render_context.h @@ -419,7 +419,7 @@ typedef struct object_data { float_t wet_param; int32_t texture_transform_count; texture_transform_struct texture_transform_array[TEXTURE_TRANSFORM_COUNT]; - bool(*object_bounding_sphere_check_func)(object_bounding_sphere*); + bool(*object_bounding_sphere_check_func)(object_bounding_sphere*, camera*); } object_data; struct render_context { @@ -433,9 +433,7 @@ struct render_context { fog fog_data[FOG_MAX]; light_proj* litproj; light_set light_set_data[LIGHT_SET_MAX]; - wind* wind; - void* stage; data_struct* data; post_process_struct post_process; bool chara_reflect; @@ -515,6 +513,8 @@ extern float_t object_data_get_wet_param(object_data* object_data); extern void object_data_set_chara_color(object_data* object_data, bool value); extern void object_data_set_draw_task_flags(object_data* object_data, draw_task_flags flags); extern void object_data_set_morph(object_data* object_data, object_info object, float_t value); +extern void object_data_set_object_bounding_sphere_check_func(object_data* object_data, + bool(*func)(object_bounding_sphere*, camera*)); extern void object_data_set_shadow_type(object_data* object_data, shadow_type_enum type); extern void object_data_set_texture_color_coeff(object_data* object_data, vec4* value); extern void object_data_set_texture_color_offset(object_data* object_data, vec4* value); diff --git a/src/CRE/render_texture.c b/src/CRE/render_texture.c index 3d5d0632..78c11e35 100644 --- a/src/CRE/render_texture.c +++ b/src/CRE/render_texture.c @@ -35,12 +35,14 @@ int32_t render_texture_init(render_texture* rt, int32_t width, int32_t height, render_texture_counter++; color_texture = rt->color_texture->texture; + gl_state_bind_texture_2d(rt->color_texture->texture); if (color_format == GL_RGBA32F) { - gl_state_bind_texture_2d(rt->color_texture->texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl_state_bind_texture_2d(0); } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + gl_state_bind_texture_2d(0); } else { rt->color_texture = 0; diff --git a/src/CRE/rob.c b/src/CRE/rob.c index cac65b56..fc7e91a5 100644 --- a/src/CRE/rob.c +++ b/src/CRE/rob.c @@ -10,43 +10,20 @@ #include "../KKdLib/str_utils.h" vector_old_func(bone_data) -vector_old_func(bone_node) -vector_old_ptr_func(ExConstraintBlock) -vector_old_ptr_func(ExClothBlock) -vector_old_ptr_func(ExExpressionBlock) -vector_old_ptr_func(ExOsageBlock) -vector_old_ptr_func(ExNodeBlock) -vector_old_ptr_func(ExNullBlock) vector_old_func(ex_data_name_bone_index) -vector_old_func(item_sub_data_item_change) -vector_old_func(item_sub_data_texture_change) -vector_old_func(item_sub_data_texture_change_tex) vector_old_func(mot_key_set) -vector_old_ptr_func(motion_blend_mot) -vector_old_func(osage_coli) -vector_old_func(pair_int32_t_object_info) -vector_old_func(pair_name_ExOsageBlock) -vector_old_func(pair_object_info_item_id) -vector_old_func(pair_uint32_t_ptr_rob_osage_node) -vector_old_ptr_func(rob_chara) -vector_old_func(rob_osage_node) -vector_old_ptr_func(rob_osage_node) -vector_old_func(skin_param_osage_node) -vector_old_func(skin_param_osage_root_boc) -vector_old_func(skin_param_osage_root_coli) -vector_old_func(skin_param_osage_root_normal_ref) -vector_old_func(struc_215) -vector_old_func(struc_294) -vector_old_func(struc_331) -vector_old_func(struc_373) #define SKP_TEXT_BUF_SIZE 0x400 -typedef struct motion_storage { +class motion_storage { +public: uint32_t set_id; int32_t count; mot_set set; -} motion_storage; + + motion_storage(); + ~motion_storage(); +}; typedef struct exp_func_op1 { const char* name; @@ -63,7 +40,293 @@ typedef struct exp_func_op3 { float_t(*func)(float_t v1, float_t v2, float_t v3); } exp_func_op3; -vector_old(motion_storage) +typedef struct rob_cmn_mottbl_sub_header { + int32_t data_offset; + int32_t field_4; +} rob_cmn_mottbl_sub_header; + +typedef struct rob_cmn_mottbl_header { + int32_t chara_count; + int32_t mottbl_indices_count; + int32_t subheaders_offset; +} rob_cmn_mottbl_header; + +class ReqData { +public: + chara_index chara_index; + int32_t count; + + ReqData(::chara_index chara_index, int32_t count); + virtual ~ReqData(); + virtual void Reset(); +}; + +class ReqDataObj : public ReqData { +public: + item_sub_data data; + + ReqDataObj(::chara_index chara_index, int32_t count); + virtual ~ReqDataObj() override; + virtual void Reset() override; +}; + +class osage_set_motion { +public: + int32_t motion_id; + std::vector> frames; + + osage_set_motion(); + ~osage_set_motion(); +}; + +class pv_data_set_motion { +public: + int32_t motion_id; + std::pair frame_stage_index; + + pv_data_set_motion(); + ~pv_data_set_motion(); +}; + +class PvOsageManager : public Task { +public: + int32_t state; + int32_t chara_id; + bool reset; + int32_t field_74; + uint32_t motion_index; + std::vector pv_set_motion; + std::vector osage_set_motion; + void* pv;//pv_db_pv* pv; + std::map reset_frames_list; + std::thread* thread; + std::condition_variable cnd; + bool disp; + bool not_reset; + bool exit; + int32_t field_D4; + std::mutex mtx; + std::mutex disp_mtx; + std::mutex not_reset_mtx; + std::mutex exit_mtx; + + PvOsageManager(); + virtual ~PvOsageManager() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + + bool GetDisp(); + void Reset(); + void SetNotResetTrue(); + + bool sub_1404F7AF0(); + void sub_1404F7BD0(bool not_reset); + void sub_1404F82F0(); + + static void ThreadMain(PvOsageManager* pv_osg_mgr); +}; + +typedef struct RobThread { + rob_chara* data; + void(*func)(rob_chara*); +} RobThread; + +class RobThreadParent { +public: + bool exit; + std::thread* thread; + std::mutex mtx; + std::mutex threads_mtx; + std::condition_variable cnd; + std::mutex field_28; + std::condition_variable field_30; + std::list threads; + + RobThreadParent(); + ~RobThreadParent(); + + void AppendRobCharaFunc(rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)); + void AppendRobThread(RobThread* thread); + bool CheckThreadsNotNull(); + void sub_14054E0D0(); + void sub_14054E370(); + + static void ThreadMain(RobThreadParent* rob_thrd_parent); +}; + +class RobThreadHandler { +public: + RobThreadParent* arr[6]; + + RobThreadHandler(); + ~RobThreadHandler(); + + void AppendRobCharaFunc(int32_t chara_id, rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)); + void sub_14054E3F0(); +}; + +class TaskRobLoad : public Task { +public: + bool field_68; + int32_t field_6C; + std::list load_req_data_obj; + std::list free_req_data_obj; + std::list load_item_req_data_obj; + std::list loaded_req_data_obj; + std::list load_req_data; + std::list free_req_data; + std::list load_item_req_data; + std::list loaded_req_data; + int32_t field_F0; + + TaskRobLoad(); + virtual ~TaskRobLoad() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; +}; + +class RobImplTask : public Task { +public: + std::list init_chara; + std::list ctrl_chara; + std::list free_chara; + + RobImplTask(); + virtual ~RobImplTask() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + virtual bool CheckType(rob_chara_type type) = 0; + virtual bool Field38() = 0; + + void AppendList(rob_chara* rob_chr, std::list* list); + void AppendCtrlCharaList(rob_chara* rob_chr); + void AppendFreeCharaList(rob_chara* rob_chr); + void AppendInitCharaList(rob_chara* rob_chr); + void FreeList(int8_t* chara_id, std::list* list); + void FreeCharaLists(); + void FreeCtrlCharaList(int8_t* chara_id); + void FreeFreeCharaList(int8_t* chara_id); + void FreeInitCharaList(int8_t* chara_id); +}; + +class TaskRobPrepareControl : public RobImplTask { +public: + TaskRobPrepareControl(); + virtual ~TaskRobPrepareControl() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobPrepareAction : public RobImplTask { +public: + TaskRobPrepareAction(); + virtual ~TaskRobPrepareAction() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobBase : public RobImplTask { +public: + TaskRobBase(); + virtual ~TaskRobBase() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobCollision : public RobImplTask { +public: + TaskRobCollision(); + virtual ~TaskRobCollision() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobInfo : public RobImplTask { +public: + TaskRobInfo(); + virtual ~TaskRobInfo() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobMotionModifier : public RobImplTask { +public: + TaskRobMotionModifier(); + virtual ~TaskRobMotionModifier() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobDisp : public RobImplTask { +public: + TaskRobDisp(); + virtual ~TaskRobDisp() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + virtual bool CheckType(rob_chara_type type) override; + virtual bool Field38() override; +}; + +class TaskRobManager : public Task { +public: + int32_t field_68; + int32_t state; + TaskRobPrepareControl prepare_control; + TaskRobPrepareAction prepare_action; + TaskRobBase base; + TaskRobCollision collision; + TaskRobInfo info; + TaskRobMotionModifier motion_modifier; + TaskRobDisp disp; + std::list init_chara; + std::list load_chara; + std::list free_chara; + std::list loaded_chara; + + TaskRobManager(); + virtual ~TaskRobManager() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + + void AppendFreeCharaList(rob_chara* rob_chr); + void AppendInitCharaList(rob_chara* rob_chr); + void AppendLoadedCharaList(rob_chara* rob_chr); + bool CheckHasRobCharaLoad(rob_chara* rob_chr); + void CheckTypeAppendInitCharaLists(std::list* rob_chr_list); + void FreeLoadedCharaList(int8_t* chara_id); +}; + +typedef struct rob_manager_rob_impl { + RobImplTask* task; + const char* name; +} rob_manager_rob_impl; static bone_data* bone_data_init(bone_data* bone); static float_t bone_data_limit_angle(float_t angle); @@ -82,14 +345,13 @@ static float_t* bone_node_get_exp_data_component(bone_node* a1, static void bone_data_parent_data_init(bone_data_parent* bone, rob_chara_bone_data* rob_bone_data, bone_database* bone_data); static void bone_data_parent_load_bone_database(bone_data_parent* bone, - vector_old_bone_database_bone* bones, vec3* common_translation, vec3* translation); + std::vector* bones, vec3* common_translation, vec3* translation); static void bone_data_parent_load_rob_chara(bone_data_parent* bone); static void bone_data_parent_reset(bone_data_parent* bone); static void bone_data_parent_free(bone_data_parent* bone); static void bone_node_expression_data_mat_set(bone_node_expression_data* data, vec3* parent_scale, mat4* ex_data_mat, mat4* mat); -static void bone_node_expression_data_reset_position_rotation(bone_node_expression_data* data); static void bone_node_expression_data_reset_scale(bone_node_expression_data* data); static void bone_node_expression_data_set_position_rotation(bone_node_expression_data* data, float_t position_x, float_t position_y, float_t position_z, @@ -139,42 +401,73 @@ static float_t exp_tan(float_t v1); static const float_t get_osage_gravity_const(); -static void item_sub_data_texture_change_free(item_sub_data_texture_change* tex_chg); - -static void item_sub_data_texture_change_tex_free(item_sub_data_texture_change_tex* tex_chg_tex); +static void mot_blend_interpolate(mot_blend* a1, vector_old_bone_data* bones, + vector_old_uint16_t* bone_indices, bone_database_skeleton_type skeleton_type); +static void mot_blend_load_motion(mot_blend* a1, int32_t motion_id, motion_database* mot_db); +static void mot_blend_reset(mot_blend* a1); +static void mot_blend_set_duration(mot_blend* a1, float_t duration, float_t step, float_t offset); +static void mot_blend_set_frame(mot_blend* a1, float_t frame); static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, mot_key_set* a4, uint32_t key_set_count, struc_369* a6); static uint32_t mot_load_last_key_calc(uint16_t keys_count); static bool mot_data_load_file(mot* a1, mot_data* a2); -static void mot_parent_get_key_set_count_by_bone_database_bones(mot_parent* a1, - vector_old_bone_database_bone* a2); -static void mot_parent_get_key_set_count(mot_parent* a1, size_t motion_bone_count, size_t ik_bone_count); -static void mot_parent_init_key_sets(mot_parent* a1, bone_database_skeleton_type type, + +static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, + std::vector* a2); +static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t motion_bone_count, size_t ik_bone_count); +static void mot_key_data_init_key_sets(mot_key_data* a1, bone_database_skeleton_type type, size_t motion_bone_count, size_t ik_bone_count); -static void mot_parent_interpolate(mot_parent* a1, float_t frame, +static void mot_key_data_interpolate(mot_key_data* a1, float_t frame, uint32_t key_set_offset, uint32_t key_set_count); -static mot_data* mot_parent_load_file(mot_parent* a1, int32_t motion_id, motion_database* mot_db); -static void mot_parent_reserve_key_sets(mot_parent* a1); -static motion_blend_mot* motion_blend_mot_init(); +static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, motion_database* mot_db); +static void mot_key_data_reserve_key_sets(mot_key_data* a1); +static void mot_key_data_reset(mot_key_data* key_data); +static void mot_key_data_free(mot_key_data* a1); + +static void mot_play_data_reset(mot_play_data* play_data); +static void mot_play_frame_data_reset(mot_play_frame_data* frame_data); +static void mot_play_frame_data_set_frame(mot_play_frame_data* a1, float_t frame); + static void motion_blend_mot_interpolate(motion_blend_mot* a1); static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, - rob_chara_bone_data* a2, bone_database* bone_data); + rob_chara_bone_data* a2, bool(*bone_check_func)(motion_bone_index), bone_database* bone_data); static bool motion_blend_mot_interpolate_get_reverse(int32_t* a1); static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, bone_database* a3, motion_database* mot_db); static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* mat); static void motion_blend_mot_reset(motion_blend_mot* mot_blend_mot); -static void motion_blend_mot_dispose(motion_blend_mot* mot_blend_mot); +static void motion_blend_mot_set_duration(motion_blend_mot* mot, + float_t duration, float_t step, float_t offset); static void osage_coli_set(osage_coli* osg_coli, skin_param_osage_root_coli* skp_root_coli, mat4* mats); static void osage_coli_ring_set(osage_coli* osg_coli, - vector_old_skin_param_osage_root_coli* vec_skp_root_coli, mat4* mats); + std::vector* vec_skp_root_coli, mat4* mats); -static rob_chara_bone_data* rob_chara_bone_data_init(); +static void osage_play_data_manager_get_opd_file_data(object_info obj_info, + int32_t motion_id, float_t** data, uint32_t* count); + +static bool pv_osage_manager_array_get_disp(int32_t* chara_id); +static PvOsageManager* pv_osage_manager_array_ptr_get(int32_t chara_id); +static bool pv_osage_manager_array_ptr_get_disp(); +static void pv_osage_manager_array_ptr_set_not_reset_true(); + +static void rob_base_rob_chara_init(rob_chara* rob_chr); +static void rob_base_rob_chara_ctrl(rob_chara* rob_chr); +static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr); +static void rob_base_rob_chara_free(rob_chara* rob_chr); + +static void rob_disp_rob_chara_init(rob_chara* rob_chr, + bone_database* bone_data, void* data, object_database* obj_db); +static void rob_disp_rob_chara_ctrl(rob_chara* rob_chr); +static void rob_disp_rob_chara_ctrl_thread_main(rob_chara* rob_chr); +static void rob_disp_rob_chara_disp(rob_chara* rob_chr); +static void rob_disp_rob_chara_free(rob_chara* rob_chr); + +static rob_chara_item_equip* rob_chara_array_get_item_equip(int32_t chara_id); static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, - vector_old_bone_database_bone* bones); + std::vector* bones); static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_data, const struc_241* a2, eyes_adjust* a3); static float_t rob_chara_bone_data_get_frame(rob_chara_bone_data* rob_bone_data); @@ -186,7 +479,7 @@ static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_dat static void rob_chara_bone_data_ik_scale_calculate( rob_chara_bone_data_ik_scale* ik_scale, vector_old_bone_data* vec_bone_data, bone_database_skeleton_type base_skeleton_type, - bone_database_skeleton_type skeleton_type, bone_database* bone_db); + bone_database_skeleton_type skeleton_type, bone_database* bone_data); static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, bone_database_skeleton_type base_skeleton_type, bone_database_skeleton_type skeleton_type, bone_database* bone_data); @@ -200,136 +493,178 @@ static void rob_chara_bone_data_motion_blend_mot_list_free(rob_chara_bone_data* size_t last_index); static void rob_chara_bone_data_motion_blend_mot_list_init(rob_chara_bone_data* rob_bone_data); static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, - int32_t motion_id, int32_t index, bone_database* bone_data, motion_database* mot_db); + int32_t motion_id, MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data); -static void rob_chara_bone_data_set_frame(rob_chara_bone_data* rob_bone_data, float_t frame); static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data); +static void rob_chara_bone_data_set_eyelid_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_eyelid_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_eyelid_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); +static void rob_chara_bone_data_set_eyes_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_eyes_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_eyes_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); +static void rob_chara_bone_data_set_face_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_face_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_face_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); +static void rob_chara_bone_data_set_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_hand_l_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_hand_l_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_hand_l_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); +static void rob_chara_bone_data_set_hand_r_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_hand_r_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_hand_r_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, - vector_old_bone_database_bone* bones); + std::vector* bones, std::string* motion_bones); +static void rob_chara_bone_data_set_motion_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_mouth_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset); +static void rob_chara_bone_data_set_mouth_frame(rob_chara_bone_data* rob_bone_data, float_t frame); +static void rob_chara_bone_data_set_mouth_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, uint16_t* parent_indices); static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y); static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* mat); -static void rob_chara_bone_data_dispose(rob_chara_bone_data* rob_bone_data); -static rob_chara_item_equip* rob_chara_item_equip_init(); +static void rob_chara_data_adjuct_reset(rob_chara_adjust_data* rob_chr_adj); + +static void rob_chara_data_miku_rot_reset(rob_chara_data_miku_rot* rob_mik_rot); + +static void rob_chara_data_reset(rob_chara_data* rob_chr_data); + static void rob_chara_item_equip_disp( - rob_chara_item_equip* rob_item_equip, int32_t chara_id, render_context* rctx); + rob_chara_item_equip* rob_itm_equip, int32_t chara_id, render_context* rctx); +static object_info rob_chara_item_equip_get_object_info( + rob_chara_item_equip* rob_item_equip, item_id id); static void rob_chara_item_equip_get_parent_bone_nodes( - rob_chara_item_equip* rob_item_equip, bone_node* bone_nodes, bone_database* bone_data); + rob_chara_item_equip* rob_itm_equip, bone_node* bone_nodes, bone_database* bone_data); static void rob_chara_item_equip_load_object_info( - rob_chara_item_equip* rob_item_equip, object_info object_info, - item_id id, bone_database* bone_data, void* data, object_database* obj_db); -static void rob_chara_item_equip_object_init(rob_chara_item_equip_object* itm_eq_obj); + rob_chara_item_equip* rob_itm_equip, object_info object_info, item_id id, + bool osage_reset, bone_database* bone_data, void* data, object_database* obj_db); +static void rob_chara_item_equip_object_check_no_opd( + rob_chara_item_equip_object* itm_eq_obj, std::vector* opd_blend_data); static void rob_chara_item_equip_object_clear_ex_data(rob_chara_item_equip_object* itm_eq_obj); static void rob_chara_item_equip_object_disp( rob_chara_item_equip_object* itm_eq_obj, mat4* mat, render_context* rctx); static int32_t rob_chara_item_equip_object_get_bone_index( - rob_chara_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data); + rob_chara_item_equip_object* itm_eq_obj, const char* name, bone_database* bone_data); static bone_node* rob_chara_item_equip_object_get_bone_node( rob_chara_item_equip_object* itm_eq_obj, int32_t bone_index); static bone_node* rob_chara_item_equip_object_get_bone_node_by_name( - rob_chara_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data); + rob_chara_item_equip_object* itm_eq_obj, const char* name, bone_database* bone_data); static void rob_chara_item_equip_object_get_parent_bone_nodes( rob_chara_item_equip_object* itm_eq_obj, bone_node* bone_nodes, bone_database* bone_data); -static void rob_chara_item_equip_object_init_data(rob_chara_item_equip_object* itm_eq_obj, size_t index); static void rob_chara_item_equip_object_init_ex_data_bone_nodes( rob_chara_item_equip_object* itm_eq_obj, object_skin_ex_data* a2); +static void rob_chara_item_equip_object_init_members(rob_chara_item_equip_object* itm_eq_obj, size_t index = 0xDEADBEEF); static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object* itm_eq_obj, object_skin_ex_data* ex_data, bone_database* bone_data, void* data, object_database* obj_db); static void rob_chara_item_equip_object_load_object_info_ex_data( - rob_chara_item_equip_object* itm_eq_obj, object_info object_info, - bone_node* bone_nodes, bone_database* bone_data, void* data, object_database* obj_db); -static void rob_chara_item_equip_object_reset(rob_chara_item_equip_object* itm_eq_obj); + rob_chara_item_equip_object* itm_eq_obj, object_info object_info, bone_node* bone_nodes, + bool osage_reset, bone_database* bone_data, void* data, object_database* obj_db); static bool rob_chara_item_equip_object_set_boc(rob_chara_item_equip_object* itm_eq_obj, skin_param_osage_root* skp_root, ExOsageBlock* osg); static void rob_chara_item_equip_object_set_collision_target_osage( rob_chara_item_equip_object* itm_eq_obj, skin_param_osage_root* skp_root, skin_param* skp); +static void rob_chara_item_equip_object_set_motion_reset_data( + rob_chara_item_equip_object* itm_eq_obj, int32_t motion_id, float_t frame); +static void rob_chara_item_equip_object_set_motion_skin_param( + rob_chara_item_equip_object* itm_eq_obj, int8_t chara_id, int32_t motion_id, int32_t frame); +static void rob_chara_item_equip_object_set_osage_reset( + rob_chara_item_equip_object* itm_eq_obj); +static void rob_chara_item_equip_object_set_rob_move_cancel( + rob_chara_item_equip_object* itm_eq_obj, float_t value); static void rob_chara_item_equip_object_skp_load( rob_chara_item_equip_object* itm_eq_obj, key_val* kv, bone_database* bone_data); static void rob_chara_item_equip_object_skp_load_file( rob_chara_item_equip_object* itm_eq_obj, void* data, bone_database* bone_data, object_database* obj_db); -static void rob_chara_item_equip_object_free(rob_chara_item_equip_object* itm_eq_obj); -static void rob_chara_item_equip_reset(rob_chara_item_equip* rob_item_equip); -static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_item_equip, +static void rob_chara_item_equip_reset(rob_chara_item_equip* rob_itm_equip); +static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_itm_equip, bone_node* bone_nodes); -static void rob_chara_item_equip_set_item_equip_range(rob_chara_item_equip* rob_item_equip, bool value); -static void rob_chara_item_equip_set_shadow_type(rob_chara_item_equip* rob_item_equip, int32_t chara_id); -static void rob_chara_item_equip_dispose(rob_chara_item_equip* rob_item_equip); +static void rob_chara_item_equip_set_item_equip_range(rob_chara_item_equip* rob_itm_equip, bool value); +static void rob_chara_item_equip_set_motion_reset_data( + rob_chara_item_equip* rob_itm_equip, int32_t motion_id, float_t frame); +static void rob_chara_item_equip_set_motion_skin_param( + rob_chara_item_equip* rob_itm_equip, int8_t chara_id, int32_t motion_id, int32_t frame); +static void rob_chara_item_equip_set_rob_move_cancel(rob_chara_item_equip* rob_itm_equip, + uint8_t id, float_t value); +static void rob_chara_item_equip_set_rob_step(rob_chara_item_equip* rob_itm_equip, float_t value); +static void rob_chara_item_equip_set_shadow_type(rob_chara_item_equip* rob_itm_equip, int32_t chara_id); +static void rob_chara_item_equip_set_opd_blend_data( + rob_chara_item_equip* rob_itm_equip, std::list* a2); +static void rob_chara_item_equip_set_osage_reset(rob_chara_item_equip* rob_itm_equip); -static void rob_chara_item_sub_data_init(rob_chara_item_sub_data* rob_item_sub_data); -static bool rob_chara_item_sub_data_check_for_npr_flag(rob_chara_item_sub_data* item_sub_data); -static void rob_chara_item_sub_data_item_change_clear( - rob_chara_item_sub_data* rob_item_sub_data); -static void rob_chara_item_sub_data_reload_items(rob_chara_item_sub_data* item_sub_data, +static bool rob_chara_item_sub_data_check_for_npr_flag(rob_chara_item_sub_data* itm_sub_data); +static void rob_chara_item_sub_data_reload_items(rob_chara_item_sub_data* itm_sub_data, int32_t chara_id, bone_database* bone_data, void* data, object_database* obj_db); -static void rob_chara_item_sub_data_texture_change_clear( - rob_chara_item_sub_data* rob_item_sub_data); -static void rob_chara_item_sub_data_texture_pattern_clear( - rob_chara_item_sub_data* rob_item_sub_data); -static void rob_chara_item_sub_data_free( - rob_chara_item_sub_data* rob_item_sub_data); - -static void rob_chara_data_init(rob_chara_data* rob_mot_blend); -static void rob_chara_data_free(rob_chara_data* rob_mot_blend); static bool rob_chara_check_for_ageageagain_module(chara_index chara_index, int32_t module_index); +static object_info rob_chara_get_head_object(rob_chara* rob_chr, int32_t head_object_id); +static object_info rob_chara_get_object_info(rob_chara* rob_chr, item_id id); static void rob_chara_load_default_motion(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db); static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skeleton_select, int32_t motion_id, bone_database* bone_data, motion_database* mot_db); -static void rob_chara_set_draw(rob_chara* rob_chr, item_id id, bool disp); +static void rob_chara_set_disp(rob_chara* rob_chr, item_id id, bool disp); +static void rob_chara_set_motion_reset_data(rob_chara* rob_chr, int32_t motion_id, float_t frame); +static void rob_chara_set_motion_skin_param(rob_chara* rob_chr, int32_t motion_id, float_t frame); +static void rob_chara_set_osage_reset(rob_chara* rob_chr); -static void rob_osage_init(rob_osage* rob_osg); +static int32_t rob_cmn_mottbl_get_motion_id(rob_chara* rob_chr, int32_t id); +static void rob_cmn_mottbl_read(void* a1, void* data, size_t size); + +static rob_manager_rob_impl* rob_manager_rob_impls1_get(TaskRobManager* rob_mgr); +static rob_manager_rob_impl* rob_manager_rob_impls2_get(TaskRobManager* rob_mgr); + +static void rob_osage_reset(rob_osage* rob_osg); static void rob_osage_init_data(rob_osage* rob_osg, object_skin_block_osage* osg_data, object_skin_osage_node* osg_nodes, bone_node* ex_data_bone_nodes, object_skin* skin); static rob_osage_node* rob_osage_get_node(rob_osage* rob_osg, size_t index); -static void rob_osage_load_skin_param(rob_osage* rob_osg, key_val* kv, char* name, +static float_t* rob_osage_load_opd_data(rob_osage* rob_osg, + size_t node_index, float_t* opd_data, size_t opd_count); +static void rob_osage_load_skin_param(rob_osage* rob_osg, key_val* kv, const char* name, skin_param_osage_root* skp_root, object_info* obj_info, bone_database* bone_data); -static void rob_osage_node_init(rob_osage_node* node); -static void rob_osage_node_free(rob_osage_node* node); static void rob_osage_set_air_res(rob_osage* rob_osg, float_t air_res); static void rob_osage_coli_set(rob_osage* rob_osg, mat4* mats); static void rob_osage_set_coli_r(rob_osage* rob_osg, float_t coli_r); static void rob_osage_set_force(rob_osage* rob_osg, float_t force, float_t force_gain); static void rob_osage_set_hinge(rob_osage* rob_osg, float_t hinge_y, float_t hinge_z); static void rob_osage_set_init_rot(rob_osage* rob_osg, float_t init_rot_y, float_t init_rot_z); +static void rob_osage_set_motion_reset_data(rob_osage* rob_osg, int32_t motion_id, float_t frame); static void rob_osage_set_rot(rob_osage* rob_osg, float_t rotation_y, float_t rotation_z); static void rob_osage_set_skin_param_osage_root(rob_osage* rob_osg, skin_param_osage_root* skp_root); static void rob_osage_set_skp_osg_nodes(rob_osage* rob_osg, - vector_old_skin_param_osage_node* skp_osg_nodes); + std::vector* skp_osg_nodes); +static void rob_osage_set_yz_order(rob_osage* rob_osg, int32_t yz_order); static void rob_osage_free(rob_osage* rob_osg); -static void rob_sub_action_init(rob_sub_action* sub_act); -static void rob_sub_action_init_sub(rob_sub_action* sub_act); -static void rob_sub_action_free(rob_sub_action* sub_act); +static bool skin_param_file_read(void* data, const char* path, const char* file, uint32_t hash); -static void skin_param_init(skin_param* skp); +static void skin_param_osage_node_parse(key_val* kv, const char* name, + std::vector* a3, skin_param_osage_root* skp_root); -static bool skin_param_file_read(void* data, char* path, char* file, uint32_t hash); - -static void skin_param_osage_node_parse(key_val* kv, char* name, - vector_old_skin_param_osage_node* a3, skin_param_osage_root* skp_root); - -static void skin_param_osage_root_init(skin_param_osage_root* root); -static void skin_param_osage_root_boc_free(skin_param_osage_root_boc* boc); -static void skin_param_osage_root_normal_ref_free(skin_param_osage_root_normal_ref* ref); -static void skin_param_osage_root_parse(key_val* kv, char* name, +static void skin_param_osage_root_parse(key_val* kv, const char* name, skin_param_osage_root* skp_root, bone_database* bone_data); -static void skin_param_osage_root_free(skin_param_osage_root* root); -static void task_rob_manager_struct_append_init_chara(TaskRobManager* rob_mgr, rob_chara* rob_chr); -static void task_rob_manager_struct_append_loaded_chara(TaskRobManager* rob_mgr, rob_chara* rob_chr); -static void task_rob_manager_struct_append_free_chara(TaskRobManager* rob_mgr, rob_chara* rob_chr); - -vector_old_func(motion_storage) - -vector_old_motion_storage motion_storage_data; +std::vector motion_storage_data; rob_chara rob_chara_array[ROB_CHARA_COUNT]; rob_chara_pv_data rob_chara_pv_data_array[ROB_CHARA_COUNT]; -TaskRobManager task_rob_manager; -extern wind* wind_ptr; + +static rob_manager_rob_impl rob_manager_rob_impls1[2]; +static bool rob_manager_rob_impls1_init = false; +static rob_manager_rob_impl rob_manager_rob_impls2[7]; +static bool rob_manager_rob_impls2_init = false; + +static PvOsageManager* pv_osage_manager_array_ptr; +static rob_cmn_mottbl_header* rob_cmn_mottbl_data; +static RobThreadHandler* rob_thread_handler; +static TaskRobManager task_rob_manager; +static TaskRobLoad task_rob_load; static const exp_func_op1 exp_func_op1_array[] = { { "neg" , exp_neg }, @@ -1102,6 +1437,8 @@ static const skeleton_rotation_offset skeleton_rotation_offset_array[] = { { 0, 1, 1, { 0.0f, 0.0f, 0.0f }, }, }; +extern render_context* rctx_ptr; + chara_init_data* chara_init_data_get(chara_index chara_index) { if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) return (chara_init_data*)&chara_init_data_array[chara_index]; @@ -1127,14 +1464,10 @@ void motion_set_load_motion(uint32_t set, std::string* motion_name, motion_datab string_add_length(&file, ".farc", 5); mot_set_farc msf; - mot_init(&msf); - data_struct_load_file(&data_list[DATA_AFT], &msf, - "rom/rob/", string_data(&file), mot_load_file); - if (msf.ready && vector_old_length(msf.vec) > 0) { - motion_storage_insert_motion_set(&msf.vec.begin[0], set); - memset(&msf.vec.begin[0], 0, sizeof(mot_set)); - } - mot_free(&msf); + data_list[DATA_AFT].load_file(&msf, + "rom/rob/", string_data(&file), mot_set_farc::load_file); + if (msf.ready && msf.vec.size() > 0) + motion_storage_insert_motion_set(&msf.vec[0], set); string_free(&file); } @@ -1143,102 +1476,102 @@ void motion_set_unload(uint32_t set) { motion_storage_delete_motion_set(set); } -void rob_chara_init(rob_chara* rob_chr) { - rob_chr->bone_data = rob_chara_bone_data_init(); - rob_chr->item_equip = rob_chara_item_equip_init(); - rob_chara_item_sub_data_init(&rob_chr->item_sub_data); - rob_chara_data_init(&rob_chr->data); - rob_chara_data_init(&rob_chr->data_prev); - rob_chara_pv_data_init(&rob_chr->pv_data); +void pv_osage_manager_array_reset(int32_t chara_id) { + pv_osage_manager_array_ptr_get(chara_id)->Reset(); +} + +void pv_osage_manager_array_ptr_init() { + if (!pv_osage_manager_array_ptr) + pv_osage_manager_array_ptr = new PvOsageManager[CHARA_MAX]; +} + +void pv_osage_manager_array_ptr_free() { + if (pv_osage_manager_array_ptr) + delete[] pv_osage_manager_array_ptr; } static void sub_1405EE878(ExNodeBlock* node) { } -static void sub_1405F4BB0(rob_chara_item_equip_object* rob_item_equip, bool a2) { - ExNodeBlock** begin = rob_item_equip->node_blocks.begin; - ExNodeBlock** end = rob_item_equip->node_blocks.end; - for (int32_t i = 0; i < 6; i++) - for (ExNodeBlock** j = begin; j != end; j++) - (*j)->Field_18(i, a2); -} - -static void sub_1405F4820(rob_chara_item_equip_object* itm_eq_obj, int32_t a2) { - if (itm_eq_obj->node_blocks.begin == itm_eq_obj->node_blocks.end) +static void rob_chara_item_equip_object_ctrl_iterate_nodes(rob_chara_item_equip_object* itm_eq_obj, int32_t osage_iterations) { + if (!itm_eq_obj->node_blocks.size()) return; - for (ExNodeBlock** i = itm_eq_obj->node_blocks.begin; - i != itm_eq_obj->node_blocks.end; i++) - (*i)->Field_48(); + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->Field_48(); - for (int32_t v3 = a2; v3; v3--) { - if (itm_eq_obj->field_1B8) - sub_1405F4BB0(itm_eq_obj, true); + for (; osage_iterations; osage_iterations--) { + if (itm_eq_obj->field_1B8 && itm_eq_obj->node_blocks.size()) + for (int32_t i = 0; i < 6; i++) + for (ExNodeBlock*& j : itm_eq_obj->node_blocks) + j->Field_18(i, true); - for (ExNodeBlock** i = itm_eq_obj->node_blocks.begin; - i != itm_eq_obj->node_blocks.end; i++) - (*i)->Field_50(); + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->Field_50(); } } -static void sub_1405F9640(rob_chara_item_equip_object* itm_eq_obj) { - if (itm_eq_obj->osage_blocks.begin == itm_eq_obj->osage_blocks.end - && itm_eq_obj->cloth_blocks.begin == itm_eq_obj->cloth_blocks.end) +static void rob_chara_item_equip_object_load_opd_data(rob_chara_item_equip_object* itm_eq_obj) { + if (!itm_eq_obj->osage_blocks.size() && !itm_eq_obj->cloth_blocks.size()) return; rob_chara_item_equip* rob_itm_equip = itm_eq_obj->item_equip; size_t index = 0; - for (struc_373* i = rob_itm_equip->field_940.begin; - i != rob_itm_equip->field_940.end; i++, index++) { - /*size_t rob_chr = 0; - int32_t child_osg_node = 0; - sub_140489480(itm_eq_obj->obj_info, chr_data->motion_id, &rob_chr, &child_osg_node); - if (!rob_chr) + for (opd_blend_data& i : rob_itm_equip->opd_blend_data) { + float_t* opd_data = 0; + uint32_t opd_count = 0; + osage_play_data_manager_get_opd_file_data(itm_eq_obj->obj_info, i.motion_id, &opd_data, &opd_count); + if (!opd_data) break; - for (ExOsageBlock** j = itm_eq_obj->osage_blocks.begin; - j != itm_eq_obj->osage_blocks.end; j++) - rob_chr = sub_1405F9A40(*j, index, rob_chr, child_osg_node); + for (ExOsageBlock*& j : itm_eq_obj->osage_blocks) + opd_data = j->LoadOpdData(index, opd_data, opd_count); - for (ExClothBlock** k = itm_eq_obj->cloth_blocks.begin; - k != itm_eq_obj->cloth_blocks.end; k++) - rob_chr = sub_1405F9A30(*k, index, rob_chr, child_osg_node);*/ + for (ExClothBlock*& j : itm_eq_obj->cloth_blocks) + opd_data = j->LoadOpdData(index, opd_data, opd_count); + index++; } } -static void rob_chara_item_equip_object_calc(rob_chara_item_equip_object* itm_eq_obj) { - if (itm_eq_obj->field_B0 > 0) { - sub_1405F4820(itm_eq_obj, itm_eq_obj->field_B0); - itm_eq_obj->field_B0 = 0; +static void rob_chara_item_equip_ctrl_iterate_nodes(rob_chara_item_equip* rob_itm_equip, uint8_t iterations = 0) { + for (int32_t i = ITEM_BODY; i < ITEM_MAX; ++i) + rob_chara_item_equip_object_ctrl_iterate_nodes(&rob_itm_equip->item_equip_object[i], iterations); +} + +static void rob_chara_item_equip_object_ctrl(rob_chara_item_equip_object* itm_eq_obj) { + if (itm_eq_obj->osage_iterations > 0) { + rob_chara_item_equip_object_ctrl_iterate_nodes(itm_eq_obj, itm_eq_obj->osage_iterations); + itm_eq_obj->osage_iterations = 0; } - for (ExNodeBlock** i = itm_eq_obj->node_blocks.begin; - i != itm_eq_obj->node_blocks.end; ++i) - (*i)->Field_10(); + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->Field_10(); - if (itm_eq_obj->field_1C8) { - itm_eq_obj->field_1C8 = 0; - sub_1405F9640(itm_eq_obj); - for (ExNodeBlock** j = itm_eq_obj->node_blocks.begin; - j != itm_eq_obj->node_blocks.end; ++j) - (*j)->Disp(); + if (itm_eq_obj->use_opd) { + itm_eq_obj->use_opd = false; + rob_chara_item_equip_object_load_opd_data(itm_eq_obj); + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->SetOsagePlayData(); } else { - if (itm_eq_obj->field_1B8) - sub_1405F4BB0(itm_eq_obj, 0); - - for (ExNodeBlock** k = itm_eq_obj->node_blocks.begin; k != itm_eq_obj->node_blocks.end; ++k) - (*k)->Update(); + if (itm_eq_obj->field_1B8 && itm_eq_obj->node_blocks.size()) + for (int32_t i = 0; i < 6; i++) + for (ExNodeBlock*& j : itm_eq_obj->node_blocks) + j->Field_18(i, false); + + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->Field_20(); } - for (ExNodeBlock** l = itm_eq_obj->node_blocks.begin; l != itm_eq_obj->node_blocks.end; ++l) - (*l)->Field_58(); + + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->Field_58(); } -static void rob_chara_item_equip_calc(rob_chara_item_equip* rob_item_equip) { - if (!rob_item_equip->field_D8) - for (int32_t i = rob_item_equip->first_item_equip_object; i < rob_item_equip->max_item_equip_object; i++) - rob_chara_item_equip_object_calc(&rob_item_equip->item_equip_object[i]); +static void rob_chara_item_equip_ctrl(rob_chara_item_equip* rob_itm_equip) { + if (!rob_itm_equip->field_D8) + for (int32_t i = rob_itm_equip->first_item_equip_object; i < rob_itm_equip->max_item_equip_object; i++) + rob_chara_item_equip_object_ctrl(&rob_itm_equip->item_equip_object[i]); } static float_t rob_chara_get_trans_scale(rob_chara* rob_chr, int32_t bone, vec3* trans) { @@ -1248,9 +1581,9 @@ static float_t rob_chara_get_trans_scale(rob_chara* rob_chr, int32_t bone, vec3* return rob_chr->data.field_1E68.field_DF8[bone].scale; } -mat4* rob_chara_bone_data_get_mats_mat(rob_chara_bone_data* rob_bone_data, ssize_t index) { - if (index < vector_old_length(rob_bone_data->mats)) - return &rob_bone_data->mats.begin[index]; +mat4* rob_chara_bone_data_get_mats_mat(rob_chara_bone_data* rob_bone_data, size_t index) { + if (index < rob_bone_data->mats.size()) + return &rob_bone_data->mats[index]; return 0; } @@ -1264,7 +1597,7 @@ static void sub_140509D30(rob_chara* rob_chr) { const struc_218* v3 = rob_chr->chara_init_data->field_828; const struc_218* v6 = rob_chr->chara_init_data->field_830; mat4 mat; - for (int32_t i = 0; i < 27; i++) { + for (int32_t i = 0; i < 27; i++) { mat = *rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, v3->bone_index); mat4_translate_mult(&mat, v3->bone_offset.x, v3->bone_offset.y, v3->bone_offset.z, &mat); *v42 = mat; @@ -1311,33 +1644,6 @@ static void sub_140509D30(rob_chara* rob_chr) { } } -void rob_chara_calc(rob_chara* rob_chr) { - if (rob_chara_bone_data_get_frame(rob_chr->bone_data) < 0.0) - rob_chara_bone_data_set_frame(rob_chr->bone_data, 0.0); - - float_t frame = rob_chara_bone_data_get_frame(rob_chr->bone_data); - float_t frame_count = rob_chara_bone_data_get_frame_count(rob_chr->bone_data); - if (frame > frame_count) - rob_chara_bone_data_set_frame(rob_chr->bone_data, frame_count); - - rob_chara_get_trans_scale(rob_chr, 0, &rob_chr->item_equip->position); - - rob_chara_item_equip_calc(rob_chr->item_equip); - - /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { - sub_140543520(rob_chr->chara_id, 1, rob_chr->item_equip->osage_phys_step); - sub_14054FC90(rob_chr, 1u, "j_tail_l_006_wj"); - sub_140543520(rob_chr->chara_id, 2, rob_chr->item_equip->osage_phys_step); - sub_14054FC90(rob_chr, 2u, "j_tail_r_006_wj"); - }*/ -} - -void rob_chara_disp(rob_chara* rob_chr, render_context* rctx) { - rob_chr->item_equip->texture_color_coeff = vec4u_identity; - rob_chr->item_equip->mat = mat4u_identity; - rob_chara_item_equip_disp(rob_chr->item_equip, rob_chr->chara_id, rctx); -} - mat4* rob_chara_get_bone_data_mat(rob_chara* chara, size_t index) { return rob_chara_bone_data_get_mat(chara->bone_data, index); } @@ -1350,9 +1656,454 @@ float_t rob_chara_get_frame_count(rob_chara* rob_chr) { return rob_chara_bone_data_get_frame_count(rob_chr->bone_data); } -void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, - int32_t index, bone_database* bone_data, motion_database* mot_db) { - rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, index, bone_data, mot_db); +static int16_t sub_14054FE90(rob_chara* rob_chr, bool a3) { + int16_t v3 = rob_chr->data.miku_rot.rot_y_int16; + if (!a3 || !(rob_chr->data.field_0 & 0x10)) { + int16_t v4 = rob_chr->data.field_8.field_B8.field_8; + if (v4) + return v3 + v4; + } + + if (rob_chr->data.field_1588.field_20.field_0 & 0x100) + return v3 + rob_chr->data.field_1588.field_274; + return v3; +} + +inline static void rob_chara_data_parts_adjust_reset(rob_chara_data_parts_adjust* parts_adjust) { + parts_adjust->enable = false; + parts_adjust->frame = 0.0f; + parts_adjust->transition_frame = 0.0f; + parts_adjust->curr_external_force = vec3_null; + parts_adjust->curr_force = 1.0f; + parts_adjust->curr_strength = 1.0f; + parts_adjust->motion_id = -1; + parts_adjust->set_frame = 0; + parts_adjust->force_duration = 0.0f; + parts_adjust->type = 6; + parts_adjust->cycle_type = 0; + parts_adjust->ignore_gravity = true; + parts_adjust->external_force_min = vec3_null; + parts_adjust->external_force_strength = vec3_null; + parts_adjust->external_force = vec3_null; + parts_adjust->cycle = 1.0f; + parts_adjust->phase = 0.0f; + parts_adjust->force = 1.0f; + parts_adjust->strength = 1.0f; + parts_adjust->strength_transition = 0.0f; +} + +inline static void rob_chara_data_hand_adjust_reset(rob_chara_data_hand_adjust* hand_adjust) { + hand_adjust->enable = false; + hand_adjust->scale_select = 0; + hand_adjust->type = ROB_CHARA_DATA_HAND_ADJUST_NONE; + hand_adjust->current_scale = 1.0f; + hand_adjust->scale = 1.0f; + hand_adjust->transition_time = 0.0f; + hand_adjust->current_time = 0.0f; + hand_adjust->rotation_blend = 1.0f; + hand_adjust->offset_blend = 1.0f; + hand_adjust->enable_scale = false; + hand_adjust->disable_x = false; + hand_adjust->disable_y = false; + hand_adjust->disable_z = false; + hand_adjust->offset = vec3_null; + hand_adjust->field_30 = vec3_null; + hand_adjust->field_3C = 0.0f; + hand_adjust->field_40 = 0; +} + +static motion_bone_index rob_motion_c_kata_bone_get(int32_t index) { + if (index == 0) + return MOTION_BONE_C_KATA_L; + else if (index == 1) + return MOTION_BONE_C_KATA_R; + else + return MOTION_BONE_NONE; +} + +static void sub_14041C4F0(rob_chara_bone_data* rob_bone_data, int32_t a2, float_t a3) { + motion_blend_mot* v3 = rob_bone_data->motion_loaded.front(); + v3->bone_data.bones.begin[a2].field_2E0 = a3; +} + +static void sub_14041BB70(rob_chara_bone_data* rob_bone_data, bool a2) { + rob_bone_data->field_758 = a2; +} + +static bool rob_osage_check_osage_setting_parts_bit(rob_osage* rob_osg, int32_t parts_bits) { + if (rob_osg->osage_setting.parts == -1) + return 0; + return _bittest((const LONG*)&parts_bits, rob_osg->osage_setting.parts); +} + +static void sub_1405F9510(ExOsageBlock* a1, bool a2) { + a1->rob.field_1F0F = a2; +} + +static void sub_1405F9520(rob_chara_item_equip_object* a1, int32_t parts_bits, bool a3) { + for (ExOsageBlock*& i : a1->osage_blocks) + if (rob_osage_check_osage_setting_parts_bit(&i->rob, parts_bits)) + sub_1405F9510(i, a3); +} + +static void sub_140513EE0(rob_chara_item_equip* rob_itm_equip, int32_t a2, bool a3) { + sub_1405F9520(&rob_itm_equip->item_equip_object[a2 == 8 ? ITEM_OUTER : ITEM_KAMI], 1 << a2, a3); +} + +static void sub_140419D30(rob_chara_bone_data* rob_bone_data, + float_t frame, float_t step, float_t frame_count) { + mot_play_data* v5 = &rob_bone_data->motion_loaded.front()->mot_play_data; + v5->frame_data.frame = frame; + v5->frame_data.step_prev = v5->frame_data.step; + v5->frame_data.step = step; + v5->frame_data.frame_count = frame_count; + v5->frame_data.last_frame = frame_count - 1.0f; + v5->frame_data.field_14 = -1.0f; + v5->frame_data.field_18 = -1; + v5->frame_data.field_1C = -1; + v5->frame_data.field_20 = 0.0f; + v5->frame_data.field_24 = -1.0f; + v5->frame_data.field_28 = 0; + v5->frame_data.field_2C = -1; + v5->field_30 = 0; + v5->field_34 = 0; + v5->field_38 = 0.0f; + v5->field_40 = 0; + v5->field_48 = 0; +} + +static void sub_14041C650(rob_chara_bone_data* rob_bone_data, int32_t a2) { + rob_bone_data->motion_loaded.front()->mot_play_data.frame_data.field_18 = a2; +} + +static void sub_14041BB50(rob_chara_bone_data* rob_bone_data, int32_t a2) { + rob_bone_data->motion_loaded.front()->mot_play_data.frame_data.field_1C = a2; +} + +static void sub_14041C990(rob_chara_bone_data* rob_bone_data, float_t a2, int32_t a3, float_t a4) { + motion_blend_mot* v4 = rob_bone_data->motion_loaded.front(); + v4->mot_play_data.frame_data.field_20 = a2; + v4->mot_play_data.frame_data.field_24 = a4; + v4->mot_play_data.frame_data.field_2C = a3; +} + +static void sub_14041B9D0(rob_chara_bone_data* rob_bone_data) { + struc_312* v1 = &rob_bone_data->field_958; + v1->field_58 = false; + v1->field_59 = false; + v1->field_5C = vec3_null; + v1->field_68 = vec3_null; + v1->field_74 = vec3_null; + v1->field_80 = vec3_null; + v1->field_8C = 1.0f; + v1->field_90 = 0; + v1->field_98 = 1.0f; +} + +static void sub_14041D6F0(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v3 = &rob_bone_data->motion_loaded.front()->field_4F8; + v3->field_BD = v3->field_BC; + v3->field_BC = a2; +} + +static void sub_14041D720(rob_chara_bone_data* a1, bool a2) { + a1->motion_loaded.front()->field_4F8.field_BD = a2; +} + +static float_t sub_14054FDE0(rob_chara* rob_chr) { + if (rob_chr->data.field_1588.field_2C0 >= 0.0f) + return rob_chr->data.field_1588.field_2C0; + else if (rob_chr->data.field_0 & 0x04) + return 10.0; + else if ((rob_chr->data.field_1588.field_10.field_0 & 0x4000) + || (rob_chr->data.field_1588.field_20.field_8 & 0x08)) + return 5.0f; + else if (rob_chr->data.adjust.motion_id == rob_chr->data.adjust.prev_motion_id) + return 4.0f; + else if (rob_chr->data.field_1588.field_20.field_0 & 0x200) { + if (!(rob_chr->data.field_0 & 0x80) + || (rob_chr->data.field_0 & 0x40) != 0) + return 1.0f; + } + else { + if (!(rob_chr->data.field_1588.field_20.field_0 & 0x8000) + || !(rob_chr->data.field_1588.field_20.field_0 & 0x01)) + return 7.0f; + } + return 3.0f; +} + +static float_t sub_14054FEE0(rob_chara* a1) { + if (a1->data.field_1588.field_2C4 >= 0.0f) + return a1->data.field_1588.field_2C4; + else if (a1->data.field_1588.field_20.field_0 & 0x200) + return 14.0f; + else + return 7.0f; +} + +static void sub_14041D310(rob_chara_bone_data* rob_bone_data, float_t a2, float_t a3, int32_t a4) { + motion_blend_mot* mot = rob_bone_data->motion_loaded.front(); + if (mot->blend) + mot->blend->Field_10(a2, a3, a4); +} + +static void sub_14041C9D0(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + v2->field_8 = (uint8_t)(v2->field_0 & 1); + if (a2) + v2->field_0 |= 0x01; + else + v2->field_0 &= ~0x01; +} + +static void sub_14041C680(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + if (a2) + v2->field_0 |= 0x02; + else + v2->field_0 &= ~0x02; +} + +static void sub_14041D2D0(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + if (a2) + v2->field_0 |= 0x04; + else + v2->field_0 &= ~0x04; +} + +static void sub_14041BC40(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + if (a2) + v2->field_0 |= 0x08; + else + v2->field_0 &= ~0x08; +} + +static void sub_14041D6C0(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + if (a2) + v2->field_0 |= 0x10; + else + v2->field_0 &= ~0x10; +} + +static void sub_14041D340(rob_chara_bone_data* rob_bone_data, bool a2) { + struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + if (a2) + v2->field_0 |= 0x20; + else + v2->field_0 &= ~0x20; +} + +static void sub_140414F00(struc_308* a1, float_t a2) { + a1->prev_eyes_adjust = a1->eyes_adjust; + a1->eyes_adjust = a2; +} + +static void sub_14041D270(rob_chara_bone_data* rob_bone_data, float_t a2) { + sub_140414F00(&rob_bone_data->motion_loaded.front()->field_4F8, a2); +} + +static void sub_14041D2A0(rob_chara_bone_data* rob_bone_data, float_t a2) { + rob_bone_data->motion_loaded.front()->field_4F8.prev_eyes_adjust = a2; +} + +static void sub_140555B00(rob_chara* rob_chr, bool a2) { + bool v3; + if (!a2) + v3 = 0; + else if (rob_chr->data.adjust.prev_motion_id == -1) + v3 = 0; + else { + v3 = !(rob_chr->data.field_1588.field_20.field_0 & 0x400) + || !(rob_chr->data.field_1588.field_10.field_0 & 0x40) + || (rob_chr->data.field_1588.field_20.field_0 & 0x100000); + } + + bool v6; + int32_t v7; + if (rob_chr->data.field_1588.field_52) { + v6 = 0; + v7 = 2; + } + else if (rob_chr->data.field_1588.field_20.field_0 & 0x8000) { + v6 = 0; + v7 = 2; + } + else { + v6 = 1; + v7 = 1; + } + + if (rob_chr->data.field_1588.field_52 != 3 && rob_chr->data.field_8.field_1A4) { + v6 = 0; + v7 = 2; + } + + float_t v8 = rob_chr->data.adjust.frame_data.frame; + float_t v9 = 0.0f; + float_t v10 = 0.0f; + if (v3) + v10 = sub_14054FDE0(rob_chr); + + float_t v11 = v8 + v10; + if (v6) + v9 = sub_14054FEE0(rob_chr); + + float_t v12 = rob_chr->data.field_1588.field_8; + float_t v13 = v12 - v9; + if (v3 && v6 && (v13 < v11 || v13 <= v8)) { + float_t v14 = rob_chr->data.field_1588.field_8; + v14 = (v12 - v8) * 0.5f; + int32_t v15 = (int32_t)v14; + if (v14 != -0.0f && (float_t)v15 != v14) + v14 = (float_t)(v14 < 0.0f ? v15 - 1 : v15); + + float_t v16 = v14 + v8; + if (v11 > v16) + { + float_t v17; + if (v13 < v16) { + v13 = v16; + v17 = v16; + v9 = v12 - v16; + } + else + v17 = rob_chr->data.field_1588.field_8 - v9; + v10 = v17 - v8; + } + else + { + v13 = v8 + v10; + v9 = v12 - v11; + } + } + rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, v9, 1.0f, 1.0f); + + sub_14041D310(rob_chr->bone_data, v9, v13, v7); + sub_14041D340(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_54 & 0x40)); + sub_14041D6C0(rob_chr->bone_data, (rob_chr->data.field_1588.field_40.field_0 & 0x10) + && (rob_chr->data.field_1588.field_20.field_0 & 0x08)); + sub_14041D6F0(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_10.field_8 & 0x18000000)); + sub_14041D720(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_30.field_8 & 0x18000000)); + sub_14041D2A0(rob_chr->bone_data, + (float_t)((double_t)rob_chr->data.field_1588.field_276 * M_PI * (1.0 / 32768.0))); + sub_14041D270(rob_chr->bone_data, + (float_t)((double_t)rob_chr->data.field_1588.field_274 * M_PI * (1.0 / 32768.0))); +} + +void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, bool a3, float_t frame, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db) { + rob_chr->data.miku_rot.rot_y_int16 = sub_14054FE90(rob_chr, false); + if (!(rob_chr->data.field_1588.field_20.field_0 & 0x10)) { + //rob_chr->data.miku_rot.position.x = rob_chr->data.miku_rot.field_24.x; + //rob_chr->data.miku_rot.position.z = rob_chr->data.miku_rot.field_24.z; + } + + //if (rob_chr->data.field_1588.field_20.field_8 & 0x8000000) + // rob_chr->data.miku_rot.position.y = rob_chr->data.miku_rot.field_24.y; + + if (a3) + rob_chr->data.adjust.field_28 ^= (rob_chr->data.adjust.field_28 ^ ~rob_chr->data.adjust.field_28) & 0x04; + + if (rob_chr->data.adjust.field_28 & 0x04) + rob_chr->data.adjust.field_28 |= 0x08; + else + rob_chr->data.adjust.field_28 &= ~0x08; + + rob_chr->data.adjust.field_28 &= 0x2F; + rob_chr->data.adjust.field_28 |= 0x10; + rob_chr->data.adjust.field_2C = 0; + rob_chr->data.adjust.field_30 = 0; + + rob_chara_data_parts_adjust* parts_adjust = rob_chr->data.adjust.parts_adjust; + for (int32_t i = 0; i < 13; i++, parts_adjust++) + rob_chara_data_parts_adjust_reset(parts_adjust); + + rob_chara_data_parts_adjust_reset(&rob_chr->data.adjust.field_10D8[0]); + + rob_chr->data.adjust_data.offset = vec3_null; + rob_chr->data.adjust_data.offset_x = true; + rob_chr->data.adjust_data.offset_y = false; + rob_chr->data.adjust_data.offset_z = true; + rob_chr->data.adjust_data.get_global_trans = false; + + struc_222* v13 = rob_chr->data.adjust.field_12C8; + rob_chara_data_hand_adjust* hand_adjust = rob_chr->data.adjust.hand_adjust; + rob_chara_data_hand_adjust* hand_adjust_prev = rob_chr->data.adjust.hand_adjust_prev; + for (int32_t i = 0; i < 2; i++, v13++, hand_adjust++, hand_adjust_prev++) { + rob_chara_data_hand_adjust_reset(hand_adjust); + rob_chara_data_hand_adjust_reset(hand_adjust_prev); + + v13->field_0 = 0; + v13->field_4 = 0.0f; + v13->field_8 = 0.0f; + v13->field_C = 0.0f; + v13->duration = 0.0f; + v13->frame = 0.0f; + sub_14041C4F0(rob_chr->bone_data, rob_motion_c_kata_bone_get(i), 0.0f); + } + sub_14041BB70(rob_chr->bone_data, 0); + + rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; + rob_chara_item_equip_set_rob_move_cancel(rob_itm_equip, 0, 0.0f); + for (int32_t i = 0; i < 13; i++) + sub_140513EE0(rob_itm_equip, i, false); + rob_chr->data.field_1588.field_30 = rob_chr->data.field_1588.field_10; + rob_chr->data.field_1588.field_40 = rob_chr->data.field_1588.field_20; + rob_chr->data.field_1588.field_276 = rob_chr->data.field_1588.field_274; + //sub_140539750(&rob_chr->data.field_1588); + //sub_14053A9C0(&rob_chr->data.field_1588, rob_chr, motion_id, + // motion_database_get_mot_data_frame_count(motion_id)); + if (rob_chr->data.field_1588.field_40.field_C & 0x20) + rob_chr->data.field_1588.field_20.field_0 &= ~0x08; + if (rob_chr->data.field_1588.field_40.field_C & 0x40) + rob_chr->data.field_1588.field_20.field_8 |= 0x10000000; + if (!(rob_chr->data.field_1588.field_20.field_0 & 0x10) && frame > 0.0f) + rob_chr->data.field_1588.field_20.field_0 &= ~0x08; + + rob_chr->data.adjust.prev_motion_id = rob_chr->data.adjust.motion_id; + rob_chr->data.adjust.frame_data.frame = frame; + rob_chr->data.adjust.field_24 = 0; + rob_chr->data.adjust.motion_id = motion_id; + if (rob_chr->data.adjust.step_data.step < 0.0f) + rob_chr->data.adjust.step_data.frame = 1.0f; + else + rob_chr->data.adjust.step_data.frame = rob_chr->data.adjust.step_data.step; + + float_t step = rob_chr->data.adjust.step; + if (step < 0.0f) + step = rob_chr->data.adjust.step_data.frame; + rob_chara_item_equip_set_rob_step(rob_chr->item_equip, step); + rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, blend_type, bone_data, mot_db); + sub_140419D30(rob_chr->bone_data, rob_chr->data.adjust.step_data.frame, + rob_chr->data.adjust.step_data.frame, rob_chr->data.field_1588.frame_count); + sub_14041C650(rob_chr->bone_data, 1); + if (rob_chr->data.field_1588.field_58 == 1) { + sub_14041BB50(rob_chr->bone_data, 1); + sub_14041C990(rob_chr->bone_data, rob_chr->data.field_1588.field_70, rob_chr->data.field_1588.field_6C, -1.0f); + } + rob_chara_bone_data_set_rotation_y( + rob_chr->bone_data, + (float_t)((double_t)rob_chr->data.field_1588.field_2B8 * M_PI * (1.0 / 32768.0))); + sub_14041BC40(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_20.field_8 & 0x20000000)); + sub_14041B9D0(rob_chr->bone_data); + if (rob_chr->type == ROB_CHARA_TYPE_2) { + sub_14041D340(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_54 & 0x40)); + sub_14041D6C0(rob_chr->bone_data, (rob_chr->data.field_1588.field_40.field_0 & 0x10) + && (rob_chr->data.field_1588.field_20.field_0 & 0x08)); + sub_14041D6F0(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_10.field_8 & 0x18000000)); + sub_14041D720(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_30.field_8 & 0x18000000)); + sub_14041D2A0(rob_chr->bone_data, + (float_t)((double_t)rob_chr->data.field_1588.field_276 * M_PI * (1.0 / 32768.0))); + sub_14041D270(rob_chr->bone_data, + (float_t)((double_t)rob_chr->data.field_1588.field_274 * M_PI * (1.0 / 32768.0))); + } + else + sub_140555B00(rob_chr, blend_type >= MOTION_BLEND_FREEZE && blend_type <= MOTION_BLEND_CROSS); + rob_chr->data.field_3DE0 = 0; } void rob_chara_reload_items(rob_chara* rob_chr, item_sub_data* sub_data, @@ -1426,16 +2177,16 @@ void rob_chara_reload_items(rob_chara* rob_chr, item_sub_data* sub_data, ITEM_NONE, }; - rob_chara_item_equip* rob_item_equip = rob_chr->item_equip; + rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; object_info base_face = chara_init_data_array[rob_chr->chara_index].base_face; - rob_chara_item_equip_load_object_info(rob_item_equip, - base_face, ITEM_ATAMA, bone_data, data, obj_db); + rob_chara_item_equip_load_object_info(rob_itm_equip, + base_face, ITEM_ATAMA, false, bone_data, data, obj_db); for (int32_t i = 0; array0[i] != ITEM_SUB_MAX; i++) { item_sub_id sub_id = array0[i]; item_id id = array4[sub_id]; - object_info obj_info = object_info_null; + object_info obj_info = object_info(); int32_t no = sub_data->data[sub_id]; if (sub_id == ITEM_SUB_HEAD) { if (no == 981) @@ -1450,22 +2201,22 @@ void rob_chara_reload_items(rob_chara* rob_chr, item_sub_data* sub_data, else if (no == 681) obj_info = { 913, 3796 }; } - rob_chara_item_equip_load_object_info(rob_item_equip, - obj_info, id, bone_data, data, obj_db); + rob_chara_item_equip_load_object_info(rob_itm_equip, + obj_info, id, false, bone_data, data, obj_db); } for (int32_t i = 0; array1[i] != ITEM_SUB_MAX; i++) { item_sub_id sub_id = array1[i]; - object_info obj_info = object_info_null; + object_info obj_info = object_info(); int32_t no = sub_data->data[sub_id]; if (sub_id == ITEM_SUB_KATA) { if (no == 301) obj_info = { 306, 953 }; else if (no == 181) obj_info = { 915, 3794 }; - rob_chara_item_equip_load_object_info(rob_item_equip, - obj_info, ITEM_ITEM09, bone_data, data, obj_db); + rob_chara_item_equip_load_object_info(rob_itm_equip, + obj_info, ITEM_ITEM09, false, bone_data, data, obj_db); } } @@ -1475,39 +2226,18 @@ void rob_chara_reload_items(rob_chara* rob_chr, item_sub_data* sub_data, if (id == ITEM_NONE) continue; - object_info obj_info = object_info_null; + object_info obj_info = object_info(); int32_t no = sub_data->data[sub_id]; if (sub_id == ITEM_SUB_OUTER) if (no == 1) obj_info = { 7, 4 }; else if (no == 481) obj_info = { 914, 3795 }; - rob_chara_item_equip_load_object_info(rob_item_equip, - obj_info, id, bone_data, data, obj_db); + rob_chara_item_equip_load_object_info(rob_itm_equip, + obj_info, id, false, bone_data, data, obj_db); } } -void rob_chara_reset(rob_chara* rob_chr, bone_database* bone_data, void* data, object_database* obj_db) { - bone_node* v3 = rob_chara_bone_data_get_node(rob_chr->bone_data, 0); - rob_chara_item_equip_reset_init_data(rob_chr->item_equip, v3); - rob_chara_item_equip_set_item_equip_range(rob_chr->item_equip, rob_chr->module_index == 501); - rob_chara_item_equip_load_object_info(rob_chr->item_equip, - object_info_null, ITEM_BODY, bone_data, data, obj_db); - rob_chara_item_equip_load_object_info(rob_chr->item_equip, - rob_chr->chara_init_data->base_face, ITEM_ATAMA, bone_data, data, obj_db); - rob_chara_item_equip_set_shadow_type(rob_chr->item_equip, rob_chr->chara_id); - rob_chr->item_equip->field_A0 = 5; - rob_chara_item_sub_data_reload_items(&rob_chr->item_sub_data, - rob_chr->chara_id, bone_data, data, obj_db); - if (rob_chara_item_sub_data_check_for_npr_flag(&rob_chr->item_sub_data)) - rob_chr->item_equip->npr_flag = true; - - /*if (rob_chara_check_for_ageageagain_module(rob_chrchara_index, rob_chr->module_index)) { - sub_140542E30(rob_chr->chara_id, 1); - sub_140542E30(rob_chr->chara_id, 2); - }*/ -} - static float_t chara_size_table_get_value(uint32_t a1) { static const float_t chara_size_table[] = { 1.07f, 1.0f, 0.96f, 0.987f, 1.025f @@ -1530,25 +2260,47 @@ static float_t chara_pos_adjust_y_table_get_value(uint32_t a1) { return chara_pos_adjust_y_table[a1]; } +static void sub_140513C60(rob_chara_item_equip* rob_item_equip, item_id id, bool a3) { + if (a3) + rob_item_equip->field_18[id] &= ~0x04; + else + rob_item_equip->field_18[id] |= 0x04; +} + void rob_chara_reset_data(rob_chara* rob_chr, rob_chara_pv_data* pv_data, bone_database* bone_data, motion_database* mot_db) { rob_chara_bone_data_reset(rob_chr->bone_data); rob_chara_bone_data_init_data(rob_chr->bone_data, BONE_DATABASE_SKELETON_COMMON, rob_chr->chara_init_data->skeleton_type, bone_data); + rob_chara_data_reset(&rob_chr->data); + rob_chara_data_reset(&rob_chr->data_prev); rob_chara_item_equip_get_parent_bone_nodes(rob_chr->item_equip, rob_chara_bone_data_get_node(rob_chr->bone_data, 0), bone_data); + rob_chr->type = pv_data->type; rob_chara_data* chr_data = &rob_chr->data; - chr_data->field_1D38.field_0 = pv_data->field_14; - chr_data->field_1D38.field_6 = pv_data->field_14; + chr_data->miku_rot.rot_y_int16 = pv_data->rot_y_int16; + chr_data->miku_rot.field_6 = pv_data->rot_y_int16; chr_data->adjust_data.scale = chara_size_table_get_value(rob_chr->pv_data.chara_size_index); chr_data->adjust_data.height_adjust = rob_chr->pv_data.height_adjust; chr_data->adjust_data.pos_adjust_y = chara_pos_adjust_y_table_get_value(rob_chr->pv_data.chara_size_index); rob_chara_bone_data_eyes_xrot_adjust(rob_chr->bone_data, chara_some_data_array, &pv_data->eyes_adjust); rob_chara_bone_data_get_ik_scale(rob_chr->bone_data, bone_data); rob_chara_load_default_motion(rob_chr, bone_data, mot_db); - int32_t motion_id = 195; //rob_cmn_mottbl_get_motion_index(rob_chr, 0); - rob_chara_load_motion(rob_chr, motion_id, 0, bone_data, mot_db); - rob_chara_set_draw(rob_chr, ITEM_MAX, true); + chr_data->field_8.field_4.field_0 = 1; + chr_data->field_8.field_4.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 0); + chr_data->field_8.field_0 = 0; + chr_data->field_8.field_4.field_10 = pv_data->field_5; + rob_chara_load_motion(rob_chr, chr_data->field_8.field_4.motion_id, + pv_data->field_5, 0.0f, MOTION_BLEND, bone_data, mot_db); + rob_chara_set_disp(rob_chr, ITEM_MAX, true); + rob_chr->item_equip->field_DC = 0; + sub_140513C60(rob_chr->item_equip, ITEM_ATAMA, 0); + sub_140513C60(rob_chr->item_equip, ITEM_TE_R, 0); + sub_140513C60(rob_chr->item_equip, ITEM_TE_L, 0); + object_info head_obj = rob_chara_get_head_object(rob_chr, 0); + chr_data->adjust.field_150.head_object = head_obj; + chr_data->adjust.field_3B0.head_object = head_obj; + rob_chara_set_disp(rob_chr, ITEM_MAX, 1); } void rob_chara_set_frame(rob_chara* rob_chr, float_t frame) { @@ -1558,6 +2310,35 @@ void rob_chara_set_frame(rob_chara* rob_chr, float_t frame) { sub_140509D30(rob_chr); } +bool rob_chara_set_motion_id(rob_chara* rob_chr, int32_t motion_id, + float_t frame, float_t duration, bool a5, bool set_motion_reset_data, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db) { + if (!a5 && rob_chr->data.adjust.motion_id == motion_id) + return false; + + if (duration <= 0.0f) + blend_type = MOTION_BLEND; + rob_chara_load_motion(rob_chr, motion_id, 0, frame, blend_type, bone_data, mot_db); + rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, duration, 1.0f, 0.0f); + rob_chr->data.adjust.field_28 |= 0x80; + rob_chr->data.adjust.frame_data.last_set_frame = frame; + rob_chara_set_motion_skin_param(rob_chr, motion_id, (float_t)(int32_t)frame); + if (duration == 0.0f) { + if (set_motion_reset_data) + rob_chara_set_motion_reset_data(rob_chr, motion_id, frame); + + rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; + rob_itm_equip->item_equip_object[ITEM_TE_L].osage_iterations = 60; + rob_itm_equip->item_equip_object[ITEM_TE_R].osage_iterations = 60; + + /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { + sub_1405430F0(rob_chr->chara_id, 1); + sub_1405430F0(rob_chr->chara_id, 2); + }*/ + } + return true; +} + void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, chara_index chara_index, uint32_t module_index, rob_chara_pv_data* pv_data) { rob_chr->chara_id = chara_id; @@ -1578,18 +2359,6 @@ void rob_chara_set_visibility(rob_chara* rob_chr, bool value) { }*/ } -void rob_chara_free(rob_chara* rob_chr) { - if (rob_chr->bone_data) - rob_chara_bone_data_dispose(rob_chr->bone_data); - - if (rob_chr->item_equip) - rob_chara_item_equip_dispose(rob_chr->item_equip); - - rob_chara_item_sub_data_free(&rob_chr->item_sub_data); - rob_chara_data_free(&rob_chr->data); - rob_chara_data_free(&rob_chr->data_prev); -} - static bone_data* bone_data_init(bone_data* bone) { memset(bone, 0, sizeof(bone_data)); bone->eyes_xrot_adjust_neg = 1.0f; @@ -1647,9 +2416,9 @@ static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select) { if (a1->motion_bone_index == MOTION_BONE_KL_EYE_L || a1->motion_bone_index == MOTION_BONE_KL_EYE_R) { - if (a1->rotation.x > 0.0) + if (a1->rotation.x > 0.0f) a1->rotation.x *= a1->eyes_xrot_adjust_pos; - else if (a1->rotation.x < 0.0) + else if (a1->rotation.x < 0.0f) a1->rotation.x *= a1->eyes_xrot_adjust_neg; } @@ -2166,50 +2935,50 @@ static vec3* bone_data_set_key_data(bone_data* data, vec3* keyframe_data, static void bone_data_parent_data_init(bone_data_parent* bone, rob_chara_bone_data* rob_bone_data, bone_database* bone_data) { - char* base_name = (char*)bone_database_skeleton_type_to_string(rob_bone_data->base_skeleton_type); - char* name = (char*)bone_database_skeleton_type_to_string(rob_bone_data->skeleton_type); - vector_old_bone_database_bone* common_bones = 0; - vector_old_vec3* common_translation = 0; - vector_old_vec3* translation = 0; - if (!bone_database_get_skeleton_bones(bone_data, base_name, &common_bones) - || !bone_database_get_skeleton_positions(bone_data, base_name, &common_translation) - || !bone_database_get_skeleton_positions(bone_data, name, &translation)) + const char* base_name = bone_database_skeleton_type_to_string(rob_bone_data->base_skeleton_type); + const char* name = bone_database_skeleton_type_to_string(rob_bone_data->skeleton_type); + std::vector* common_bones = 0; + std::vector* common_translation = 0; + std::vector* translation = 0; + if (!bone_data->get_skeleton_bones(base_name, &common_bones) + || !bone_data->get_skeleton_positions(base_name, &common_translation) + || !bone_data->get_skeleton_positions(name, &translation)) return; bone->rob_bone_data = rob_bone_data; bone_data_parent_load_rob_chara(bone); - bone_data_parent_load_bone_database(bone, common_bones, common_translation->begin, translation->begin); + bone_data_parent_load_bone_database(bone, common_bones, common_translation->data(), translation->data()); } static void bone_data_parent_load_bone_database(bone_data_parent* bone, - vector_old_bone_database_bone* bones, vec3* common_translation, vec3* translation) { + std::vector* bones, vec3* common_translation, vec3* translation) { rob_chara_bone_data* rob_bone_data = bone->rob_bone_data; size_t chain_pos = 0; size_t total_bone_count = 0; size_t ik_bone_count = 0; bone_data* bone_node = bone->bones.begin; - for (bone_database_bone* i = bones->begin; i != bones->end; i++, bone_node++) { - bone_node->motion_bone_index = (motion_bone_index)(i - bones->begin); - bone_node->type = i->type; - bone_node->mirror = i->mirror; - bone_node->parent = i->parent; - bone_node->flags = i->flags; - if (i->type >= BONE_DATABASE_BONE_POSITION_ROTATION) + for (bone_database_bone& i : *bones ) { + bone_node->motion_bone_index = (motion_bone_index)(&i - bones->data()); + bone_node->type = i.type; + bone_node->mirror = i.mirror; + bone_node->parent = i.parent; + bone_node->flags = i.flags; + if (i.type >= BONE_DATABASE_BONE_POSITION_ROTATION) bone_node->key_set_count = 6; else bone_node->key_set_count = 3; bone_node->base_translation[0] = *common_translation++; bone_node->base_translation[1] = *translation++; - bone_node->node = &rob_bone_data->nodes.begin[total_bone_count]; - bone_node->has_parent = i->has_parent; - if (i->has_parent) - bone_node->parent_mat = &rob_bone_data->mats.begin[i->parent]; + bone_node->node = &rob_bone_data->nodes[total_bone_count]; + bone_node->has_parent = i.has_parent; + if (i.has_parent) + bone_node->parent_mat = &rob_bone_data->mats[i.parent]; else bone_node->parent_mat = 0; bone_node->pole_target_mat = 0; - switch (i->type) { + switch (i.type) { case BONE_DATABASE_BONE_ROTATION: case BONE_DATABASE_BONE_TYPE_1: case BONE_DATABASE_BONE_POSITION: @@ -2237,8 +3006,8 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, bone_node->ik_2nd_segment_length[1] = (translation++)->x; mat4* pole_target = 0; - if (i->pole_target) - pole_target = &rob_bone_data->mats.begin[i->pole_target]; + if (i.pole_target) + pole_target = &rob_bone_data->mats[i.pole_target]; bone_node->pole_target_mat = pole_target; chain_pos += 3; @@ -2246,11 +3015,12 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, total_bone_count += 4; break; } + bone_node++; } } static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, - mot_data* a2, bone_database* a3, motion_database* mot_db) { + mot_data* a2, bone_database* bone_data, motion_database* mot_db) { if (!a2) return; @@ -2262,28 +3032,28 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, return; bone_database_skeleton_type skeleton_type = a1->rob_bone_data->base_skeleton_type; - char* skeleton_type_string = (char*)bone_database_skeleton_type_to_string(skeleton_type); + const char* skeleton_type_string = bone_database_skeleton_type_to_string(skeleton_type); std::string* bone_names = mot_db->bone_name.data(); - mot_bone_info* bone_info = a2->bone_info; - for (size_t key_set_offset= 0, i = 0; key_set_offset< key_set_count; i++) { - int32_t bone_index = bone_database_get_skeleton_bone_index(a3, - skeleton_type_string, bone_names[bone_info[i].index].c_str()); + mot_bone_info* bone_info = a2->bone_info.data(); + for (size_t key_set_offset = 0, i = 0; key_set_offset < key_set_count; i++) { + int32_t bone_index = bone_data->get_skeleton_bone_index(skeleton_type_string, + bone_names[bone_info[i].index].c_str()); if (bone_index == -1) { - bone_index = bone_database_get_skeleton_bone_index(a3, - skeleton_type_string, bone_names[bone_info[++i].index].c_str()); + bone_index = bone_data->get_skeleton_bone_index(skeleton_type_string, + bone_names[bone_info[++i].index].c_str()); if (bone_index == -1) break; } *vector_old_uint16_t_reserve_back(bone_indices) = (uint16_t)bone_index; - bone_data* bone_node = &a1->bones.begin[bone_index]; + ::bone_data* bone_node = &a1->bones.begin[bone_index]; bone_node->key_set_offset = (int32_t)key_set_offset; bone_node->frame = -1.0f; if (bone_node->type >= BONE_DATABASE_BONE_POSITION_ROTATION) - key_set_offset+= 6; + key_set_offset += 6; else - key_set_offset+= 3; + key_set_offset += 3; } } @@ -2373,13 +3143,6 @@ static void bone_node_expression_data_mat_set(bone_node_expression_data* data, mat4_scale_rot(mat, data->parent_scale.x, data->parent_scale.y, data->parent_scale.z, mat); } -static void bone_node_expression_data_reset_position_rotation(bone_node_expression_data* data) { - data->position = vec3_null; - data->rotation = vec3_null; - data->scale = vec3_identity; - data->parent_scale = vec3_identity; -} - static void bone_node_expression_data_reset_scale(bone_node_expression_data* data) { data->scale = vec3_identity; data->parent_scale = vec3_identity; @@ -2407,21 +3170,17 @@ static void bone_node_expression_data_set_position_rotation_vec3(bone_node_expre } static void sub_14047EE90(rob_osage* rob_osg, mat4* mat) { - if (rob_osg->field_1F70) { - /*list_struc_479_node* v5 = rob_osg->field_1F70->head->next; - for (rob_osage_node* v6 = rob_osg->nodes.begin + 1; v6 != rob_osg->nodes.end; v6++) { - v6->field_A0 = v5->value.field_0; - v6->field_AC = v5->value.field_C; - v6->field_B8 = v5->value.field_18; - v6->field_C4 = v5->value.field_24; - v5 = v5->next; - }*/ - rob_osg->field_1F70 = 0; + if (rob_osg->reset_data_list) { + std::list::iterator reset_data_list = rob_osg->reset_data_list->begin(); + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { + i->reset_data = *reset_data_list++; + } + rob_osg->reset_data_list = 0; } - for (rob_osage_node* v9 = rob_osg->nodes.begin + 1; v9 != rob_osg->nodes.end; v9++) { - mat4_mult_vec3(mat, &v9->field_A0.trans_diff, &v9->trans_diff); - mat4_mult_vec3_trans(mat, &v9->field_A0.trans, &v9->trans); + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { + mat4_mult_vec3(mat, &i->reset_data.trans_diff, &i->trans_diff); + mat4_mult_vec3_trans(mat, &i->reset_data.trans, &i->trans); } rob_osg->parent_mat = *rob_osg->parent_mat_ptr; } @@ -2441,13 +3200,13 @@ static void sub_14047F110(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo mat4_rotate_mult(mat, rot.x, rot.y, rot.z, mat); } -static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4, int32_t a5) { +static bool sub_140482FF0(mat4* mat, vec3* trans, skin_param_hinge* hinge, vec3* rot, int32_t* yz_order) { bool clipped = false; float_t z_rot; float_t y_rot; - if (a5 == 1) { - y_rot = atan2f(-a2->z, a2->x); - z_rot = atan2f(a2->y, sqrtf(a2->x * a2->x + a2->z * a2->z)); + if (*yz_order == 1) { + y_rot = atan2f(-trans->z, trans->x); + z_rot = atan2f(trans->y, sqrtf(trans->x * trans->x + trans->z * trans->z)); if (hinge) { if (y_rot > hinge->ymax) { y_rot = hinge->ymax; @@ -2473,8 +3232,8 @@ static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4 mat4_rotate_z_mult(mat, z_rot, mat); } else { - z_rot = atan2f(a2->y, a2->x); - y_rot = atan2f(-a2->z, sqrtf(a2->x * a2->x + a2->y * a2->y)); + z_rot = atan2f(trans->y, trans->x); + y_rot = atan2f(-trans->z, sqrtf(trans->x * trans->x + trans->y * trans->y)); if (hinge) { if (y_rot > hinge->ymax) { y_rot = hinge->ymax; @@ -2500,9 +3259,9 @@ static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4 mat4_rotate_y_mult(mat, y_rot, mat); } - if (a4) { - a4->y = y_rot; - a4->z = z_rot; + if (rot) { + rot->y = y_rot; + rot->z = z_rot; } return clipped; } @@ -2511,8 +3270,8 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo mat4 v47 = *mat; vec3 v45; vec3_mult(rob_osg->exp_data.position, *parent_scale, v45); - mat4_mult_vec3_trans(&v47, &v45, &rob_osg->nodes.begin[0].trans); - if (rob_osg->wind_reset && !rob_osg->field_1F0E) { + mat4_mult_vec3_trans(&v47, &v45, &rob_osg->nodes[0].trans); + if (rob_osg->osage_reset && !rob_osg->field_1F0E) { rob_osg->field_1F0E = true; sub_14047EE90(rob_osg, mat); } @@ -2527,28 +3286,28 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo move_cancel = rob_osg->move_cancel; if (move_cancel > 0.0f) - for (rob_osage_node* v19 = rob_osg->nodes.begin + 1; v19 != rob_osg->nodes.end; v19++) { + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { mat4 parent_mat; vec3 v46; parent_mat = rob_osg->parent_mat; - mat4_mult_vec3_inv_trans(&parent_mat, &v19->trans, &v46); + mat4_mult_vec3_inv_trans(&parent_mat, &i->trans, &v46); parent_mat = *rob_osg->parent_mat_ptr; mat4_mult_vec3_trans(&parent_mat, &v46, &v46); - vec3_sub(v46, v19->trans, v46); + vec3_sub(v46, i->trans, v46); vec3_mult_scalar(v46, move_cancel, v46); - vec3_add(v19->trans, v46, v19->trans); + vec3_add(i->trans, v46, i->trans); } } if (a4) { sub_14047F110(rob_osg, &v47, parent_scale, 0); - *rob_osg->nodes.begin->bone_node_mat = v47; - for (rob_osage_node* v29 = rob_osg->nodes.begin, *v30 = rob_osg->nodes.begin + 1; - v30 != rob_osg->nodes.end; v29++, v30++) { + *rob_osg->nodes[0].bone_node_mat = v47; + for (auto v29 = rob_osg->nodes.begin(), v30 = rob_osg->nodes.begin() + 1; + v30 != rob_osg->nodes.end(); v29++, v30++) { vec3 v46; mat4_mult_vec3_inv_trans(&v47, &v30->trans, &v46); bool v32 = sub_140482FF0(&v47, &v46, &v30->data_ptr->skp_osg_node.hinge, - &v30->field_A0.rotation, rob_osg->field_1EB8); + &v30->reset_data.rotation, &rob_osg->yz_order); *v30->bone_node_ptr->ex_data_mat = v47; float_t v34; vec3_distance(v30->trans, v29->trans, v34); @@ -2565,8 +3324,8 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo mat4_get_translation(&v47, &v30->trans); } - if (rob_osg->nodes.begin != rob_osg->nodes.end && rob_osg->node.bone_node_mat) { - mat4 v48 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; + if (rob_osg->nodes.size() && rob_osg->node.bone_node_mat) { + mat4 v48 = *rob_osg->nodes.end()[-1].bone_node_ptr->ex_data_mat; mat4_translate_mult(&v48, parent_scale->x * rob_osg->node.length, 0.0f, 0.0f, &v48); *rob_osg->node.bone_node_ptr->ex_data_mat = v48; } @@ -2613,9 +3372,9 @@ static void sub_140482490(rob_osage_node* node, float_t step, float_t a3) { vec3_add(node->trans_orig, v4, node->trans); } - sub_140482F30(&node->trans, &node[-1].trans, node->length * a3); + sub_140482F30(&node[0].trans, &node[-1].trans, node->length * a3); if (node->sibling_node) - sub_140482F30(&node->trans, &node->sibling_node->trans, node->distance); + sub_140482F30(&node->trans, &node->sibling_node->trans, node->max_distance); } static void sub_140482180(rob_osage_node* node, float_t a2) { @@ -2634,15 +3393,14 @@ static void sub_140482180(rob_osage_node* node, float_t a2) { } static void sub_14047C800(rob_osage* rob_osg, mat4* mat, - vec3* parent_scale, float_t step, bool a5, bool a6, bool a7) { - rob_osage_node* v7 = rob_osg->nodes.end; - if (rob_osg->nodes.begin == v7) + vec3* parent_scale, float_t step, bool disable_wind, bool ring_coli, bool a7) { + if (!rob_osg->nodes.size()) return; const float_t osage_gravity_const = get_osage_gravity_const(); sub_1404803B0(rob_osg, mat, parent_scale, 0); - rob_osage_node* v17 = &rob_osg->nodes.begin[0]; + rob_osage_node* v17 = &rob_osg->nodes[0]; v17->trans_orig = v17->trans; vec3 v113; vec3_mult(rob_osg->exp_data.position, *parent_scale, v113); @@ -2651,29 +3409,29 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_mult_vec3_trans(&v130, &v113, &v17->trans); vec3_sub(v17->trans, v17->trans_orig, v17->trans_diff); sub_14047F110(rob_osg, &v130, parent_scale, 0); - *rob_osg->nodes.begin->bone_node_mat = v130; - *rob_osg->nodes.begin->bone_node_ptr->ex_data_mat = v130; + *rob_osg->nodes[0].bone_node_mat = v130; + *rob_osg->nodes[0].bone_node_ptr->ex_data_mat = v130; v113 = { 1.0f, 0.0f, 0.0f }; vec3 v128; mat4_mult_vec3(&v130, &v113, &v128); float_t v25 = parent_scale->x; - if (!rob_osg->wind_reset && step <= 0.0f) + if (!rob_osg->osage_reset && step <= 0.0f) return; bool stiffness = rob_osg->skin_param_ptr->stiffness > 0.0f; - rob_osage_node* v12 = rob_osg->nodes.end; - rob_osage_node* v30 = rob_osg->nodes.begin; - for (rob_osage_node* v26 = rob_osg->nodes.begin + 1; v26 != v12; v26++, v30++) { + auto v12 = rob_osg->nodes.end(); + auto v30 = rob_osg->nodes.begin(); + for (auto v26 = rob_osg->nodes.begin() + 1; v26 != v12; v26++, v30++) { rob_osage_node_data* v31 = v26->data_ptr; float_t weight = v31->skp_osg_node.weight; vec3 v111; - if (!rob_osg->field_1F78) { + if (!rob_osg->set_external_force) { sub_140482300(&v111, &v26->trans, &v30->trans, osage_gravity_const, weight); - if (v26 != &v12[-1]) { + if (v26 != v12 - 1) { vec3 v112; sub_140482300(&v112, &v26->trans, &v26[1].trans, osage_gravity_const, weight); vec3_add(v111, v112, v111); @@ -2681,7 +3439,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, } } else - vec3_mult_scalar(rob_osg->field_1F7C, 1.0f / weight, v111); + vec3_mult_scalar(rob_osg->external_force, 1.0f / weight, v111); vec3 v127; vec3_mult_scalar(v128, v31->force * v26->force, v127); @@ -2691,10 +3449,10 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3_add(v111, v127, v126); vec3_mult_scalar(v26->trans_diff, v41, v111); vec3_sub(v126, v111, v126); - vec3_mult_scalar(v26->field_D0, weight, v111); + vec3_mult_scalar(v26->external_force, weight, v111); vec3_add(v126, v111, v126); - if (!a5) { + if (!disable_wind) { vec3_mult_scalar(rob_osg->wind_direction, rob_osg->skin_param_ptr->wind_afc, v111); vec3_add(v126, v111, v126); } @@ -2715,7 +3473,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3 v111; mat4_get_translation(&v131, &v111); - for (rob_osage_node* v55 = rob_osg->nodes.begin + 1; v55 != v12; v55++) { + for (auto v55 = rob_osg->nodes.begin() + 1; v55 != v12; v55++) { mat4_mult_vec3_trans(&v131, &v55->field_94, &v128); vec3 v123; @@ -2736,7 +3494,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3 v129; mat4_mult_vec3_inv_trans(&v131, &v126, &v129); - sub_140482FF0(&v131, &v129, 0, 0, rob_osg->field_1EB8); + sub_140482FF0(&v131, &v129, 0, 0, &rob_osg->yz_order); float_t v58; vec3_distance(v111, v126, v58); @@ -2746,17 +3504,17 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, } } - for (rob_osage_node* v82 = rob_osg->nodes.begin + 1; v82 != v12; v82++) { + for (auto v82 = rob_osg->nodes.begin() + 1; v82 != v12; v82++) { v82->trans_orig = v82->trans; vec3_add(v82->field_28, v82->trans_diff, v82->trans_diff); vec3_add(v82->trans_diff, v82->trans, v82->trans); } - for (rob_osage_node* v90 = v12 - 2; v90 != rob_osg->nodes.begin; v90--) - sub_140482F30(&v90->trans, &v90[1].trans, v25 * v90->child_length); + for (auto v90 = v12 - 2; v90 != rob_osg->nodes.begin(); v90--) + sub_140482F30(&v90[0].trans, &v90[1].trans, v25 * v90->child_length); - if (a6) { - rob_osage_node* v91 = rob_osg->nodes.begin; + if (ring_coli) { + auto v91 = rob_osg->nodes.begin(); float_t v93 = v91->data_ptr->skp_osg_node.coli_r; float_t v97; if (v91->trans.x < rob_osg->ring.ring_rectangle_x - v93 @@ -2768,20 +3526,20 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, v97 = rob_osg->ring.ring_height; float_t v96 = v97 + v93; - for (rob_osage_node* v98 = v91 + 1; v98 != v12; v98++) { - sub_140482490(v98, step, v25); - sub_140482180(v98, v96); + for (auto v98 = v91 + 1; v98 != v12; v98++) { + sub_140482490(&v98[0], step, v25); + sub_140482180(&v98[0], v96); } } if (a7) { - for (rob_osage_node* v99 = rob_osg->nodes.begin + 1, *v100 = rob_osg->nodes.begin; - v99 != v12; v99++, v100++) { + for (auto v99 = rob_osg->nodes.begin() + 1, + v100 = rob_osg->nodes.begin(); v99 != v12; v99++, v100++) { vec3 v129; mat4_mult_vec3_inv_trans(&v130, &v99->trans, &v129); bool v102 = sub_140482FF0(&v130, &v129, &v99->data_ptr->skp_osg_node.hinge, - &v99->field_A0.rotation, rob_osg->field_1EB8); + &v99->reset_data.rotation, &rob_osg->yz_order); *v99->bone_node_ptr->ex_data_mat = v130; float_t v104; @@ -2801,8 +3559,8 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_get_translation(&v130, &v99->trans); } - if (rob_osg->nodes.begin != rob_osg->nodes.end && rob_osg->node.bone_node_mat) { - mat4 v131 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; + if (rob_osg->nodes.size() && rob_osg->node.bone_node_mat) { + mat4 v131 = *rob_osg->nodes.end()[-1].bone_node_ptr->ex_data_mat; mat4_translate_mult(&v131, v25 * rob_osg->node.length, 0.0f, 0.0f, &v131); *rob_osg->node.bone_node_ptr->ex_data_mat = v131; } @@ -3033,19 +3791,23 @@ static int32_t sub_140485220(vec3* a1, skin_param_osage_node* a2, osage_coli* a3 return v8; } -static int32_t sub_1404851C0(vec3* a1, skin_param_osage_node* a2, vector_old_osage_coli* a3, float_t* a4) { - if (a3->begin == a3->end || a3->end[-1].type) +static int32_t sub_1404851C0(vec3* a1, skin_param_osage_node* a2, std::vector* a3, float_t* a4) { + if (!a3->size() || a3->end()[-1].type) return 0; - return sub_140485220(a1, a2, a3->begin, a4); + return sub_140485220(a1, a2, a3->data(), a4); +} + +static int32_t sub_140485180(osage_coli* a1, vec3* a2, skin_param_osage_node* a3) { + return sub_140485220(a2, a3, a1, 0); } static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step, bool a5) { - if (!rob_osg->wind_reset && step <= 0.0f) + if (!rob_osg->osage_reset && step <= 0.0f) return; osage_coli* coli = rob_osg->coli; osage_coli* coli_ring = rob_osg->coli_ring; - vector_old_osage_coli* vec_ring_coli = &rob_osg->ring.coli; + std::vector* vec_ring_coli = &rob_osg->ring.coli; float_t v9 = 0.0f; if (step > 0.0f) @@ -3053,20 +3815,20 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo mat4 v64; if (a5) - v64 = *rob_osg->nodes.begin[0].bone_node_mat; + v64 = *rob_osg->nodes[0].bone_node_mat; else { v64 = *mat; vec3 trans; vec3_mult(rob_osg->exp_data.position, *parent_scale, trans); - mat4_mult_vec3_trans(&v64, &trans, &rob_osg->nodes.begin[0].trans); + mat4_mult_vec3_trans(&v64, &trans, &rob_osg->nodes[0].trans); sub_14047F110(rob_osg, &v64, parent_scale, 0); } float_t v60 = -1000.0f; if (a5) { float_t v22; - rob_osage_node* v16 = &rob_osg->nodes.begin[0]; + rob_osage_node* v16 = &rob_osg->nodes[0]; float_t v18 = v16->data_ptr->skp_osg_node.coli_r; if (v16->trans.x < rob_osg->ring.ring_rectangle_x - v18 || v16->trans.z < rob_osg->ring.ring_rectangle_y - v18 @@ -3083,39 +3845,38 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo v23 = 0.2f / (2.0f - step); if (rob_osg->skin_param_ptr->colli_tgt_osg) { - vector_old_rob_osage_node* v24 = rob_osg->skin_param_ptr->colli_tgt_osg; - rob_osage_node* v26 = v24->end; - rob_osage_node* v27 = rob_osg->nodes.begin; - for (rob_osage_node* v25 = rob_osg->nodes.begin + 1; - v25 != rob_osg->nodes.end; v25++, v27++) { + std::vector* v24 = rob_osg->skin_param_ptr->colli_tgt_osg; + auto v26 = v24->end(); + auto v27 = rob_osg->nodes.begin() + 1; + for (auto v25 = rob_osg->nodes.begin() + 1; v25 != rob_osg->nodes.end(); v25++, v27++) { vec3 v62 = vec3_null; - for (rob_osage_node* v30 = v24->begin + 1; v30 != v26; v30++) + for (auto v30 = v24->begin() + 1; v30 != v26; v30++) sub_140483DE0(&v62, &v27->trans, &v30->trans, v27->data_ptr->skp_osg_node.coli_r + v30->data_ptr->skp_osg_node.coli_r); vec3_add(v27->trans, v62, v27->trans); } } - for (rob_osage_node* v35 = rob_osg->nodes.begin + 1; v35 != rob_osg->nodes.end; v35++) { + for (auto v35 = rob_osg->nodes.begin() + 1; v35 != rob_osg->nodes.end(); v35++) { skin_param_osage_node* skp_osg_node = &v35->data_ptr->skp_osg_node; float_t v37 = (1.0f - rob_osg->field_1EB4) * rob_osg->skin_param_ptr->friction; - vec3* v38 = &v35->trans; if (a5) { - sub_140482490(v35, step, parent_scale->x); - v35->field_C8 = (float_t)sub_1404851C0(v38, skp_osg_node, vec_ring_coli, &v35->field_CC); + sub_140482490(&v35[0], step, parent_scale->x); + v35->field_C8 = (float_t)sub_1404851C0(&v35->trans, + skp_osg_node, vec_ring_coli, &v35->field_CC); if (!rob_osg->field_1F0F) { - v35->field_C8 += (float_t)sub_140485220(v38, skp_osg_node, coli_ring, 0); - v35->field_C8 += (float_t)sub_140485220(v38, skp_osg_node, coli, 0); + v35->field_C8 += (float_t)sub_140485180(coli_ring, &v35->trans, skp_osg_node); + v35->field_C8 += (float_t)sub_140485180(coli, &v35->trans, skp_osg_node); } - sub_140482180(v35, v60); + sub_140482180(&v35[0], v60); } else - sub_140482F30(v38, &v35[-1].trans, v35->length * parent_scale->x); + sub_140482F30(&v35[0].trans, &v35[-1].trans, v35[0].length * parent_scale->x); vec3 v63; - mat4_mult_vec3_inv_trans(&v64, v38, &v63); + mat4_mult_vec3_inv_trans(&v64, &v35->trans, &v63); bool v40 = sub_140482FF0(&v64, &v63, &skp_osg_node->hinge, - &v35->field_A0.rotation, rob_osg->field_1EB8); + &v35->reset_data.rotation, &rob_osg->yz_order); v35->bone_node_ptr->exp_data.parent_scale = *parent_scale; *v35->bone_node_ptr->ex_data_mat = v64; @@ -3127,7 +3888,7 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo float_t v42 = v35->length * parent_scale->x; float_t v44; bool v45; - vec3_distance_squared(*v38, v35[-1].trans, v44); + vec3_distance_squared(v35[0].trans, v35[-1].trans, v44); if (v44 >= v42 * v42) { v42 = sqrtf(v44); v45 = false; @@ -3136,12 +3897,12 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo v45 = true; mat4_translate_mult(&v64, v42, 0.0f, 0.0f, &v64); - v35->field_A0.field_24 = v42; + v35->reset_data.length = v42; if (v40 || v45) - mat4_get_translation(&v64, v38); + mat4_get_translation(&v64, &v35->trans); vec3 v62; - vec3_sub(*v38, v35->trans_orig, v62); + vec3_sub(v35->trans, v35->trans_orig, v62); vec3_mult_scalar(v62, v9, v35->trans_diff); if (v35->field_C8 > 0.0f) { @@ -3155,12 +3916,12 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo if (v55 > v23 * v23) vec3_mult_scalar(v35->trans_diff, v23 / sqrtf(v55), v35->trans_diff); - mat4_mult_vec3_inv_trans(mat, v38, &v35->field_A0.trans); - mat4_mult_vec3_inv(mat, &v35->trans_diff, &v35->field_A0.trans_diff); + mat4_mult_vec3_inv_trans(mat, &v35->trans, &v35->reset_data.trans); + mat4_mult_vec3_inv(mat, &v35->trans_diff, &v35->reset_data.trans_diff); } - if (rob_osg->nodes.begin != rob_osg->nodes.end && rob_osg->node.bone_node_mat) { - mat4 v65 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; + if (rob_osg->nodes.size() && rob_osg->node.bone_node_mat) { + mat4 v65 = *rob_osg->nodes.end()[-1].bone_node_ptr->ex_data_mat; mat4_translate_mult(&v65, rob_osg->node.length * parent_scale->x, 0.0f, 0.0f, &v65); *rob_osg->node.bone_node_ptr->ex_data_mat = v65; mat4_scale_rot(&v65, parent_scale->x, parent_scale->y, parent_scale->z, &v65); @@ -3169,57 +3930,56 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo } } -static void sub_140480F40(rob_osage* rob_osg, vec3* a2, float_t a3) { - vec3 v4; - if (a2) - v4 = *a2; +static void rob_osage_set_nodes_external_force(rob_osage* rob_osg, vec3* external_force, float_t strength) { + vec3 v4 ; + if (external_force) + v4 = *external_force; else v4 = vec3_null; - size_t v7 = rob_osg->field_298; + size_t exf = rob_osg->osage_setting.exf; size_t v8 = 0; - if (v7 >= 4) { - float_t v9 = a3 * a3 * a3 * a3; - v8 = ((v7 - 4) / 4 + 1) * 4; + if (exf >= 4) { + float_t strength4 = strength * strength * strength * strength; + v8 = ((exf - 4) / 4 + 1) * 4; for (size_t v10 = v8 / 4; v10; v10--) - vec3_mult_scalar(v4, v9, v4); + vec3_mult_scalar(v4, strength4, v4); } - if (v8 < v7) - for (size_t v12 = v7 - v8; v12; v12--) - vec3_mult_scalar(v4, a3, v4); + if (v8 < exf) + for (size_t v12 = exf - v8; v12; v12--) + vec3_mult_scalar(v4, strength, v4); - for (rob_osage_node* v13 = rob_osg->nodes.begin + 1; - v13 != rob_osg->nodes.end; v13++) { - v13->field_D0 = v4; - vec3_mult_scalar(v4, a3, v4); + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { + i->external_force = v4; + vec3_mult_scalar(v4, strength, v4); } } static void rob_osage_set_nodes_force(rob_osage* rob_osg, float_t force) { - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) i->force = force; } static void sub_140480260(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step, bool v5) { if (!v5) { - sub_140480F40(rob_osg, 0, 1.0f); + rob_osage_set_nodes_external_force(rob_osg, 0, 1.0f); rob_osage_set_nodes_force(rob_osg, 1.0f); - rob_osg->field_1F78 = 0; - rob_osg->field_1F7C = vec3_null; + rob_osg->set_external_force = false; + rob_osg->external_force = vec3_null; } rob_osg->field_2A0 = true; rob_osg->field_2A1 = false; rob_osg->field_2A4 = -1.0f; rob_osg->field_1F0C = false; - rob_osg->wind_reset = false; + rob_osg->osage_reset = false; rob_osg->field_1F0E = false; - for (rob_osage_node* i = rob_osg->nodes.begin; i != rob_osg->nodes.end; i++) { - i->field_C8 = 0.0; - i->field_CC = 1.0; + for (auto i = rob_osg->nodes.begin(); i != rob_osg->nodes.end(); i++) { + i->field_C8 = 0.0f; + i->field_CC = 1.0f; } rob_osg->parent_mat = *rob_osg->parent_mat_ptr; @@ -3232,31 +3992,31 @@ static void sub_14047C770(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo } static void sub_14047C750(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step) { - sub_14047C770(rob_osg, mat, parent_scale, step, 0); + sub_14047C770(rob_osg, mat, parent_scale, step, false); } static void sub_14047ECA0(rob_osage* rob_osg, float_t step) { if (step <= 0.0f) return; - vector_old_osage_coli* vec_coli = &rob_osg->ring.coli; + std::vector* vec_coli = &rob_osg->ring.coli; osage_coli* coli_ring = rob_osg->coli_ring; osage_coli* coli = rob_osg->coli; bool v11 = rob_osg->field_1F0F; - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) { + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { rob_osage_node_data* data = i->data_ptr; i->field_C8 += (float_t)sub_1404851C0(&i->trans, &data->skp_osg_node, vec_coli, &i->field_CC); if (v11) continue; - for (rob_osage_node** j = data->boc.begin; j != data->boc.end; j++) { + for (std::vector::iterator j = data->boc.begin(); j != data->boc.end(); j++) { rob_osage_node* k = *j; - k->field_C8 += (float_t)sub_140485220(&k->trans, &data->skp_osg_node, coli_ring, 0); - k->field_C8 += (float_t)sub_140485220(&k->trans, &data->skp_osg_node, coli, 0); + k->field_C8 += (float_t)sub_140485180(coli_ring, &k->trans, &data->skp_osg_node); + k->field_C8 += (float_t)sub_140485180(coli, &k->trans, &data->skp_osg_node); } - i->field_C8 += (float_t)sub_140485220(&i->trans, &data->skp_osg_node, coli_ring, 0); - i->field_C8 += (float_t)sub_140485220(&i->trans, &data->skp_osg_node, coli, 0); + i->field_C8 += (float_t)sub_140485180(coli_ring, &i->trans, &data->skp_osg_node); + i->field_C8 += (float_t)sub_140485180(coli, &i->trans, &data->skp_osg_node); } } @@ -3338,7 +4098,7 @@ static void sub_140484850(vec3* a1, vec3* a2, vec3* a3, osage_coli* coli) { else { float_t v25; vec3_length(v56, v25); - if (v25 != 0.0) + if (v25 != 0.0f) vec3_mult_scalar(v56, 1.0f / v25, v56); float_t v30 = 1.0f / coli->bone_pos_diff_length; @@ -3409,14 +4169,14 @@ static void sub_14047D620(rob_osage* rob_osg, float_t step) { if (step < 0.0f && rob_osg->field_1F0F) return; - vector_old_rob_osage_node* nodes = &rob_osg->nodes; - vec3 v7 = nodes->begin[0].trans; + std::vector* nodes = &rob_osg->nodes; + vec3 v7 = (*nodes)[0].trans; osage_coli* coli = rob_osg->coli; osage_coli* coli_ring = rob_osg->coli_ring; int32_t coli_type = rob_osg->skin_param_ptr->coli_type; - for (rob_osage_node* v10 = nodes->begin + 1; v10 != nodes->end; v10++) { + for (auto v10 = nodes->begin() + 1; v10 != nodes->end(); v10++) { rob_osage_node_data* v11 = v10->data_ptr; - for (rob_osage_node** j = v11->boc.begin; j != v11->boc.end; j++) { + for (std::vector::iterator j = v11->boc.begin(); j != v11->boc.end(); j++) { rob_osage_node* v15 = *j; float_t v17 = (float_t)( sub_140485000(&v10->trans, &v15->trans, &v11->skp_osg_node, coli) @@ -3425,7 +4185,7 @@ static void sub_14047D620(rob_osage* rob_osg, float_t step) { v15->field_C8 += v17; } - if (coli_type && (coli_type != 1 || v10 != nodes->begin + 1)) { + if (coli_type && (coli_type != 1 || v10 != nodes->begin() + 1)) { float_t v20 = (float_t)( sub_140485000(&v10[0].trans, &v10[-1].trans, &v11->skp_osg_node, coli) + sub_140485000(&v10[0].trans, &v10[-1].trans, &v11->skp_osg_node, coli_ring)); @@ -3433,54 +4193,52 @@ static void sub_14047D620(rob_osage* rob_osg, float_t step) { v10[-1].field_C8 += v20; } } - nodes->begin[0].trans = v7; + (*nodes)[0].trans = v7; } -static void sub_14047F990(rob_osage* a1, mat4* a2, vec3* a3, bool a4) { - rob_osage_node* v4; - v4 = a1->nodes.end; - if (a1->nodes.begin == v4) +static void sub_14047F990(rob_osage* rob_osg, mat4* a2, vec3* a3, bool a4) { + if (!rob_osg->nodes.size()) return; vec3 v76; - vec3_mult(a1->exp_data.position, *a3, v76); + vec3_mult(rob_osg->exp_data.position, *a3, v76); mat4_mult_vec3_trans(a2, &v76, &v76); vec3 v74 = v76; - rob_osage_node* v12 = &a1->nodes.begin[0]; + rob_osage_node* v12 = &rob_osg->nodes[0]; v12->trans = v76; v12->trans_orig = v76; v12->trans_diff = vec3_null; float_t ring_height; - rob_osage_node* v14 = &a1->nodes.begin[0]; + rob_osage_node* v14 = &rob_osg->nodes[0]; float_t coli_r = v14->data_ptr->skp_osg_node.coli_r; - if (v14->trans.x < a1->ring.ring_rectangle_x - coli_r - || v14->trans.z < a1->ring.ring_rectangle_y - coli_r - || v14->trans.x > a1->ring.ring_rectangle_x + a1->ring.ring_rectangle_width - || v14->trans.z > a1->ring.ring_rectangle_y + a1->ring.ring_rectangle_height) - ring_height = a1->ring.ring_out_height; + if (v14->trans.x < rob_osg->ring.ring_rectangle_x - coli_r + || v14->trans.z < rob_osg->ring.ring_rectangle_y - coli_r + || v14->trans.x > rob_osg->ring.ring_rectangle_x + rob_osg->ring.ring_rectangle_width + || v14->trans.z > rob_osg->ring.ring_rectangle_y + rob_osg->ring.ring_rectangle_height) + ring_height = rob_osg->ring.ring_out_height; else - ring_height = a1->ring.ring_height; + ring_height = rob_osg->ring.ring_height; mat4 v78 = *a2; - sub_14047F110(a1, &v78, a3, true); + sub_14047F110(rob_osg, &v78, a3, true); vec3 v60 = { 1.0f, 0.0f, 0.0f }; mat4_mult_vec3(&v78, &v60, &v60); - osage_coli* coli_ring = a1->coli_ring; - osage_coli* coli = a1->coli; + osage_coli* coli_ring = rob_osg->coli_ring; + osage_coli* coli = rob_osg->coli; float_t v25 = ring_height + coli_r; float_t v16 = a3->x; - for (rob_osage_node* i = a1->nodes.begin, *j = a1->nodes.begin + 1; j != a1->nodes.end; i++, j++) { + for (auto i = rob_osg->nodes.begin(), j = rob_osg->nodes.begin() + 1; j != rob_osg->nodes.end(); i++, j++) { vec3_normalize(v60, v60); vec3_mult_scalar(v60, v16 * j->length, v60); vec3_add(i->trans, v60, v74); if (a4 && j->sibling_node) - sub_140482F30(&v74, &j->sibling_node->trans, j->distance); + sub_140482F30(&v74, &j->sibling_node->trans, j->max_distance); skin_param_osage_node* v38 = &j->data_ptr->skp_osg_node; - sub_140485220(&v74, v38, coli_ring, 0); - sub_140485220(&v74, v38, coli, 0); + sub_140485180(coli_ring, &v74, v38); + sub_140485180(coli, &v74, v38); float_t v39 = v25 + v38->coli_r; if (v74.y < v39 && v39 < 1001.0f) { @@ -3495,7 +4253,7 @@ static void sub_14047F990(rob_osage* a1, mat4* a2, vec3* a3, bool a4) { vec3 v77; mat4_mult_vec3_inv_trans(&v78, &j->trans, &v77); sub_140482FF0(&v78, &v77, &j->data_ptr->skp_osg_node.hinge, - &j->field_A0.rotation, a1->field_1EB8); + &j->reset_data.rotation, &rob_osg->yz_order); j->bone_node_ptr->exp_data.parent_scale = *a3; *j->bone_node_ptr->ex_data_mat = v78; if (j->bone_node_mat) @@ -3511,13 +4269,13 @@ static void sub_14047F990(rob_osage* a1, mat4* a2, vec3* a3, bool a4) { vec3_sub(j->trans, i->trans, v60); } - if (a1->nodes.begin != a1->nodes.end && a1->node.bone_node_mat) { - mat4 v79 = *a1->nodes.end[-1].bone_node_ptr->ex_data_mat; - mat4_translate_mult(&v79, v16 * a1->node.length, 0.0f, 0.0f, &v79); - *a1->node.bone_node_ptr->ex_data_mat = v79; + if (rob_osg->nodes.size() && rob_osg->node.bone_node_mat) { + mat4 v79 = *rob_osg->nodes.end()[-1].bone_node_ptr->ex_data_mat; + mat4_translate_mult(&v79, v16 * rob_osg->node.length, 0.0f, 0.0f, &v79); + *rob_osg->node.bone_node_ptr->ex_data_mat = v79; mat4_scale_rot(&v79, a3->x, a3->y, a3->z, &v79); - *a1->node.bone_node_mat = v79; - a1->node.bone_node_ptr->exp_data.parent_scale = *a3; + *rob_osg->node.bone_node_mat = v79; + rob_osg->node.bone_node_ptr->exp_data.parent_scale = *a3; } } @@ -3578,50 +4336,169 @@ static void sub_14053CE30(rob_osage_node_data_normal_ref* normal_ref, mat4* a2) } static void sub_14047E1C0(rob_osage* rob_osg, vec3* scale) { - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) if (i->data_ptr->normal_ref.field_0) { sub_14053CE30(&i->data_ptr->normal_ref, i->bone_node_mat); mat4_scale_rot(i->bone_node_mat, scale->x, scale->y, scale->z, i->bone_node_mat); } } -static void rob_osage_init(rob_osage* rob_osg) { - vector_old_rob_osage_node_clear(&rob_osg->nodes, rob_osage_node_free); - rob_osg->nodes.end = rob_osg->nodes.begin; - rob_osage_node_init(&rob_osg->node); +static void sub_140482DF0(struc_477* dst, struc_477* src0, struc_477* src1, float_t blend) { + dst->length = lerp(src0->length, src1->length, blend); + vec3_lerp_scalar(src0->angle, src1->angle, dst->angle, blend); +} + +static void sub_140482100(struc_476* a1, opd_blend_data* a2, struc_477* a3) { + if (!a2->field_C) + a1->field_0 = *a3; + else if (a2->type == MOTION_BLEND_FREEZE) { + if (a2->blend == 0.0f) + a1->field_10 = a1->field_0; + sub_140482DF0(&a1->field_0, &a1->field_10, a3, a2->blend); + } + else if (a2->type == MOTION_BLEND_CROSS) + sub_140482DF0(&a1->field_0, &a1->field_0, a3, a2->blend); +} + +static void sub_14047E240(rob_osage* rob_osg, mat4* a2, vec3* a3, std::vector* a4) { + if (!a4->size()) + return; + + vec3 v63; + vec3_mult(rob_osg->exp_data.position, *a3, v63); + + mat4 v85; + mat4_mult_vec3_trans(&v85, &v63, &rob_osg->nodes[0].trans); + + sub_14047F110(rob_osg, &v85, a3, 0); + *rob_osg->nodes[0].bone_node_mat = v85; + *rob_osg->nodes[0].bone_node_ptr->ex_data_mat = v85; + + size_t v17 = a4->size() - 1; + for (auto i = a4->end(); i != a4->begin(); v17--) { + i--; + mat4 v87 = v85; + float_t frame = i->frame; + vec3 v22 = rob_osg->nodes[0].trans; + vec3 v25 = v22; + if (frame >= i->frame_count) + frame = 0.0f; + + int32_t frame_int = (int32_t)frame; + if (frame != -0.0f && (float_t)frame_int != frame) + frame_int = (frame < 0.0f ? frame_int - 1 : frame_int); + + int32_t curr_key = frame_int; + int32_t next_key = frame_int + 1; + if ((float_t)next_key >= i->frame_count) + next_key = 0; + + float_t blend = frame - (float_t)frame_int; + float_t inv_blend = 1.0f - blend; + for (auto j = rob_osg->nodes.begin() + 1; j != rob_osg->nodes.end(); j++) { + opd_vec3_data* opd = &j->opd_data[v17]; + float_t* opd_x = opd->x; + float_t* opd_y = opd->y; + float_t* opd_z = opd->z; + + vec3 v62; + v62.x = opd_x[curr_key]; + v62.y = opd_y[curr_key]; + v62.z = opd_z[curr_key]; + + vec3 v77; + v77.x = opd_x[next_key]; + v77.y = opd_y[next_key]; + v77.z = opd_z[next_key]; + + vec3 v84; + mat4_mult_vec3_trans(a2, &v62, &v84); + + vec3 v83; + mat4_mult_vec3_trans(a2, &v77, &v83); + + vec3 v82; + vec3_mult_scalar(v83, blend, v82); + + vec3 v81; + vec3_mult_scalar(v84, inv_blend, v81); + vec3_add(v82, v81, v82); + + vec3 v86; + mat4_mult_vec3_inv_trans(&v87, &v82, &v86); + + vec3 v64 = vec3_null; + sub_140482FF0(&v87, &v86, 0, &v64, &rob_osg->yz_order); + mat4_set_translation(&v87, &v82); + + float_t v50; + vec3_distance(v83, v25, v50); + + float_t v49; + vec3_distance(v84, v22, v49); + + struc_477 v72; + v72.angle = v64; + v72.length = v49 * inv_blend + v50 * blend; + sub_140482100(&j->field_1B0, &i[0], &v72); + + v22 = v84; + v25 = v83; + } + } + + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { + float_t v54 = i->field_1B0.field_0.angle.y; + float_t v55 = i->field_1B0.field_0.angle.z; + v54 = clamp(v54, (float_t)-M_PI, (float_t)M_PI); + v55 = clamp(v55, (float_t)-M_PI, (float_t)M_PI); + mat4_rotate_z_mult(&v85, v55, &v85); + mat4_rotate_y_mult(&v85, v54, &v85); + i->bone_node_ptr->exp_data.parent_scale = *a3; + *i->bone_node_ptr->ex_data_mat = v85; + if (i->bone_node_mat) { + mat4 mat = v85; + mat4_scale_rot(&mat, a3->x, a3->y, a3->z, &mat); + *i->bone_node_mat = mat; + } + mat4_translate_mult(&v85, i->field_1B0.field_0.length, 0.0f, 0.0f, &v85); + i->trans_orig = i->trans; + mat4_get_translation(&v85, &i->trans); + } + + if (rob_osg->nodes.size() && rob_osg->node.bone_node_mat) { + mat4 v87 = *rob_osg->nodes.end()[-1].bone_node_ptr->ex_data_mat; + mat4_translate_mult(&v87, rob_osg->node.length * a3->x, 0.0f, 0.0f, &v87); + *rob_osg->node.bone_node_ptr->ex_data_mat = v87; + + mat4_scale_rot(&v87, a3->x, a3->y, a3->z, &v87); + *rob_osg->node.bone_node_mat = v87; + rob_osg->node.bone_node_ptr->exp_data.parent_scale = *a3; + } +} + +static void rob_osage_reset(rob_osage* rob_osg) { + rob_osg->nodes.clear(); + rob_osg->node = rob_osage_node(); rob_osg->wind_direction = vec3_null; rob_osg->field_1EB4 = 0.0f; - rob_osg->field_1EB8 = 0; + rob_osg->yz_order = 0; rob_osg->field_2A0 = true; - /*tree_295* cns_data = &rob_osg->field_1F60; - sub_140216750(&rob_osg->field_1F60, rob_osg->field_1F60.head->parent); - cns_data->head->parent = cns_data->head; - cns_data->head->left = cns_data->head; - cns_data->head->right = cns_data->head; - rob_osg->field_1F60.size = 0;*/ + rob_osg->motion_reset_data.clear(); rob_osg->move_cancel = 0.0f; rob_osg->field_1F0C = false; - rob_osg->wind_reset = false; + rob_osg->osage_reset = false; rob_osg->field_1F0E = false; - rob_osg->ring.ring_rectangle_x = 0.0f; - rob_osg->ring.ring_rectangle_y = 0.0f; - rob_osg->ring.ring_rectangle_width = 0.0f; - rob_osg->ring.ring_rectangle_height = 0.0f; - rob_osg->ring.ring_height = -1000.0f; - rob_osg->ring.ring_out_height = -1000.0f; - rob_osg->ring.field_18 = 0; - rob_osg->ring.coli.end = rob_osg->ring.coli.begin; - rob_osg->ring.skp_root_coli.end = rob_osg->ring.skp_root_coli.begin; + rob_osg->ring = osage_ring_data(); rob_osg->field_1F0F = 0; - skin_param_init(&rob_osg->skin_param); + rob_osg->skin_param = skin_param(); rob_osg->skin_param_ptr = &rob_osg->skin_param; - rob_osg->field_290 = -1; - rob_osg->field_298 = 0; - rob_osg->field_1F70 = 0; + rob_osg->osage_setting = osage_setting_osg_cat(); + rob_osg->reset_data_list = 0; rob_osg->field_2A4 = 0.0f; rob_osg->field_2A1 = false; - rob_osg->field_1F78 = 0; - rob_osg->field_1F7C = vec3_null; + rob_osg->set_external_force = false; + rob_osg->external_force = vec3_null; rob_osg->parent_mat_ptr = 0; rob_osg->parent_mat = mat4u_null; } @@ -3629,18 +4506,17 @@ static void rob_osage_init(rob_osage* rob_osg) { static void rob_osage_init_data(rob_osage* rob_osg, object_skin_block_osage* osg_data, object_skin_osage_node* osg_nodes, bone_node* ex_data_bone_nodes, object_skin* skin) { - rob_osage_init(rob_osg); + rob_osage_reset(rob_osg); bone_node_expression_data_set_position_rotation_vec3( &rob_osg->exp_data, &osg_data->base.position, &osg_data->base.rotation); - vector_old_rob_osage_node* nodes = &rob_osg->nodes; - vector_old_rob_osage_node_clear(&rob_osg->nodes, 0); - vector_old_rob_osage_node_reserve(&rob_osg->nodes, osg_data->count + 1ULL); - rob_osg->nodes.end += osg_data->count + 1ULL; + std::vector& nodes = rob_osg->nodes; + rob_osg->nodes.clear(); + rob_osg->nodes.resize(osg_data->count + 1ULL); - rob_osage_node* external = nodes->begin; - rob_osage_node_init(nodes->begin); + rob_osage_node* external = &nodes[0]; + nodes[0] = rob_osage_node(); external->child_length = osg_nodes->length; bone_node* external_bone_node = &ex_data_bone_nodes[osg_data->external_name_index & 0x7FFF]; external->bone_node_ptr = external_bone_node; @@ -3651,8 +4527,8 @@ static void rob_osage_init_data(rob_osage* rob_osg, bone_node* parent_bone_node = external->bone_node_ptr; for (int32_t i = 0; i < osg_data->count; i++) { object_skin_osage_node* v14 = &osg_nodes[i]; - rob_osage_node* node = &nodes->begin[i + 1]; - rob_osage_node_init(node); + rob_osage_node* node = &nodes[i + 1LL]; + *node = rob_osage_node(); node->length = v14[0].length; if (i != osg_data->count - 1) node->child_length = v14[1].length; @@ -3663,7 +4539,7 @@ static void rob_osage_init_data(rob_osage* rob_osg, parent_bone_node = node->bone_node_ptr; } - rob_osage_node_init(&rob_osg->node); + rob_osg->node = rob_osage_node(); rob_osg->node.length = osg_nodes[osg_data->count - 1].length; bone_node* v22 = &ex_data_bone_nodes[osg_data->name_index & 0x7FFF]; rob_osg->node.bone_node_ptr = v22; @@ -3671,42 +4547,46 @@ static void rob_osage_init_data(rob_osage* rob_osg, v22->parent = parent_bone_node; *rob_osg->node.bone_node_ptr->ex_data_mat = mat4_identity; - object_skin_osage_node* v23 = osg_data->nodes; - size_t v32 = 0i64; - if (osg_data->count) - { - size_t v33 = 0i64; - do - { - rob_osage_node* v26 = nodes->begin; - size_t v35 = 0i64; - if (skin->bones_count) - { - object_skin_bone* v36 = skin->bones; - while (v36->id != osg_nodes->name_index) - { - ++v35; - ++v36; - if (v35 >= skin->bones_count) - goto LABEL_18; - } + if (osg_data->count) { + object_skin_osage_node* v23 = osg_data->nodes; + size_t v24 = 0; + rob_osage_node* v26 = &nodes[1]; + for (size_t i = 0; i < osg_data->count; i++) { + vec3 v27 = vec3_null; + if (v23) + v27 = v23[i].rotation; - mat4 mat = skin->bones[v35].inv_bind_pose_mat; - mat4_inverse_normalized(&mat, &mat); - v26[v33 + 1].mat = mat; - } - else - { - LABEL_18: - v26[v33 + 1].mat = mat4_null; - } - ++v32; - ++v33; - ++osg_nodes; - } while (v32 < (unsigned int)osg_data->count); + mat4 mat; + mat4_rotate(v27.x, v27.y, v27.z, &mat); + + vec3 v49; + v49 = vec3_null; + v49.x = v26[i].length; + mat4_mult_vec3(&mat, &v49, &v26[i].field_94); + } } - rob_osage_node* v38 = &rob_osg->nodes.end[-1]; + if (osg_data->count) { + object_skin_osage_node* v23 = osg_data->nodes; + rob_osage_node* v26 = &nodes[1]; + size_t v33 = 0; + for (int32_t i = 0; i < osg_data->count; i++) { + v26[i].mat = mat4_null; + + object_skin_bone* v36 = skin->bones; + for (int32_t j = 0; j < skin->bones_count; j++) + if ((v36++)->id == osg_nodes->name_index) { + mat4 mat = skin->bones[j].inv_bind_pose_mat; + mat4_inverse_normalized(&mat, &mat); + v26[i].mat = mat; + break; + } + + osg_nodes++; + } + } + + rob_osage_node* v38 = &rob_osg->nodes.end()[-1]; if (memcmp(&v38->mat, &mat4_null, sizeof(mat4))) { mat4 mat = v38->mat; mat4_translate_mult(&mat, rob_osg->node.length, 0.0f, 0.0f, &mat); @@ -3714,30 +4594,6 @@ static void rob_osage_init_data(rob_osage* rob_osg, } } -static void skin_param_hinge_limit(skin_param_hinge* hinge) { - hinge->ymin = max(hinge->ymin, -179.0f) * DEG_TO_RAD_FLOAT; - hinge->ymax = min(hinge->ymax, 179.0f) * DEG_TO_RAD_FLOAT; - hinge->zmin = max(hinge->zmin, -179.0f) * DEG_TO_RAD_FLOAT; - hinge->zmax = min(hinge->zmax, 179.0f) * DEG_TO_RAD_FLOAT; -} - -static void rob_osage_node_data_init(rob_osage_node_data* node_data) { - node_data->force = 0.0f; - node_data->boc.end = node_data->boc.begin; - node_data->skp_osg_node.coli_r = 0.0f; - node_data->skp_osg_node.weight = 1.0f; - node_data->skp_osg_node.inertial_cancel = 0.0f; - node_data->skp_osg_node.hinge = { -90.0f, 90.0f, -90.0f, 90.0f }; - skin_param_hinge_limit(&node_data->skp_osg_node.hinge); - node_data->normal_ref.field_0 = 0; - node_data->normal_ref.n = 0; - node_data->normal_ref.u = 0; - node_data->normal_ref.d = 0; - node_data->normal_ref.l = 0; - node_data->normal_ref.r = 0; - node_data->normal_ref.mat = mat4u_identity; -} - static float_t ex_expression_block_stack_get_value(ex_expression_block_stack* stack) { float_t value = 0.0f; switch (stack->type) { @@ -3903,7 +4759,7 @@ static float_t exp_neg(float_t v1) { } static float_t exp_or(float_t v1, float_t v2) { - return v1 != 0.0 || v2 != 0.0f ? 1.0f : 0.0f; + return v1 != 0.0f || v2 != 0.0f ? 1.0f : 0.0f; } static float_t exp_pow(float_t v1, float_t v2) { @@ -3942,17 +4798,145 @@ static const float_t get_osage_gravity_const() { return 0.00299444468691945f; } -static void item_sub_data_item_change_free(item_sub_data_item_change* itm_chg) { - vector_old_uint32_t_free(&itm_chg->item_ids, 0); +static bool sub_140410250(struc_313* a1, size_t a2) { + return !!(a1->bitfield.data()[a2 >> 5] & (1 << (a2 & 0x1F))); } -static void item_sub_data_texture_change_free(item_sub_data_texture_change* tex_chg) { - vector_old_item_sub_data_texture_change_tex_free(&tex_chg->tex, item_sub_data_texture_change_tex_free); +static void mot_blend_interpolate(mot_blend* a1, vector_old_bone_data* bones, + vector_old_uint16_t* bone_indices, bone_database_skeleton_type skeleton_type) { + if (!a1->mot_key_data.key_sets_ready || !a1->mot_key_data.mot_data || a1->field_30) + return; + + float_t frame = a1->mot_play_data.frame_data.frame; + vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.begin; + bone_data* bones_data = bones->begin; + for (uint16_t* i = bone_indices->begin; i != bone_indices->end; i++) { + bone_data* data = &bones_data[*i]; + bool get_data = sub_140410250(&a1->field_0.field_8, data->motion_bone_index); + if (get_data) { + mot_key_data_interpolate(&a1->mot_key_data, frame, data->key_set_offset, data->key_set_count); + data->frame = frame; + } + keyframe_data = bone_data_set_key_data(data, keyframe_data, skeleton_type, get_data, 0); + } } -static void item_sub_data_texture_change_tex_free(item_sub_data_texture_change_tex* tex_chg_tex) { - if (tex_chg_tex->changed) - texture_free(tex_chg_tex->chg); +static void mot_blend_load_motion(mot_blend* a1, int32_t motion_id, motion_database* mot_db) { + mot_key_data_load_file(&a1->mot_key_data, motion_id, mot_db); + a1->blend.Reset(); +} + +static void sub_14040F650(struc_313* a1, size_t a2) { + size_t v7 = (a2 + 31) >> 5; + if (v7 < a1->bitfield.size()) + a1->bitfield.resize(v7); + a1->motion_bone_count = a2; + + int32_t v9 = (int32_t)a2 & 0x1F; + if (v9) + a1->bitfield.data()[v7 - 1] &= (1 << v9) - 1; +} + +static void sub_1404122C0(struc_313* a1, struc_314* a2, struc_314* a3, struc_314* a4) { + uint32_t* bitfield = a1->bitfield.data(); + uint32_t* v4 = bitfield; + uint32_t* v5 = a3->field_0; + size_t v6 = a3->field_8; + size_t v7 = a1->motion_bone_count; + size_t v8 = 0; + + struc_314 v25; + v25.field_0 = bitfield; + v25.field_8 = 0; + if (v7) { + size_t v12 = v6 + 32 * (v5 - v4); + v25.field_0 = &bitfield[v12 >> 5]; + v25.field_8 = v12 & 0x1F; + } + + struc_314 v26; + v26.field_0 = bitfield; + v26.field_8 = 0; + if (v7) { + size_t v17 = a4->field_8 + 32 * (a4->field_0 - v4); + v26.field_0 = &v4[v17 >> 5]; + v26.field_8 = v17 & 0x1F; + } + + size_t v18 = v25.field_8 + 32 * (v25.field_0 - v4); + if (v25.field_0 != v26.field_0 || v25.field_8 != v26.field_8) { + size_t v19 = 0; + if (v7) { + v4 += v7 >> 5; + v19 = a1->motion_bone_count & 0x1F; + } + + size_t v20 = v26.field_8; + uint32_t* v21 = v26.field_0; + size_t v22 = v25.field_8; + uint32_t* v23 = v25.field_0; + while (v21 != v4 || v20 != v19) { + if ((1 << v20) & *v21) + *v23 |= 1 << v22; + else + *v23 &= ~(1 << v22); + if (v22 >= 0x1F) { + v22 = 0; + v23++; + } + else + v22++; + + if (v20 >= 0x1F) { + v20 = 0; + v21++; + } + else + v20++; + } + sub_14040F650(a1, v22 + 32 * (v23 - a1->bitfield.data())); + } + + a2->field_0 = &a1->bitfield.data()[v18 >> 5]; + a2->field_8 = v18 & 0x1F; +} + +static void sub_1404119A0(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + struc_314 v3; + if (a1->motion_bone_count) { + v3.field_0 = &bitfield[a1->motion_bone_count >> 5]; + v3.field_8 = a1->motion_bone_count & 0x1F; + } + else { + v3.field_0 = bitfield; + v3.field_8 = 0; + } + + struc_314 v4; + v4.field_0 = bitfield; + v4.field_8 = 0; + + struc_314 v5; + sub_1404122C0(a1, &v5, &v4, &v3); +} + +static void mot_blend_reset(mot_blend* a1) { + mot_key_data_reset(&a1->mot_key_data); + mot_play_data_reset(&a1->mot_play_data); + a1->blend.Reset(); + a1->field_0.bone_check_func = 0; + sub_1404119A0(&a1->field_0.field_8); + a1->field_0.motion_bone_count = 0; + a1->field_30 = 0; +} + +static void mot_blend_set_duration(mot_blend* a1, float_t duration, float_t step, float_t offset) { + a1->blend.SetDuration(duration, step, offset); +} + +static void mot_blend_set_frame(mot_blend* a1, float_t frame) { + mot_play_frame_data_set_frame(&a1->mot_play_data.frame_data, frame); } static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, @@ -4089,17 +5073,17 @@ static bool mot_data_load_file(mot* a1, mot_data* a2) { a1->key_set_count = key_set_count; a1->field_4 = a2->info & 0x8000; - mot_key_set_data* key_set_file = a2->key_set; + mot_key_set_data* key_set_file = a2->key_set.data(); mot_key_set* key_set = a1->key_sets; for (int32_t i = 0; i < key_set_count; i++, key_set++, key_set_file++) { key_set->type = key_set_file->type; if (key_set->type == MOT_KEY_SET_STATIC) - key_set->values = key_set_file->values; + key_set->values = key_set_file->values.data(); else if (key_set->type != MOT_KEY_SET_NONE) { uint16_t keys_count = key_set_file->keys_count; - key_set->frames = key_set_file->frames; - key_set->values = key_set_file->values; + key_set->frames = key_set_file->frames.data(); + key_set->values = key_set_file->values.data(); key_set->keys_count = keys_count; key_set->current_key = 0; @@ -4116,8 +5100,8 @@ static bool mot_data_load_file(mot* a1, mot_data* a2) { return skeleton_select; } -static void mot_parent_get_key_set_count_by_bone_database_bones(mot_parent* a1, - vector_old_bone_database_bone* a2) { +static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, + std::vector* a2) { size_t object_bone_count; size_t motion_bone_count; size_t total_bone_count; @@ -4125,28 +5109,28 @@ static void mot_parent_get_key_set_count_by_bone_database_bones(mot_parent* a1, size_t chain_pos; bone_database_bones_calculate_count(a2, &object_bone_count, &motion_bone_count, &total_bone_count, &ik_bone_count, &chain_pos); - mot_parent_get_key_set_count(a1, motion_bone_count, ik_bone_count); + mot_key_data_get_key_set_count(a1, motion_bone_count, ik_bone_count); } -static void mot_parent_get_key_set_count(mot_parent* a1, size_t motion_bone_count, size_t ik_bone_count) { +static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t motion_bone_count, size_t ik_bone_count) { a1->key_set_count = (motion_bone_count + ik_bone_count) * 3 + 16; } -static void mot_parent_init_key_sets(mot_parent* a1, bone_database_skeleton_type type, +static void mot_key_data_init_key_sets(mot_key_data* a1, bone_database_skeleton_type type, size_t motion_bone_count, size_t ik_bone_count) { - mot_parent_get_key_set_count(a1, motion_bone_count, ik_bone_count); - mot_parent_reserve_key_sets(a1); + mot_key_data_get_key_set_count(a1, motion_bone_count, ik_bone_count); + mot_key_data_reserve_key_sets(a1); a1->skeleton_type = type; } -static void mot_parent_interpolate(mot_parent* a1, float_t frame, +static void mot_key_data_interpolate(mot_key_data* a1, float_t frame, uint32_t key_set_offset, uint32_t key_set_count) { mot_key_frame_interpolate(&a1->mot, frame, &a1->key_set_data.begin[key_set_offset], &a1->key_set.begin[key_set_offset], key_set_count, &a1->field_68); } -static mot_data* mot_parent_load_file(mot_parent* a1, int32_t motion_id, motion_database* mot_db) { +static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, motion_database* mot_db) { if (a1->motion_id != motion_id) { mot_data* mot_data = motion_storage_get_mot_data(motion_id, mot_db); a1->mot_data = mot_data; @@ -4165,7 +5149,7 @@ static mot_data* mot_parent_load_file(mot_parent* a1, int32_t motion_id, motion_ return a1->mot_data; } -static void mot_parent_reserve_key_sets(mot_parent* a1) { +static void mot_key_data_reserve_key_sets(mot_key_data* a1) { vector_old_mot_key_set_reserve(&a1->key_set, a1->key_set_count); a1->key_set.end += a1->key_set_count; memset(a1->key_set.begin, 0, sizeof(mot_key_set) * a1->key_set_count); @@ -4178,28 +5162,61 @@ static void mot_parent_reserve_key_sets(mot_parent* a1) { a1->key_sets_ready = true; } -static void mot_parent_free(mot_parent* a1) { +static void mot_key_data_reset(mot_key_data* key_data) { + key_data->key_sets_ready = 0; + key_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; + key_data->frame = -1.0f; + key_data->key_set_count = 0; + key_data->mot_data = 0; + key_data->skeleton_select = 0; + key_data->field_68.field_0 = 0; + key_data->field_68.field_4 = 0.0f; + vector_old_mot_key_set_clear(&key_data->key_set, 0); + vector_old_float_t_clear(&key_data->key_set_data, 0); + key_data->motion_id = -1; +} + +static void mot_key_data_free(mot_key_data* a1) { vector_old_mot_key_set_free(&a1->key_set, 0); vector_old_float_t_free(&a1->key_set_data, 0); } -static motion_blend_mot* motion_blend_mot_init() { - motion_blend_mot* mot_blend_mot = force_malloc_s(motion_blend_mot, 1); - bone_data_parent_reset(&mot_blend_mot->bone_data); - mot_blend_mot->mot_data.key_set = vector_old_empty(mot_key_set); - mot_blend_mot->mot_data.key_set_data = vector_old_empty(float_t); - mot_blend_mot->mot_data.skeleton_type = BONE_DATABASE_SKELETON_NONE; - mot_blend_mot->mot_data.frame = -1.0f; - mot_blend_mot->mot_data.motion_id = -1; - mot_blend_mot->field_4F8.field_C0 = 1.0f; - mot_blend_mot->field_4F8.field_C4 = 1.0f; - return mot_blend_mot; +static void mot_play_data_reset(mot_play_data* play_data) { + mot_play_frame_data_reset(&play_data->frame_data); + play_data->field_30 = 0; + play_data->field_34 = 0; + play_data->field_38 = 0; + play_data->field_40 = 0; + play_data->field_48 = 0; +} + +static void mot_play_frame_data_reset(mot_play_frame_data* frame_data) { + frame_data->frame = 0.0f; + frame_data->step = 1.0f; + frame_data->step_prev = 1.0f; + frame_data->frame_count = 0; + frame_data->last_frame = -1.0f; + frame_data->field_14 = -1.0f; + frame_data->field_18 = -1; + frame_data->field_1C = -1; + frame_data->field_20 = 0; + frame_data->field_24 = -1.0f; + frame_data->field_28 = 0; + frame_data->field_2C = -1; +} + +static void mot_play_frame_data_set_frame(mot_play_frame_data* a1, float_t frame) { + float_t v2 = a1->field_14; + a1->frame = frame; + a1->field_28 = false; + if (v2 >= 0.0f && (a1->field_18 == 2 && frame <= v2) || frame >= v2) + a1->field_14 = -1.0f; } static void motion_blend_mot_interpolate(motion_blend_mot* a1) { - vec3* keyframe_data = (vec3*)a1->mot_data.key_set_data.begin; + vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.begin; bool reverse = motion_blend_mot_interpolate_get_reverse(&a1->field_4F8.field_0); - float_t frame = a1->field_4A8.field_0.frame; + float_t frame = a1->mot_play_data.frame_data.frame; bone_database_skeleton_type skeleton_type = a1->bone_data.rob_bone_data->base_skeleton_type; bone_data* bones_data = a1->bone_data.bones.begin; @@ -4210,7 +5227,7 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { data = &bones_data[data->mirror]; if (get_data && frame != data->frame) { - mot_parent_interpolate(&a1->mot_data, frame, data->key_set_offset, data->key_set_count); + mot_key_data_interpolate(&a1->mot_key_data, frame, data->key_set_offset, data->key_set_count); data->frame = frame; } @@ -4218,12 +5235,13 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { } uint32_t bone_key_set_count = a1->bone_data.bone_key_set_count; - if (frame != a1->mot_data.frame) { - mot_parent_interpolate(&a1->mot_data, frame, bone_key_set_count, a1->bone_data.global_key_set_count); - a1->mot_data.frame = frame; + if (frame != a1->mot_key_data.frame) { + mot_key_data_interpolate(&a1->mot_key_data, frame, + bone_key_set_count, a1->bone_data.global_key_set_count); + a1->mot_key_data.frame = frame; } - keyframe_data = (vec3*)&a1->mot_data.key_set_data.begin[bone_key_set_count]; + keyframe_data = (vec3*)&a1->mot_key_data.key_set_data.begin[bone_key_set_count]; vec3 global_trans = keyframe_data[0]; vec3 global_rotation = keyframe_data[1]; if (reverse) @@ -4259,19 +5277,172 @@ static bool motion_blend_mot_interpolate_get_reverse(int32_t* a1) { return (*a1 & 1) && (*a1 & 8) == 0 || !(*a1 & 1) && (*a1 & 8) != 0; } +static void sub_1404146F0(struc_240* a1) { + uint32_t* v1 = a1->field_8.bitfield.data(); + int32_t v2 = MOTION_BONE_N_HARA_CP; + size_t v4 = 0; + while (true) { + size_t v5 = a1->field_8.motion_bone_count; + uint32_t* v6 = a1->field_8.bitfield.data(); + size_t v7 = 0; + if (v5) { + v6 += a1->field_8.motion_bone_count >> 5; + v7 = a1->field_8.motion_bone_count & 0x1F; + } + if (v1 == v6 && v4 == v7) + break; + + if (a1->bone_check_func((motion_bone_index)v2)) + *v1 |= 1 << v4; + else + *v1 &= ~(1 << v4); + v2++; + + if (v4 >= 0x1F) { + v4 = 0; + v1++; + } + else + v4++; + } +} + +size_t sub_14040EB30(struc_313* a1, struc_314* a2, size_t a3) { + size_t v5 = a2->field_8 + 32 * (a2->field_0 - a1->bitfield.data()); + if (!a3) + return v5; + + a1->bitfield.resize((a1->motion_bone_count + a3 + 31) >> 5); + + uint32_t* bitfield = a1->bitfield.data(); + size_t v7 = a1->motion_bone_count; + if (!v7) { + a1->motion_bone_count = a3; + return v5; + } + + struc_314 v18; + v18.field_0 = &bitfield[v7 >> 5]; + v18.field_8 = a1->motion_bone_count & 0x1F; + size_t v11 = a3 + v7; + a1->motion_bone_count = v11; + + struc_314 v17; + v17.field_0 = &bitfield[v11 >> 5]; + v17.field_8 = v11 & 0x1F; + + uint32_t* v12 = &bitfield[v5 >> 5]; + size_t v13 = v18.field_8; + uint32_t* v14 = v18.field_0; + size_t v15 = v17.field_8; + uint32_t* v16 = v17.field_0; + while (v12 != v14 || (v5 & 0x1F) != v13) { + if (v13) + v13--; + else { + v13 = 31; + v14--; + } + + if (v15) + v15--; + else { + v15 = 31; + v16--; + } + + if ((1 << v13) & *v14) + *v16 |= 1 << v15; + else + *v16 &= ~(1 << v15); + } + return v5; +} + +static void sub_14040E980(struc_313* a1, struc_314* a2, struc_314* a3, size_t a4, bool* a5) { + uint32_t* bitfield = a1->bitfield.data(); + struc_314 a2a = *a3; + size_t v8 = sub_14040EB30(a1, &a2a, a4); + size_t v10 = v8 + a4; + size_t v11 = v8; + uint32_t* v12 = &bitfield[v10 >> 5]; + size_t v13 = v10 & 0x1F; + + uint32_t* v15 = &bitfield[v8 >> 5]; + size_t v14 = v8 & 0x1F; + while (v15 != v12 || v14 != v13) { + if (*a5) + *v15 |= 1 << v14; + else + *v15 &= ~(1 << v14); + + if (v14 >= 0x1F) { + v14 = 0i64; + v15++; + } + else + v14++; + } + + a2->field_0 = &bitfield[v11 >> 5]; + a2->field_8 = v11 & 0x1F; +} + +static void sub_140414550(struc_313* a1, size_t a2, bool a3) { + uint32_t* bitfield = a1->bitfield.data(); + size_t motion_bone_count = a1->motion_bone_count; + if (a2 > motion_bone_count) { + struc_314 a3a; + a3a.field_0 = bitfield; + a3a.field_8 = 0; + if (motion_bone_count) { + a3a.field_0 = &bitfield[motion_bone_count >> 5]; + a3a.field_8 = motion_bone_count & 0x1F; + } + + struc_314 a4 = a3a; + sub_14040E980(a1, &a3a, &a4, a2 - motion_bone_count, &a3); + } + else if (a2 < motion_bone_count) { + struc_314 a4; + a4.field_0 = bitfield; + a4.field_8 = 0; + if (motion_bone_count) { + a4.field_0 = &bitfield[motion_bone_count >> 5]; + a4.field_8 = motion_bone_count & 0x1F; + } + + struc_314 a3a; + a3a.field_0 = &bitfield[a2 >> 5]; + a3a.field_8 = a2 & 0x1F; + + struc_314 a2a; + sub_1404122C0(a1, &a2a, &a3a, &a4); + } +} + +static void sub_140413350(struc_240* a1, bool(*bone_check_func)(motion_bone_index), size_t motion_bone_count) { + a1->bone_check_func = bone_check_func; + a1->motion_bone_count = motion_bone_count; + sub_1404119A0(&a1->field_8); + sub_140414550(&a1->field_8, motion_bone_count, 0); + sub_1404146F0(a1); +} + static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, - rob_chara_bone_data* a2, bone_database* bone_data) { + rob_chara_bone_data* a2, bool(*bone_check_func)(motion_bone_index), bone_database* bone_data) { bone_data_parent_data_init(&a1->bone_data, a2, bone_data); - mot_parent_init_key_sets( - &a1->mot_data, + mot_key_data_init_key_sets( + &a1->mot_key_data, a1->bone_data.rob_bone_data->base_skeleton_type, a1->bone_data.motion_bone_count, a1->bone_data.ik_bone_count); + sub_140413350(&a1->field_0, bone_check_func, a1->bone_data.motion_bone_count); } static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, bone_database* type, motion_database* mot_db) { - mot_data* v6 = mot_parent_load_file(&a1->mot_data, motion_id, mot_db); + mot_data* v6 = mot_key_data_load_file(&a1->mot_key_data, motion_id, mot_db); bone_data_parent* v7 = &a1->bone_data; if (type) { bone_data_parent_load_bone_indices_from_mot(v7, v6, type, mot_db); @@ -4282,11 +5453,11 @@ static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, } else { rob_chara_bone_data* rob_bone_data = v7->rob_bone_data; - for (mat4* i = rob_bone_data->mats.begin; i != rob_bone_data->mats.end; i++) - *i = mat4_identity; + for (mat4& i : rob_bone_data->mats) + i = mat4_identity; - for (mat4* i = rob_bone_data->mats2.begin; i != rob_bone_data->mats2.end; i++) - *i = mat4_identity; + for (mat4& i : rob_bone_data->mats2) + i = mat4_identity; a1->bone_data.bone_indices.end = a1->bone_data.bone_indices.begin; } @@ -4314,41 +5485,15 @@ static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* mat) { static void motion_blend_mot_reset(motion_blend_mot* mot_blend_mot) { bone_data_parent_reset(&mot_blend_mot->bone_data); - mot_blend_mot->mot_data.key_sets_ready = 0; - mot_blend_mot->mot_data.skeleton_type = BONE_DATABASE_SKELETON_NONE; - mot_blend_mot->mot_data.frame = -1.0f; - mot_blend_mot->mot_data.key_set_count = 0; - mot_blend_mot->mot_data.mot_data = 0; - mot_blend_mot->mot_data.skeleton_select = 0; - mot_blend_mot->mot_data.field_68.field_0 = 0; - mot_blend_mot->mot_data.field_68.field_4 = 0.0f; - mot_blend_mot->mot_data.key_set.end = mot_blend_mot->mot_data.key_set.begin; - mot_blend_mot->mot_data.key_set_data.end = mot_blend_mot->mot_data.key_set_data.begin; - mot_blend_mot->mot_data.motion_id = -1; - mot_blend_mot->field_4A8.field_0.frame = 0.0f; - mot_blend_mot->field_4A8.field_0.field_8 = 1.0f; - mot_blend_mot->field_4A8.field_0.step = 1.0f; - mot_blend_mot->field_4A8.field_0.frame_count = 0; - mot_blend_mot->field_4A8.field_0.last_frame = -1.0f; - mot_blend_mot->field_4A8.field_0.field_14 = -1.0f; - mot_blend_mot->field_4A8.field_0.field_18 = -1; - mot_blend_mot->field_4A8.field_0.field_1C = -1; - mot_blend_mot->field_4A8.field_0.field_20 = 0; - mot_blend_mot->field_4A8.field_0.field_24 = -1.0f; - mot_blend_mot->field_4A8.field_0.field_28 = 0; - mot_blend_mot->field_4A8.field_0.field_2C = -1; - mot_blend_mot->field_4A8.field_30 = 0; - mot_blend_mot->field_4A8.field_34 = 0; - mot_blend_mot->field_4A8.field_38 = 0; - mot_blend_mot->field_4A8.field_40 = 0; - mot_blend_mot->field_4A8.field_48 = 0; + mot_key_data_reset(&mot_blend_mot->mot_key_data); + mot_play_data_reset(&mot_blend_mot->mot_play_data); mot_blend_mot->field_4F8.field_0 = 0; mot_blend_mot->field_4F8.field_8 = 0; mot_blend_mot->field_4F8.mat = mat4u_identity; mot_blend_mot->field_4F8.field_4C = mat4u_identity; mot_blend_mot->field_4F8.field_8C = false; mot_blend_mot->field_4F8.eyes_adjust = 0.0f; - mot_blend_mot->field_4F8.field_B8 = 0.0f; + mot_blend_mot->field_4F8.prev_eyes_adjust = 0.0f; mot_blend_mot->field_4F8.field_90 = vec3_identity; mot_blend_mot->field_4F8.field_9C = vec3_identity; mot_blend_mot->field_4F8.field_A8 = vec3_identity; @@ -4359,50 +5504,62 @@ static void motion_blend_mot_reset(motion_blend_mot* mot_blend_mot) { mot_blend_mot->field_4F8.field_C8 = vec3_null; } -static void motion_blend_mot_dispose(motion_blend_mot* mot_blend_mot) { - mot_parent_free(&mot_blend_mot->mot_data); - bone_data_parent_free(&mot_blend_mot->bone_data); - free(mot_blend_mot); +static void motion_blend_mot_set_duration(motion_blend_mot* mot, + float_t duration, float_t step, float_t offset) { + if (mot->blend) + mot->blend->SetDuration(duration, step, offset); +} + +static void opd_data_decode(int16_t* src_data, size_t count, uint8_t shift, float_t* dst_data) { + float_t div = (float_t)(1 << shift); + size_t index = 0; + for (size_t i = 0; i < count; i++, index++) { + if (src_data[i] & 1) { + float_t first_val = dst_data[index - 1]; + float_t last_val = src_data[i + 1] / div; + float_t diff_val = last_val - first_val; + + int32_t lerp_count = (int32_t)((src_data[i] >> 1) - (index - 1)); + float_t scale = 1.0f / (float_t)lerp_count; + for (int32_t j = 1; j < lerp_count; j++, index++) + dst_data[index] = (float_t)j * diff_val * scale + first_val; + dst_data[index] = last_val; + i++; + } + else + dst_data[index] = src_data[i] / div; + } } static void osage_coli_set(osage_coli* osg_coli, skin_param_osage_root_coli* skp_root_coli, mat4* mats) { - osage_coli* v5 = osg_coli; - skin_param_osage_root_coli* v6 = skp_root_coli; osg_coli->type = 0; - if (skp_root_coli && mats && skp_root_coli->type) - while (v6->type) { - v5->type = v6->type; - v5->radius = v6->radius; + if (!skp_root_coli || !mats) + return; - mat4 mat = mats[v6->bone0_index]; - mat4_mult_vec3_trans(&mat, &v6->bone0_pos, &v5->bone0_pos); - - if (v6->type == 2 || v6->type == 4) { - mat = mats[v6->bone1_index]; - mat4_mult_vec3_trans(&mat, &v6->bone1_pos, &v5->bone1_pos); - vec3_sub(v5->bone1_pos, v5->bone0_pos, v5->bone_pos_diff); - - float_t length; - vec3_length_squared(v5->bone_pos_diff, length); - v5->bone_pos_diff_length_squared = length; - length = sqrtf(length); - v5->bone_pos_diff_length = length; - if (length < 0.01f) - v5->type = 1; - } - else if (v6->type == 3) - mat4_mult_vec3(&mat, &v6->bone1_pos, &v5->bone1_pos); - - v5++; - v6++; + for (; skp_root_coli->type; osg_coli++, skp_root_coli++) { + osg_coli->type = skp_root_coli->type; + osg_coli->radius = skp_root_coli->radius; + mat4 mat = mats[skp_root_coli->bone0_index]; + mat4_mult_vec3_trans(&mat, &skp_root_coli->bone0_pos, &osg_coli->bone0_pos); + if (skp_root_coli->type == 2 || skp_root_coli->type == 4) { + mat = mats[skp_root_coli->bone1_index]; + mat4_mult_vec3_trans(&mat, &skp_root_coli->bone1_pos, &osg_coli->bone1_pos); + vec3_sub(osg_coli->bone1_pos, osg_coli->bone0_pos, osg_coli->bone_pos_diff); + vec3_length_squared(osg_coli->bone_pos_diff, osg_coli->bone_pos_diff_length_squared); + osg_coli->bone_pos_diff_length = sqrtf(osg_coli->bone_pos_diff_length_squared); + if (osg_coli->bone_pos_diff_length < 0.01f) + osg_coli->type = 1; } - v5->type = 0; + else if (skp_root_coli->type == 3) + mat4_mult_vec3(&mat, &skp_root_coli->bone1_pos, &osg_coli->bone1_pos); + } + osg_coli->type = 0; } static void osage_coli_ring_set(osage_coli* osg_coli, - vector_old_skin_param_osage_root_coli* vec_skp_root_coli, mat4* mats) { - if (vec_skp_root_coli->begin == vec_skp_root_coli->end) { + std::vector* vec_skp_root_coli, mat4* mats) { + if (!vec_skp_root_coli->size()) { osg_coli->type = 0; osg_coli->radius = 0.0f; osg_coli->bone0_pos = vec3_null; @@ -4413,19 +5570,1059 @@ static void osage_coli_ring_set(osage_coli* osg_coli, osg_coli->field_34 = 1.0f; } else - osage_coli_set(osg_coli, vec_skp_root_coli->begin, mats); + osage_coli_set(osg_coli, vec_skp_root_coli->data(), mats); } -static rob_chara_bone_data* rob_chara_bone_data_init() { - rob_chara_bone_data* rob_bone_data = force_malloc_s(rob_chara_bone_data, 1); - rob_bone_data->base_skeleton_type = BONE_DATABASE_SKELETON_NONE; - rob_bone_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; - rob_bone_data->ik_scale.ratio0 = 1.0f; - return rob_bone_data; +static void osage_play_data_manager_get_opd_file_data(object_info obj_info, + int32_t motion_id, float_t** data, uint32_t* count) { + //osage_play_data_manager_get()->GetOpdFileData(v8, obj_info, motion_id, data, count); +} + +static bool pv_osage_manager_array_get_disp(int32_t* chara_id) { + return pv_osage_manager_array_ptr_get(*chara_id)->GetDisp(); +} + +static PvOsageManager* pv_osage_manager_array_ptr_get(int32_t chara_id) { + if (chara_id >= CHARA_MAX) + chara_id = 0; + return &pv_osage_manager_array_ptr[chara_id]; +} + +static bool pv_osage_manager_array_ptr_get_disp() { + bool disp = false; + for (int32_t i = 0; i < CHARA_MAX; i++) + disp |= pv_osage_manager_array_ptr_get(i)->GetDisp(); + return disp; +} + +static void pv_osage_manager_array_ptr_set_not_reset_true() { + for (int32_t i = 0; i < CHARA_MAX; i++) + pv_osage_manager_array_ptr_get(i)->SetNotResetTrue(); +} + +static void rob_base_rob_chara_init(rob_chara* rob_chr) { + //sub_14054F4A0(&rob_chr->rob_touch); + //sub_14054F830(&rob_chr->rob_touch, rob_chr->pv_data.field_70 != 0); +} + +static void sub_140414900(struc_308* a1, mat4* a2) { + if (a2) { + a1->field_8C = true; + a1->mat = *a2; + } + else { + a1->field_8C = false; + a1->mat = mat4u_identity; + } +} + +static mat4u* sub_140504E80(rob_chara* rob_chr) { + mat4 mat; + mat4_rotate_y((float_t)((double_t)rob_chr->data.miku_rot.rot_y_int16 * M_PI * (1.0 / 32768.0)), &mat); + mat4_set_translation(&mat, &rob_chr->data.miku_rot.position); + rob_chr->data.miku_rot.field_6C = mat; + return &rob_chr->data.miku_rot.field_6C; +} + +static void sub_14041DA50(rob_chara_bone_data* rob_bone_data, mat4* mat) { + for (bone_node& i : rob_bone_data->nodes) + mat4_mult(i.mat, mat, i.mat); + sub_140414900(&rob_bone_data->motion_loaded.front()->field_4F8, mat); +} + +static void sub_140507F60(rob_chara* rob_chr) { + mat4 v2 = *sub_140504E80(rob_chr); + sub_14041DA50(rob_chr->bone_data, &v2); + rob_chr->data.miku_rot.field_48 = rob_chr->data.miku_rot.field_24; + + mat4* v3 = rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, ROB_BONE_N_HARA); + mat4_get_translation(v3, &rob_chr->data.miku_rot.field_24); + vec3_sub(rob_chr->data.miku_rot.field_24, + rob_chr->data.miku_rot.field_48, rob_chr->data.miku_rot.field_54); + + mat4* v8 = rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, ROB_BONE_N_HARA_CP); + vec3 v10 = { 0.0f, 0.0f, 1.0f }; + mat4_mult_vec3(v8, &v10, &v10); + rob_chr->data.miku_rot.field_6 = (int32_t)((float_t)(atan2f(v10.x, v10.z) * 32768.0f) * (1.0 / M_PI)); +} + +void rob_chara_data_parts_adjust_ctrl(rob_chara* rob_chr, rob_chara_data_parts_adjust* parts_adjust, + rob_chara_data_parts_adjust* parts_adjust_prev) { + float_t cycle = parts_adjust->cycle; + float_t v7 = 0.0f; + parts_adjust->frame += rob_chr->data.adjust.step_data.frame; + if (rob_chr->data.field_1588.field_58 == 1) + cycle *= (60.0f / rob_chr->data.field_1588.field_8); + cycle *= parts_adjust->frame * 2.0f * (float_t)M_PI * (float_t)(1.0 / 60.0f); + + switch (parts_adjust->cycle_type) { + case 1: + v7 = cosf(parts_adjust->phase * (float_t)M_PI + cycle); + break; + case 2: + v7 = sinf(parts_adjust->phase * (float_t)M_PI + cycle); + break; + } + + vec3 v8; + vec3 v9; + vec3_add_scalar(parts_adjust->external_force, v7, v8); + vec3_mult(parts_adjust->external_force_min, parts_adjust->external_force_strength, v9); + vec3_mult(v8, v9, v9); + vec3_add(v9, parts_adjust->external_force_min, parts_adjust->curr_external_force); + + if (parts_adjust->type == 1) { + mat4 mat = mat4_identity; + mat4_rotate_y_mult(&mat, (float_t)((double_t)rob_chr->data.miku_rot.rot_y_int16 + * M_PI * (1.0 / 32768.0)), &mat); + mat4_mult_vec3(&mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + } + else if (parts_adjust->type == 2) { + mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 9)->ex_data_mat; + if (mat) + mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + } + else if (parts_adjust->type == 3) { + mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 10)->ex_data_mat; + if (mat) + mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + } + else if (parts_adjust->type == 4) { + mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 15)->ex_data_mat; + if (mat) + mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + } + else if (parts_adjust->type == 5) { + mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 177)->ex_data_mat; + if (mat) { + parts_adjust->curr_external_force.z = -parts_adjust->curr_external_force.z; + mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + } + } + + if (parts_adjust->ignore_gravity) + parts_adjust->curr_external_force.y = get_osage_gravity_const() + parts_adjust->curr_external_force.y; + + parts_adjust->curr_force = parts_adjust->force; + parts_adjust->curr_strength = parts_adjust->strength; + + bool transition_frame_step = false; + if (parts_adjust->force_duration > parts_adjust->transition_frame + && fabsf(parts_adjust->force_duration - parts_adjust->transition_frame) > 0.000001f) { + transition_frame_step = true; + float_t blend = (parts_adjust->transition_frame + 1.0f) / (parts_adjust->force_duration + 1.0f); + vec3_lerp_scalar(parts_adjust_prev->curr_external_force, + parts_adjust->curr_external_force, parts_adjust->curr_external_force, blend); + parts_adjust->curr_force = lerp(parts_adjust_prev->curr_force, parts_adjust->curr_force, blend); + } + + if (parts_adjust->strength_transition > parts_adjust->transition_frame + && fabsf(parts_adjust->strength_transition - parts_adjust->transition_frame) > 0.000001f) { + float_t blend = (parts_adjust->transition_frame + 1.0f) / (parts_adjust->strength_transition + 1.0f); + parts_adjust->curr_strength = lerp(parts_adjust_prev->curr_strength, parts_adjust->curr_strength, blend); + } + else if (!transition_frame_step) + return; + + parts_adjust->transition_frame += rob_chr->data.adjust.step_data.frame; +} + +static void rob_chara_item_equip_object_set_parts_external_force( + rob_chara_item_equip_object* itm_eq_obj, int32_t parts_bits, + vec3* weight, float_t force, float_t strength) { + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) { + rob_osage* rob_osg = &i->rob; + if (rob_osage_check_osage_setting_parts_bit(rob_osg, parts_bits)) { + rob_osage_set_nodes_external_force(rob_osg, weight, strength); + rob_osage_set_nodes_force(rob_osg, force); + } + } +} + +static void rob_chara_item_equip_set_parts_external_force(rob_chara_item_equip* rob_itm_eq, + int32_t parts, vec3* external_force, float_t force, float_t strength) { + item_id id = (item_id)(parts == ROB_OSAGE_PARTS_MUFFLER ? ITEM_OUTER : ITEM_KAMI); + object_info obj_info = rob_itm_eq->item_equip_object[id].obj_info; + //if (!osage_setting_data_obj_has_key(&obj_info)) + // return; + + switch (parts) { + case ROB_OSAGE_PARTS_SHORT_L: + case ROB_OSAGE_PARTS_SHORT_R: + rob_itm_eq->parts_short = true; + break; + case ROB_OSAGE_PARTS_APPEND_L: + case ROB_OSAGE_PARTS_APPEND_R: + rob_itm_eq->parts_append = true; + break; + case ROB_OSAGE_PARTS_WHITE_ONE_L: + rob_itm_eq->parts_white_one_l = true; + break; + } + + int32_t parts_bits = 1 << parts; + if (!rob_itm_eq->parts_short) { + if (parts == ROB_OSAGE_PARTS_LEFT) + parts_bits |= ROB_OSAGE_PARTS_SHORT_L_BIT; + else if (parts == ROB_OSAGE_PARTS_RIGHT) + parts_bits |= ROB_OSAGE_PARTS_SHORT_R_BIT; + } + + if (!rob_itm_eq->parts_append) { + if (parts == ROB_OSAGE_PARTS_LEFT) + parts_bits |= ROB_OSAGE_PARTS_APPEND_L_BIT; + else if (parts == ROB_OSAGE_PARTS_RIGHT) + parts_bits |= ROB_OSAGE_PARTS_APPEND_R_BIT; + } + + if (!rob_itm_eq->parts_white_one_l && parts == ROB_OSAGE_PARTS_LONG_C) + parts_bits |= ROB_OSAGE_PARTS_WHITE_ONE_L_BIT; + + rob_chara_item_equip_object_set_parts_external_force( + &rob_itm_eq->item_equip_object[id], parts_bits, external_force, force, strength); +} + +static void rob_chara_item_equip_object_set_external_force( + rob_chara_item_equip_object* itm_eq_obj, vec3* external_force) { + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) { + i->rob.set_external_force = true; + i->rob.external_force = *external_force; + } + + /*for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) { + i->set_external_force = true; + i->external_force = *external_force; + }*/ +} + +static void rob_chara_item_equip_set_external_force( + rob_chara_item_equip* rob_itm_eq, vec3* external_force) { + for (int32_t i = rob_itm_eq->first_item_equip_object; i < rob_itm_eq->max_item_equip_object; i++) + rob_chara_item_equip_object_set_external_force(&rob_itm_eq->item_equip_object[i], external_force); +} + +static void rob_chara_set_parts_external_force(rob_chara* rob_chr) { + for (int32_t i = 0; i < 13; i++) { + rob_chara_data_parts_adjust* parts_adjust = &rob_chr->data.adjust.parts_adjust[i]; + if (parts_adjust->enable) { + rob_chara_data_parts_adjust_ctrl(rob_chr, parts_adjust, &rob_chr->data.adjust.parts_adjust_prev[i]); + rob_chara_item_equip_set_parts_external_force(rob_chr->item_equip, i, + &parts_adjust->curr_external_force, parts_adjust->curr_force, parts_adjust->curr_strength); + } + } + + if (rob_chr->data.adjust.field_10D8[0].enable) { + rob_chara_data_parts_adjust_ctrl(rob_chr, rob_chr->data.adjust.field_10D8, &rob_chr->data.adjust.field_10D8[1]); + rob_chara_item_equip_set_external_force(rob_chr->item_equip, + &rob_chr->data.adjust.field_10D8[0].curr_external_force); + } + + rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; + rob_itm_equip->parts_short = false; + rob_itm_equip->parts_append = false; + rob_itm_equip->parts_white_one_l = false; +} + +static void sub_140505B20(rob_chara* rob_chr) { + if (rob_chr->data.field_1588.field_20.field_0 & 0x100) + rob_chr->data.miku_rot.field_2 = rob_chr->data.miku_rot.rot_y_int16 + + rob_chr->data.field_1588.field_274; + else + rob_chr->data.miku_rot.field_2 = rob_chr->data.miku_rot.rot_y_int16; + + if (rob_chr->data.field_0 & 2 && rob_chr->data.miku_rot.field_30.y > -0.000001f) + rob_chr->data.field_1 |= 0x80; + else + rob_chr->data.field_1 &= ~0x80; +} + +static vec3* rob_chara_bone_data_get_global_trans(rob_chara_bone_data* rob_bone_data) { + return &rob_bone_data->motion_loaded.front()->bone_data.global_trans; +} + +static void rob_chara_data_adjuct_set_trans(rob_chara_adjust_data* rob_chr_adj, + vec3* trans, bool pos_adjust, vec3* global_trans) { + float_t scale = rob_chr_adj->scale; + vec3 v9 = rob_chr_adj->offset; + if (global_trans) + v9.y += global_trans->y; + + vec3 v5 = *trans; + if (rob_chr_adj->height_adjust) + v5.y += rob_chr_adj->pos_adjust_y; + else { + if (!rob_chr_adj->offset_x) + v5.x = (v5.x - v9.x) * scale + v9.x; + if (!rob_chr_adj->offset_y) + v5.y = (v5.y - v9.y) * scale + v9.y; + if (!rob_chr_adj->offset_z) + v5.z = (v5.z - v9.z) * scale + v9.z; + } + if (pos_adjust) + vec3_add(v5, rob_chr_adj->pos_adjust, v5); + + vec3 v10; + vec3_mult_scalar(*trans, scale, v10); + vec3_sub(v5, v10, rob_chr_adj->trans); +} + +static void rob_chara_set_data_adjust_mat(rob_chara* rob_chr, + rob_chara_adjust_data* rob_chr_adj, bool pos_adjust) { + vec3 v12; + mat4* v6 = rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, ROB_BONE_N_HARA_CP); + mat4_get_translation(v6, &v12); + vec3* global_trans = 0; + if (rob_chr_adj->get_global_trans) + global_trans = rob_chara_bone_data_get_global_trans(rob_chr->bone_data); + rob_chara_data_adjuct_set_trans(rob_chr_adj, &v12, pos_adjust, global_trans); + + mat4 mat; + float_t scale = rob_chr_adj->scale; + mat4_scale(scale, scale, scale, &mat); + mat4_set_translation(&mat, &rob_chr_adj->trans); + rob_chr_adj->mat = mat; +} + +static void rob_chara_set_data_adjust_mat_pos_adjust_true(rob_chara* rob_chr) { + rob_chara_set_data_adjust_mat(rob_chr, &rob_chr->data.adjust_data, true); +} + +static void rob_base_rob_chara_ctrl(rob_chara* rob_chr) { + sub_140507F60(rob_chr); + rob_chara_set_parts_external_force(rob_chr); + sub_140505B20(rob_chr); + //sub_14036D130(7, &rob_chr); + rob_chara_set_data_adjust_mat_pos_adjust_true(rob_chr); +} + +static void sub_140514520(rob_chara* rob_chr) { + //sub_140514540(rob_chr); + //sub_1405144C0(rob_chr); +} + +static void sub_14054CC80(rob_chara* a1) { + //sub_14054BC70(&a1->data.rob_sub_action); + if (a1->data.rob_sub_action.data.field_0) { + a1->data.rob_sub_action.data.field_0->Field_18(a1); + a1->data.rob_sub_action.data.field_0 = 0; + } + + if (a1->data.rob_sub_action.data.field_8) + a1->data.rob_sub_action.data.field_8->Field_20(a1); +} + +static bool sub_140419E90(rob_chara_bone_data* rob_bone_data) { + mot_play_data* v2 = &rob_bone_data->motion_loaded.front()->mot_play_data; + if (v2->field_34) + return v2->field_38 <= 0.0f; + else if (v2->frame_data.field_18 != 1) { + if (v2->frame_data.field_18 == 2 && v2->frame_data.field_1C > 3) + return v2->frame_data.frame < 0.0f; + return false; + } + else if (v2->frame_data.field_1C <= 3u || v2->frame_data.last_frame >= v2->frame_data.frame) + return false; + + return (bool)v2->frame_data.field_18; +} + +static uint8_t sub_14041A0D0(rob_chara_bone_data* rob_bone_data) { + return rob_bone_data->motion_loaded.front()->mot_play_data.frame_data.field_28; +} + +static void sub_140505980(rob_chara* rob_chr) { + int32_t v3; + int32_t v4; + if (rob_chr->data.adjust.field_24) { + if (rob_chr->data.adjust.field_24 - 1) { + if (rob_chr->data.adjust.field_24 != 2) + return; + goto LABEL_23; + } + } + else { + if (rob_chr->data.field_1588.field_78 > rob_chr->data.adjust.frame_data.frame) + return; + + if (rob_chr->data.field_1588.field_10.field_0 & 0x4000) { + rob_chr->data.field_1588.field_20.field_0 |= 0x4000; + if ((rob_chr->data.field_1588.field_10.field_0 & 0x20000) != 0) + rob_chr->data.field_1588.field_20.field_0 &= ~0x20000; + } + rob_chr->data.field_1588.field_20.field_0 &= ~0x02; + rob_chr->data.adjust.field_24 = 1; + } + + if (rob_chr->data.field_1588.field_7C > rob_chr->data.adjust.frame_data.frame) + return; + + rob_chr->data.field_1588.field_20.field_0 |= 4u; + rob_chr->data.field_1588.field_20.field_8 &= ~0x400000; + v3 = rob_chr->data.field_1588.field_20.field_0; + if (v3 & 0x4000) { + rob_chr->data.field_1588.field_20.field_0 = v3 & ~0x4000; + rob_chr->data.field_1588.field_88 &= ~0x02; + if (rob_chr->data.field_1588.field_88 & 0x04) + rob_chr->data.field_1588.field_20.field_0 &= ~0x8000; + } + else if (v3 & 0x2000000 + && (v3 & 0x01) != 0 + && !(rob_chr->data.field_1588.field_20.field_4 & 0x10000000) + && !(rob_chr->data.field_1588.field_20.field_4 & 0x20000000)) + rob_chr->data.field_1588.field_20.field_0 = v3 & ~0x01; + + v4 = rob_chr->data.field_1588.field_10.field_0; + if (v4 & 0x10000 && v4 & 0x20000) + rob_chr->data.field_1588.field_20.field_0 &= ~0x20000; + rob_chr->data.adjust.field_24 = 2; + +LABEL_23: + float_t v5 = rob_chr->data.field_1588.field_80; + if (v5 >= 0.0f && v5 <= rob_chr->data.adjust.frame_data.frame) { + if (v5 < (rob_chr->data.field_1588.field_8 - 1.0f) + || rob_chr->data.field_1588.field_58 == -1 + || rob_chr->data.field_1588.field_58 == 2) { + rob_chr->data.field_1588.field_20.field_0 &= ~0x2020081; + rob_chr->data.field_2 |= 0x20; + } + rob_chr->data.adjust.field_24 = 3; + } +} + +static void sub_1405070E0(rob_chara* rob_chr) { + //if (sub_140419E90(rob_chr->bone_data) || sub_14041A0D0(rob_chr->bone_data)) + // sub_140505310(rob_chr); + sub_140505980(rob_chr); + //mothead_apply(&rob_chr->data.field_1588, rob_chr, rob_chr->data.adjust.frame_data.frame); + //sub_1405044B0(rob_chr); +} + +static void sub_1405079B0(rob_chara* rob_chr, int32_t a2, struc_222* a3) { + if (!a3->field_0) + return; + + float_t v5 = a3->duration; + float_t v6 = a3->frame; + if (v5 <= v6 || fabsf(v5 - v6) <= 0.000001f) { + a3->field_0 = 0; + a3->field_4 = a3->field_C; + } + else { + float_t v7 = (v6 + 1.0f) / (v5 + 1.0f); + float_t v8 = a3->field_8; + float_t v9 = 1.0f - v7; + if (v8 <= 0.0001f || v8 >= 1.0f) { + if (a3->field_C != 0.0f) { + a3->field_4 = a3->field_C * v7 + v9; + a3->frame = v6 + rob_chr->data.adjust.step_data.frame; + } + else { + a3->field_4 = 0.0f; + a3->frame = v6 + rob_chr->data.adjust.step_data.frame; + } + } + else { + if (a3->field_C != 0.0f) { + a3->field_4 = a3->field_C * v7 + v8 * v9; + a3->frame = v6 + rob_chr->data.adjust.step_data.frame; + } + else { + a3->field_4 = v8 * v9 + v7; + a3->frame = v6 + rob_chr->data.adjust.step_data.frame; + } + } + } + + sub_14041C4F0(rob_chr->bone_data, rob_motion_c_kata_bone_get(a2), a3->field_4); +} + +static void sub_140507960(rob_chara* rob_chr) { + for (int32_t i = 0; i < 2; i++) + sub_1405079B0(rob_chr, i, &rob_chr->data.adjust.field_12C8[i]); +} + +static void rob_chara_set_face_motion(rob_chara* rob_chr, + RobFaceMotion* motion, int32_t type, motion_database* mot_db); + +static bool sub_14053F290(RobPartialMotion* a1) { + return a1->data.state == 1; +} + +static bool sub_14053F280(RobPartialMotion* a1) { + return a1->data.state == 2; +} + +static bool sub_14053F2A0(RobPartialMotion* a1) { + return a1->data.state == 3; +} + +static bool sub_14053F270(RobPartialMotion* a1) { + return a1->data.state == 4; +} + +static bool sub_14053F2B0(RobPartialMotion* a1) { + return a1->data.state <= 4; +} + +static bool sub_14053F1B0(RobPartialMotion* a1) { + if (!sub_14053F2B0(a1)) + return false; + + if (sub_14053F280(a1)) { + if (a1->data.field_38 > 3 && (a1->data.frame_count - 1.0f) < a1->data.frame) + return true; + } + else if (sub_14053F270(a1)) { + if (a1->data.field_38 > 3 && a1->data.frame < 0.0f) + return true; + } + else if (sub_14053F2A0(a1)) { + return a1->data.field_24 <= 0.0f; + } + return false; +} + +static void rob_chara_set_face_motion_id(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db) { + RobFaceMotion v12; + v12.data.duration = duration; + v12.data.offset = offset; + if (motion_id != -1) { + v12.data.motion_id = motion_id; + v12.data.state = state; + v12.data.frame = frame; + v12.data.play_frame_step = step; + v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + v12.data.field_24 = a6; + if (sub_14053F290(&v12)) { + v12.data.frame_data = &rob_chr->data.adjust.frame_data; + v12.data.step_data = &rob_chr->data.adjust.step_data; + } + v12.data.field_38 = a8; + } + rob_chara_set_face_motion(rob_chr, &v12, 0, mot_db); +} + +static void sub_1405509D0(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_14053F1B0(&rob_chr->data.adjust.field_150.face)) + rob_chara_set_face_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void rob_chara_set_hand_l_motion(rob_chara* rob_chr, + RobHandMotion* motion, int32_t type, motion_database* mot_db); + +static void sub_140553E30(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db) { + RobHandMotion v12; + v12.data.duration = duration; + v12.data.offset = offset; + if (motion_id != -1) { + v12.data.motion_id = motion_id; + v12.data.state = state; + v12.data.frame = frame; + v12.data.play_frame_step = step; + v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + v12.data.field_24 = a6; + if (sub_14053F290(&v12)) { + v12.data.frame_data = &rob_chr->data.adjust.frame_data; + v12.data.step_data = &rob_chr->data.adjust.step_data; + } + v12.data.field_38 = a8; + } + rob_chara_set_hand_l_motion(rob_chr, &v12, 0, mot_db); +} + +static void sub_140550A40(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_14053F1B0(&rob_chr->data.adjust.field_150.hand_l)) + sub_140553E30(rob_chr, -1, 0.0f, -1, 12.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, + RobHandMotion* motion, int32_t type, motion_database* mot_db); + +static void sub_140554370(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db) { + RobHandMotion v12; + v12.data.duration = duration; + v12.data.offset = offset; + if (motion_id != -1) { + v12.data.motion_id = motion_id; + v12.data.state = state; + v12.data.frame = frame; + v12.data.play_frame_step = step; + v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + v12.data.field_24 = a6; + if (sub_14053F290(&v12)) { + v12.data.frame_data = &rob_chr->data.adjust.frame_data; + v12.data.step_data = &rob_chr->data.adjust.step_data; + } + v12.data.field_38 = a8; + } + rob_chara_set_hand_r_motion(rob_chr, &v12, 0, mot_db); +} + +static void sub_140550AB0(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_14053F1B0(&rob_chr->data.adjust.field_150.hand_r)) + sub_140553E30(rob_chr, -1, 0.0f, -1, 12.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void rob_chara_set_mouth_motion(rob_chara* rob_chr, + RobMouthMotion* motion, int32_t type, motion_database* mot_db); + +static void sub_140554C40(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db) { + RobMouthMotion v12; + v12.data.duration = duration; + v12.data.offset = offset; + if (motion_id != -1) { + v12.data.motion_id = motion_id; + v12.data.state = state; + v12.data.frame = frame; + v12.data.play_frame_step = step; + v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + v12.data.field_24 = a6; + if (sub_14053F290(&v12)) { + v12.data.frame_data = &rob_chr->data.adjust.frame_data; + v12.data.step_data = &rob_chr->data.adjust.step_data; + } + v12.data.field_38 = a8; + } + rob_chara_set_mouth_motion(rob_chr, &v12, 0, mot_db); +} + +static void sub_140550B20(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_14053F1B0(&rob_chr->data.adjust.field_150.mouth)) + sub_140554C40(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void rob_chara_set_eyes_motion(rob_chara* rob_chr, + RobEyesMotion* motion, int32_t type, motion_database* mot_db); + +static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db) { + RobEyesMotion v12; + v12.data.duration = duration; + v12.data.offset = offset; + if (motion_id != -1) { + v12.data.motion_id = motion_id; + v12.data.state = state; + v12.data.frame = frame; + v12.data.play_frame_step = step; + v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + v12.data.field_24 = a6; + if (sub_14053F290(&v12)) { + v12.data.frame_data = &rob_chr->data.adjust.frame_data; + v12.data.step_data = &rob_chr->data.adjust.step_data; + } + v12.data.field_38 = a8; + } + rob_chara_set_eyes_motion(rob_chr, &v12, 0, mot_db); +} + +static void sub_140550960(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_14053F1B0(&rob_chr->data.adjust.field_150.eye)) + rob_chara_set_eyes_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, + RobEyelidMotion* motion, int32_t type, motion_database* mot_db); + +static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db) { + RobEyelidMotion v12; + v12.data.duration = duration; + v12.data.offset = offset; + if (motion_id != -1) { + v12.data.motion_id = motion_id; + v12.data.state = state; + v12.data.frame = frame; + v12.data.play_frame_step = step; + v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + v12.data.field_24 = a6; + if (sub_14053F290(&v12)) { + v12.data.frame_data = &rob_chr->data.adjust.frame_data; + v12.data.step_data = &rob_chr->data.adjust.step_data; + } + v12.data.field_38 = a8; + } + rob_chara_set_eyelid_motion(rob_chr, &v12, 0, mot_db); +} + +static void sub_1405508F0(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_14053F1B0(&rob_chr->data.adjust.field_150.eyelid)) + rob_chara_set_eyelid_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void sub_14041CA70(rob_chara_bone_data* rob_bone_data, float_t a2) { + rob_bone_data->motion_loaded.front()->field_4F8.field_C0 = a2; +} + +static void sub_14041CAB0(rob_chara_bone_data* rob_bone_data, float_t a2) { + rob_bone_data->motion_loaded.front()->field_4F8.field_C4 = a2; +} + +static void sub_14041CA10(rob_chara_bone_data* rob_bone_data, vec3* a2) { + rob_bone_data->motion_loaded.front()->field_4F8.field_C8 = *a2; +} + +static void sub_140415400(mot_play_data* a1) { + if (a1->frame_data.field_18 != 3) + return; + + if (a1->field_40) + a1->frame_data.frame = *a1->field_40; + if (a1->field_48) + a1->frame_data.step = *a1->field_48; +} + +static void sub_14041DA00(rob_chara_bone_data* rob_bone_data) { + for (motion_blend_mot*& i : rob_bone_data->motion_loaded) + sub_140415400(&i->mot_play_data); +} + +static void sub_14053F2C0(RobPartialMotion* a1) { + if (!sub_14053F290(a1)) + return; + + if (a1->data.frame_data) + a1->data.frame = a1->data.frame_data->frame; + + if (a1->data.step_data) + a1->data.play_frame_step = a1->data.step_data->frame; +} + +static object_info sub_140550330(rob_chara* rob_chr) { + if (rob_chr->data.adjust.field_29 & 0x04) + return rob_chr->data.adjust.field_3B0.head_object; + else + return rob_chr->data.adjust.field_150.head_object; +} + +static void rob_chara_item_equip_load_object_info_atama_asi( + rob_chara_item_equip* rob_itm_equip, item_id id, object_info object_info, bool a4, + bone_database* bone_data, void* data, object_database* obj_db) { + if ((unsigned int)(id - 1) > 13) + object_info = ::object_info(); + rob_chara_item_equip_load_object_info(rob_itm_equip, object_info, id, a4, bone_data, data, obj_db); +} + +static void rob_chara_load_object_info_atama_asi(rob_chara* rob_chr, item_id id, + object_info object_info, bool a4, bone_database* bone_data, void* data, object_database* obj_db) { + rob_chara_item_equip_load_object_info_atama_asi(rob_chr->item_equip, + id, object_info, a4, bone_data, data, obj_db); +} + +static object_info sub_140550350(rob_chara* rob_chr){ + if (rob_chr->data.adjust.field_29 & 0x08) + return rob_chr->data.adjust.field_3B0.hand_l_object; + else if (rob_chr->data.adjust.field_2A & 0x04) + return rob_chr->data.adjust.hand_l_object; + return rob_chr->data.adjust.field_150.hand_l_object; +} + +static object_info sub_140550380(rob_chara* rob_chr) { + if (rob_chr->data.adjust.field_29 & 0x10) + return rob_chr->data.adjust.field_3B0.hand_r_object; + else if (rob_chr->data.adjust.field_2A & 0x08) + return rob_chr->data.adjust.hand_r_object; + return rob_chr->data.adjust.field_150.hand_r_object; +} + +static object_info sub_140550310(rob_chara* rob_chr) { + if (rob_chr->data.adjust.field_2A & 0x01) + return rob_chr->data.adjust.field_3B0.face_object; + return rob_chr->data.adjust.field_150.face_object; +} + +static void sub_140504710(rob_chara* rob_chr, motion_database* mot_db, + bone_database* bone_data, void* data, object_database* obj_db) { + sub_1405509D0(rob_chr, mot_db); + sub_140550A40(rob_chr, mot_db); + sub_140550AB0(rob_chr, mot_db); + sub_140550B20(rob_chr, mot_db); + sub_140550960(rob_chr, mot_db); + sub_1405508F0(rob_chr, mot_db); + //sub_140555F70(rob_chr, mot_db); + sub_14041C9D0(rob_chr->bone_data, !!(rob_chr->data.adjust.field_28 & 0x08)); + sub_14041D2D0(rob_chr->bone_data, !!(rob_chr->data.adjust.field_28 & 0x04)); + sub_14041C680(rob_chr->bone_data, !!(rob_chr->data.field_0 & 0x02)); + sub_14041D270(rob_chr->bone_data, + (float_t)((double_t)rob_chr->data.field_1588.field_274 * M_PI * (1.0 / 32768.0))); + sub_14041CA70(rob_chr->bone_data, rob_chr->data.adjust.field_138); + sub_14041CAB0(rob_chr->bone_data, rob_chr->data.adjust.field_13C); + sub_14041CA10(rob_chr->bone_data, &rob_chr->data.adjust.field_140); + sub_14041DA00(rob_chr->bone_data); + + struc_405* v2 = &rob_chr->data.adjust.field_150; + if ((rob_chr->data.adjust.field_29 & 0x04)) + v2 = &rob_chr->data.adjust.field_3B0; + sub_14053F2C0(&v2->face); + rob_chara_bone_data_set_face_frame(rob_chr->bone_data, v2->face.data.frame); + rob_chara_bone_data_set_face_play_frame_step(rob_chr->bone_data, v2->face.data.play_frame_step); + + RobHandMotion* v3 = &rob_chr->data.adjust.field_150.hand_l; + if (rob_chr->data.adjust.field_29 & 0x08) + v3 = &rob_chr->data.adjust.field_3B0.hand_l; + else if (rob_chr->data.adjust.field_2A & 0x04) + v3 = &rob_chr->data.adjust.hand_l; + sub_14053F2C0(v3); + rob_chara_bone_data_set_hand_l_frame(rob_chr->bone_data, v3->data.frame); + rob_chara_bone_data_set_hand_l_play_frame_step(rob_chr->bone_data, v3->data.play_frame_step); + + RobHandMotion* v4 = &rob_chr->data.adjust.field_150.hand_r; + if (rob_chr->data.adjust.field_29 & 0x10) + v4 = &rob_chr->data.adjust.field_3B0.hand_r; + else if (rob_chr->data.adjust.field_2A & 0x08) + v4 = &rob_chr->data.adjust.hand_r; + sub_14053F2C0(v4); + rob_chara_bone_data_set_hand_r_frame(rob_chr->bone_data, v4->data.frame); + rob_chara_bone_data_set_hand_r_play_frame_step(rob_chr->bone_data, v4->data.play_frame_step); + + RobMouthMotion* v5 = &rob_chr->data.adjust.field_150.mouth; + if (rob_chr->data.adjust.field_29 & 0x20) + v5 = &rob_chr->data.adjust.field_3B0.mouth; + sub_14053F2C0(v5); + rob_chara_bone_data_set_mouth_frame(rob_chr->bone_data, v5->data.frame); + rob_chara_bone_data_set_mouth_play_frame_step(rob_chr->bone_data, v5->data.play_frame_step); + + RobEyesMotion* v6 = &rob_chr->data.adjust.field_150.eye; + if (rob_chr->data.adjust.field_29 & 0x40) + v6 = &rob_chr->data.adjust.field_3B0.eye; + sub_14053F2C0(v6); + rob_chara_bone_data_set_eyes_frame(rob_chr->bone_data, v6->data.frame); + rob_chara_bone_data_set_eyes_play_frame_step(rob_chr->bone_data, v6->data.play_frame_step); + + RobEyelidMotion* v7 = &rob_chr->data.adjust.field_150.eyelid; + if (rob_chr->data.adjust.field_29 & 0x80) + v7 = &rob_chr->data.adjust.field_3B0.eyelid; + sub_14053F2C0(v7); + rob_chara_bone_data_set_eyelid_frame(rob_chr->bone_data, v7->data.frame); + rob_chara_bone_data_set_eyelid_play_frame_step(rob_chr->bone_data, v7->data.play_frame_step); + + object_info v8 = sub_140550330(rob_chr); + if (rob_chara_get_object_info(rob_chr, ITEM_ATAMA) != v8) + rob_chara_load_object_info_atama_asi(rob_chr, ITEM_ATAMA, v8, false, bone_data, data, obj_db); + object_info v9 = rob_chara_get_head_object(rob_chr, 1); + object_info v10 = rob_chara_get_head_object(rob_chr, 7); + + bool v11 = v8 == v9 || v8 == v10; + rob_chr->bone_data->eyes.field_30 = v11; + rob_chr->bone_data->field_788.field_91 = v11; + + object_info v12 = sub_140550350(rob_chr); + if (rob_chara_get_object_info(rob_chr, ITEM_TE_L) != v12) + rob_chara_load_object_info_atama_asi(rob_chr, ITEM_TE_L, v12, true, bone_data, data, obj_db); + + object_info v13 = sub_140550380(rob_chr); + if (rob_chara_get_object_info(rob_chr, ITEM_TE_R) != v13) + rob_chara_load_object_info_atama_asi(rob_chr, ITEM_TE_R, v13, true, bone_data, data, obj_db); + + object_info v14 = sub_140550310(rob_chr); + if (rob_chara_get_object_info(rob_chr, ITEM_HARA) != v14) + rob_chara_load_object_info_atama_asi(rob_chr, ITEM_HARA, v14, false, bone_data, data, obj_db); + + rob_chara_bone_data_interpolate(rob_chr->bone_data); + rob_chara_bone_data_update(rob_chr->bone_data, 0); + //sub_140504F00(rob_chr); + + rob_chr->data.adjust.field_28 &= ~0x80; +} + +static void sub_140504AC0(rob_chara* rob_chr) { + vec3 v4 = rob_chr->data.miku_rot.field_30; + vec3 v20 = vec3_null; + if (rob_chr->data.field_0 & 0x02) { + vec3_add(v4, rob_chr->data.miku_rot.field_3C, v20); + vec3_add(v20, rob_chr->data.field_8.field_B8.field_10, v20); + v4.y = rob_chr->data.field_8.field_B8.field_10.y + - get_osage_gravity_const() * rob_chr->data.field_1588.field_200; + } + else if (rob_chr->data.field_1 >= 0) { + vec3 v20 = rob_chr->data.miku_rot.field_3C; + v20.x += v4.x + rob_chr->data.field_8.field_B8.field_10.x; + v20.z += v4.z + rob_chr->data.field_8.field_B8.field_10.z; + + float_t v7 = 0.4f; + if (rob_chr->data.field_1588.field_20.field_0 & 0xC00) + v7 = 0.6f; + + float_t v13 = powf(v7, 1.0); + if (rob_chr->data.field_1588.field_348) + v13 = 1.0f; + + v4.x *= v13; + v4.y = 0.0f; + v4.z *= v13; + + rob_chr->data.field_8.field_B8.field_10.x *= v13; + rob_chr->data.field_8.field_B8.field_10.z *= v13; + + if (rob_chr->data.field_0 & 0x04 + && rob_chr->data.field_1588.field_1EC > rob_chr->data.adjust.frame_data.frame) { + v20.x += rob_chr->data.field_3DD4; + v20.z += rob_chr->data.field_3DDC; + } + + if (rob_chr->data.field_1588.field_348 == 3) { + v20 = vec3_null; + if (rob_chr->data.field_1588.field_34C >= rob_chr->data.adjust.frame_data.frame) { + v20.y = rob_chr->data.field_1588.field_350.y; + } + else { + rob_chr->data.field_1588.field_348 = 0; + } + } + else if (rob_chr->data.field_1588.field_348) { + v20.x = 0.0f; + v20.z = 0.0f; + if (rob_chr->data.adjust.frame_data.frame > rob_chr->data.field_1588.field_34C + || rob_chr->data.field_1E68.field_1C && rob_chr->data.field_1588.field_348 == 1) + rob_chr->data.field_1588.field_348 = 0; + else { + float_t v17 = rob_chr->data.field_1588.field_34C - rob_chr->data.adjust.frame_data.frame; + if (v17 < 0.0f) + v17 = 0.0f; + + float_t v18 = 1.0f / (v17 + 1.0f); + v20.x = v18 * (rob_chr->data.field_1588.field_350.x - rob_chr->data.miku_rot.field_24.x); + v20.z = v18 * (rob_chr->data.field_1588.field_350.z - rob_chr->data.miku_rot.field_24.z); + } + } + } + + if (rob_chr->data.field_1588.field_20.field_4 & 0x4000000 + && (rob_chr->data.field_3DA0 & 0x40 && rob_chr->data.field_3D9C & 0x20 + || rob_chr->data.field_3DA0 & 0x20 && rob_chr->data.field_3D9C & 0x40)) { + v4.x = 0.0f; + v4.z = 0.0f; + } + + rob_chr->data.miku_rot.field_30 = v4; + rob_chr->data.miku_rot.field_3C = vec3_null; + vec3_add(v20, rob_chr->data.miku_rot.position, rob_chr->data.miku_rot.position); +} + +static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { + data_struct* data = rctx_ptr->data; + bone_database* bone_data = &data->data_ft.bone_data; + motion_database* mot_db = &data->data_ft.mot_db; + object_database* obj_db = &data->data_ft.obj_db; + + sub_140514520(rob_chr); + sub_14054CC80(rob_chr); + //sub_1405077D0(rob_chr); + sub_1405070E0(rob_chr); + sub_140507960(rob_chr); + sub_140504710(rob_chr, mot_db, bone_data, data, obj_db); + sub_140504AC0(rob_chr); +} + +static void rob_base_rob_chara_free(rob_chara* rob_chr) { + //sub_14054F370(&rob_chr->rob_touch); + rob_chara_bone_data_motion_blend_mot_free(rob_chr->bone_data); +} + +static void rob_disp_rob_chara_init(rob_chara* rob_chr, + bone_database* bone_data, void* data, object_database* obj_db) { + bone_node* v3 = rob_chara_bone_data_get_node(rob_chr->bone_data, 0); + rob_chara_item_equip_reset_init_data(rob_chr->item_equip, v3); + rob_chara_item_equip_set_item_equip_range(rob_chr->item_equip, rob_chr->module_index == 501); + rob_chara_item_equip_load_object_info(rob_chr->item_equip, + object_info(), ITEM_BODY, false, bone_data, data, obj_db); + rob_chara_item_equip_load_object_info(rob_chr->item_equip, + rob_chr->chara_init_data->base_face, ITEM_ATAMA, false, bone_data, data, obj_db); + rob_chara_item_equip_set_shadow_type(rob_chr->item_equip, rob_chr->chara_id); + rob_chr->item_equip->field_A0 = 5; + rob_chara_item_sub_data_reload_items(&rob_chr->item_sub_data, + rob_chr->chara_id, bone_data, data, obj_db); + if (rob_chara_item_sub_data_check_for_npr_flag(&rob_chr->item_sub_data)) + rob_chr->item_equip->npr_flag = true; + + /*if (rob_chara_check_for_ageageagain_module(rob_chrchara_index, rob_chr->module_index)) { + sub_140542E30(rob_chr->chara_id, 1); + sub_140542E30(rob_chr->chara_id, 2); + }*/ +} + +static void rob_disp_rob_chara_ctrl(rob_chara* rob_chr) { + if (!rob_chr->field_C) + return; + + rob_chr->field_C = false; + + if (rob_chr->field_D) { + rob_chr->field_D = false; + return; + } + + rob_chara_item_equip_ctrl_iterate_nodes(rob_chr->item_equip); + + /*TaskEffectSplash::Data* rob_impls1 = sub_1403649D0(); + if (rob_impls1) + sub_140366A70(rob_impls1);*/ + + /*TaskEffectFogRing::Data* v3 = sub_140348600(); + if (v3) + sub_140349C30(v3);*/ +} + +static MotionBlendType motion_blend_mot_get_type(motion_blend_mot* a1) { + MotionBlend* v1 = a1->blend; + MotionBlendType v2 = MOTION_BLEND; + if (v1 == &a1->cross) + return MOTION_BLEND_CROSS; + if (v1 == &a1->freeze) + return MOTION_BLEND_FREEZE; + if (v1 == &a1->combine) + v2 = MOTION_BLEND_COMBINE; + return v2; +} + +static bool sub_140413810(motion_blend_mot* a1) { + if (a1->blend && a1->blend->Field_30()) + return a1->blend->field_9; + return false; +} + +static void rob_disp_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { + if (rob_chara_bone_data_get_frame(rob_chr->bone_data) < 0.0f) + rob_chara_bone_data_set_frame(rob_chr->bone_data, 0.0f); + + float_t frame_count = rob_chara_bone_data_get_frame_count(rob_chr->bone_data); + if (rob_chara_bone_data_get_frame(rob_chr->bone_data) > frame_count) + rob_chara_bone_data_set_frame(rob_chr->bone_data, frame_count); + + rob_chara_item_equip_set_opd_blend_data(rob_chr->item_equip, &rob_chr->bone_data->motion_loaded); + + vec3 trans = vec3_null; + rob_chara_get_trans_scale(rob_chr, 0, &trans); + rob_chr->item_equip->position = trans; + rob_chara_item_equip_ctrl(rob_chr->item_equip); + /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { + sub_140543520(rob_chr->chara_id, 1, rob_chr->item_equip->step); + sub_14054FC90(rob_chr, 1u, "j_tail_l_006_wj"); + sub_140543520(rob_chr->chara_id, 2, rob_chr->item_equip->step); + sub_14054FC90(rob_chr, 2u, "j_tail_r_006_wj"); + }*/ +} + +static void rob_disp_rob_chara_disp(rob_chara* rob_chr) { + rob_chr->item_equip->texture_color_coeff = vec4u_identity; + rob_chr->item_equip->mat = rob_chr->data.adjust_data.mat; + rob_chara_item_equip_disp(rob_chr->item_equip, rob_chr->chara_id, rctx_ptr); +} + +static void rob_disp_rob_chara_free(rob_chara* rob_chr) { + //sub_140541260(rob_chr->chara_id); + rob_chara_item_equip_reset(rob_chr->item_equip); +} + +static rob_chara_item_equip* rob_chara_array_get_item_equip(int32_t chara_id) { + return rob_chara_array[chara_id].item_equip; } static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, - vector_old_bone_database_bone* bones) { + std::vector* bones) { bone_database_bones_calculate_count(bones, &rob_bone_data->object_bone_count, &rob_bone_data->motion_bone_count, &rob_bone_data->total_bone_count, &rob_bone_data->ik_bone_count, &rob_bone_data->chain_pos); @@ -4465,8 +6662,8 @@ static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_d float_t eyes_xrot_adjust_neg = v1_neg * v2_neg; float_t eyes_xrot_adjust_pos = v1_pos * v2_pos; - for (motion_blend_mot** i = rob_bone_data->motions.begin; i != rob_bone_data->motions.end; i++) { - bone_data* data = (*i)->bone_data.bones.begin; + for (motion_blend_mot*& i : rob_bone_data->motions) { + bone_data* data = i->bone_data.bones.begin; data[MOTION_BONE_KL_EYE_L].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; data[MOTION_BONE_KL_EYE_L].eyes_xrot_adjust_pos = eyes_xrot_adjust_pos; data[MOTION_BONE_KL_EYE_R].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; @@ -4475,19 +6672,19 @@ static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_d } static float_t rob_chara_bone_data_get_frame(rob_chara_bone_data* rob_bone_data) { - return rob_bone_data->motion_loaded.begin[0]->field_4A8.field_0.frame; + return rob_bone_data->motion_loaded.front()->mot_play_data.frame_data.frame; } static float_t rob_chara_bone_data_get_frame_count(rob_chara_bone_data* rob_bone_data) { - return (float_t)rob_bone_data->motion_loaded.begin[0]->mot_data.mot.frame_count; + return (float_t)rob_bone_data->motion_loaded.front()->mot_key_data.mot.frame_count; } static void rob_chara_bone_data_get_ik_scale( rob_chara_bone_data* rob_bone_data, bone_database* bone_data) { - if (vector_old_length(rob_bone_data->motion_loaded) < 0) + if (rob_bone_data->motion_loaded.size() < 0) return; - motion_blend_mot* v2 = rob_bone_data->motion_loaded.begin[0]; + motion_blend_mot* v2 = rob_bone_data->motion_loaded.front(); rob_chara_bone_data_ik_scale_calculate(&rob_bone_data->ik_scale, &v2->bone_data.bones, rob_bone_data->base_skeleton_type, rob_bone_data->skeleton_type, bone_data); float_t ratio0 = rob_bone_data->ik_scale.ratio0; @@ -4504,27 +6701,27 @@ static mat4* rob_chara_bone_data_get_mat(rob_chara_bone_data* rob_bone_data, siz } static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_data, size_t index) { - if ((ssize_t)index < vector_old_length(rob_bone_data->nodes)) - return &rob_bone_data->nodes.begin[index]; + if (index < rob_bone_data->nodes.size()) + return &rob_bone_data->nodes[index]; return 0; } static void rob_chara_bone_data_ik_scale_calculate( rob_chara_bone_data_ik_scale* ik_scale, vector_old_bone_data* vec_bone_data, bone_database_skeleton_type base_skeleton_type, - bone_database_skeleton_type skeleton_type, bone_database* bone_db) { - char* base_name = (char*)bone_database_skeleton_type_to_string(base_skeleton_type); - char* name = (char*)bone_database_skeleton_type_to_string(skeleton_type); + bone_database_skeleton_type skeleton_type, bone_database* bone_data) { + const char* base_name = bone_database_skeleton_type_to_string(base_skeleton_type); + const char* name = bone_database_skeleton_type_to_string(skeleton_type); float_t* base_heel_height = 0; float_t* heel_height = 0; - if (!bone_database_get_skeleton_heel_height(bone_db, base_name, &base_heel_height) - || !bone_database_get_skeleton_heel_height(bone_db, name, &heel_height)) + if (!bone_data->get_skeleton_heel_height(base_name, &base_heel_height) + || !bone_data->get_skeleton_heel_height(name, &heel_height)) return; - bone_data* b_cl_mune = &vec_bone_data->begin[MOTION_BONE_CL_MUNE]; - bone_data* b_kl_kubi = &vec_bone_data->begin[MOTION_BONE_KL_KUBI]; - bone_data* b_c_kata_l = &vec_bone_data->begin[MOTION_BONE_C_KATA_L]; - bone_data* b_cl_momo_l = &vec_bone_data->begin[MOTION_BONE_CL_MOMO_L]; + ::bone_data* b_cl_mune = &vec_bone_data->begin[MOTION_BONE_CL_MUNE]; + ::bone_data* b_kl_kubi = &vec_bone_data->begin[MOTION_BONE_KL_KUBI]; + ::bone_data* b_c_kata_l = &vec_bone_data->begin[MOTION_BONE_C_KATA_L]; + ::bone_data* b_cl_momo_l = &vec_bone_data->begin[MOTION_BONE_CL_MOMO_L]; float_t base_height = fabsf(b_cl_momo_l->base_translation[0].y) + b_cl_momo_l->ik_segment_length[0] + b_cl_momo_l->ik_2nd_segment_length[0] + *base_heel_height; @@ -4539,12 +6736,78 @@ static void rob_chara_bone_data_ik_scale_calculate( / (fabsf(b_kl_kubi->base_translation[0].y) + b_cl_mune->ik_segment_length[0] + base_height); } +static void mot_key_data_reserve_key_sets_by_skeleton_type(mot_key_data* a1, + bone_database_skeleton_type type, bone_database* bone_data) { + const char* name = bone_database_skeleton_type_to_string(type); + std::vector* bones = 0; + if (!bone_data->get_skeleton_bones(name, &bones)) + return; + + mot_key_data_get_key_set_count_by_bone_database_bones(a1, bones); + mot_key_data_reserve_key_sets(a1); + a1->skeleton_type = type; +} + +static void mot_blend_reserve_key_sets(mot_blend* blend, bone_database_skeleton_type type, + bool(*bone_check_func)(motion_bone_index), size_t motion_bone_count, bone_database* bone_data) { + mot_key_data_reserve_key_sets_by_skeleton_type(&blend->mot_key_data, type, bone_data); + sub_140413350(&blend->field_0, bone_check_func, motion_bone_count); +} + +static bool motion_blend_mot_check(motion_bone_index bone_index) { + return 1; +} + +static bool mot_blend_face_check(motion_bone_index bone_index) { + return bone_index >= MOTION_BONE_FACE_ROOT && bone_index <= MOTION_BONE_TL_TOOTH_UPPER_WJ; +} + +static bool mot_blend_hand_l_check(motion_bone_index bone_index) { + return bone_index >= MOTION_BONE_N_HITO_L_EX && bone_index <= MOTION_BONE_NL_OYA_C_L_WJ; +} + +static bool mot_blend_hand_r_check(motion_bone_index bone_index) { + return bone_index >= MOTION_BONE_N_HITO_R_EX && bone_index <= MOTION_BONE_NL_OYA_C_R_WJ; +} + +static bool mot_blend_mouth_check(motion_bone_index bone_index) { + return bone_index >= MOTION_BONE_N_AGO && bone_index <= MOTION_BONE_TL_TOOTH_UNDER_WJ + || bone_index >= MOTION_BONE_N_KUTI_D && bone_index <= MOTION_BONE_TL_KUTI_U_R_WJ + || bone_index >= MOTION_BONE_N_TOOTH_UPPER && bone_index <= MOTION_BONE_TL_TOOTH_UPPER_WJ; +} + +static bool mot_blend_eyes_check(motion_bone_index bone_index) { + return bone_index >= MOTION_BONE_N_EYE_L && bone_index <= MOTION_BONE_KL_HIGHLIGHT_R_WJ; +} + +static bool mot_blend_eyelid_check(motion_bone_index bone_index) { + if (bone_index >= MOTION_BONE_N_MABU_L_D_A && bone_index <= MOTION_BONE_TL_MABU_R_U_C_WJ + || bone_index >= MOTION_BONE_N_EYELID_L_A && bone_index <= MOTION_BONE_TL_EYELID_R_B_WJ) + return true; + return mot_blend_eyes_check(bone_index); +} + static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, - bone_database_skeleton_type base_skeleton_type, - bone_database_skeleton_type skeleton_type, bone_database* bone_data) { - rob_chara_bone_data_init_skeleton(rob_bone_data, base_skeleton_type, skeleton_type, bone_data); - for (motion_blend_mot** i = rob_bone_data->motions.begin; i != rob_bone_data->motions.end; i++) - motion_blend_mot_load_bone_data(*i, rob_bone_data, bone_data); + bone_database_skeleton_type base_type, + bone_database_skeleton_type type, bone_database* bone_data) { + rob_chara_bone_data_init_skeleton(rob_bone_data, base_type, type, bone_data); + for (motion_blend_mot*& i : rob_bone_data->motions) + motion_blend_mot_load_bone_data(i, rob_bone_data, + motion_blend_mot_check, bone_data); + + size_t motion_bone_count = rob_bone_data->motion_bone_count; + mot_blend_reserve_key_sets(&rob_bone_data->face, base_type, + mot_blend_face_check, motion_bone_count, bone_data); + mot_blend_reserve_key_sets(&rob_bone_data->hand_l, base_type, + mot_blend_hand_l_check, motion_bone_count, bone_data); + mot_blend_reserve_key_sets(&rob_bone_data->hand_r, base_type, + mot_blend_hand_r_check, motion_bone_count, bone_data); + mot_blend_reserve_key_sets(&rob_bone_data->mouth, base_type, + mot_blend_mouth_check, motion_bone_count, bone_data); + mot_blend_reserve_key_sets(&rob_bone_data->eyes, base_type, + mot_blend_eyes_check, motion_bone_count, bone_data); + mot_blend_reserve_key_sets(&rob_bone_data->eyelid, base_type, + mot_blend_eyelid_check, motion_bone_count, bone_data); } static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, @@ -4554,121 +6817,481 @@ static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data && rob_bone_data->skeleton_type == skeleton_type) return; - char* name = (char*)bone_database_skeleton_type_to_string(base_skeleton_type); - vector_old_bone_database_bone* bones = 0; - vector_old_uint16_t* parent_indices = 0; - if (!bone_database_get_skeleton_bones(bone_data, name, &bones) - || !bone_database_get_skeleton_parent_indices(bone_data, name, &parent_indices)) + const char* name = bone_database_skeleton_type_to_string(base_skeleton_type); + std::vector* bones = 0; + std::vector* parent_indices = 0; + std::vector* motion_bones = 0; + if (!bone_data->get_skeleton_bones(name, &bones) + || !bone_data->get_skeleton_parent_indices(name, &parent_indices) + || !bone_data->get_skeleton_motion_bones(name, &motion_bones)) return; rob_chara_bone_data_calculate_bones(rob_bone_data, bones); rob_chara_bone_data_reserve(rob_bone_data); - rob_chara_bone_data_set_mats(rob_bone_data, bones); - rob_chara_bone_data_set_parent_mats(rob_bone_data, parent_indices->begin); + rob_chara_bone_data_set_mats(rob_bone_data, bones, motion_bones->data()); + rob_chara_bone_data_set_parent_mats(rob_bone_data, parent_indices->data()); rob_bone_data->base_skeleton_type = base_skeleton_type; rob_bone_data->skeleton_type = skeleton_type; } -static void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data) { - if (vector_old_length(rob_bone_data->motion_loaded) < 0) +static void sub_14041B4E0(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_FACE_ROOT; i <= MOTION_BONE_TL_TOOTH_UPPER_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_14041B580(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_FACE_ROOT; i <= MOTION_BONE_TL_TOOTH_UPPER_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); + + for (uint32_t i = MOTION_BONE_N_EYE_L; i <= MOTION_BONE_KL_HIGHLIGHT_R_WJ; i++) + bitfield[i >> 5] |= 1 << (i & 0x1F); +} + +static void sub_14041B800(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_N_KUTI_D; i <= MOTION_BONE_TL_KUTI_U_R_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); + + for (uint32_t i = MOTION_BONE_N_AGO; i <= MOTION_BONE_TL_TOOTH_UNDER_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); + + for (uint32_t i = MOTION_BONE_N_TOOTH_UPPER; i <= MOTION_BONE_TL_TOOTH_UPPER_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_14041B440(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_N_EYE_L; i <= MOTION_BONE_KL_HIGHLIGHT_R_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_14041B1C0(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_N_MABU_L_D_A; i <= MOTION_BONE_TL_MABU_R_U_C_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); + + for (uint32_t i = MOTION_BONE_N_EYELID_L_A; i <= MOTION_BONE_TL_EYELID_R_B_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_14041B6B0(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_N_HITO_L_EX; i <= MOTION_BONE_NL_OYA_C_L_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_14041B750(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_N_HITO_R_EX; i <= MOTION_BONE_NL_OYA_C_R_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_14041B300(struc_313* a1) { + uint32_t* bitfield = a1->bitfield.data(); + for (uint32_t i = MOTION_BONE_N_MABU_L_D_A; i <= MOTION_BONE_TL_MABU_R_U_C_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); + + for (uint32_t i = MOTION_BONE_N_EYELID_L_A; i <= MOTION_BONE_TL_EYELID_R_B_WJ; i++) + bitfield[i >> 5] &= ~(1 << (i & 0x1F)); +} + +static void sub_140413EA0(struc_240* a1, void(*a2)(struc_313*)) { + a2(&a1->field_8); +} + +static void sub_14041AD90(rob_chara_bone_data* rob_bone_data) { + if (rob_bone_data->mouth.mot_key_data.key_sets_ready + && rob_bone_data->mouth.mot_key_data.mot_data && !rob_bone_data->mouth.field_30) + sub_140413EA0(&rob_bone_data->face.field_0, sub_14041B800); + if (rob_bone_data->eyelid.mot_key_data.key_sets_ready + && rob_bone_data->eyelid.mot_key_data.mot_data && !rob_bone_data->eyelid.field_30) + sub_140413EA0(&rob_bone_data->face.field_0, sub_14041B1C0); + else if (rob_bone_data->field_758 || rob_bone_data->eyes.mot_key_data.key_sets_ready + && rob_bone_data->eyes.mot_key_data.mot_data && !rob_bone_data->eyes.field_30) + sub_140413EA0(&rob_bone_data->face.field_0, sub_14041B440); +} + +static void sub_14041AD50(rob_chara_bone_data* rob_bone_data) { + if (rob_bone_data->field_758 || rob_bone_data->eyes.mot_key_data.key_sets_ready + && rob_bone_data->eyes.mot_key_data.mot_data && !rob_bone_data->eyes.field_30) + sub_140413EA0(&rob_bone_data->eyelid.field_0, sub_14041B440); +} + +static void sub_14041ABA0(rob_chara_bone_data* a1) { + for (motion_blend_mot*& i : a1->motion_loaded) { + if (a1->face.mot_key_data.key_sets_ready + && a1->face.mot_key_data.mot_data && !a1->face.field_30) { + if (!a1->field_758 || a1->eyes.mot_key_data.key_sets_ready + && a1->eyes.mot_key_data.mot_data && !a1->eyes.field_30) + sub_140413EA0(&i->field_0, sub_14041B4E0); + else + sub_140413EA0(&i->field_0, sub_14041B580); + } + else { + if (a1->mouth.mot_key_data.key_sets_ready + && a1->mouth.mot_key_data.mot_data && !a1->mouth.field_30) + sub_140413EA0(&i->field_0, sub_14041B800); + if (a1->eyelid.mot_key_data.key_sets_ready + && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) { + if (!a1->field_758 + || a1->eyes.mot_key_data.key_sets_ready + && a1->eyes.mot_key_data.mot_data && !a1->eyes.field_30) + sub_140413EA0(&i->field_0, sub_14041B1C0); + else + sub_140413EA0(&i->field_0, sub_14041B300); + } + else if (a1->eyes.mot_key_data.key_sets_ready + && a1->eyes.mot_key_data.mot_data && !a1->eyes.field_30) + sub_140413EA0(&i->field_0, sub_14041B440); + } + + if (a1->hand_l.mot_key_data.key_sets_ready + && a1->hand_l.mot_key_data.mot_data && !a1->hand_l.field_30) + sub_140413EA0(&i->field_0, sub_14041B6B0); + if (a1->hand_r.mot_key_data.key_sets_ready + && a1->hand_r.mot_key_data.mot_data && !a1->hand_r.field_30) + sub_140413EA0(&i->field_0, sub_14041B750); + } + sub_14041AD90(a1); + sub_14041AD50(a1); +} + +static bool sub_1404136B0(motion_blend_mot* a1) { + if (a1->blend) + return a1->blend->Field_30(); + return false; +} + +static bool sub_140413630(struc_308* a1) { + return (a1->field_4 & 2) != 0; +} + +static bool sub_140413790(struc_308* a1) { + return (a1->field_0 & 2) != 0; +} + +static bool sub_1404137A0(struc_308* a1) { + return (a1->field_0 & 0x10) != 0; +} + +static void sub_140415A10(motion_blend_mot* a1) { + if (!a1->blend) return; - for (motion_blend_mot** i = rob_bone_data->motion_loaded.begin; - i != rob_bone_data->motion_loaded.end; i++) - motion_blend_mot_interpolate(*i); + struc_400 v7; + v7.field_0 = false; + v7.field_2 = false; + v7.field_3 = false; + v7.field_4 = false; + if (!a1->field_4F8.field_BD) + v7.field_0 = !sub_140413630(&a1->field_4F8); + if (!a1->field_4F8.field_BC) + v7.field_2 = !sub_140413790(&a1->field_4F8); + v7.field_1 = sub_1404137A0(&a1->field_4F8); + v7.frame = a1->mot_key_data.frame; + v7.eyes_adjust = a1->field_4F8.eyes_adjust; + v7.prev_eyes_adjust = a1->field_4F8.prev_eyes_adjust; + a1->blend->Field_18(&v7); +} + +static bool sub_140410A20(motion_blend_mot* a1) { + return !a1->blend || !a1->blend->field_9; +} + +static void sub_140415B30(mot_blend* a1) { + struc_400 v3; + v3.field_0 = false; + v3.field_1 = false; + v3.field_2 = false; + v3.field_3 = false; + v3.field_4 = false; + v3.frame = 0.0f; + v3.eyes_adjust = 0.0f; + v3.prev_eyes_adjust = 0.0f; + a1->blend.Field_18(&v3); +} + +static void sub_14041DAC0(rob_chara_bone_data* a1) { + size_t v2 = 0; + bool v3 = 0; + for (std::list::iterator i = a1->motion_loaded.begin(); + i != a1->motion_loaded.end(); v2++) { + motion_blend_mot* v4 = i._Ptr->_Myval; + if (sub_1404136B0(v4)) + sub_140415A10(v4); + else { + if (v3) { + rob_chara_bone_data_motion_blend_mot_list_free(a1, v2); + break; + } + sub_140415A10(v4); + v3 = sub_140410A20(v4); + } + } + + sub_140415B30(&a1->face); + sub_140415B30(&a1->hand_l); + sub_140415B30(&a1->hand_r); + sub_140415B30(&a1->mouth); + sub_140415B30(&a1->eyes); + sub_140415B30(&a1->eyelid); +} + +static void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data) { + if (rob_bone_data->motion_loaded.size() < 0) + return; + + sub_14041ABA0(rob_bone_data); + sub_14041DAC0(rob_bone_data); + + for (motion_blend_mot*& i : rob_bone_data->motion_loaded) + motion_blend_mot_interpolate(i); + + bone_database_skeleton_type skeleton_type = rob_bone_data->base_skeleton_type; + motion_blend_mot* v5 = rob_bone_data->motion_loaded.front(); + vector_old_bone_data* bones = &v5->bone_data.bones; + vector_old_uint16_t* bone_indices = &v5->bone_data.bone_indices; + mot_blend_interpolate(&rob_bone_data->face, bones, bone_indices, skeleton_type); + mot_blend_interpolate(&rob_bone_data->hand_l, bones, bone_indices, skeleton_type); + mot_blend_interpolate(&rob_bone_data->hand_r, bones, bone_indices, skeleton_type); + mot_blend_interpolate(&rob_bone_data->mouth, bones, bone_indices, skeleton_type); + mot_blend_interpolate(&rob_bone_data->eyes, bones, bone_indices, skeleton_type); + mot_blend_interpolate(&rob_bone_data->eyelid, bones, bone_indices, skeleton_type); } static void rob_chara_bone_data_motion_blend_mot_free(rob_chara_bone_data* rob_bone_data) { - vector_old_size_t_clear(&rob_bone_data->motion_indices, 0); - vector_old_ptr_motion_blend_mot_clear(&rob_bone_data->motions, motion_blend_mot_dispose); + rob_bone_data->motion_indices.clear(); + for (motion_blend_mot*& i : rob_bone_data->motions) + delete i; + rob_bone_data->motions.clear(); } static void rob_chara_bone_data_motion_blend_mot_init(rob_chara_bone_data* rob_bone_data) { for (int32_t i = 0; i < 3; i++) { - *vector_old_ptr_motion_blend_mot_reserve_back(&rob_bone_data->motions) = motion_blend_mot_init(); - *vector_old_size_t_reserve_back(&rob_bone_data->motion_indices) = i; + rob_bone_data->motions.push_back(new motion_blend_mot()); + rob_bone_data->motion_indices.push_back(i); } rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); } static void rob_chara_bone_data_motion_blend_mot_list_free(rob_chara_bone_data* rob_bone_data, size_t last_index) { - for (motion_blend_mot** i = &rob_bone_data->motion_loaded.end[-1]; - i - rob_bone_data->motion_loaded.begin > (ssize_t)last_index; i--) { - motion_blend_mot* type = rob_bone_data->motion_loaded.end[-1]; - if ((ssize_t)rob_bone_data->motion_loaded_indices.end[-1] - >= vector_old_length(rob_bone_data->motions) && type) - motion_blend_mot_dispose(type); - rob_bone_data->motion_loaded.end[-1] = 0; - vector_old_ptr_motion_blend_mot_pop_back(&rob_bone_data->motion_loaded, 0); - vector_old_size_t_pop_back(&rob_bone_data->motion_loaded_indices, 0); + for (size_t i = rob_bone_data->motion_loaded.size(); i > last_index; i--) { + motion_blend_mot* v5 = rob_bone_data->motion_loaded.back(); + size_t v6 = rob_bone_data->motions.size(); + size_t v14 = rob_bone_data->motion_loaded_indices.back(); + if (v14 >= v6) + delete v5; + else { + rob_bone_data->motion_indices.push_back(v14); + sub_1404146F0(&v5->field_0); + } + rob_bone_data->motion_loaded.pop_back(); + rob_bone_data->motion_loaded_indices.pop_back(); } } static void rob_chara_bone_data_motion_blend_mot_list_init(rob_chara_bone_data* rob_bone_data) { - size_t free_index = rob_bone_data->motion_indices.end[-1]; - vector_old_size_t_pop_back(&rob_bone_data->motion_indices, 0); - vector_old_ptr_motion_blend_mot_push_back(&rob_bone_data->motion_loaded, - &rob_bone_data->motions.begin[free_index]); - vector_old_size_t_push_back(&rob_bone_data->motion_loaded_indices, &free_index); + size_t free_index = rob_bone_data->motion_indices.front(); + rob_bone_data->motion_indices.pop_front(); + rob_bone_data->motion_loaded.push_front(rob_bone_data->motions[free_index]); + rob_bone_data->motion_loaded_indices.push_front(free_index); } static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data) { - size_t mats_size = rob_bone_data->object_bone_count; - vector_old_mat4_reserve(&rob_bone_data->mats, mats_size); - rob_bone_data->mats.end += mats_size; + rob_bone_data->mats.resize(rob_bone_data->object_bone_count); + rob_bone_data->mats2.resize(rob_bone_data->total_bone_count - rob_bone_data->object_bone_count); + rob_bone_data->nodes.resize(rob_bone_data->total_bone_count); +} - size_t mats2_size = rob_bone_data->total_bone_count - rob_bone_data->object_bone_count; - vector_old_mat4_reserve(&rob_bone_data->mats2, mats2_size); - rob_bone_data->mats2.end += mats2_size; +static void sub_1401EAD00(bone_data* a1, bone_data* a2) { + if (a1->flags) + return; - size_t nodes_size = rob_bone_data->total_bone_count; - vector_old_bone_node_reserve(&rob_bone_data->nodes, nodes_size); - rob_bone_data->nodes.end += nodes_size; + switch (a1->type) { + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_POSITION_ROTATION: + a1->trans = a2->trans; + a1->trans_dup[0] = a2->trans_dup[0]; + break; + } - for (bone_node* i = rob_bone_data->nodes.begin; i != rob_bone_data->nodes.end; i++) { - i->name = 0; - i->mat = 0; - i->parent = 0; - i->exp_data.position = vec3_null; - i->exp_data.rotation = vec3_null; - i->exp_data.scale = vec3_identity; - i->exp_data.parent_scale = vec3_identity; - i->ex_data_mat = 0; + switch (a1->type) { + case BONE_DATABASE_BONE_ROTATION: + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_POSITION_ROTATION: + a1->rot_mat[0] = a2->rot_mat[0]; + a1->rot_mat_dup[0] = a2->rot_mat_dup[0]; + break; + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + a1->rot_mat[0] = a2->rot_mat[0]; + a1->rot_mat_dup[0] = a2->rot_mat_dup[0]; + a1->rot_mat[1] = a2->rot_mat[1]; + a1->rot_mat_dup[2] = a2->rot_mat_dup[2]; + break; + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + a1->rot_mat[0] = a2->rot_mat[0]; + a1->rot_mat_dup[0] = a2->rot_mat_dup[0]; + a1->rot_mat[1] = a2->rot_mat[1]; + a1->rot_mat_dup[2] = a2->rot_mat_dup[2]; + a1->rot_mat[2] = a2->rot_mat[2]; + a1->rot_mat_dup[4] = a2->rot_mat_dup[4]; + break; } } +static void sub_140412BB0(motion_blend_mot* a1, vector_old_bone_data* a2) { + for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) + sub_1401EAD00(i, &a2->begin[i->motion_bone_index]); +} + static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, - int32_t motion_id, int32_t index, bone_database* bone_data, motion_database* mot_db) { - if (vector_old_length(rob_bone_data->motion_loaded) < 1) + int32_t motion_id, MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db) { + if (rob_bone_data->motion_loaded.size() < 1) return; - if (index == 1) { + if (blend_type == MOTION_BLEND_FREEZE) { rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); - motion_blend_mot_load_file(rob_bone_data->motion_loaded.begin[0], motion_id, bone_data, mot_db); + motion_blend_mot_load_file(rob_bone_data->motion_loaded.front(), motion_id, bone_data, mot_db); return; } - if (index != 2) { - if (index == 3) - index = 0; + if (blend_type != MOTION_BLEND_CROSS) { + if (blend_type == MOTION_BLEND_COMBINE) + blend_type = MOTION_BLEND; rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); - motion_blend_mot_load_file(rob_bone_data->motion_loaded.begin[0], motion_id, bone_data, mot_db); + motion_blend_mot_load_file(rob_bone_data->motion_loaded.front(), motion_id, bone_data, mot_db); return; } rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 2); - if (vector_old_length(rob_bone_data->motion_indices) > 0) { + if (rob_bone_data->motion_indices.size() > 0) { rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); - motion_blend_mot_load_file(rob_bone_data->motion_loaded.begin[0], motion_id, bone_data, mot_db); + sub_140412BB0(rob_bone_data->motion_loaded.front(), &rob_bone_data->motion_loaded.front()->bone_data.bones); + motion_blend_mot_load_file(rob_bone_data->motion_loaded.front(), motion_id, bone_data, mot_db); return; } - motion_blend_mot* v16 = motion_blend_mot_init(); - motion_blend_mot_load_bone_data(v16, rob_bone_data, bone_data); - vector_old_ptr_motion_blend_mot_push_back(&rob_bone_data->motion_loaded, &v16); - *vector_old_size_t_reserve_back(&rob_bone_data->motion_loaded_indices) = vector_old_length(rob_bone_data->motions); - motion_blend_mot_load_file(rob_bone_data->motion_loaded.begin[0], motion_id, bone_data, mot_db); + motion_blend_mot* v16 = new motion_blend_mot(); + motion_blend_mot_load_bone_data(v16, rob_bone_data, v16->field_0.bone_check_func, bone_data); + rob_bone_data->motion_loaded.push_front(v16); + rob_bone_data->motion_loaded_indices.push_front(rob_bone_data->motions.size()); + sub_140412BB0(rob_bone_data->motion_loaded.front(), &rob_bone_data->motion_loaded.front()->bone_data.bones); + motion_blend_mot_load_file(rob_bone_data->motion_loaded.front(), motion_id, bone_data, mot_db); +} + +static void sub_1404198D0(struc_258* a1) { + a1->field_0 = 0; + a1->field_8 = mat4u_identity; + a1->field_48.field_0 = 0.0f; + a1->field_48.field_4 = 0.0f; + a1->field_48.field_8 = 0.0f; + a1->field_48.field_C = 0.0f; + a1->field_48.field_10 = 0.0f; + a1->field_48.field_14 = 0.0f; + a1->field_48.field_18 = 0.0f; + a1->field_48.field_1C = 0.0f; + a1->field_48.field_20 = 0.0f; + a1->field_48.field_24 = 0.0f; + a1->field_48.field_28 = 0.0f; + a1->field_48.field_2C = 1.0f; + a1->field_48.field_30 = 1.0f; + a1->field_48.field_34 = -3.8f; + a1->field_48.field_38 = 6.0f; + a1->field_48.field_3C = -3.8f; + a1->field_48.field_40 = 6.0f; + a1->field_8C = false; + a1->field_8D = false; + a1->field_8E = false; + a1->field_8F = false; + a1->field_90 = false; + a1->field_91 = false; + a1->field_94 = 0.0f; + a1->field_98 = 1.0f; + a1->field_9C = 1.0f; + a1->field_A0 = 0.0f; + a1->field_A4 = 0.0f; + a1->field_A8 = 0.0f; + a1->field_AC = 0.0f; + a1->field_B0 = 0.0f; + a1->field_B4 = vec3_null; + a1->field_C0 = vec3_null; + a1->field_CC = mat4u_identity; + a1->field_10C = mat4u_identity; + a1->field_14C = 0; + a1->field_150 = 0.0f; + a1->field_154 = 0.0f; + a1->field_158 = 0.0f; + a1->field_15C.field_0 = 0.0f; + a1->field_15C.field_4 = 0.0f; + a1->field_15C.field_8 = 0.0f; + a1->field_15C.field_C = 0.0f; + a1->field_15C.field_10 = 0; + a1->field_15C.field_14 = 0; + a1->field_15C.field_18 = 0; + a1->field_15C.field_1C = 0; + a1->field_15C.field_20 = 0.0f; + a1->field_15C.field_24 = 0.0f; + a1->field_184 = 0.0f; + a1->field_188 = 0.0f; + a1->field_18C = 0.0f; + a1->field_190 = false; + a1->field_191 = false; + a1->field_192 = false; + a1->field_193 = false; + a1->field_194 = false; + a1->field_195 = false; + a1->field_198 = 0.0f; + a1->field_19C = 0.0f; + a1->field_1A0 = 0.0f; + a1->field_1A4 = 0; + a1->field_1A8 = 0; + a1->field_1AC = 0.0f; + a1->field_1B0 = 0.0f; + a1->field_1B4 = 0; + a1->field_1B8 = 0; + a1->field_1BC = vec2_identity; + a1->field_1C4 = 0; + a1->field_1C8 = 0; +} + +static void sub_1403FAEF0(struc_312* a1) { + a1->field_0.field_0 = 0.0f; + a1->field_0.field_4 = 0.0f; + a1->field_0.field_8 = 0.0f; + a1->field_0.field_C = 0.0f; + a1->field_0.field_10 = 0.0f; + a1->field_0.field_14 = 0.0f; + a1->field_0.field_18 = 0.0f; + a1->field_0.field_1C = 0; + a1->field_0.field_20 = 0.0f; + a1->field_0.field_24 = 0.0f; + a1->field_0.field_28 = 0.0f; + a1->field_2C.field_0 = 0.0f; + a1->field_2C.field_4 = 0.0f; + a1->field_2C.field_8 = 0.0f; + a1->field_2C.field_C = 0.0f; + a1->field_2C.field_10 = 0.0f; + a1->field_2C.field_14 = 0.0f; + a1->field_2C.field_18 = 0.0f; + a1->field_2C.field_1C = 0; + a1->field_2C.field_20 = 0.0f; + a1->field_2C.field_24 = 0.0f; + a1->field_2C.field_28 = 0.0f; + a1->field_58 = false; + a1->field_59 = false; + a1->field_8C = 1.0f; + a1->field_90 = 0; + a1->field_98 = 1.0f; + a1->field_5C = vec3_null; + a1->field_68 = vec3_null; + a1->field_74 = vec3_null; + a1->field_80 = vec3_null; } static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { @@ -4677,66 +7300,166 @@ static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { rob_bone_data->total_bone_count = 0; rob_bone_data->ik_bone_count = 0; rob_bone_data->chain_pos = 0; - rob_bone_data->mats.end = rob_bone_data->mats.begin; - rob_bone_data->mats2.end = rob_bone_data->mats2.begin; - rob_bone_data->nodes.end = rob_bone_data->nodes.begin; + rob_bone_data->mats.clear(); + rob_bone_data->mats2.clear(); + rob_bone_data->nodes.clear(); rob_bone_data->base_skeleton_type = BONE_DATABASE_SKELETON_NONE; rob_bone_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; - if (vector_old_length(rob_bone_data->motions) == 3) { + if (rob_bone_data->motions.size() == 3) { rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 0); - for (motion_blend_mot** i = rob_bone_data->motions.begin; i != rob_bone_data->motions.end; i++) - motion_blend_mot_reset(*i); + for (motion_blend_mot*& i : rob_bone_data->motions) + motion_blend_mot_reset(i); rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); } else { rob_chara_bone_data_motion_blend_mot_free(rob_bone_data); rob_chara_bone_data_motion_blend_mot_init(rob_bone_data); } + + mot_blend_reset(&rob_bone_data->face); + mot_blend_reset(&rob_bone_data->hand_l); + mot_blend_reset(&rob_bone_data->hand_r); + mot_blend_reset(&rob_bone_data->mouth); + mot_blend_reset(&rob_bone_data->eyes); + mot_blend_reset(&rob_bone_data->eyelid); + rob_bone_data->field_758 = 0; + rob_bone_data->ik_scale.ratio0 = 1.0f; + rob_bone_data->ik_scale.ratio1 = 1.0f; + rob_bone_data->ik_scale.ratio2 = 1.0f; + rob_bone_data->ik_scale.ratio3 = 1.0f; + rob_bone_data->field_76C = vec3_null; + rob_bone_data->field_778 = vec3_null; + sub_1404198D0(&rob_bone_data->field_788); + sub_1403FAEF0(&rob_bone_data->field_958); } -static void sub_140414BC0(struc_346* a1, float_t frame) { - float_t v2 = a1->field_14; - a1->frame = frame; - a1->field_28 = false; - if (v2 >= 0.0f && (a1->field_18 == 2 && frame <= v2) || frame >= v2) - a1->field_14 = -1.0; +static void rob_chara_bone_data_set_eyelid_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + mot_blend_set_duration(&rob_bone_data->eyelid, duration, step, offset); +} + +static void rob_chara_bone_data_set_eyelid_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { + mot_blend_set_frame(&rob_bone_data->eyelid, frame); +} + +static void rob_chara_bone_data_set_eyelid_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step) { + mot_play_frame_data* frame_data = &rob_bone_data->eyelid.mot_play_data.frame_data; + frame_data->step_prev = frame_data->step; + frame_data->step = step; +} + +static void rob_chara_bone_data_set_eyes_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + mot_blend_set_duration(&rob_bone_data->eyes, duration, step, offset); +} + +static void rob_chara_bone_data_set_eyes_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { + mot_blend_set_frame(&rob_bone_data->eyes, frame); +} + +static void rob_chara_bone_data_set_eyes_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step) { + mot_play_frame_data* frame_data = &rob_bone_data->eyes.mot_play_data.frame_data; + frame_data->step_prev = frame_data->step; + frame_data->step = step; +} + +static void rob_chara_bone_data_set_face_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + mot_blend_set_duration(&rob_bone_data->face, duration, step, offset); +} + +static void rob_chara_bone_data_set_face_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { + mot_blend_set_frame(&rob_bone_data->face, frame); +} + +static void rob_chara_bone_data_set_face_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step) { + mot_play_frame_data* frame_data = &rob_bone_data->face.mot_play_data.frame_data; + frame_data->step_prev = frame_data->step; + frame_data->step = step; } static void rob_chara_bone_data_set_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { - sub_140414BC0(&rob_bone_data->motion_loaded.begin[0]->field_4A8.field_0, frame); + mot_play_frame_data_set_frame(&rob_bone_data->motion_loaded.front()->mot_play_data.frame_data, frame); +} + +static void rob_chara_bone_data_set_hand_l_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + mot_blend_set_duration(&rob_bone_data->hand_l, duration, step, offset); +} + +static void rob_chara_bone_data_set_hand_l_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { + mot_blend_set_frame(&rob_bone_data->hand_l, frame); +} + +static void rob_chara_bone_data_set_hand_l_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step) { + mot_play_frame_data* frame_data = &rob_bone_data->hand_l.mot_play_data.frame_data; + frame_data->step_prev = frame_data->step; + frame_data->step = step; +} + +static void rob_chara_bone_data_set_hand_r_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + mot_blend_set_duration(&rob_bone_data->hand_r, duration, step, offset); +} + +static void rob_chara_bone_data_set_hand_r_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { + mot_blend_set_frame(&rob_bone_data->hand_r, frame); +} + +static void rob_chara_bone_data_set_hand_r_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step) { + mot_play_frame_data* frame_data = &rob_bone_data->hand_r.mot_play_data.frame_data; + frame_data->step_prev = frame_data->step; + frame_data->step = step; } static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, - vector_old_bone_database_bone* bones) { + std::vector* bones, std::string* motion_bones) { size_t chain_pos = 0; size_t ik_bone_count = 0; size_t total_bone_count = 0; - mat4* mats = rob_bone_data->mats.begin; - mat4* mats2 = rob_bone_data->mats2.begin; - bone_node* nodes = rob_bone_data->nodes.begin; - for (bone_database_bone* i = bones->begin; i != bones->end; i++) - switch (i->type) { + mat4* mats = rob_bone_data->mats.data(); + mat4* mats2 = rob_bone_data->mats2.data(); + bone_node* nodes = rob_bone_data->nodes.data(); + for (bone_database_bone& i : *bones) + switch (i.type) { case BONE_DATABASE_BONE_ROTATION: case BONE_DATABASE_BONE_TYPE_1: case BONE_DATABASE_BONE_POSITION: - (nodes++)->mat = mats++; + nodes->mat = mats++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; chain_pos++; total_bone_count++; break; case BONE_DATABASE_BONE_POSITION_ROTATION: - (nodes++)->mat = mats++; + nodes->mat = mats++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; chain_pos++; ik_bone_count++; total_bone_count++; break; case BONE_DATABASE_BONE_HEAD_IK_ROTATION: - (nodes++)->mat = mats2++; - (nodes++)->mat = mats++; - (nodes++)->mat = mats2++; + nodes->mat = mats2++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; + + nodes->mat = mats++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; + + nodes->mat = mats2++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; chain_pos += 2; ik_bone_count++; @@ -4744,10 +7467,25 @@ static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, break; case BONE_DATABASE_BONE_ARM_IK_ROTATION: case BONE_DATABASE_BONE_LEGS_IK_ROTATION: - (nodes++)->mat = mats++; - (nodes++)->mat = mats++; - (nodes++)->mat = mats++; - (nodes++)->mat = mats2++; + nodes->mat = mats++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; + + nodes->mat = mats++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; + + nodes->mat = mats++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; + + nodes->mat = mats2++; + nodes->name = motion_bones->c_str(); + nodes++; + motion_bones++; chain_pos += 3; ik_bone_count++; @@ -4755,38 +7493,57 @@ static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, break; } - for (bone_node* i = rob_bone_data->nodes.begin; i != rob_bone_data->nodes.end; i++) - i->ex_data_mat = i->mat; + for (bone_node& i : rob_bone_data->nodes) + i.ex_data_mat = i.mat; +} + +static void rob_chara_bone_data_set_motion_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + motion_blend_mot_set_duration(rob_bone_data->motion_loaded.front(), duration, step, offset); +} + +static void rob_chara_bone_data_set_mouth_anim_duration(rob_chara_bone_data* rob_bone_data, + float_t duration, float_t step, float_t offset) { + mot_blend_set_duration(&rob_bone_data->mouth, duration, step, offset); +} + +static void rob_chara_bone_data_set_mouth_frame(rob_chara_bone_data* rob_bone_data, float_t frame) { + mot_blend_set_frame(&rob_bone_data->mouth, frame); +} + +static void rob_chara_bone_data_set_mouth_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step) { + mot_play_frame_data* frame_data = &rob_bone_data->mouth.mot_play_data.frame_data; + frame_data->step_prev = frame_data->step; + frame_data->step = step; } static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, uint16_t* parent_indices) { - if (vector_old_length(rob_bone_data->nodes) < 1) + if (rob_bone_data->nodes.size() < 1) return; parent_indices++; - for (bone_node* i = &rob_bone_data->nodes.begin[1]; i != rob_bone_data->nodes.end; i++) - i->parent = &rob_bone_data->nodes.begin[*parent_indices++]; + for (auto i = rob_bone_data->nodes.begin() + 1; i != rob_bone_data->nodes.end(); i++) + i->parent = &rob_bone_data->nodes[*parent_indices++]; } static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y) { - rob_bone_data->motion_loaded.begin[0]->bone_data.rotation_y = rotation_y; + rob_bone_data->motion_loaded.front()->bone_data.rotation_y = rotation_y; } static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* mat) { - if (vector_old_length(rob_bone_data->motion_loaded_indices) < 1) + if (rob_bone_data->motion_loaded_indices.size() < 1) return; - for (motion_blend_mot** i = rob_bone_data->motion_loaded.begin; - i != rob_bone_data->motion_loaded.end; i++) { - if (!*i) + for (motion_blend_mot*& i : rob_bone_data->motion_loaded) { + if (!i) continue; - motion_blend_mot* v5 = *i; + motion_blend_mot* v5 = i; v5->field_4F8.field_8C = false; v5->field_4F8.field_4C = v5->field_4F8.mat; v5->field_4F8.mat = mat4u_identity; - int32_t skeleton_select = v5->mot_data.skeleton_select; + int32_t skeleton_select = v5->mot_key_data.skeleton_select; for (bone_data* j = v5->bone_data.bones.begin; j != v5->bone_data.bones.end; j++) bone_data_mult_0(j, skeleton_select); @@ -4814,7 +7571,7 @@ static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* float_t v9 = v5->field_4F8.field_C4; vec3 v10 = v5->field_4F8.field_C8; v5->field_4F8.field_A8 = b_n_hara_cp->trans; - if (!v5->mot_data.skeleton_select) { + if (!v5->mot_key_data.skeleton_select) { if (ratio != v9) { b_n_hara_cp->trans.x = (b_n_hara_cp->trans.x - v10.x) * v9 + v10.x; b_n_hara_cp->trans.z = (b_n_hara_cp->trans.z - v10.z) * v9 + v10.z; @@ -4835,43 +7592,572 @@ static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* } } - motion_blend_mot_mult_mat(rob_bone_data->motion_loaded.begin[0], mat); + motion_blend_mot_mult_mat(rob_bone_data->motion_loaded.front(), mat); } -static void rob_chara_bone_data_dispose(rob_chara_bone_data* rob_bone_data) { - vector_old_mat4_free(&rob_bone_data->mats, 0); - vector_old_mat4_free(&rob_bone_data->mats2, 0); - vector_old_bone_node_free(&rob_bone_data->nodes, 0); - vector_old_ptr_motion_blend_mot_free(&rob_bone_data->motions, motion_blend_mot_dispose); - vector_old_size_t_free(&rob_bone_data->motion_indices, 0); - vector_old_size_t_free(&rob_bone_data->motion_loaded_indices, 0); - for (motion_blend_mot** i = rob_bone_data->motion_loaded.begin; - i != rob_bone_data->motion_loaded.end; i++) - *i = 0; - vector_old_ptr_motion_blend_mot_free(&rob_bone_data->motion_loaded, 0); - free(rob_bone_data); +static void rob_chara_data_adjuct_reset(rob_chara_adjust_data* rob_chr_adj) { + rob_chr_adj->scale = 1.0f; + rob_chr_adj->height_adjust = false; + rob_chr_adj->pos_adjust_y = 0.0f; + rob_chr_adj->pos_adjust = vec3_null; + rob_chr_adj->offset = vec3_null; + rob_chr_adj->offset_x = true; + rob_chr_adj->offset_y = false; + rob_chr_adj->offset_z = true; + rob_chr_adj->get_global_trans = false; + mat4 mat; + mat4_translate(rob_chr_adj->trans.x, rob_chr_adj->trans.y, + rob_chr_adj->trans.z, &mat); + rob_chr_adj->mat = mat; + rob_chr_adj->left_hand_scale = -1.0f; + rob_chr_adj->right_hand_scale = -1.0f; + rob_chr_adj->left_hand_scale_default = -1.0f; + rob_chr_adj->right_hand_scale_default = -1.0f; } -static rob_chara_item_equip* rob_chara_item_equip_init() { - rob_chara_item_equip* rob_item_equip = force_malloc_s(rob_chara_item_equip, 1); - rob_chara_item_equip_object* itm_eq_obj = force_malloc_s(rob_chara_item_equip_object, 31); - for (int32_t i = 0; i < 31; i++) - rob_chara_item_equip_object_init(&itm_eq_obj[i]); - rob_item_equip->item_equip_object = itm_eq_obj; - rob_item_equip->wind_strength = 1.0f; - rob_item_equip->chara_color = 1; - for (int32_t i = 0; i < 31; i++) - rob_item_equip->item_equip_object[i].item_equip = rob_item_equip; - rob_chara_item_equip_reset(rob_item_equip); - return rob_item_equip; +static void rob_chara_data_miku_rot_reset(rob_chara_data_miku_rot* rob_mik_rot) { + rob_mik_rot->rot_y_int16 = 0; + rob_mik_rot->field_2 = 0; + rob_mik_rot->field_4 = 0; + rob_mik_rot->field_6 = 0; + rob_mik_rot->field_8 = 0; + rob_mik_rot->field_C = 0; + rob_mik_rot->field_10 = 0.0f; + rob_mik_rot->field_14 = 0; + rob_mik_rot->position = vec3_null; + rob_mik_rot->field_24 = vec3_null; + rob_mik_rot->field_30 = vec3_null; + rob_mik_rot->field_3C = vec3_null; + rob_mik_rot->field_48 = vec3_null; + rob_mik_rot->field_54 = vec3_null; + rob_mik_rot->field_60 = 0; + rob_mik_rot->field_64 = 0; + rob_mik_rot->field_68 = 0; + rob_mik_rot->field_6C = mat4u_identity; } -static float_t sub_140512F60(rob_chara_item_equip* rob_item_equip) { +void sub_140506C20(struc_523* a1) { + a1->field_0 = 0; + a1->field_1 = 0; + a1->field_4 = 0; + a1->field_8 = 0; + a1->field_C = 0; + a1->field_10 = vec3_null; + a1->field_1C = 0; + a1->field_20 = 0; + a1->field_24 = 0; + a1->field_28 = 0; + a1->field_2C = 0; + a1->field_30 = 0; + a1->field_34 = 0; + a1->field_38 = 0; + a1->field_3C = 0; + a1->field_40 = 0; + a1->field_44 = 0; + a1->field_48 = 0; + a1->field_4C = 0; + a1->field_50 = 0; + a1->field_58.clear(); + a1->field_68 = 0; + a1->field_70 = 0; + a1->field_78 = 0; + a1->field_7C = 0; + a1->field_80 = 0.0f; +} + +static void sub_140505C90(struc_264* a1) { + a1->field_0 = 0; + a1->field_4 = { 0, {}, -1, 0 }; + a1->field_18 = { 0, {}, -1, 0 }; + a1->field_2C = { 0, {}, -1, 0 }; + a1->field_40 = { 0, {}, -1, 0 }; + a1->field_54 = { 0, {}, -1, 0 }; + a1->field_68 = 0; + a1->field_6C = 0; + a1->field_70 = 0; + a1->field_74 = 0.0f; + a1->field_78 = 0x7FFF; + a1->field_7C = 0; + a1->field_80 = 0; + a1->field_84 = 0; + a1->field_8C = 0; + a1->field_94 = 0; + a1->field_98 = 0; + a1->field_9C = 0; + a1->field_A0 = 0; + a1->field_A4 = 0; + a1->field_A5 = 0; + a1->field_A8 = 0; + a1->field_AC = 0; + a1->field_B0 = 0; + a1->eyes_adjust = 0; + sub_140506C20(&a1->field_B8); + a1->field_140 = 0; + a1->field_144 = 0; + a1->field_146 = 0; + a1->field_147 = 0; + a1->field_148 = 0; + a1->field_14C = 0; + a1->field_150 = 0; + a1->field_152 = 0; + a1->field_154 = 0; + a1->field_158 = 0; + a1->field_15C = 0; + a1->field_160 = 0; + a1->field_168 = -1; + a1->field_16C = 0; + a1->field_170 = 0; + a1->field_174 = 0; + a1->field_178 = 0; + a1->field_17C = 0; + a1->field_180 = 0; + a1->field_184 = 0; + a1->field_188 = 0; + a1->field_18C = 999.0f; + a1->field_190 = 0; + a1->field_194 = 0; + a1->field_198 = 0; + a1->field_19C = 0; + a1->field_1A0 = 0; + a1->field_1A4 = 0; + a1->field_1A8 = 0; + a1->field_1B0 = 0; + a1->field_1B4 = 0; + a1->field_1B8 = 0; + a1->field_1BC = -1; + a1->field_1C0.field_0 = 0; + a1->field_1C0.field_4 = 0; + a1->field_1C8 = 0; + a1->field_1C9 = 0; + a1->field_1CA = 0; + a1->field_1CC = 0; + a1->field_1D0 = 0; + a1->field_1D4 = 0; +} + +static void sub_140506440(rob_chara_adjust* a1) { + a1->motion_id = -1; + a1->prev_motion_id = -1; + a1->frame_data.frame = 0.0f; + a1->frame_data.prev_frame = 0.0f; + a1->frame_data.last_set_frame = 0.0f; + a1->step_data.frame = 0.0f; + a1->step_data.field_4 = 0.0f; + a1->step_data.step = -1.0f; + a1->step = -1.0f; + a1->field_24 = 0; + a1->field_28 = 0; + a1->field_29 = 0; + a1->field_2A = 0; + a1->field_2C = 0; + a1->field_30 = 0; + a1->field_34 = 0; + a1->field_36 = 0; + + for (int32_t& i : a1->field_38) + i = 0; + for (int32_t& i : a1->field_B8) + i = 0; + + a1->field_138 = 1.0f; + a1->field_13C = 1.0f; + a1->field_140 = vec3_null; + a1->field_150.Reset(); + a1->hand_l.Reset(); + a1->hand_r.Reset(); + a1->hand_l_object = object_info(); + a1->hand_r_object = object_info(); + a1->field_3B0.Reset(); + + for (rob_chara_data_parts_adjust& i : a1->parts_adjust) + rob_chara_data_parts_adjust_reset(&i); + + for (rob_chara_data_parts_adjust& i : a1->parts_adjust_prev) + rob_chara_data_parts_adjust_reset(&i); + + for (rob_chara_data_parts_adjust& i : a1->field_10D8) + rob_chara_data_parts_adjust_reset(&i); + + for (struc_222& i : a1->field_12C8) { + i.field_0 = 0; + i.field_4 = 0.0f; + i.field_8 = 0.0f; + i.field_C = 0.0f; + i.duration = 0.0f; + i.frame = 0.0f; + } + + for (rob_chara_data_hand_adjust& i : a1->hand_adjust) + rob_chara_data_hand_adjust_reset(&i); + + for (rob_chara_data_hand_adjust& i : a1->hand_adjust_prev) + rob_chara_data_hand_adjust_reset(&i); +} + +static void sub_140536DD0(struc_223* a1) { + a1->field_84 = 0; + a1->field_88 = 0; + a1->field_8C = 0; + a1->field_90 = 0; + a1->field_94 = 0; + a1->field_96 = 0; + a1->field_98 = -1; + a1->field_9C = 0; + a1->field_A0 = 0; + a1->field_A4 = 0; + a1->field_A8 = 0; + a1->field_B0[0] = { 0, 1.2f, 1.0f }; + a1->field_B0[1] = { 0, -1.0f, -1.0f }; + a1->field_B0[2] = { 0, -1.0f, -1.0f }; + a1->field_B0[3] = { 0, -1.0f, -1.0f }; + a1->field_B0[4] = { 0, -1.0f, -1.0f }; + a1->field_B0[5] = { 0, -1.0f, -1.0f }; + a1->field_B0[6] = { 0, -1.0f, -1.0f }; + a1->field_B0[7] = { 0, -1.0f, -1.0f }; + a1->field_B0[8] = { 0, -1.0f, -1.0f }; + a1->field_B0[9] = { 0, -1.0f, -1.0f }; + a1->field_B0[10] = { 0, -1.0f, -1.0f }; + a1->field_B0[11] = { 0, -1.0f, -1.0f }; + a1->field_B0[12] = { 0, -1.0f, -1.0f }; + a1->field_B0[13] = { 0, -1.0f, -1.0f }; + a1->field_B0[14] = { 0, -1.0f, -1.0f }; + a1->field_B0[15] = { 0, -1.0f, -1.0f }; + a1->field_B0[16] = { 0, -1.0f, -1.0f }; + a1->field_B0[17] = { 0, -1.0f, -1.0f }; + a1->field_B0[18] = { 0, -1.0f, -1.0f }; + a1->field_B0[19] = { 0, -1.0f, -1.0f }; + a1->field_B0[20] = { 0, -1.0f, -1.0f }; + a1->field_B0[21] = { 0, -1.0f, -1.0f }; + a1->field_B0[22] = { 0, -1.0f, -1.0f }; + a1->field_B0[23] = { 0, -1.0f, -1.0f }; + a1->field_B0[24] = { 0, -1.0f, -1.0f }; + a1->field_B0[25] = { 0, -1.0f, -1.0f }; + a1->field_260 = 0; + a1->field_270 = 0; + a1->field_2B0 = 0; + a1->field_2D8 = a1->field_2D0; + a1->field_310 = 3; + a1->field_314 = 0; +} + +static void sub_140537110(struc_223* a1) { + a1->field_0 = -1; + a1->frame_count = 0.0f; + a1->field_8 = 0.0f; + a1->field_C = 0; + sub_140536DD0(a1); + a1->field_50 = 0; + a1->field_52 = 0; + a1->field_54 = 0; + a1->field_58 = -1; + a1->field_5C = -1; + a1->field_60 = 0; + a1->field_64 = -1; + a1->field_68 = 0; + a1->field_6C = -1; + a1->field_70 = 0.0f; + a1->field_74 = -1.0f; + a1->field_78 = 0.0f; + a1->field_7C = 0.0f; + a1->field_80 = 0.0f; + a1->field_1E8 = 0; + a1->field_1EC = 0.0f; + a1->field_1F0 = 0.0f; + a1->field_1F4 = 0.0f; + a1->field_1F8 = -1.0f; + a1->field_1FC = 0.0f; + a1->field_200 = 1.0f; + a1->field_204 = -1; + a1->field_208 = 0; + a1->field_20C = -1; + a1->field_210 = 0; + a1->field_218 = -1.0f; + a1->field_21C = -1.0f; + a1->field_220 = 0; + a1->field_228.clear(); + a1->field_238 = -1; + a1->field_23C = 0; + a1->field_240 = 0; + a1->field_244 = 0; + a1->field_248 = 0; + a1->field_250 = 0; + a1->field_258 = -1.0f; + a1->field_25C = 0; + a1->field_268 = 0; + a1->field_274 = 0; + a1->field_278 = 0; + a1->field_27C = -1; + a1->field_280 = 0; + a1->field_284 = 0; + a1->field_288 = 0; + a1->field_290 = 0; + a1->field_294 = 0; + a1->field_298 = 0; + a1->field_29C = 0.0f; + a1->field_2A0 = 0; + a1->field_2A4 = 0.0f; + a1->field_2A8 = 0.0f; + a1->field_2AC = 0.0f; + a1->field_2B8 = 0; + a1->field_2BC = 0; + a1->field_2C0 = -1.0f; + a1->field_2C4 = -1.0f; + a1->field_2C8 = 0; + a1->field_2E8 = -1; + a1->field_2EC = 0; + a1->field_2F4 = 0; + a1->field_2FC = -1; + a1->field_300 = 100; + a1->field_304 = 1; + a1->field_308 = 0; + a1->field_30C = 1.0f; + a1->field_2F0 = 0; + a1->field_318 = 0.0f; + a1->field_31C = 0.0f; + a1->field_320 = 0.0f; + a1->field_324 = 0.05f; + a1->field_328 = -1.0f; + a1->iterations = -1; +} + +static void sub_1405335C0(struc_223* a1) { + a1->field_330.field_0 = 0; + a1->field_330.field_8 = 0; + a1->field_340 = 0; + a1->field_344 = 0; + a1->field_348 = 0; + a1->field_34C = 0.0f; + a1->field_350 = vec3_null; + + for (struc_226& i : a1->field_35C) + for (int8_t& j : i.field_0) + j = 0; + + for (struc_225& i : a1->field_3B0) + for (float_t& j : i.field_0) + j = 1.0f; + + for (struc_224& i : a1->field_4F4) + for (int32_t& j : i.field_0) + j = 0; + + a1->field_638 = 0; + a1->field_640 = -1.0f; + a1->field_644 = -1.0f; + a1->field_648 = 0; + a1->field_64C = 0; + a1->field_650 = 1.0f; + a1->field_654 = 1.0f; + a1->field_65C = 0; + a1->field_660 = -1.0f; + a1->field_664 = -1.0f; + a1->field_668 = 0; + a1->field_66C[0] = { -1, -1.0f, -1.0f }; + a1->field_66C[1] = { -1, -1.0f, -1.0f }; + a1->field_66C[2] = { -1, -1.0f, -1.0f }; + a1->field_66C[3] = { -1, -1.0f, -1.0f }; +} + +static void sub_140539750(struc_223* a1) { + a1->field_20 = {}; + a1->field_10 = {}; + sub_140537110(a1); + sub_1405335C0(a1); + a1->field_7A0 = 0; + a1->field_7A8 = -1; +} + +static void sub_140505FB0(struc_209* a1) { + a1->field_0 = 0; + a1->field_4 = 0; + a1->field_8 = 0; + a1->field_C = 0; + a1->field_10 = 0; + a1->field_14 = 0; + a1->field_18 = 0; + a1->field_1C = 0; + a1->field_20 = 0; + a1->field_24 = 0; + a1->field_28 = 0; + a1->field_2C = 0; + a1->field_30 = 0; + a1->field_34 = 0; + a1->field_38 = 0; + a1->field_3C = 0; + a1->field_40 = 0; + a1->field_44 = 0; + a1->field_48 = 0; + a1->field_4C = 0; + a1->field_50 = 0; + a1->field_54 = 0; + a1->field_58 = 0; + a1->field_5C = -1; + a1->field_60 = 0; + a1->field_64 = 0; + a1->field_68 = -1; + a1->field_6C = 0; + a1->field_70 = 0; + a1->field_74 = 0; + + for (mat4u& i : a1->field_78) + i = mat4u_identity; + + for (mat4u& i : a1->field_738) + i = mat4u_identity; + + for (struc_195& i : a1->field_DF8) + i = {}; + + for (struc_195& i : a1->field_1230) + i = {}; + + for (struc_195& i : a1->field_1668) + i = {}; + + for (struc_210& i : a1->field_1AA0) + i = {}; + + for (float_t& i : a1->field_1BE4) + i = 0.0f; + + a1->field_1C50.clear(); + a1->field_1C50.resize(27); + + size_t v3 = 0; + for (std::pair& i : a1->field_1C50) + i = { v3++, 0.0f }; + + a1->field_1C68 = 27; + a1->field_1C70 = 27; + a1->field_1C78 = 27; + a1->field_1C80 = 27; + + for (int32_t& i : a1->field_1C88) + i = 0; + + for (int32_t& i : a1->field_1CF4) + i = 0; + + for (int32_t& i : a1->field_1D60) + i = 0; + + a1->field_1DCC = 0; + a1->field_1DD0 = 0; + a1->field_1DD4 = 0; + a1->field_1DD8 = 0; + a1->field_1DDC = 0; + a1->field_1DE0 = 0; + a1->field_1DE4 = 0.0f; + a1->field_1DE8 = -1; + a1->field_1DEC = -1; + a1->field_1DF0 = 0; + a1->field_1DF4 = 0; + a1->field_1DF8 = -1; + a1->field_1DFC = -1; + + a1->field_1E00 = 0; + a1->field_1E04 = 0; + a1->field_1E08 = 0; + a1->field_1E0C = 0; + a1->field_1E10 = 0; + a1->field_1E14 = 0; + a1->field_1E18 = 0; + a1->field_1E1C = 0; + a1->field_1E20 = 0; + a1->field_1E24 = 0; + a1->field_1E28 = 0; + a1->field_1E2C = 0; + a1->field_1E30 = 0; + a1->field_1E34 = 0; + a1->field_1E38 = 0; + a1->field_1E3C = 0; + a1->field_1E40 = 0; + a1->field_1E44 = 0; + a1->field_1E48 = 0; + a1->field_1E4C = 0; + a1->field_1E50 = 0; + a1->field_1E54 = 0; + a1->field_1E58 = 0; + a1->field_1E5C = 0; + a1->field_1E60 = 0; + a1->field_1E64 = 0; + a1->field_1E68 = 0; + a1->field_1E6C = 0; + a1->field_1E70 = 0; + a1->field_1E74 = 0; + a1->field_1E78 = 0; + a1->field_1E7C = 0; + a1->field_1E80 = 0; + a1->field_1E84 = 0; + a1->field_1E88 = 0; + a1->field_1E8C = 0; + a1->field_1E90 = 0; + a1->field_1E94 = 0; + a1->field_1E98 = 0; + a1->field_1E9C = 0; + a1->field_1EA0 = 0; + a1->field_1EA4 = 0; + a1->field_1EA8 = 0; + a1->field_1EAC = 0; + a1->field_1EB0 = 0; + + for (struc_267& i : a1->field_1EB4) + i = { 1000.0f, 0x145F, 0, -1.0f, 0 }; + + for (int32_t& i : a1->field_1EF4) + i = 0; + + a1->field_1F04 = 1; + a1->field_1F08 = 0; + a1->field_1F0C = 0; + a1->field_1F10 = 0; + a1->field_1F14 = 0; + a1->field_1F18 = 0; + a1->field_1F1C = 0; + a1->field_1F20 = 0; + a1->field_1F21 = 0; + a1->field_1F22 = 0; + a1->field_1F23 = 0; + a1->field_1F24 = 0; + a1->field_1F25 = 0; + a1->field_1F26 = 0; +} + +static void rob_chara_data_reset(rob_chara_data* rob_chr_data) { + sub_140505C90(&rob_chr_data->field_8); + rob_chr_data->rob_sub_action.Reset(); + sub_140506440(&rob_chr_data->adjust); + sub_140539750(&rob_chr_data->field_1588); + rob_chara_data_miku_rot_reset(&rob_chr_data->miku_rot); + rob_chara_data_adjuct_reset(&rob_chr_data->adjust_data); + sub_140505FB0(&rob_chr_data->field_1E68); + rob_chr_data->field_3D90 = 0; + rob_chr_data->field_3D94 = 0; + rob_chr_data->field_3D98 = 0; + rob_chr_data->field_3D9C = 0; + rob_chr_data->field_3DA0 = 0; + rob_chr_data->field_3DA8 = 0; + rob_chr_data->field_3DB0 = 0; + rob_chr_data->field_3DB8 = 0; + rob_chr_data->field_3DBC = 0; + rob_chr_data->field_3DA4 = 0; + rob_chr_data->field_3DC8 = 0; + rob_chr_data->field_3DD4 = 0.0f; + rob_chr_data->field_3DCC = 0; + rob_chr_data->field_3DC0 = 0; + rob_chr_data->field_3DC4 = 0; + rob_chr_data->field_3DD8 = 0; + rob_chr_data->field_3DD0 = 0; + rob_chr_data->field_3DDC = 0.0f; + rob_chr_data->field_3DE0 = 0; +} + +static float_t sub_140512F60(rob_chara_item_equip* rob_itm_equip) { float_t v26; float_t v27; float_t v28; - mat4* mats = rob_item_equip->matrices; + mat4* mats = rob_itm_equip->matrices; float_t v25 = 1.0f; float_t* v2 = &v27; float_t v3 = mats->row3.y; @@ -4927,8 +8213,45 @@ static float_t sub_140512F60(rob_chara_item_equip* rob_item_equip) { return *v22; } +static void sub_140512C20(rob_chara_item_equip* rob_itm_equip, render_context* rctx) { + if (rob_itm_equip->field_D0.is_null() || rob_itm_equip->field_D4 == ITEM_NONE) + return; + + mat4 mat = mat4_identity; + const char* name; + if (rob_itm_equip->field_DC == 1) { + name = "kl_te_r_wj"; + mat4_translate(0.0f, 0.0f, 0.082f, &mat); + mat4_rotate_mult(&mat, (float_t)(-90.9 * DEG_TO_RAD), 0.0f, (float_t)(-179.5 * DEG_TO_RAD), &mat); + } + if (rob_itm_equip->field_DC == 2) { + name = "kl_te_l_wj"; + mat4_translate(0.0f, 0.0015f, -0.0812f, &mat); + mat4_rotate_mult(&mat, (float_t)(-34.5 * DEG_TO_RAD), 0.0f, (float_t)(-179.5 * DEG_TO_RAD), &mat); + } + else + name = "j_1_hyoutan_000wj"; + + bone_database* bone_data = &rctx->data->data_ft.bone_data; + bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( + &rob_itm_equip->item_equip_object[rob_itm_equip->field_D4], name, bone_data); + if (!node || !node->mat) + return; + + mat4_mult(&mat, node->mat, &mat); + glPushMatrix(); + glMultTransposeMatrixf(&mat.row0.x); + int32_t tex_pat_count = (int32_t)rob_itm_equip->texture_pattern.size(); + if (tex_pat_count) + object_data_set_texture_pattern(&rctx->object_data, tex_pat_count, rob_itm_equip->texture_pattern.data()); + draw_task_add_draw_object_by_object_info(rctx, 0, rob_itm_equip->field_D0, 0, 0, 0, 0, 0, false); + if (tex_pat_count) + object_data_set_texture_pattern(&rctx->object_data, 0, 0); + glPopMatrix(); +} + static void rob_chara_item_equip_disp( - rob_chara_item_equip* rob_item_equip, int32_t chara_id, render_context* rctx) { + rob_chara_item_equip* rob_itm_equip, int32_t chara_id, render_context* rctx) { draw_task_flags v2 = (draw_task_flags)0; if (rctx->chara_reflect) enum_or(v2, DRAW_TASK_CHARA_REFLECT); @@ -4937,15 +8260,15 @@ static void rob_chara_item_equip_disp( object_data* object_data = &rctx->object_data; shadow* shad = rctx->draw_pass.shadow_ptr; - if (rob_item_equip->shadow_type != -1) { - if (rob_item_equip->field_A0 & 4) { - shadow_type_enum shadow_type = rob_item_equip->shadow_type; - vec3 pos = rob_item_equip->position; + if (rob_itm_equip->shadow_type != -1) { + if (rob_itm_equip->field_A0 & 4) { + shadow_type_enum shadow_type = rob_itm_equip->shadow_type; + vec3 pos = rob_itm_equip->position; pos.y -= 0.2f; vector_old_vec3_push_back(&shad->field_1D0[shadow_type], &pos); float_t v9; - if (sub_140512F60(rob_item_equip) <= -0.2f) + if (sub_140512F60(rob_itm_equip) <= -0.2f) v9 = -0.5f; else v9 = 0.05f; @@ -4954,31 +8277,31 @@ static void rob_chara_item_equip_disp( enum_or(v2, DRAW_TASK_SHADOW); } - if (rob_item_equip->field_A0 & 1) + if (rob_itm_equip->field_A0 & 1) enum_or(v2, DRAW_TASK_4); } object_data_set_draw_task_flags(object_data, v2); - object_data_set_chara_color(object_data, rob_item_equip->chara_color); + object_data_set_chara_color(object_data, rob_itm_equip->chara_color); vec4 v23; object_data_get_texture_color_coeff(object_data, &v23); - vec4 texture_color_coeff = rob_item_equip->texture_color_coeff; + vec4 texture_color_coeff = rob_itm_equip->texture_color_coeff; object_data_set_texture_color_coeff(object_data, &texture_color_coeff); - object_data_set_wet_param(object_data, rob_item_equip->wet); - //sub_140502FB0(rob_item_equip->field_F9); - //sub_140512C20(rob_item_equip); - //sub_1405421D0(chara_id, rctx->chara_reflect, rob_item_equip->chara_color); + object_data_set_wet_param(object_data, rob_itm_equip->wet); + //sub_140502FB0(rob_itm_equip->field_F9); + sub_140512C20(rob_itm_equip, rctx); + //sub_1405421D0(chara_id, rctx->chara_reflect, rob_itm_equip->chara_color); - mat4 mat = rob_item_equip->mat; - if (rob_item_equip->item_equip_range) - for (int32_t i = rob_item_equip->first_item_equip_object; - i < rob_item_equip->max_item_equip_object; i++) - rob_chara_item_equip_object_disp(&rob_item_equip->item_equip_object[i], &mat, rctx); + mat4 mat = rob_itm_equip->mat; + if (rob_itm_equip->item_equip_range) + for (int32_t i = rob_itm_equip->first_item_equip_object; + i < rob_itm_equip->max_item_equip_object; i++) + rob_chara_item_equip_object_disp(&rob_itm_equip->item_equip_object[i], &mat, rctx); else { - for (int32_t i = 1; i < 31; i++) { + for (int32_t i = ITEM_ATAMA; i < ITEM_MAX; i++) { draw_task_flags v18 = (draw_task_flags)0; - if (rob_item_equip->field_18[i] == 0) { + if (rob_itm_equip->field_18[i] == 0) { if (rctx->chara_reflect) enum_or(v18, DRAW_TASK_CHARA_REFLECT); if (rctx->chara_refract) @@ -4989,11 +8312,11 @@ static void rob_chara_item_equip_disp( if (i == 8) v19 = (draw_task_flags)0; - if (!(rob_item_equip->field_A0 & 4)) + if (!(rob_itm_equip->field_A0 & 4)) enum_and(v19, ~DRAW_TASK_SHADOW); object_data_set_draw_task_flags(object_data, (draw_task_flags)(v18 | v19 | DRAW_TASK_SSS)); - rob_chara_item_equip_object_disp(&rob_item_equip->item_equip_object[i], &mat, rctx); + rob_chara_item_equip_object_disp(&rob_itm_equip->item_equip_object[i], &mat, rctx); } } object_data_set_texture_color_coeff(object_data, &v23); @@ -5003,70 +8326,85 @@ static void rob_chara_item_equip_disp( object_data_set_shadow_type(object_data, SHADOW_CHARA); } -static void rob_chara_item_equip_get_parent_bone_nodes( - rob_chara_item_equip* rob_item_equip, bone_node* bone_nodes, bone_database* bone_data) { - rob_item_equip->bone_nodes = bone_nodes; - rob_item_equip->matrices = bone_nodes->mat; - for (int32_t i = rob_item_equip->first_item_equip_object; - i < rob_item_equip->max_item_equip_object; i++) - rob_chara_item_equip_object_get_parent_bone_nodes( - &rob_item_equip->item_equip_object[i], rob_item_equip->bone_nodes, bone_data); +static object_info rob_chara_item_equip_get_object_info( + rob_chara_item_equip* rob_item_equip, item_id id) { + if (id >= ITEM_BODY && id <= ITEM_ITEM16) + return rob_item_equip->item_equip_object[id].obj_info; + return object_info(); } -static void rob_chara_item_equip_load_object_info(rob_chara_item_equip* rob_item_equip, - object_info object_info, item_id id, bone_database* bone_data, void* data, object_database* obj_db) { - if (id < ITEM_BODY || id > ITEM_ITEM16 || !rob_item_equip->bone_nodes) +static void rob_chara_item_equip_get_parent_bone_nodes( + rob_chara_item_equip* rob_itm_equip, bone_node* bone_nodes, bone_database* bone_data) { + rob_itm_equip->bone_nodes = bone_nodes; + rob_itm_equip->matrices = bone_nodes->mat; + for (int32_t i = rob_itm_equip->first_item_equip_object; + i < rob_itm_equip->max_item_equip_object; i++) + rob_chara_item_equip_object_get_parent_bone_nodes( + &rob_itm_equip->item_equip_object[i], rob_itm_equip->bone_nodes, bone_data); +} + +static void rob_chara_item_equip_load_object_info( + rob_chara_item_equip* rob_itm_equip, object_info object_info, item_id id, + bool osage_reset, bone_database* bone_data, void* data, object_database* obj_db) { + if (id < ITEM_BODY || id > ITEM_ITEM16 || !rob_itm_equip->bone_nodes) return; rob_chara_item_equip_object_load_object_info_ex_data( - &rob_item_equip->item_equip_object[id], object_info, - rob_item_equip->bone_nodes, bone_data, data, obj_db); - rob_item_equip->item_equip_object[id].disp = true; + &rob_itm_equip->item_equip_object[id], object_info, + rob_itm_equip->bone_nodes, osage_reset, bone_data, data, obj_db); + rob_itm_equip->item_equip_object[id].disp = true; } -static void rob_chara_item_equip_object_init(rob_chara_item_equip_object* itm_eq_obj) { - memset(itm_eq_obj, 0, sizeof(rob_chara_item_equip_object)); - bone_node_expression_data_reset_position_rotation(&itm_eq_obj->exp_data); - rob_chara_item_equip_object_init_data(itm_eq_obj, 0x12345678); +static void rob_chara_item_equip_object_check_no_opd( + rob_chara_item_equip_object* itm_eq_obj, std::vector* opd_blend_data) { + itm_eq_obj->use_opd = true; + if (!itm_eq_obj->osage_blocks.size() && !itm_eq_obj->cloth_blocks.size() || !opd_blend_data->size()) + return; + + for (::opd_blend_data& i : *opd_blend_data) { + float_t* opd_data = 0; + uint32_t opd_count = 0; + osage_play_data_manager_get_opd_file_data(itm_eq_obj->obj_info, + i.motion_id, &opd_data, &opd_count); + if (!opd_data) { + itm_eq_obj->use_opd = false; + break; + } + } } static void rob_chara_item_equip_object_clear_ex_data(rob_chara_item_equip_object* itm_eq_obj) { - for (ExNullBlock** i = itm_eq_obj->null_blocks.begin; - i != itm_eq_obj->null_blocks.end; i++) { - (*i)->Reset(); - delete* i; + for (ExNullBlock*& i : itm_eq_obj->null_blocks) { + i->Reset(); + delete i; } - itm_eq_obj->null_blocks.end = itm_eq_obj->null_blocks.begin; + itm_eq_obj->null_blocks.clear(); - for (ExOsageBlock** i = itm_eq_obj->osage_blocks.begin; - i != itm_eq_obj->osage_blocks.end; i++) { - (*i)->Reset(); - delete* i; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) { + i->Reset(); + delete i; } - itm_eq_obj->osage_blocks.end = itm_eq_obj->osage_blocks.begin; + itm_eq_obj->osage_blocks.clear(); - for (ExConstraintBlock** i = itm_eq_obj->constraint_blocks.begin; - i != itm_eq_obj->constraint_blocks.end; i++) { - (*i)->Reset(); - delete* i; + for (ExConstraintBlock*& i : itm_eq_obj->constraint_blocks) { + i->Reset(); + delete i; } - itm_eq_obj->constraint_blocks.end = itm_eq_obj->constraint_blocks.begin; + itm_eq_obj->constraint_blocks.clear(); - for (ExExpressionBlock** i = itm_eq_obj->expression_blocks.begin; - i != itm_eq_obj->expression_blocks.end; i++) { - (*i)->Reset(); - delete* i; + for (ExExpressionBlock*& i : itm_eq_obj->expression_blocks) { + i->Reset(); + delete i; } - itm_eq_obj->expression_blocks.end = itm_eq_obj->expression_blocks.begin; + itm_eq_obj->expression_blocks.clear(); - for (ExClothBlock** i = itm_eq_obj->cloth_blocks.begin; - i != itm_eq_obj->cloth_blocks.end; i++) { - (*i)->Reset(); - delete* i; + for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) { + i->Reset(); + delete i; } - itm_eq_obj->cloth_blocks.end = itm_eq_obj->cloth_blocks.begin; + itm_eq_obj->cloth_blocks.clear(); - itm_eq_obj->node_blocks.end = itm_eq_obj->node_blocks.begin; + itm_eq_obj->node_blocks.clear(); } static void rob_chara_item_equip_object_disp( @@ -5088,26 +8426,25 @@ static void rob_chara_item_equip_object_disp( &itm_eq_obj->texture_pattern, &itm_eq_obj->texture_data, itm_eq_obj->alpha, + itm_eq_obj->mats, + itm_eq_obj->ex_data_block_mats.data(), itm_eq_obj->mat, - itm_eq_obj->field_F0.begin, - itm_eq_obj->field_A8, mat); - for (ExNodeBlock** i = itm_eq_obj->node_blocks.begin; - i != itm_eq_obj->node_blocks.end; i++) - (*i)->Disp(); + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->Disp(); } object_data_set_draw_task_flags(object_data, v2); } static int32_t rob_chara_item_equip_object_get_bone_index( - rob_chara_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data) { - int32_t bone_index = bone_database_get_skeleton_motion_bone_index(bone_data, - (char*)bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), name); + rob_chara_item_equip_object* itm_eq_obj, const char* name, bone_database* bone_data) { + int32_t bone_index = bone_data->get_skeleton_motion_bone_index( + bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), (char*)name); if (bone_index == -1) - for (ex_data_name_bone_index* i = itm_eq_obj->ex_bones.begin; i != itm_eq_obj->ex_bones.end; i++) - if (!str_utils_compare(name, i->name)) - return 0x8000 | i->bone_index; + for (ex_data_name_bone_index& i : itm_eq_obj->ex_bones) + if (!str_utils_compare(name, i.name)) + return 0x8000 | i.bone_index; return bone_index; } @@ -5115,33 +8452,64 @@ static bone_node* rob_chara_item_equip_object_get_bone_node( rob_chara_item_equip_object* itm_eq_obj, int32_t bone_index) { if (!(bone_index & 0x8000)) return &itm_eq_obj->bone_nodes[bone_index & 0x7FFF]; - else if ((bone_index & 0x7FFF) < vector_old_length(itm_eq_obj->ex_data_bone_nodes)) - return &itm_eq_obj->ex_data_bone_nodes.begin[bone_index & 0x7FFF]; + else if ((bone_index & 0x7FFF) < itm_eq_obj->ex_data_bone_nodes.size()) + return &itm_eq_obj->ex_data_bone_nodes[bone_index & 0x7FFF]; return 0; } static bone_node* rob_chara_item_equip_object_get_bone_node_by_name( - rob_chara_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data) { + rob_chara_item_equip_object* itm_eq_obj, const char* name, bone_database* bone_data) { return rob_chara_item_equip_object_get_bone_node(itm_eq_obj, rob_chara_item_equip_object_get_bone_index(itm_eq_obj, name, bone_data)); } static void rob_chara_item_equip_object_get_parent_bone_nodes( rob_chara_item_equip_object* itm_eq_obj, bone_node* bone_nodes, bone_database* bone_data) { - itm_eq_obj->bone_nodes = bone_nodes; - itm_eq_obj->mat = bone_nodes->mat; - for (ExNodeBlock** i = itm_eq_obj->node_blocks.begin; i != itm_eq_obj->node_blocks.end; i++) - (*i)->parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( - itm_eq_obj, string_data(&(*i)->parent_name), bone_data); + itm_eq_obj->mats = bone_nodes->mat; + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) + i->parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( + itm_eq_obj, i->parent_name.c_str(), bone_data); } -static void rob_chara_item_equip_object_init_data(rob_chara_item_equip_object* itm_eq_obj, size_t index) { +static void rob_chara_item_equip_object_init_ex_data_bone_nodes( + rob_chara_item_equip_object* itm_eq_obj, object_skin_ex_data* a2) { + itm_eq_obj->ex_data_bone_nodes.clear(); + itm_eq_obj->ex_data_mats.clear(); + itm_eq_obj->ex_data_block_mats.clear(); + + int32_t count = a2->bone_names_count; + itm_eq_obj->ex_data_bone_nodes.resize(count); + itm_eq_obj->ex_data_mats.resize(count); + itm_eq_obj->ex_data_block_mats.resize(count); + + bone_node* v4 = itm_eq_obj->ex_data_bone_nodes.data(); + mat4* v5 = itm_eq_obj->ex_data_mats.data(); + mat4* v8 = itm_eq_obj->ex_data_block_mats.data(); + for (int32_t v10 = 0; v10 < count; v10++) + v4[v10].mat = &v5[v10]; + + if (a2->bone_names) { + itm_eq_obj->ex_bones.clear(); + for (int32_t i = 0; i < count; i++) { + bone_node* node = &v4[i]; + node->name = a2->bone_names[i]; + node->mat = &v5[i]; + *node->mat = mat4_identity; + node->ex_data_mat = &v8[i]; + *node->ex_data_mat = mat4_identity; + + itm_eq_obj->ex_bones.push_back({ a2->bone_names[i], i}); + } + } +} + +static void rob_chara_item_equip_object_init_members(rob_chara_item_equip_object* itm_eq_obj, size_t index) { itm_eq_obj->index = index; - itm_eq_obj->obj_info = object_info_null; + itm_eq_obj->obj_info = object_info(); itm_eq_obj->field_14 = -1; - itm_eq_obj->mat = 0; - itm_eq_obj->texture_pattern.end = itm_eq_obj->texture_pattern.begin; + itm_eq_obj->mats = 0; + itm_eq_obj->texture_pattern.clear(); itm_eq_obj->texture_data.field_0 = -1; itm_eq_obj->texture_data.texture_color_coeff = vec3_identity; itm_eq_obj->texture_data.texture_color_offset = vec3_null; @@ -5152,70 +8520,25 @@ static void rob_chara_item_equip_object_init_data(rob_chara_item_equip_object* i itm_eq_obj->field_64 = 0; itm_eq_obj->disp = true; itm_eq_obj->field_A4 = 0; - itm_eq_obj->field_A8 = 0; + itm_eq_obj->mat = 0; itm_eq_obj->bone_nodes = 0; rob_chara_item_equip_object_clear_ex_data(itm_eq_obj); - itm_eq_obj->ex_data_bone_nodes.end = itm_eq_obj->ex_data_bone_nodes.begin; - itm_eq_obj->field_F0.end = itm_eq_obj->field_F0.begin; - itm_eq_obj->field_108.end = itm_eq_obj->field_108.begin; - for (ex_data_name_bone_index* i = itm_eq_obj->ex_bones.begin; i != itm_eq_obj->ex_bones.end; i++) - i->name = 0; - itm_eq_obj->ex_bones.end = itm_eq_obj->ex_bones.begin; + itm_eq_obj->ex_data_bone_nodes.clear(); + itm_eq_obj->ex_data_mats.clear(); + itm_eq_obj->ex_data_block_mats.clear(); + itm_eq_obj->ex_bones.clear(); itm_eq_obj->field_1B8 = 0; - itm_eq_obj->field_1C8 = 0; + itm_eq_obj->use_opd = false; itm_eq_obj->field_1C0 = 0; } -static void rob_chara_item_equip_object_init_ex_data_bone_nodes( - rob_chara_item_equip_object* itm_eq_obj, object_skin_ex_data* a2) { - itm_eq_obj->ex_data_bone_nodes.end = itm_eq_obj->ex_data_bone_nodes.begin; - itm_eq_obj->field_F0.end = itm_eq_obj->field_F0.begin; - - int32_t count = a2->bone_names_count; - vector_old_bone_node_reserve(&itm_eq_obj->ex_data_bone_nodes, count); - itm_eq_obj->ex_data_bone_nodes.end += count; - vector_old_mat4_reserve(&itm_eq_obj->field_F0, count); - itm_eq_obj->field_F0.end += count; - vector_old_mat4_reserve(&itm_eq_obj->field_108, count); - itm_eq_obj->field_108.end += count; - - bone_node* v4 = itm_eq_obj->ex_data_bone_nodes.begin; - mat4* v5 = itm_eq_obj->field_F0.begin; - mat4* v8 = itm_eq_obj->field_108.begin; - for (int32_t v10 = 0; v10 < count; v10++) - v4[v10].mat = &v5[v10]; - - if (a2->bone_names) { - vector_old_ex_data_name_bone_index* v14 = &itm_eq_obj->ex_bones; - memset(v14->begin, 0, sizeof(ex_data_name_bone_index) * vector_old_length(*v14)); - for (ex_data_name_bone_index* i = v14->begin; i != v14->end; i++) - i->name = 0; - v14->end = v14->begin; - - for (int32_t i = 0; i < count; i++) { - bone_node* v38 = &v4[i]; - v38->name = a2->bone_names[i]; - v38->mat = &v5[i]; - *v38->mat = mat4_identity; - bone_node_expression_data_reset_position_rotation(&v38->exp_data); - v38->ex_data_mat = &v8[i]; - *v38->ex_data_mat = mat4_identity; - - ex_data_name_bone_index* v35 = vector_old_ex_data_name_bone_index_reserve_back(v14); - v35->name = a2->bone_names[i]; - v35->bone_index = i; - } - } -} - static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object* itm_eq_obj, object_skin_ex_data* ex_data, bone_database* bone_data, void* data, object_database* obj_db) { if (!ex_data->blocks) return; - vector_old_pair_uint32_t_ptr_rob_osage_node a4 - = vector_old_empty(pair_uint32_t_ptr_rob_osage_node); - vector_old_pair_name_ExOsageBlock a5 = vector_old_empty(pair_name_ExOsageBlock); + std::vector> v129; + std::map v138; rob_chara_item_equip_object_clear_ex_data(itm_eq_obj); size_t constraint_count = 0; @@ -5233,7 +8556,7 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object ExClothBlock* cls = new ExClothBlock; node = cls; - vector_old_ptr_ExClothBlock_push_back(&itm_eq_obj->cloth_blocks, &cls); + itm_eq_obj->cloth_blocks.push_back(cls); cls->index = cloth_count + osage_count; cloth_count++; continue; @@ -5244,8 +8567,8 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object ExConstraintBlock* cns = new ExConstraintBlock; node = cns; - vector_old_ptr_ExConstraintBlock_push_back(&itm_eq_obj->constraint_blocks, &cns); - ExConstraintBlock::InitData(cns, itm_eq_obj, &v4->constraint, + itm_eq_obj->constraint_blocks.push_back(cns); + cns->InitData(itm_eq_obj, &v4->constraint, bone_names_ptr[v4->constraint.name_index & 0x7FFF], bone_data); constraint_count++; } @@ -5255,8 +8578,8 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object ExExpressionBlock* exp = new ExExpressionBlock; node = exp; - vector_old_ptr_ExExpressionBlock_push_back(&itm_eq_obj->expression_blocks, &exp); - ExExpressionBlock::InitData(exp, itm_eq_obj, &v4->expression, + itm_eq_obj->expression_blocks.push_back(exp); + exp->InitData(itm_eq_obj, &v4->expression, bone_names_ptr[v4->expression.name_index & 0x7FFF], itm_eq_obj->obj_info, itm_eq_obj->index, bone_data); expression_count++; @@ -5267,13 +8590,13 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object ExOsageBlock* osg = new ExOsageBlock; node = osg; - vector_old_ptr_ExOsageBlock_push_back(&itm_eq_obj->osage_blocks, &osg); - ExOsageBlock::InitData(osg, itm_eq_obj, &v4->osage, + itm_eq_obj->osage_blocks.push_back(osg); + osg->InitData(itm_eq_obj, &v4->osage, bone_names_ptr[v4->osage.external_name_index & 0x7FFF], &itm_eq_obj->skin_ex_data->osage_nodes[v4->osage.start_index], - itm_eq_obj->bone_nodes, itm_eq_obj->ex_data_bone_nodes.begin, itm_eq_obj->skin); - ExOsageBlock::sub_1405F3E10(osg, &v4->osage, - &itm_eq_obj->skin_ex_data->osage_nodes[v4->osage.start_index], &a4, &a5); + itm_eq_obj->bone_nodes, itm_eq_obj->ex_data_bone_nodes.data(), itm_eq_obj->skin); + osg->sub_1405F3E10(&v4->osage, + &itm_eq_obj->skin_ex_data->osage_nodes[v4->osage.start_index], &v129, &v138); osg->index = osage_count; osage_count++; } @@ -5283,8 +8606,8 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object ExNullBlock* null = new ExNullBlock; node = null; - vector_old_ptr_ExNullBlock_push_back(&itm_eq_obj->null_blocks, &null); - ExNullBlock::InitData(null, itm_eq_obj, &v4->constraint, + itm_eq_obj->null_blocks.push_back(null); + null->InitData(itm_eq_obj, &v4->constraint, bone_names_ptr[v4->constraint.name_index & 0x7FFF], bone_data); null_count++; } @@ -5295,7 +8618,7 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object exp_data.rotation = v54->rotation; exp_data.scale = v54->scale; exp_data.parent_scale = vec3_identity; - string_copy(&v54->parent_name, &node->parent_name); + node->parent_name = std::string(string_data(&v54->parent_name), v54->parent_name.length); bone_node* parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name(itm_eq_obj, string_data(&v54->parent_name), bone_data); @@ -5304,96 +8627,91 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object node->bone_node_ptr->exp_data = exp_data; node->bone_node_ptr->parent = parent_bone_node; } - vector_old_ptr_ExNodeBlock_push_back(&itm_eq_obj->node_blocks, &node); + + std::map::iterator v75 = v138.find(parent_bone_node->name); + if (v75 != v138.end()) + node->parent_node = v75->second; + + v138.insert({ node->name, node }); + itm_eq_obj->node_blocks.push_back(node); } - for (ExNodeBlock** i = itm_eq_obj->node_blocks.begin; i != itm_eq_obj->node_blocks.end; i++) { - ExNodeBlock* v86 = (*i)->parent_node; + for (ExNodeBlock*& i : itm_eq_obj->node_blocks) { + ExNodeBlock* v86 = i->parent_node; if (v86) { - v86->field_5A = true; - if (v86->type == EX_OSAGE || v86->type == EX_CLOTH || !v86->field_58) + v86->has_parent_node = true; + if ((v86->type & ~3u) || v86->type == EX_OSAGE || !v86->field_58) continue; } - (*i)->field_58 = true; + i->field_58 = true; } - for (ExOsageBlock** i = itm_eq_obj->osage_blocks.begin; - i != itm_eq_obj->osage_blocks.end; i++) { - ExOsageBlock* osg = *i; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) { + ExOsageBlock* osg = i; ExNodeBlock* parent_node = osg->parent_node; bone_node* parent_bone_node = 0; - if (parent_node && osg->field_58) { + if (!parent_node || osg->field_58) + parent_bone_node = osg->parent_bone_node; + else { while (!parent_node->field_58) { parent_node = parent_node->parent_node; if (!parent_node) - break; - parent_bone_node = parent_node->parent_bone_node; + goto LABEL_166; } - + parent_bone_node = parent_node->parent_bone_node; } - else - parent_bone_node = osg->parent_bone_node; if (parent_bone_node && parent_bone_node->ex_data_mat) { osg->rob.parent_mat_ptr = parent_bone_node->ex_data_mat; osg->rob.parent_mat = *parent_bone_node->ex_data_mat; } + LABEL_166: + ; } - if (ex_data->osage_sibling_infos) { - pair_uint32_t_ptr_rob_osage_node* v6 = a4.begin; - pair_uint32_t_ptr_rob_osage_node* v7 = a4.end; - + if (ex_data->osage_sibling_infos) for (int32_t i = 0; i < ex_data->osage_sibling_infos_count; i++) { object_skin_osage_sibling_info* sibling_info = &ex_data->osage_sibling_infos[i]; uint32_t name_index = sibling_info->name_index; uint32_t sibling_name_index = sibling_info->sibling_name_index; - pair_uint32_t_ptr_rob_osage_node* node = v6; - for (; node != v7; node++) - if (node->key == name_index) + auto node = v129.begin(); + for (; node != v129.end(); node++) + if (node->first == name_index) break; - pair_uint32_t_ptr_rob_osage_node* sibling_node = v6; - for (; sibling_node != v7; sibling_node++) - if (sibling_node->key == sibling_name_index) + auto sibling_node = v129.begin(); + for (; sibling_node != v129.end(); sibling_node++) + if (sibling_node->first == sibling_name_index) break; - if (node != v7 && sibling_node != v7) { - rob_osage_node* v102 = node->value; - v102->sibling_node = sibling_node->value; - v102->distance = sibling_info->distance; + if (node != v129.end() && sibling_node != v129.end()) { + rob_osage_node* v102 = node->second; + v102->sibling_node = sibling_node->second; + v102->max_distance = sibling_info->max_distance; } } - } if (osage_count || cloth_count) rob_chara_item_equip_object_skp_load_file(itm_eq_obj, data, bone_data, obj_db); size_t v103 = 0; - for (ExOsageBlock** i = itm_eq_obj->osage_blocks.begin; i != itm_eq_obj->osage_blocks.end; i++) - v103 += vector_old_length((*i)->rob.nodes) - 1; - //for (ExClothBlock** i = itm_eq_obj->cloth_blocks.begin; i != itm_eq_obj->cloth_blocks.end; i++) - // v103 += vector_old_length((*i)->rob.base.field_20) - (*i)->rob.base.field_10; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + v103 += i->rob.nodes.size() - 1; + //for (ExClothBlock*& i : itm_eq_obj->cloth_blocks.begin) + // v103 += i->rob.base.field_20.size() - i->rob.base.field_10; itm_eq_obj->field_1C0 = v103; - - vector_old_pair_uint32_t_ptr_rob_osage_node_free(&a4, 0); - vector_old_pair_name_ExOsageBlock_free(&a5, 0); } static void rob_chara_item_equip_object_load_object_info_ex_data( - rob_chara_item_equip_object* itm_eq_obj, object_info object_info, - bone_node* bone_nodes, bone_database* bone_data, void* data, object_database* obj_db) { + rob_chara_item_equip_object* itm_eq_obj, object_info object_info, bone_node* bone_nodes, + bool osage_reset, bone_database* bone_data, void* data, object_database* obj_db) { itm_eq_obj->obj_info = object_info; itm_eq_obj->bone_nodes = bone_nodes; - itm_eq_obj->mat = bone_nodes->mat; - itm_eq_obj->ex_data_bone_nodes.end = itm_eq_obj->ex_data_bone_nodes.begin; - for (ex_data_name_bone_index* i = itm_eq_obj->ex_bones.begin; - i != itm_eq_obj->ex_bones.end; i++) - i->name = 0; - - itm_eq_obj->ex_bones.end = itm_eq_obj->ex_bones.begin; - itm_eq_obj->field_F0.end = itm_eq_obj->field_F0.begin; + itm_eq_obj->mats = bone_nodes->mat; + itm_eq_obj->ex_data_bone_nodes.clear(); + itm_eq_obj->ex_bones.clear(); + itm_eq_obj->ex_data_mats.clear(); rob_chara_item_equip_object_clear_ex_data(itm_eq_obj); object_skin* skin = object_storage_get_object_skin(itm_eq_obj->obj_info); if (!skin || !skin->ex_data_init) @@ -5403,37 +8721,28 @@ static void rob_chara_item_equip_object_load_object_info_ex_data( itm_eq_obj->skin_ex_data = &skin->ex_data; rob_chara_item_equip_object_init_ex_data_bone_nodes(itm_eq_obj, &skin->ex_data); rob_chara_item_equip_object_load_ex_data(itm_eq_obj, &skin->ex_data, bone_data, data, obj_db); -} - -static void rob_chara_item_equip_object_reset(rob_chara_item_equip_object* itm_eq_obj) { - rob_chara_item_equip_object_init_data(itm_eq_obj, 0xDEADBEEF); + + if (osage_reset && itm_eq_obj->osage_blocks.size()) + itm_eq_obj->osage_iterations = 60; } static bool rob_chara_item_equip_object_set_boc(rob_chara_item_equip_object* itm_eq_obj, skin_param_osage_root* skp_root, ExOsageBlock* osg) { rob_osage* rob_osg = &osg->rob; - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) - i->data_ptr->boc.end = i->data_ptr->boc.begin; + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) + i->data_ptr->boc.clear(); bool v6 = false; - for (skin_param_osage_root_boc* i = skp_root->boc.begin; i != skp_root->boc.end; i++) { - ExOsageBlock** v8 = itm_eq_obj->osage_blocks.begin; - ExOsageBlock** v9 = itm_eq_obj->osage_blocks.end; - if (v8 == v9) - continue; - - while (v8 != v9) { - ExOsageBlock* v10 = *v8; - if (str_utils_compare((*v8)->name, string_data(&i->ed_root)) - || i->ed_node + 1LL >= vector_old_length(rob_osg->nodes) - || i->st_node + 1LL >= vector_old_length(v10->rob.nodes)) { - v8++; + for (skin_param_osage_root_boc& i : skp_root->boc) { + for (ExOsageBlock*& j : itm_eq_obj->osage_blocks) { + if (str_utils_compare(j->name, i.ed_root.c_str()) + || i.ed_node + 1ULL >= rob_osg->nodes.size() + || i.st_node + 1ULL >= j->rob.nodes.size()) continue; - } - rob_osage_node* v17 = rob_osage_get_node(rob_osg, i->ed_node + 1LL); - rob_osage_node* v18 = rob_osage_get_node(&v10->rob, i->st_node + 1LL); - vector_old_ptr_rob_osage_node_push_back(&v17->data_ptr->boc, &v18); + rob_osage_node* v17 = rob_osage_get_node(rob_osg, i.ed_node + 1LL); + rob_osage_node* v18 = rob_osage_get_node(&j->rob, i.st_node + 1LL); + v17->data_ptr->boc.push_back(v18); v6 = true; break; } @@ -5443,46 +8752,86 @@ static bool rob_chara_item_equip_object_set_boc(rob_chara_item_equip_object* itm static void rob_chara_item_equip_object_set_collision_target_osage( rob_chara_item_equip_object* itm_eq_obj, skin_param_osage_root* skp_root, skin_param* skp) { - if (!skp_root->colli_tgt_osg.length) + if (!skp_root->colli_tgt_osg.size()) return; - char* colli_tgt_osg = string_data(&skp_root->colli_tgt_osg); - for (ExOsageBlock** i = itm_eq_obj->osage_blocks.begin; i != itm_eq_obj->osage_blocks.end; ++i) - if (!str_utils_compare(colli_tgt_osg, (*i)->name)) { - skp->colli_tgt_osg = &(*i)->rob.nodes; + const char* colli_tgt_osg = skp_root->colli_tgt_osg.c_str(); + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + if (!str_utils_compare(colli_tgt_osg, i->name)) { + skp->colli_tgt_osg = &i->rob.nodes; break; } } +static void rob_chara_item_equip_object_set_motion_reset_data( + rob_chara_item_equip_object* itm_eq_obj, int32_t motion_id, float_t frame) { + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + i->SetMotionResetData(motion_id, frame); + + for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) + i->SetMotionResetData(motion_id, frame); +} + +static void rob_chara_item_equip_object_set_motion_skin_param( + rob_chara_item_equip_object* itm_eq_obj, int8_t chara_id, int32_t motion_id, int32_t frame) { + if (itm_eq_obj->obj_info.is_null()) + return; + + struc_571** v7 = 0;//sub_14060B470(chara_id, itm_eq_obj->obj_info, motion_id, frame); + if (!v7) + return; + + struc_571* v9 = *v7; + itm_eq_obj->field_1B8 = 0; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) { + itm_eq_obj->field_1B8 |= v9->field_88; + i->SetSkinParam(v9++); + } + + for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) { + itm_eq_obj->field_1B8 |= v9->field_88; + i->SetSkinParam(v9++); + } +} + +static void rob_chara_item_equip_object_set_osage_reset( + rob_chara_item_equip_object* itm_eq_obj) { + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + i->SetOsageReset(); + + for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) + i->SetOsageReset(); +} + +static void rob_chara_item_equip_object_set_rob_move_cancel( + rob_chara_item_equip_object* itm_eq_obj, float_t value) { + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + i->rob.move_cancel = value; + //for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) + // i->rob.move_cancel = value; +} + static void rob_chara_item_equip_object_skp_load( rob_chara_item_equip_object* itm_eq_obj, key_val* kv, bone_database* bone_data) { - if (vector_old_length(kv->key_hash) < 1) + if (kv->key_hash.size() < 1) return; itm_eq_obj->field_1B8 = 0; - for (ExOsageBlock** i = itm_eq_obj->osage_blocks.begin; - i != itm_eq_obj->osage_blocks.end; i++) { - ExOsageBlock* osg = *i; + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) { + ExOsageBlock* osg = i; skin_param_osage_root root; - memset(&root, 0, sizeof(skin_param_osage_root)); - skin_param_osage_root_init(&root); rob_osage_load_skin_param(&osg->rob, kv, osg->name, &root, &itm_eq_obj->obj_info, bone_data); rob_chara_item_equip_object_set_collision_target_osage(itm_eq_obj, &root, osg->rob.skin_param_ptr); - itm_eq_obj->field_1B8 |= rob_chara_item_equip_object_set_boc(itm_eq_obj, &root, *i); + itm_eq_obj->field_1B8 |= rob_chara_item_equip_object_set_boc(itm_eq_obj, &root, osg); itm_eq_obj->field_1B8 |= root.coli_type != 0; //itm_eq_obj->field_1B8 |= sub_1405FAA30(itm_eq_obj, &root, 0); - skin_param_osage_root_free(&root); } - for (ExClothBlock** i = itm_eq_obj->cloth_blocks.begin; - i != itm_eq_obj->cloth_blocks.end; i++) { - ExClothBlock* cls = *i; + for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) { + ExClothBlock* cls = i; skin_param_osage_root root; - memset(&root, 0, sizeof(skin_param_osage_root)); - skin_param_osage_root_init(&root); skin_param_osage_root_parse(kv, cls->name, &root, bone_data); //rob_cloth_load_skin_param(&cls->rob, &root); - skin_param_osage_root_free(&root); } } @@ -5496,7 +8845,7 @@ static void rob_chara_item_equip_object_skp_load_file( } char buf[0x200]; - char* name = object_database_get_object_name(obj_db, itm_eq_obj->obj_info); + const char* name = obj_db->get_object_name(itm_eq_obj->obj_info); sprintf_s(buf, sizeof(buf), "ext_skp_%s.txt", name); for (int32_t i = 0; buf[i]; i++) @@ -5504,164 +8853,256 @@ static void rob_chara_item_equip_object_skp_load_file( buf[i] += 0x20; key_val kv; - data_struct_load_file((data_struct*)data, &kv, "rom/skin_param/", buf, skin_param_file_read); + ((data_struct*)data)->load_file(&kv, "rom/skin_param/", buf, skin_param_file_read); rob_chara_item_equip_object_skp_load(itm_eq_obj, &kv, bone_data); - key_val_free(&kv); } -static void rob_chara_item_equip_object_free(rob_chara_item_equip_object* itm_eq_obj) { - rob_chara_item_equip_object_init_data(itm_eq_obj, 0xDDDDDDDD); - - if (itm_eq_obj->cloth_blocks.begin) - free(itm_eq_obj->cloth_blocks.begin); - itm_eq_obj->cloth_blocks = vector_old_ptr_empty(ExClothBlock); - - if (itm_eq_obj->expression_blocks.begin) - free(itm_eq_obj->expression_blocks.begin); - itm_eq_obj->expression_blocks = vector_old_ptr_empty(ExExpressionBlock); - - if (itm_eq_obj->constraint_blocks.begin) - free(itm_eq_obj->constraint_blocks.begin); - itm_eq_obj->constraint_blocks = vector_old_ptr_empty(ExConstraintBlock); - - if (itm_eq_obj->osage_blocks.begin) - free(itm_eq_obj->osage_blocks.begin); - itm_eq_obj->osage_blocks = vector_old_ptr_empty(ExOsageBlock); - - if (itm_eq_obj->null_blocks.begin) - free(itm_eq_obj->null_blocks.begin); - itm_eq_obj->null_blocks = vector_old_ptr_empty(ExNodeBlock); - - if (itm_eq_obj->ex_bones.begin) - free(itm_eq_obj->ex_bones.begin); - itm_eq_obj->ex_bones = vector_old_empty(ex_data_name_bone_index); - - if (itm_eq_obj->field_108.begin) - free(itm_eq_obj->field_108.begin); - itm_eq_obj->field_108 = vector_old_empty(mat4); - - if (itm_eq_obj->field_F0.begin) - free(itm_eq_obj->field_F0.begin); - itm_eq_obj->field_F0 = vector_old_empty(mat4); - - if (itm_eq_obj->ex_data_bone_nodes.begin) - free(itm_eq_obj->ex_data_bone_nodes.begin); - itm_eq_obj->ex_data_bone_nodes = vector_old_empty(bone_node); - - if (itm_eq_obj->node_blocks.begin) - free(itm_eq_obj->node_blocks.begin); - itm_eq_obj->node_blocks = vector_old_ptr_empty(ExNodeBlock); - - if (itm_eq_obj->texture_pattern.begin) - free(itm_eq_obj->texture_pattern.begin); - itm_eq_obj->texture_pattern = vector_old_empty(texture_pattern_struct); +static void rob_chara_item_equip_reset(rob_chara_item_equip* rob_itm_equip) { + rob_itm_equip->bone_nodes = 0; + rob_itm_equip->matrices = 0; + for (int32_t i = ITEM_BODY; i < ITEM_MAX; i++) + rob_chara_item_equip_object_init_members(&rob_itm_equip->item_equip_object[i]); + rob_itm_equip->item_equip_range = false; + rob_itm_equip->shadow_type = (shadow_type_enum)-1; + rob_itm_equip->field_A0 = 5; + rob_itm_equip->texture_pattern.clear(); + rob_itm_equip->field_D0 = object_info(); + rob_itm_equip->field_D4 = -1; + rob_itm_equip->field_D8 = false; + rob_itm_equip->parts_short = false; + rob_itm_equip->parts_append = false; + rob_itm_equip->parts_white_one_l = false; + rob_itm_equip->step = 1.0f; + rob_itm_equip->use_opd = false; + rob_itm_equip->first_item_equip_object = ITEM_ATAMA; + rob_itm_equip->max_item_equip_object = ITEM_ITEM16; } -static void rob_chara_item_equip_reset(rob_chara_item_equip* rob_item_equip) { - rob_item_equip->bone_nodes = 0; - rob_item_equip->matrices = 0; - for (int32_t i = 0; i < 31; i++) - rob_chara_item_equip_object_reset(&rob_item_equip->item_equip_object[i]); - rob_item_equip->item_equip_range = false; - rob_item_equip->shadow_type = (shadow_type_enum)-1; - rob_item_equip->field_A0 = 5; - rob_item_equip->texture_pattern.end = rob_item_equip->texture_pattern.begin; - rob_item_equip->field_D0 = object_info_null; - rob_item_equip->field_D4 = -1; - rob_item_equip->field_D8 = false; - rob_item_equip->field_958 = false; - rob_item_equip->field_959 = false; - rob_item_equip->field_95A = false; - rob_item_equip->step = 0.0f; - rob_item_equip->field_93C = false; - rob_item_equip->first_item_equip_object = ITEM_ATAMA; - rob_item_equip->max_item_equip_object = ITEM_ITEM16; -} - -static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_item_equip, +static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_itm_equip, bone_node* bone_nodes) { - rob_chara_item_equip_reset(rob_item_equip); - rob_item_equip->bone_nodes = bone_nodes; - rob_item_equip->matrices = bone_nodes->mat; + rob_chara_item_equip_reset(rob_itm_equip); + rob_itm_equip->bone_nodes = bone_nodes; + rob_itm_equip->matrices = bone_nodes->mat; - mat4u* v7 = rob_item_equip->field_13C; - int32_t* v8 = rob_item_equip->field_18; + mat4u* v7 = rob_itm_equip->field_13C; + int32_t* v8 = rob_itm_equip->field_18; for (int32_t v6 = ITEM_BODY; v6 < ITEM_MAX; v6++) { - rob_chara_item_equip_object_init_data(&rob_item_equip->item_equip_object[v6], v6); + rob_chara_item_equip_object_init_members(&rob_itm_equip->item_equip_object[v6], v6); *v8++ = 0; *v7++ = mat4u_identity; } - rob_item_equip->step = 1.0f; - rob_item_equip->wet = 0.0f; - rob_item_equip->wind_strength = 1.0f; - rob_item_equip->chara_color = true; - rob_item_equip->npr_flag = false; - rob_item_equip->mat = mat4u_identity; + rob_itm_equip->step = 1.0f; + rob_itm_equip->wet = 0.0f; + rob_itm_equip->wind_strength = 1.0f; + rob_itm_equip->chara_color = true; + rob_itm_equip->npr_flag = false; + rob_itm_equip->mat = mat4u_identity; } -static void rob_chara_item_equip_set_item_equip_range(rob_chara_item_equip* rob_item_equip, bool value) { - rob_item_equip->item_equip_range = value; +static void rob_chara_item_equip_set_item_equip_range(rob_chara_item_equip* rob_itm_equip, bool value) { + rob_itm_equip->item_equip_range = value; if (value) { - rob_item_equip->first_item_equip_object = ITEM_BODY; - rob_item_equip->max_item_equip_object = ITEM_ATAMA; + rob_itm_equip->first_item_equip_object = ITEM_BODY; + rob_itm_equip->max_item_equip_object = ITEM_ATAMA; } else { - rob_item_equip->first_item_equip_object = ITEM_ATAMA; - rob_item_equip->max_item_equip_object = ITEM_ITEM16; + rob_itm_equip->first_item_equip_object = ITEM_ATAMA; + rob_itm_equip->max_item_equip_object = ITEM_ITEM16; } } -static void rob_chara_item_equip_set_shadow_type(rob_chara_item_equip* rob_item_equip, int32_t chara_id) { +static void rob_chara_item_equip_set_motion_reset_data( + rob_chara_item_equip* rob_itm_equip, int32_t motion_id, float_t frame) { + for (int32_t i = rob_itm_equip->first_item_equip_object; i < rob_itm_equip->max_item_equip_object; i++) + rob_chara_item_equip_object_set_motion_reset_data(&rob_itm_equip->item_equip_object[i], motion_id, frame); + + task_wind.ptr->reset(); +} + +static void rob_chara_item_equip_set_motion_skin_param( + rob_chara_item_equip* rob_itm_equip, int8_t chara_id, int32_t motion_id, int32_t frame) { + for (int32_t i = ITEM_KAMI; i < ITEM_ITEM16; i++) + rob_chara_item_equip_object_set_motion_skin_param(&rob_itm_equip->item_equip_object[i], chara_id, motion_id, frame); +} + +static void rob_chara_item_equip_set_rob_move_cancel(rob_chara_item_equip* rob_itm_equip, + uint8_t id, float_t value) { + if (id == 0) + for (int32_t i = rob_itm_equip->first_item_equip_object; i < rob_itm_equip->max_item_equip_object; ++i) + rob_chara_item_equip_object_set_rob_move_cancel(&rob_itm_equip->item_equip_object[i], value); + else if (id == 1) + rob_chara_item_equip_object_set_rob_move_cancel(&rob_itm_equip->item_equip_object[ITEM_KAMI], value); + else if (id == 2) + rob_chara_item_equip_object_set_rob_move_cancel(&rob_itm_equip->item_equip_object[ITEM_OUTER], value); +} + +static void rob_chara_item_equip_set_rob_step(rob_chara_item_equip* rob_itm_equip, float_t value) { + rob_itm_equip->step = value; +} + +static void rob_chara_item_equip_set_shadow_type(rob_chara_item_equip* rob_itm_equip, int32_t chara_id) { if (chara_id == 0) - rob_item_equip->shadow_type = SHADOW_CHARA; + rob_itm_equip->shadow_type = SHADOW_CHARA; else - rob_item_equip->shadow_type = SHADOW_STAGE; + rob_itm_equip->shadow_type = SHADOW_STAGE; } -static void rob_chara_item_equip_dispose(rob_chara_item_equip* rob_item_equip) { - rob_chara_item_equip_reset(rob_item_equip); - rob_chara_item_equip_object* itm_eq_obj = rob_item_equip->item_equip_object; - for (int32_t i = 0; i < 31; i++) - rob_chara_item_equip_object_free(&itm_eq_obj[i]); - free(itm_eq_obj); +static void rob_chara_item_equip_set_opd_blend_data( + rob_chara_item_equip* rob_itm_equip, std::list* a2) { + rob_itm_equip->opd_blend_data.clear(); + if (!a2) + return; - if (rob_item_equip->texture_pattern.begin) - free(rob_item_equip->texture_pattern.begin); - rob_item_equip->texture_pattern = vector_old_empty(texture_pattern_struct); - free(rob_item_equip); + for (motion_blend_mot*& i : *a2) { + opd_blend_data v11; + v11.motion_id = i->mot_key_data.motion_id; + v11.frame = i->mot_play_data.frame_data.frame; + v11.frame_count = (float_t)i->mot_key_data.mot.frame_count - 1.0f; + v11.field_C = false; + v11.type = MOTION_BLEND_NONE; + v11.blend = 0.0f; + + if (sub_140413810(i)) { + v11.type = motion_blend_mot_get_type(i); + v11.field_C = true; + v11.blend = i->blend->blend; + } + rob_itm_equip->opd_blend_data.push_back(v11); + } + + if (rob_itm_equip->opd_blend_data.size()) { + opd_blend_data* v9 = &rob_itm_equip->opd_blend_data.end()[-1]; + if (v9->field_C && v9->type != MOTION_BLEND_FREEZE) + v9->field_C = false; + } + + if (rob_itm_equip->use_opd) + for (int32_t i = ITEM_KAMI; i < ITEM_MAX; i++) + rob_chara_item_equip_object_check_no_opd(&rob_itm_equip->item_equip_object[i], &rob_itm_equip->opd_blend_data); } -static void rob_chara_item_sub_data_init(rob_chara_item_sub_data* rob_item_sub_data) { - rob_item_sub_data->texture_change = vector_old_empty(item_sub_data_texture_change); - rob_item_sub_data->item_change = vector_old_empty(item_sub_data_item_change); - rob_item_sub_data->field_F0 = vector_old_empty(pair_object_info_item_id); - rob_item_sub_data->field_100 = vector_old_empty(struc_294); - for (int32_t i = 0; i < 31; i++) - rob_item_sub_data->texture_pattern[i] = vector_old_empty(texture_pattern_struct); - rob_item_sub_data->field_3F8 = vector_old_empty(pair_int32_t_object_info); - rob_item_sub_data->chara_index_1st = CHARA_MIKU; - rob_item_sub_data->chara_index_2nd = CHARA_MIKU; - memset(&rob_item_sub_data->item, 0, sizeof(item_sub_data)); - memset(&rob_item_sub_data->item_2nd, 0, sizeof(item_sub_data)); - rob_chara_item_sub_data_texture_pattern_clear(rob_item_sub_data); +static void rob_chara_item_equip_set_osage_reset(rob_chara_item_equip* rob_itm_equip) { + for (int32_t i = rob_itm_equip->first_item_equip_object; i < rob_itm_equip->max_item_equip_object; i++) + rob_chara_item_equip_object_set_osage_reset(&rob_itm_equip->item_equip_object[i]); + + task_wind.ptr->reset(); } -static bool rob_chara_item_sub_data_check_for_npr_flag(rob_chara_item_sub_data* item_sub_data) { - int32_t* data = item_sub_data->item.data; +static bool rob_chara_item_sub_data_check_for_npr_flag(rob_chara_item_sub_data* itm_sub_data) { + int32_t* data = itm_sub_data->item.data; for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++, data++) { - //v5 = item_table_get_item_data_by_chara_index(item_sub_data->chara_index, *data); + //v5 = item_table_get_item_data_by_chara_index(itm_sub_data->chara_index, *data); //if (v5 && v5->npr_flag) // return true; } return false; } -static void rob_chara_item_sub_data_item_change_clear( - rob_chara_item_sub_data* rob_item_sub_data) { - vector_old_item_sub_data_item_change_clear( - &rob_item_sub_data->item_change, item_sub_data_item_change_free); -} +/*typedef struct item_table_item_data_obj { + object_info obj_info; + item_id rpk; +} item_table_item_data_obj; + +typedef struct item_table_item_data_ofs { + item_sub_id sub_id; + int32_t no; + vec3 position; + vec3 rotation; + vec3 scale; +} item_table_item_data_ofs; + +typedef struct item_table_item_data_tex { + int32_t org; + int32_t chg; +} item_table_item_data_tex; + +typedef struct item_table_item_data_col_data { + vec3 blend; + vec3 offset; + float_t hue; + float_t saturation; + float_t value; + float_t constrast; + bool inverse; +} item_table_item_data_col_data; + +typedef struct item_table_item_data_col { + int32_t tex; + int32_t flag; + item_table_item_data_col_data data; +} item_table_item_data_col; + +class item_table_item_data { + std::vector obj; + std::vector ofs; + std::vector tex; + std::vector col; + + item_table_item_data(); + ~item_table_item_data(); +}; + +class item_table_item { + int32_t flag; + std::string name; + std::list objset; + int32_t type; + int32_t attr; + int32_t des_id; + item_sub_id sub_id; + item_table_item_data data; + int32_t exclusion_point; + int32_t field_AC; + int32_t org_itm; + bool npr_flag; + float_t face_depth; + + item_table_item(); + ~item_table_item(); +}; + +class item_table { + int32_t field_0; + std::map item; + std::map cos; + + item_table(); + ~item_table(); +}; + +class item_table_handler { + chara_index chara_index; + int field_4; + std::list field_8; + bool loaded; + char* field_20; + item_table table; + __int64 field_F0; + __int64 field_F8; + __int64 field_100; + + item_table_handler(); + ~item_table_handler(); +};*/ + +/*static void sub_140522990(rob_chara_item_sub_data* itm_sub_data, item_sub_data* sub_data) { + if (!item_table_handler_array_get_table(itm_sub_data->chara_index_1st)) + return; + + rob_chara_item_sub_data_texture_change_clear(itm_sub_data); + rob_chara_item_sub_data_texture_pattern_clear(itm_sub_data); + for (int32_t item_sub_id = ITEM_SUB_ZUJO; item_sub_id < ITEM_SUB_MAX; item_sub_id++) { + int32_t item_id = sub_data->data[item_sub_id]; + if (item_id && item_sub_id != ITEM_SUB_KUTSU) { + item_table_item* v6 = item_table_get_item_data_by_chara_index(itm_sub_data->chara_index_1st, item_id); + if (v6) { + sub_140526FD0(itm_sub_data, item_id, v6); + sub_140527280(itm_sub_data, item_id, v6); + } + } + } +}*/ static void rob_chara_item_sub_data_reload_items(rob_chara_item_sub_data* itm_sub_data, int32_t chara_id, bone_database* bone_data, void* data, object_database* obj_db) { @@ -5677,177 +9118,157 @@ static void rob_chara_item_sub_data_reload_items(rob_chara_item_sub_data* itm_su rob_chara_reload_items(&rob_chara_array[chara_id], &sub_data, bone_data, data, obj_db); - /*rob_chara_item_equip* rob_item_equip = rob_chara_array[chara_id].item_equip; - sub_140522990(itm_sub_data, item_sub_data->item); - rob_chara_item_sub_data_load_chara_init_data(itm_sub_data, rob_item_equip); - sub_140522C60(itm_sub_data, rob_item_equip, item_sub_data->item); - sub_140522D00(itm_sub_data, rob_item_equip, item_sub_data->item); - sub_140522D90(itm_sub_data, rob_item_equip, item_sub_data->item); - sub_140522F90(itm_sub_data, rob_item_equip, item_sub_data->item); - sub_1405231D0(itm_sub_data, rob_item_equip, item_sub_data->item); - sub_1405234E0(itm_sub_data);*/ -} - -static void rob_chara_item_sub_data_texture_change_clear( - rob_chara_item_sub_data* rob_item_sub_data) { - vector_old_item_sub_data_texture_change_clear( - &rob_item_sub_data->texture_change, item_sub_data_texture_change_free); -} - -static void rob_chara_item_sub_data_texture_pattern_clear( - rob_chara_item_sub_data* rob_item_sub_data) { - for (int32_t i = 0; i < 31; i++) - vector_old_texture_pattern_struct_clear(&rob_item_sub_data->texture_pattern[i], 0); -} - -static void rob_chara_item_sub_data_free( - rob_chara_item_sub_data* rob_item_sub_data) { - rob_chara_item_sub_data_texture_change_clear(rob_item_sub_data); - rob_chara_item_sub_data_item_change_clear(rob_item_sub_data); - rob_chara_item_sub_data_texture_pattern_clear(rob_item_sub_data); - vector_old_pair_object_info_item_id_free(&rob_item_sub_data->field_F0, 0); - vector_old_struc_294_free(&rob_item_sub_data->field_100, 0); - vector_old_pair_int32_t_object_info_free(&rob_item_sub_data->field_3F8, 0); - for (int32_t i = 0; i < 31; i++) - vector_old_texture_pattern_struct_free(&rob_item_sub_data->texture_pattern[i], 0); - vector_old_item_sub_data_item_change_free( - &rob_item_sub_data->item_change, item_sub_data_item_change_free); - vector_old_item_sub_data_texture_change_free( - &rob_item_sub_data->texture_change, item_sub_data_texture_change_free); -} - -static void rob_chara_data_init(rob_chara_data* rob_mot_blend) { - memset(rob_mot_blend, 0, sizeof(rob_chara_data)); - rob_sub_action_init(&rob_mot_blend->rob_sub_action); - //sub_140514FC0(&rob_mot_blend->field_290); - //sub_1405387F0(&rob_mot_blend->field_1588); - //sub_140514BC0(&rob_mot_blend->field_1E68); -} - -static void rob_chara_data_free(rob_chara_data* rob_mot_blend) { - rob_sub_action_free(&rob_mot_blend->rob_sub_action); - vector_old_ptr_void_free(&rob_mot_blend->field_8.field_110, 0); + rob_chara_item_equip* rob_itm_equip = rob_chara_array_get_item_equip(chara_id); + //sub_140522990(itm_sub_data, itm_sub_data->item); + //rob_chara_item_sub_data_load_chara_init_data(itm_sub_data, rob_itm_equip); + //sub_140522C60(itm_sub_data, rob_itm_equip, itm_sub_data->item); + //sub_140522D00(itm_sub_data, rob_itm_equip, itm_sub_data->item); + //sub_140522D90(itm_sub_data, rob_itm_equip, itm_sub_data->item); + //sub_140522F90(itm_sub_data, rob_itm_equip, itm_sub_data->item); + //sub_1405231D0(itm_sub_data, rob_itm_equip, itm_sub_data->item); + //sub_1405234E0(itm_sub_data); } static bool rob_chara_check_for_ageageagain_module(chara_index chara_index, int32_t module_index) { return chara_index == CHARA_MIKU && module_index == 148; } +static object_info rob_chara_get_head_object(rob_chara* rob_chr, int32_t head_object_id) { + if (head_object_id < 0 || head_object_id > 8) + return {}; + object_info obj_info = object_info(); + //object_info obj_info = rob_chara_item_sub_data_get_head_object_replace( + // &rob_chr->item_sub_data, head_object_id); + if (obj_info.not_null()) + return obj_info; + return rob_chr->chara_init_data->head_objects[head_object_id]; +} + +static object_info rob_chara_get_object_info(rob_chara* rob_chr, item_id id) { + return rob_chara_item_equip_get_object_info(rob_chr->item_equip, id); +} static void rob_chara_load_default_motion(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { - int32_t motion_id = 195; //rob_cmn_mottbl_get_motion_index(rob_chr, 0); + int32_t motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 0); rob_chara_load_default_motion_sub(rob_chr, 1, motion_id, bone_data, mot_db); } -static void sub_14041C680(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.begin[0]->field_4F8; - if (a2) - v2->field_0 |= 2; - else - v2->field_0 &= ~2; -} - -static void sub_14041C9D0(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.begin[0]->field_4F8; - v2->field_8 = (uint8_t)(v2->field_0 & 1); - if (a2) - v2->field_0 |= 1; - else - v2->field_0 &= ~1; -} - -static void sub_14041D2D0(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.begin[0]->field_4F8; - if (a2) - v2->field_0 |= 4; - else - v2->field_0 &= ~4; -} - -static void sub_14041BC40(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.begin[0]->field_4F8; - if (a2) - v2->field_0 |= 8; - else - v2->field_0 &= ~8; -} - -static void sub_140414F00(struc_308* a1, float_t a2) { - a1->field_B8 = a1->eyes_adjust; - a1->eyes_adjust = a2; -} - -static void sub_14041D270(rob_chara_bone_data* rob_bone_data, float_t a2) { - sub_140414F00(&rob_bone_data->motion_loaded.begin[0]->field_4F8, a2); -} - -static void sub_14041D2A0(rob_chara_bone_data* rob_bone_data, float_t a2) { - rob_bone_data->motion_loaded.begin[0]->field_4F8.field_B8 = a2; -} - -/*static void sub_1403FBED0(motion_blend* hinge, float_t v47, float_t hinge, float_t init_rot) { - if (v47 < 0.0f) { - hinge->field_8 = false; - hinge->field_C = 0.0f; - hinge->field_10 = 0.0f; - hinge->field_14 = hinge; - hinge->field_18 = init_rot; +static void sub_1401EB1D0(bone_data* a1, int32_t skeleton_select) { + if (!a1->flags) { + switch (a1->type) { + case BONE_DATABASE_BONE_ROTATION: + a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + break; + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_POSITION_ROTATION: + a1->trans_dup[skeleton_select] = a1->trans; + a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + break; + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + break; + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + a1->rot_mat_dup[skeleton_select + 2] = a1->rot_mat[1]; + break; + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + a1->rot_mat_dup[skeleton_select + 2] = a1->rot_mat[1]; + a1->rot_mat_dup[skeleton_select + 4] = a1->rot_mat[2]; + break; + } } - else { - hinge->field_8 = true; - hinge->field_C = v47; - hinge->field_10 = 0.0f; - hinge->field_14 = hinge; - hinge->field_18 = init_rot; +} + +static void sub_140412E10(motion_blend_mot* a1, int32_t skeleton_select) { + for (bone_data* v2 = a1->bone_data.bones.begin; v2 != a1->bone_data.bones.end; v2++) { + if ((1 << (v2->motion_bone_index & 0x1F)) + & a1->field_0.field_8.bitfield.data()[v2->motion_bone_index >> 5]) { + sub_1401EB1D0(v2, skeleton_select); + if (v2->type == BONE_DATABASE_BONE_POSITION_ROTATION && (a1->field_4F8.field_0 & 0x02)) + vec3_add(v2->trans_dup[skeleton_select], a1->field_4F8.field_90, v2->trans_dup[skeleton_select]); + } } -}*/ - -/*static void sub_140414C60(motion_blend_mot* hinge, float_t v47, float_t hinge, float_t init_rot) { - motion_blend* parent_node = hinge->field_5D0; - if (parent_node) - sub_1403FBED0(parent_node, v47, hinge, init_rot); } -static void sub_14041BF80(rob_chara_bone_data* rob_bone_data, float_t v47, float_t hinge, float_t init_rot) { - sub_140414C60(rob_bone_data->motion_loaded.begin[0], v47, hinge, init_rot); +static void sub_140412F20(mot_blend* a1, vector_old_bone_data* a2) { + for (bone_data* i = a2->begin; i != a2->end; ++i) + if (((1 << (i->motion_bone_index & 0x1F)) + & a1->field_0.field_8.bitfield.data()[i->motion_bone_index >> 5]) != 0) + sub_1401EB1D0(i, 0); } -static void sub_14041D310(rob_chara_bone_data* rob_bone_data) { - motion_blend* node = rob_bone_data->motion_loaded.begin[0]->field_5D0; - if (node) - node->vftable->field_10(node); +static void rob_chara_bone_data_load_face_motion(rob_chara_bone_data* rob_bone_data, + int32_t motion_id, motion_database* mot_db) { + sub_14041AD90(rob_bone_data); + sub_140412F20(&rob_bone_data->face, &rob_bone_data->motion_loaded.front()->bone_data.bones); + sub_1404146F0(&rob_bone_data->face.field_0); + mot_blend_load_motion(&rob_bone_data->face, motion_id, mot_db); +} + +static void rob_chara_bone_data_load_hand_l_motion(rob_chara_bone_data* rob_bone_data, + int32_t motion_id, motion_database* mot_db) { + sub_140412F20(&rob_bone_data->hand_l, &rob_bone_data->motion_loaded.front()->bone_data.bones); + mot_blend_load_motion(&rob_bone_data->hand_l, motion_id, mot_db); +} + +static void rob_chara_bone_data_load_hand_r_motion(rob_chara_bone_data* rob_bone_data, + int32_t motion_id, motion_database* mot_db) { + sub_140412F20(&rob_bone_data->hand_r, &rob_bone_data->motion_loaded.front()->bone_data.bones); + mot_blend_load_motion(&rob_bone_data->hand_r, motion_id, mot_db); +} + +static void rob_chara_bone_data_load_mouth_motion(rob_chara_bone_data* rob_bone_data, + int32_t motion_id, motion_database* mot_db) { + sub_140412F20(&rob_bone_data->mouth, &rob_bone_data->motion_loaded.front()->bone_data.bones); + mot_blend_load_motion(&rob_bone_data->mouth, motion_id, mot_db); +} + +static void rob_chara_bone_data_load_eyes_motion(rob_chara_bone_data* rob_bone_data, + int32_t motion_id, motion_database* mot_db) { + sub_140412F20(&rob_bone_data->eyes, &rob_bone_data->motion_loaded.front()->bone_data.bones); + mot_blend_load_motion(&rob_bone_data->eyes, motion_id, mot_db); +} + +static void rob_chara_bone_data_load_eyelid_motion(rob_chara_bone_data* rob_bone_data, + int32_t motion_id, motion_database* mot_db) { + sub_14041AD50(rob_bone_data); + sub_140412F20(&rob_bone_data->eyelid, &rob_bone_data->motion_loaded.front()->bone_data.bones); + sub_1404146F0(&rob_bone_data->eyelid.field_0); + mot_blend_load_motion(&rob_bone_data->eyelid, motion_id, mot_db); } static void sub_140419820(rob_chara_bone_data* rob_bone_data, int32_t skeleton_select) { - sub_140412E10(rob_bone_data->motion_loaded.begin[0], skeleton_select); -}*/ + sub_140412E10(rob_bone_data->motion_loaded.front(), skeleton_select); +} static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skeleton_select, int32_t motion_id, bone_database* bone_data, motion_database* mot_db) { - /*sub_14041BE50(rob_chr->bone_data, -1); - sub_14041BFC0(rob_chr->bone_data, -1); - sub_14041C260(rob_chr->bone_data, -1); - sub_14041D200(rob_chr->bone_data, -1); - sub_14041BDB0(rob_chr->bone_data, -1); - sub_14041BD20(rob_chr->bone_data, -1);*/ - rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, 1, bone_data, mot_db); + rob_chara_bone_data_load_face_motion(rob_chr->bone_data, -1, mot_db); + rob_chara_bone_data_load_hand_l_motion(rob_chr->bone_data, -1, mot_db); + rob_chara_bone_data_load_hand_r_motion(rob_chr->bone_data, -1, mot_db); + rob_chara_bone_data_load_mouth_motion(rob_chr->bone_data, -1, mot_db); + rob_chara_bone_data_load_eyes_motion(rob_chr->bone_data, -1, mot_db); + rob_chara_bone_data_load_eyelid_motion(rob_chr->bone_data, -1, mot_db); + rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, MOTION_BLEND_FREEZE, bone_data, mot_db); rob_chara_bone_data_set_frame(rob_chr->bone_data, 0.0f); - sub_14041C680(rob_chr->bone_data, 0); - sub_14041C9D0(rob_chr->bone_data, 0); - sub_14041D2D0(rob_chr->bone_data, 0); - sub_14041BC40(rob_chr->bone_data, 0); + sub_14041C680(rob_chr->bone_data, false); + sub_14041C9D0(rob_chr->bone_data, false); + sub_14041D2D0(rob_chr->bone_data, false); + sub_14041BC40(rob_chr->bone_data, false); sub_14041D270(rob_chr->bone_data, 0.0f); sub_14041D2A0(rob_chr->bone_data, 0.0f); rob_chara_bone_data_set_rotation_y(rob_chr->bone_data, 0.0f); - //sub_14041BF80(rob_chr->bone_data, 0.0f, 1.0f, 1.0f); - //sub_14041D310(rob_chr->bone_data); + rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, 0.0f, 1.0f, 1.0f); + sub_14041D310(rob_chr->bone_data, 0.0f, 0.0f, 2); rob_chara_bone_data_interpolate(rob_chr->bone_data); rob_chara_bone_data_update(rob_chr->bone_data, 0); sub_140509D30(rob_chr); - //sub_140419820(rob_chr->bone_data, skeleton_select); + sub_140419820(rob_chr->bone_data, skeleton_select); } -static void rob_chara_set_draw(rob_chara* rob_chr, item_id id, bool disp) { +static void rob_chara_set_disp(rob_chara* rob_chr, item_id id, bool disp) { if (id < ITEM_BODY) return; else if (id < ITEM_ITEM16) @@ -5865,81 +9286,131 @@ static void rob_chara_set_draw(rob_chara* rob_chr, item_id id, bool disp) { } } +static void rob_chara_set_motion_reset_data(rob_chara* rob_chr, int32_t motion_id, float_t frame) { + rob_chara_item_equip_set_motion_reset_data(rob_chr->item_equip, motion_id, frame); +} + +static void rob_chara_set_motion_skin_param(rob_chara* rob_chr, int32_t motion_id, float_t frame) { + rob_chara_item_equip_set_motion_skin_param(rob_chr->item_equip, + rob_chr->chara_id, motion_id, (int32_t)roundf(frame)); +} + +static void rob_chara_set_osage_reset(rob_chara* rob_chr) { + rob_chara_item_equip_set_osage_reset(rob_chr->item_equip); +} + +static int32_t rob_cmn_mottbl_get_motion_id(rob_chara* rob_chr, int32_t id) { + if (id >= 214 && id <= 223) + return rob_chr->pv_data.field_74[id - 214]; + else if (id == 224) + return rob_chr->data.adjust.motion_id; + else if (id >= 226 && id <= 235) + return rob_chr->pv_data.field_74[id - 226]; + + chara_index chara_index = rob_chr->chara_index; + int32_t v2 = rob_chr->data.field_8.field_1A4; + if (rob_cmn_mottbl_data + && chara_index >= CHARA_MIKU + && chara_index >= 0 && chara_index < rob_cmn_mottbl_data->chara_count + && id >= 0 && id < rob_cmn_mottbl_data->mottbl_indices_count) { + rob_cmn_mottbl_sub_header* v4 = (rob_cmn_mottbl_sub_header*)((uint8_t*)rob_cmn_mottbl_data + + rob_cmn_mottbl_data->subheaders_offset); + if (v2 >= 0 && v2 < v4[chara_index].field_4) + return ((int32_t*)((uint8_t*)rob_cmn_mottbl_data + + *(int32_t*)((uint8_t*)rob_cmn_mottbl_data + + v2 * sizeof(int32_t) + v4[chara_index].data_offset)))[id]; + } + return -1; +} + +static void rob_cmn_mottbl_read(void* a1, void* data, size_t size) { + free(rob_cmn_mottbl_data); + + farc f; + f.read(data, size, true); + if (f.files.size()) { + farc_file* ff = f.read_file("rob_cmn_mottbl.bin"); + if (ff && ff->data) { + rob_cmn_mottbl_data = (rob_cmn_mottbl_header*)ff->data; + ff->data = 0; + } + } +} + +static rob_manager_rob_impl* rob_manager_rob_impls1_get(TaskRobManager* rob_mgr) { + if (!rob_manager_rob_impls1_init) { + rob_manager_rob_impls1_init = true; + rob_manager_rob_impls1[0].task = &rob_mgr->prepare_control; + rob_manager_rob_impls1[0].name = "ROB_PREPARE_CONTROL"; + rob_manager_rob_impls1[1].task = 0; + rob_manager_rob_impls1[1].name = ""; + } + return rob_manager_rob_impls1; +} + +static rob_manager_rob_impl* rob_manager_rob_impls2_get(TaskRobManager* rob_mgr) { + if (!rob_manager_rob_impls2_init) { + rob_manager_rob_impls2_init = true; + rob_manager_rob_impls2[0].task = &rob_mgr->prepare_action; + rob_manager_rob_impls2[0].name = "ROB_PREPARE_ACTION"; + rob_manager_rob_impls2[1].task = &rob_mgr->base; + rob_manager_rob_impls2[1].name = "ROB_BASE"; + rob_manager_rob_impls2[2].task = &rob_mgr->motion_modifier; + rob_manager_rob_impls2[2].name = "ROB_MOTION_MODIFIER"; + rob_manager_rob_impls2[3].task = &rob_mgr->collision; + rob_manager_rob_impls2[3].name = "ROB_COLLISION"; + rob_manager_rob_impls2[4].task = &rob_mgr->info; + rob_manager_rob_impls2[4].name = "ROB_INFO"; + rob_manager_rob_impls2[5].task = &rob_mgr->disp; + rob_manager_rob_impls2[5].name = "ROB_DISP"; + rob_manager_rob_impls2[6].task = 0; + rob_manager_rob_impls2[6].name = ""; + } + return rob_manager_rob_impls2; +} + static rob_osage_node* rob_osage_get_node(rob_osage* rob_osg, size_t index) { - if ((ssize_t)index < vector_old_length(rob_osg->nodes)) - return &rob_osg->nodes.begin[index]; + if (index < rob_osg->nodes.size()) + return &rob_osg->nodes[index]; else return &rob_osg->node; } -static void rob_osage_load_skin_param(rob_osage* rob_osg, key_val* kv, char* name, +static float_t* rob_osage_load_opd_data(rob_osage* rob_osg, + size_t node_index, float_t* opd_data, size_t opd_count) { + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { + if (node_index >= i->opd_data.size()) + i->opd_data.resize(node_index + 1); + + opd_vec3_data* opd = &i->opd_data[node_index]; + opd->x = opd_data; + opd_data += opd_count; + opd->y = opd_data; + opd_data += opd_count; + opd->z = opd_data; + opd_data += opd_count; + } + return opd_data; +} + +static void rob_osage_load_skin_param(rob_osage* rob_osg, key_val* kv, const char* name, skin_param_osage_root* skp_root, object_info* obj_info, bone_database* bone_data) { rob_osg->skin_param_ptr = &rob_osg->skin_param; - for (rob_osage_node* i = rob_osg->nodes.begin; i != rob_osg->nodes.end; i++) - i->data_ptr = &i->data; + for (rob_osage_node& i : rob_osg->nodes) + i.data_ptr = &i.data; skin_param_osage_root_parse(kv, name, skp_root, bone_data); rob_osage_set_skin_param_osage_root(rob_osg, skp_root); - size_t v11 = 0;//sub_14060ADC0(obj_info, &Memory);; - if (v11) { - rob_osg->field_290 = *(uint32_t*)v11; - rob_osg->field_298 = *(size_t*)(v11 + 8); - } + osage_setting_osg_cat* osage_setting = 0;//osage_setting_data_get_cat_value(obj_info, name); + if (osage_setting) + rob_osg->osage_setting = *osage_setting; - vector_old_skin_param_osage_node vec = vector_old_empty(skin_param_osage_node); - size_t count = vector_old_length(rob_osg->nodes) - 1; - vector_old_skin_param_osage_node_reserve(&vec, count); - vec.end += count; - for (skin_param_osage_node* i = vec.begin; i != vec.end; i++) { - i->coli_r = 0.0f; - i->weight = 1.0f; - i->inertial_cancel = 0.0f; - i->hinge.ymin = -90.0f; - i->hinge.ymax = 90.0f; - i->hinge.zmin = -90.0f; - i->hinge.zmax = 90.0f; - } + std::vector vec; + vec.resize(rob_osg->nodes.size() - 1); skin_param_osage_node_parse(kv, name, &vec, skp_root); rob_osage_set_skp_osg_nodes(rob_osg, &vec); - vector_old_skin_param_osage_node_free(&vec, 0); -} - -static void rob_osage_node_init(rob_osage_node* node) { - node->length = 0.0f; - node->trans = vec3_null; - node->trans_orig = vec3_null; - node->trans_diff = vec3_null; - node->field_28 = vec3_null; - node->child_length = 0.0f; - node->bone_node_ptr = 0; - node->bone_node_mat = 0; - node->sibling_node = 0; - node->distance = 0.0f; - node->field_94 = vec3_null; - node->field_A0.trans = vec3_null; - node->field_A0.trans_diff = vec3_null; - node->field_A0.rotation = vec3_null; - node->field_A0.field_24 = 0.0f; - node->field_C8 = 0.0f; - node->field_CC = 1.0f; - node->field_D0 = vec3_null; - node->force = 1.0f; - rob_osage_node_data_init(&node->data); - node->data_ptr = &node->data; - node->field_198.end = node->field_198.begin; - vector_old_struc_331_reserve(&node->field_198, 3); - node->field_198.end += 3; - node->mat = mat4u_null; -} - -static void rob_osage_node_free(rob_osage_node* node) { - vector_old_struc_331_free(&node->field_198, 0); - vector_old_ptr_rob_osage_node* boc = &node->data.boc; - for (rob_osage_node** i = boc->begin; i != boc->end; i++) - *i = 0; - vector_old_ptr_rob_osage_node_free(&node->data.boc, 0); } static void rob_osage_set_air_res(rob_osage* rob_osg, float_t air_res) { @@ -5947,20 +9418,20 @@ static void rob_osage_set_air_res(rob_osage* rob_osg, float_t air_res) { } static void rob_osage_coli_set(rob_osage* rob_osg, mat4* mats) { - if (rob_osg->skin_param_ptr->coli.begin != rob_osg->skin_param_ptr->coli.end) - osage_coli_set(rob_osg->coli, rob_osg->skin_param_ptr->coli.begin, mats); + if (rob_osg->skin_param_ptr->coli.size()) + osage_coli_set(rob_osg->coli, rob_osg->skin_param_ptr->coli.data(), mats); osage_coli_ring_set(rob_osg->coli_ring, &rob_osg->ring.skp_root_coli, mats); } static void rob_osage_set_coli_r(rob_osage* rob_osg, float_t coli_r) { - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) i->data_ptr->skp_osg_node.coli_r = coli_r; } static void rob_osage_set_force(rob_osage* rob_osg, float_t force, float_t force_gain) { rob_osg->skin_param_ptr->force = force; rob_osg->skin_param_ptr->force_gain = force_gain; - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) { + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { i->data_ptr->force = force; force = force * force_gain; } @@ -5971,7 +9442,7 @@ static void rob_osage_set_hinge(rob_osage* rob_osg, float_t hinge_y, float_t hin hinge_z = min(hinge_z, 179.0f); hinge_y = hinge_y * DEG_TO_RAD_FLOAT; hinge_z = hinge_z * DEG_TO_RAD_FLOAT; - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) { + for (auto i = rob_osg->nodes.begin() + 1; i != rob_osg->nodes.end(); i++) { rob_osage_node_data* data = i->data_ptr; data->skp_osg_node.hinge.ymin = -hinge_y; data->skp_osg_node.hinge.ymax = hinge_y; @@ -5985,122 +9456,74 @@ static void rob_osage_set_init_rot(rob_osage* rob_osg, float_t init_rot_y, float rob_osg->skin_param_ptr->init_rot.z = init_rot_z * DEG_TO_RAD_FLOAT; } +static void rob_osage_set_motion_reset_data(rob_osage* rob_osg, int32_t motion_id, float_t frame) { + rob_osg->osage_reset = true; + auto v6 = rob_osg->motion_reset_data.find({ motion_id, (int32_t)roundf(frame * 1000.0f) }); + if (v6 != rob_osg->motion_reset_data.end() && v6->second.size() + 1 == rob_osg->nodes.size()) + rob_osg->reset_data_list = &v6->second; +} + static void rob_osage_set_rot(rob_osage* rob_osg, float_t rotation_y, float_t rotation_z) { rob_osg->skin_param_ptr->rot.y = rotation_y * DEG_TO_RAD_FLOAT; rob_osg->skin_param_ptr->rot.z = rotation_z * DEG_TO_RAD_FLOAT; } static void rob_osage_set_skin_param_osage_root(rob_osage* rob_osg, skin_param_osage_root* skp_root) { - skin_param_init(rob_osg->skin_param_ptr); + *rob_osg->skin_param_ptr = skin_param(); rob_osage_set_force(rob_osg, skp_root->force, skp_root->force_gain); rob_osage_set_air_res(rob_osg, skp_root->air_res); rob_osage_set_rot(rob_osg, skp_root->rot_y, skp_root->rot_z); rob_osage_set_init_rot(rob_osg, skp_root->init_rot_y, skp_root->init_rot_z); - rob_osg->field_1EB8 = 0;//skp_root->field_54; + rob_osage_set_yz_order(rob_osg, skp_root->yz_order); rob_osg->skin_param_ptr->friction = skp_root->friction; rob_osg->skin_param_ptr->wind_afc = skp_root->wind_afc; rob_osage_set_coli_r(rob_osg, skp_root->coli_r); rob_osage_set_hinge(rob_osg, skp_root->hinge_y, skp_root->hinge_z); - vector_old_skin_param_osage_root_coli_insert_range(&rob_osg->skin_param_ptr->coli, - 0, skp_root->coli.begin, skp_root->coli.end); + rob_osg->skin_param_ptr->coli = skp_root->coli; rob_osg->skin_param_ptr->coli_type = skp_root->coli_type; rob_osg->skin_param_ptr->stiffness = skp_root->stiffness; rob_osg->skin_param_ptr->move_cancel = skp_root->move_cancel; } static void rob_osage_set_skp_osg_nodes(rob_osage* rob_osg, - vector_old_skin_param_osage_node* skp_osg_nodes) { + std::vector* skp_osg_nodes) { if (!skp_osg_nodes) return; - if (vector_old_length(rob_osg->nodes) - 1 != vector_old_length(*skp_osg_nodes)) + if (rob_osg->nodes.size() - 1 != skp_osg_nodes->size()) return; - rob_osage_node* i = rob_osg->nodes.begin + 1; - skin_param_osage_node* j = skp_osg_nodes->begin; - while (i != rob_osg->nodes.end && j != skp_osg_nodes->end) { + auto i = rob_osg->nodes.begin() + 1; + auto j = skp_osg_nodes->begin(); + while (i != rob_osg->nodes.end() && j != skp_osg_nodes->end()) { i->data_ptr->skp_osg_node = *j++; - skin_param_hinge_limit(&i->data_ptr->skp_osg_node.hinge); + i->data_ptr->skp_osg_node.hinge.limit(); i++; } } +static void rob_osage_set_yz_order(rob_osage* rob_osg, int32_t yz_order) { + rob_osg->yz_order = yz_order; +} + static void rob_osage_free(rob_osage* rob_osg) { - rob_osage_init(rob_osg); - //sub_14021BEF0(&rob_osg->field_1F60, rob_osg->field_1F60.head->left, rob_osg->field_1F60.head); - //j_free_2(rob_osg->field_1F60.head); - vector_old_skin_param_osage_root_coli_free(&rob_osg->ring.skp_root_coli, 0); - vector_old_osage_coli_free(&rob_osg->ring.coli, 0); - vector_old_skin_param_osage_root_coli_free(&rob_osg->skin_param.coli, 0); - rob_osage_node_free(&rob_osg->node); - vector_old_rob_osage_node_free(&rob_osg->nodes, rob_osage_node_free); + rob_osage_reset(rob_osg); } -static void rob_sub_action_init(rob_sub_action* sub_act) { - sub_act->data.field_0 = 0; - sub_act->data.field_8 = 0; - sub_act->data.field_10 = 0; - sub_act->data.field_18 = 0; - //rob_sub_action_execute_cry_init(&sub_act->data.cry); - //rob_sub_action_execute_shake_hand_init(&sub_act->data.shake_hand); - //rob_sub_action_execute_embarrassed_init(&sub_act->data.embarrassed); - //rob_sub_action_execute_angry_init(&sub_act->data.angry); - //rob_sub_action_execute_laugh_init(&sub_act->data.laugh); - //rob_sub_action_execute_count_num_init(&sub_act->data.count_num); - rob_sub_action_init_sub(sub_act); -} - -static void rob_sub_action_init_sub(rob_sub_action* sub_act) { - sub_act->data.field_0 = 0; - sub_act->data.field_8 = 0; - sub_act->data.field_10 = 0; - sub_act->data.field_18 = 0; - //sub_act->data.cry.base.vftable->field_8(&sub_act->data.cry.base); - //sub_act->data.shake_hand.base.vftable->field_8(&sub_act->data.shake_hand.base); - //sub_act->data.embarrassed.base.vftable->field_8(&sub_act->data.embarrassed.base); - //sub_act->data.angry.base.vftable->field_8(&sub_act->data.angry.base); - //sub_act->data.laugh.base.vftable->field_8(&sub_act->data.laugh.base); -} - -static void rob_sub_action_free(rob_sub_action* sub_act) { - sub_act->data.field_0 = 0; - sub_act->data.field_8 = 0; - sub_act->data.field_10 = 0; - sub_act->data.field_18 = 0; -} - -static void skin_param_init(skin_param* skp) { - skp->coli.end = skp->coli.begin; - skp->friction = 1.0f; - skp->wind_afc = 0.0f; - skp->air_res = 1.0f; - skp->rot = vec3_null; - skp->init_rot = vec3_null; - skp->coli_type = 0; - skp->stiffness = 0.0f; - skp->move_cancel = -0.01f; - skp->coli_r = 0.0; - skp->hinge = { -90.0f, 90.0f, -90.0f, 90.0f }; - skin_param_hinge_limit(&skp->hinge); - skp->force = 0.0f; - skp->force_gain = 0.0f; - skp->colli_tgt_osg = 0; -} - -static bool skin_param_file_read(void* data, char* path, char* file, uint32_t hash) { +static bool skin_param_file_read(void* data, const char* path, const char* file, uint32_t hash) { string s; string_init(&s, path); string_add(&s, file); key_val* kv = (key_val*)data; - key_val_file_read(kv, string_data(&s)); + kv->file_read(string_data(&s)); string_free(&s); return kv->buf ? true : false; } -static void skin_param_osage_node_parse(key_val* kv, char* name, - vector_old_skin_param_osage_node* vec, skin_param_osage_root* skp_root) { +static void skin_param_osage_node_parse(key_val* kv, const char* name, + std::vector* vec, skin_param_osage_root* skp_root) { char buf[SKP_TEXT_BUF_SIZE]; int32_t count; size_t len; @@ -6109,7 +9532,7 @@ static void skin_param_osage_node_parse(key_val* kv, char* name, size_t off; key_val lkv; - if (!key_val_get_local_key_val(kv, name, &lkv)) + if (!kv->get_local_key_val(name, &lkv)) return; len = utf8_length(name); @@ -6122,44 +9545,35 @@ static void skin_param_osage_node_parse(key_val* kv, char* name, buf[off] = 0; key_val sub_local_key_val; - if (key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count)) { - size_t c = vector_old_length(*vec); - if (c < count) { - vector_old_skin_param_osage_node_reserve(vec, count - c); - vec->end += count - c; - } + if (lkv.get_local_key_val(buf, &sub_local_key_val)) { + if (lkv.read_int32_t(buf, off, ".length", 8, &count)) { + size_t c = vec->size(); + if (c < count) + vec->resize(count); } else - vector_old_skin_param_osage_node_clear(vec, 0); + vec->clear(); int32_t j = 0; - for (skin_param_osage_node* i = vec->begin; i != vec->end; i++, j++) { - memset(i, 0, sizeof(skin_param_osage_node)); + for (auto i = vec->begin(); i != vec->end(); i++, j++) { len2 = sprintf_s(buf + len + len1, SKP_TEXT_BUF_SIZE - len - len1, ".%d", j); off = len + len1 + len2; - i->coli_r = 0.0f; - i->weight = 1.0f; - i->inertial_cancel = 0.0f; - i->hinge.ymin = -90.0f; - i->hinge.ymax = 90.0f; - i->hinge.zmin = -90.0f; - i->hinge.zmax = 90.0f; + *i = skin_param_osage_node(); float_t coli_r = 0; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".coli_r", 8, &coli_r)) i->coli_r = coli_r; float_t weight = 0; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".weight", 8, &weight)) i->weight = weight; float_t inertial_cancel = 0; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".inertial_cancel", 17, &inertial_cancel)) i->inertial_cancel = inertial_cancel; @@ -6169,82 +9583,29 @@ static void skin_param_osage_node_parse(key_val* kv, char* name, i->hinge.zmax = skp_root->hinge_z; float_t hinge_ymax = 0.0f; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".hinge_ymax", 12, &hinge_ymax)) i->hinge.ymax = hinge_ymax; float_t hinge_ymin = 0.0f; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".hinge_ymin", 12, &hinge_ymin)) i->hinge.ymin = hinge_ymin; float_t hinge_zmax = 0.0f; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".hinge_zmax", 12, &hinge_zmax)) i->hinge.zmax = hinge_zmax; float_t hinge_zmin = 0.0f; - if (key_val_read_float_t(&sub_local_key_val, + if (sub_local_key_val.read_float_t( buf, off, ".hinge_zmin", 12, &hinge_zmin)) i->hinge.zmin = hinge_zmin; } - key_val_free(&sub_local_key_val); } - key_val_free(&lkv); } -static void skin_param_osage_root_init(skin_param_osage_root* root) { - root->field_0 = 0; - root->force = 0.0f; - root->force_gain = 0.0f; - root->air_res = 0.5f; - root->rot_y = 0.0f; - root->rot_z = 0.0f; - root->init_rot_y = 0.0f; - root->init_rot_z = 0.0f; - root->hinge_y = 90.0f; - root->hinge_z = 90.0f; - root->name = (char*)"NO-PARAM"; - - vector_old_skin_param_osage_root_coli_reserve(&root->coli, 12); - root->coli.end += 12; - for (skin_param_osage_root_coli* i = root->coli.begin; i != root->coli.end; i++) { - i->type = 0; - i->bone0_index = 0; - i->bone1_index = 0; - i->radius = 0.2f;; - i->bone0_pos = vec3_null; - i->bone1_pos = vec3_null; - } - - root->coli_r = 0.0f; - root->friction = 1.0f; - root->wind_afc = 0.5f; - - vector_old_skin_param_osage_root_boc_clear(&root->boc, skin_param_osage_root_boc_free); - - root->coli_type = 0; - root->stiffness = 0.0f; - root->move_cancel = -0.01f; - string_init(&root->colli_tgt_osg); - - vector_old_skin_param_osage_root_normal_ref_clear( - &root->normal_ref, skin_param_osage_root_normal_ref_free); -} - -static void skin_param_osage_root_boc_free(skin_param_osage_root_boc* boc) { - string_free(&boc->ed_root); -} - -static void skin_param_osage_root_normal_ref_free(skin_param_osage_root_normal_ref* ref) { - string_free(&ref->r); - string_free(&ref->l); - string_free(&ref->d); - string_free(&ref->u); - string_free(&ref->n); -} - -static void skin_param_osage_root_parse(key_val* kv, char* name, +static void skin_param_osage_root_parse(key_val* kv, const char* name, skin_param_osage_root* skp_root, bone_database* bone_data) { char buf[SKP_TEXT_BUF_SIZE]; int32_t count; @@ -6255,7 +9616,7 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, size_t off; key_val lkv; - if (!key_val_get_local_key_val(kv, name, &lkv)) + if (!kv->get_local_key_val(name, &lkv)) return; len = utf8_length(name); @@ -6263,7 +9624,7 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, off = len; int32_t node_length = 0; - key_val_read_int32_t(&lkv, + lkv.read_int32_t( buf, off, ".node.length", 13, &node_length); len1 = 5; @@ -6272,31 +9633,31 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, float_t force = 0.0f; float_t force_gain = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".force", 7, &force) - && key_val_read_float_t(&lkv, + && lkv.read_float_t( buf, off, ".force_gain", 12, &force_gain)) { skp_root->force = force; skp_root->force_gain = force_gain; } float_t air_res = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".air_res", 9, &air_res)) skp_root->air_res = min(air_res, 0.9f); float_t rot_y = 0.0f; float_t rot_z = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".rot_y", 7, &rot_y) - && key_val_read_float_t(&lkv, + && lkv.read_float_t( buf, off, ".rot_z", 7, &rot_z)) { skp_root->rot_y = rot_y; skp_root->rot_z = rot_z; } float_t wind_afc = 0; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".wind_afc", 10, &wind_afc)) { skp_root->wind_afc = wind_afc; if (!str_utils_compare_length(name, utf8_length(name), "c_opa", 5)) @@ -6304,15 +9665,15 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, } int32_t coli_type = 0; - if (key_val_read_int32_t(&lkv, + if (lkv.read_int32_t( buf, off, ".coli_type", 11, &coli_type)) skp_root->coli_type = coli_type; float_t init_rot_y = 0.0f; float_t init_rot_z = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".init_rot_y", 12, &init_rot_y) - && key_val_read_float_t(&lkv, + && lkv.read_float_t( buf, off, ".init_rot_z", 12, &init_rot_z)) { skp_root->init_rot_y = init_rot_y; skp_root->init_rot_z = init_rot_z; @@ -6320,26 +9681,26 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, float_t hinge_y = 0.0f; float_t hinge_z = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".hinge_y", 9, &hinge_y) - && key_val_read_float_t(&lkv, + && lkv.read_float_t( buf, off, ".hinge_z", 9, &hinge_z)) { skp_root->hinge_y = hinge_y; skp_root->hinge_z = hinge_z; } float_t coli_r = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".coli_r", 8, &coli_r)) skp_root->coli_r = coli_r; float_t stiffness = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".stiffness", 11, &stiffness)) skp_root->stiffness = stiffness; float_t move_cancel = 0.0f; - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".move_cancel", 13, &move_cancel)) skp_root->move_cancel = move_cancel; @@ -6349,71 +9710,69 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, buf[off] = 0; key_val sub_local_key_val; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { - vector_old_skin_param_osage_root_coli* vc = &skp_root->coli; + if (lkv.read_int32_t(buf, off, ".length", 8, &count) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { + std::vector& vc = skp_root->coli; - vector_old_skin_param_osage_root_coli_reserve(vc, count); - vc->end += count; + vc.resize(count); for (int32_t i = 0; i < count; i++) { - skin_param_osage_root_coli* c = &vc->begin[i]; - memset(c, 0, sizeof(skin_param_osage_root_coli)); + skin_param_osage_root_coli* c = &vc[i]; len3 = sprintf_s(buf + len + len1 + len2, SKP_TEXT_BUF_SIZE - len - len1 - len2, ".%d", i); off = len + len1 + len2 + len3; int32_t type = 0; - if (!key_val_read_int32_t(&sub_local_key_val, + if (!sub_local_key_val.read_int32_t( buf, off, ".type", 6, &type)) break; c->type = type; float_t radius = 0; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".radius", 8, &radius)) break; c->radius = radius; char* bone0_name = 0; - if (!key_val_read_string(&sub_local_key_val, + if (!sub_local_key_val.read_string( buf, off, ".bone.0.name", 13, &bone0_name)) break; - c->bone0_index = bone_database_get_skeleton_object_bone_index(bone_data, - (char*)bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), bone0_name); + c->bone0_index = bone_data->get_skeleton_object_bone_index( + bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), bone0_name); vec3 bone0_pos = vec3_null; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".bone.0.posx", 13, &bone0_pos.x)) break; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".bone.0.posy", 13, &bone0_pos.y)) break; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".bone.0.posz", 13, &bone0_pos.z)) break; c->bone0_pos = bone0_pos; char* bone1_name = 0; - if (key_val_read_string(&sub_local_key_val, + if (sub_local_key_val.read_string( buf, off, ".bone.1.name", 13, &bone1_name)) { - c->bone1_index = bone_database_get_skeleton_object_bone_index(bone_data, - (char*)bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), bone1_name); + c->bone1_index = bone_data->get_skeleton_object_bone_index( + bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), bone1_name); vec3 bone1_pos = vec3_null; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".bone.1.posx", 13, &bone1_pos.x)) break; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".bone.1.posy", 13, &bone1_pos.y)) break; - if (!key_val_read_float_t(&sub_local_key_val, + if (!sub_local_key_val.read_float_t( buf, off, ".bone.1.posz", 13, &bone1_pos.z)) break; @@ -6421,7 +9780,6 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, } } - key_val_free(&sub_local_key_val); } len2 = 4; @@ -6429,42 +9787,39 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, off = len + len1 + len2; buf[off] = 0; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { - vector_old_skin_param_osage_root_boc* vb = &skp_root->boc; + if (lkv.read_int32_t(buf, off, ".length", 8, &count) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { + std::vector* vb = &skp_root->boc; - vector_old_skin_param_osage_root_boc_reserve(vb, count); + vb->resize(count); for (int32_t i = 0; i < count; i++) { len3 = sprintf_s(buf + len + len1 + len2, SKP_TEXT_BUF_SIZE - len - len1 - len2, ".%d", i); off = len + len1 + len2 + len3; int32_t st_node = 0; - string ed_root = string_empty; + std::string ed_root; int32_t ed_node = 0; - if (key_val_read_int32_t(&sub_local_key_val, + if (sub_local_key_val.read_int32_t( buf, off, ".st_node", 9, &st_node) && st_node < node_length - && key_val_read_string(&sub_local_key_val, + && sub_local_key_val.read_string( buf, off, ".ed_root", 9, &ed_root) - && key_val_read_int32_t(&sub_local_key_val, + && sub_local_key_val.read_int32_t( buf, off, ".ed_node", 9, &ed_node) && ed_node < node_length) { - skin_param_osage_root_boc* b = vector_old_skin_param_osage_root_boc_reserve_back(vb); - memset(b, 0, sizeof(skin_param_osage_root_boc)); - b->st_node = st_node; - b->ed_root = ed_root; - b->ed_node = ed_node; + skin_param_osage_root_boc b; + b.st_node = st_node; + b.ed_root = ed_root; + b.ed_node = ed_node; + vb->push_back(b); } - else - string_free(&ed_root); } - key_val_free(&sub_local_key_val); } off = len + len1; - string colli_tgt_osg = string_empty; - if (key_val_read_string(&lkv, + std::string colli_tgt_osg; + if (lkv.read_string( buf, off, ".colli_tgt_osg", 15, &colli_tgt_osg)) skp_root->colli_tgt_osg = colli_tgt_osg; @@ -6473,51 +9828,33 @@ static void skin_param_osage_root_parse(key_val* kv, char* name, off = len + len1 + len2; buf[off] = 0; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { - vector_old_skin_param_osage_root_normal_ref* vnr = &skp_root->normal_ref; + if (lkv.read_int32_t(buf, off, ".length", 8, &count) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { + std::vector* vnr = &skp_root->normal_ref; - vector_old_skin_param_osage_root_normal_ref_reserve(vnr, count); + vnr->resize(count); for (int32_t i = 0; i < count; i++) { len3 = sprintf_s(buf + len + len1 + len2, SKP_TEXT_BUF_SIZE - len - len1 - len2, ".%d", i); off = len + len1 + len2 + len3; - string n = string_empty; - if (key_val_read_string(&sub_local_key_val, + std::string n; + if (sub_local_key_val.read_string( buf, off, ".N", 3, &n)) { - skin_param_osage_root_normal_ref* nr - = vector_old_skin_param_osage_root_normal_ref_reserve_back(vnr); - memset(nr, 0, sizeof(skin_param_osage_root_normal_ref)); - - nr->n = n; - key_val_read_string(&sub_local_key_val, - buf, off, ".U", 3, &nr->u); - key_val_read_string(&sub_local_key_val, - buf, off, ".D", 3, &nr->d); - key_val_read_string(&sub_local_key_val, - buf, off, ".L", 3, &nr->l); - key_val_read_string(&sub_local_key_val, - buf, off, ".R", 3, &nr->r); + skin_param_osage_root_normal_ref nr; + nr.n = n; + sub_local_key_val.read_string( + buf, off, ".U", 3, &nr.u); + sub_local_key_val.read_string( + buf, off, ".D", 3, &nr.d); + sub_local_key_val.read_string( + buf, off, ".L", 3, &nr.l); + sub_local_key_val.read_string( + buf, off, ".R", 3, &nr.r); + vnr->push_back(nr); } } - key_val_free(&sub_local_key_val); } - - key_val_free(&lkv); -} - -static void skin_param_osage_root_free(skin_param_osage_root* root) { - vector_old_skin_param_osage_root_normal_ref_free( - &root->normal_ref, skin_param_osage_root_normal_ref_free); - string_free(&root->colli_tgt_osg); - vector_old_skin_param_osage_root_boc_free(&root->boc, skin_param_osage_root_boc_free); - vector_old_skin_param_osage_root_coli_free(&root->coli, 0); -} - -void rob_chara_array_init() { - for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) - rob_chara_init(&rob_chara_array[i]); } rob_chara* rob_chara_array_get(int32_t chara_id) { @@ -6528,11 +9865,12 @@ rob_chara* rob_chara_array_get(int32_t chara_id) { int32_t rob_chara_array_init_chara_index(chara_index chara_index, rob_chara_pv_data* pv_data, uint32_t module_index, bool a4) { - if (pv_data->field_0 > 3) + if (!TaskWork::CheckTaskNotReady(&task_rob_manager) + || pv_data->type < ROB_CHARA_TYPE_0|| pv_data->type > ROB_CHARA_TYPE_3) return -1; int32_t chara_id = 0; - while (rob_chara_pv_data_array[chara_id].field_0 != -1) { + while (rob_chara_pv_data_array[chara_id].type != ROB_CHARA_TYPE_NONE) { chara_id++; if (chara_id >= ROB_CHARA_COUNT) return -1; @@ -6542,71 +9880,528 @@ int32_t rob_chara_array_init_chara_index(chara_index chara_index, module_index = 0; rob_chara_pv_data_array[chara_id] = *pv_data; rob_chara_set_pv_data(&rob_chara_array[chara_id], chara_id, chara_index, module_index, pv_data); - task_rob_manager_struct_append_init_chara(&task_rob_manager, &rob_chara_array[chara_id]); + task_rob_manager.AppendInitCharaList(&rob_chara_array[chara_id]); return chara_id; } -void rob_chara_free_chara_id(int32_t chara_id) { +void rob_chara_array_free_chara_id(int32_t chara_id) { if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT) return; - task_rob_manager_struct_append_free_chara(&task_rob_manager, &rob_chara_array[chara_id]); - rob_chara_pv_data_array[chara_id].field_0 = -1; + task_rob_manager.AppendFreeCharaList(&rob_chara_array[chara_id]); + rob_chara_pv_data_array[chara_id].type = ROB_CHARA_TYPE_NONE; +} + +void rob_mot_tbl_init() { + p_file_handler rob_mot_tbl_file_handler; + rob_mot_tbl_file_handler.read_file_path("./rom/rob/", "rob_mot_tbl.bin"); + rob_mot_tbl_file_handler.set_read_free_func_data(0, rob_cmn_mottbl_read, 0); + rob_mot_tbl_file_handler.read_now(); + rob_mot_tbl_file_handler.free_data(); +} + +void rob_mot_tbl_free() { + free(rob_cmn_mottbl_data); +} + +void rob_thread_handler_init() { + if (!rob_thread_handler) + rob_thread_handler = new RobThreadHandler; +} + +void rob_thread_handler_free() { + if (rob_thread_handler) + delete rob_thread_handler; } int32_t rob_chara_array_reset_pv_data(int32_t chara_id) { - rob_chara_pv_data_array[chara_id].field_0 = -1; + rob_chara_pv_data_array[chara_id].type = ROB_CHARA_TYPE_NONE; return chara_id; } -void rob_chara_array_free() { - for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) - rob_chara_free(&rob_chara_array[i]); -} - -void rob_chara_pv_data_init(rob_chara_pv_data* pv_data) { - memset(pv_data, 0, sizeof(rob_chara_pv_data)); - pv_data->field_0 = 2; - pv_data->field_4 = 1; - pv_data->field_5 = 0; - pv_data->field_6 = 0; - pv_data->field_14 = 0x00; - pv_data->field_16 = 0xC9; - pv_data->field_74[0] = -1; - pv_data->field_74[1] = -1; - pv_data->field_74[2] = -1; - pv_data->field_74[3] = -1; - pv_data->field_74[4] = -1; - pv_data->field_74[5] = -1; - pv_data->field_74[6] = -1; - pv_data->field_74[7] = -1; - pv_data->field_74[8] = -1; - pv_data->field_74[9] = -1; - pv_data->chara_size_index = 1; - pv_data->height_adjust = false; - pv_data->eyes_adjust.base_adjust = EYES_BASE_ADJUST_DIRECTION; - pv_data->eyes_adjust.neg = -1.0f; - pv_data->eyes_adjust.pos = -1.0f; -} - inline bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id) { - return rob_chara_pv_data_array[chara_id].field_0 != -1; + return rob_chara_pv_data_array[chara_id].type != ROB_CHARA_TYPE_NONE; } -void rob_chara_pv_data_array_init() { - for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) - rob_chara_pv_data_init(&rob_chara_pv_data_array[i]); - for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) - rob_chara_pv_data_array[i].field_0 = -1; +void task_rob_manager_append_task() { + TaskWork::AppendTask(&task_rob_manager, "ROB_MANAGER TASK"); + for (rob_chara_pv_data& i : rob_chara_pv_data_array) + i.type = ROB_CHARA_TYPE_NONE; +} + +bone_node_expression_data::bone_node_expression_data() { + position = vec3_null; + rotation = vec3_null; + scale = vec3_identity; + parent_scale = vec3_identity; +} + +bone_node_expression_data::~bone_node_expression_data() { + +} + +bone_node::bone_node() : name(), mat(), parent(), ex_data_mat() { + +} + +bone_node::~bone_node() { + +} + +MotionBlend::MotionBlend() : field_8(), field_9(), +duration(), frame(), step(1.0f), offset(), blend() { + +} + +MotionBlend::~MotionBlend() { + +} + +void MotionBlend::Reset() { + field_8 = false; + field_9 = false; + duration = 0.0f; + frame = 0.0f; + step = 1.0f; + offset = 0.0f; + blend = 0.0f; +} + +bool MotionBlend::Field_30() { + return false; +} + +void MotionBlend::SetDuration(float_t duration, float_t step, float_t offset) { + this->step = step; + this->offset = offset; + if (duration < 0.0f) { + this->duration = 0.0f; + field_8 = false; + } + else { + this->duration = duration; + field_8 = true; + } + frame = 0.0f; +} + +MotionBlendCross::MotionBlendCross() : field_20(), field_21(), +field_24(mat4u_identity), field_64(mat4u_identity), field_A4(mat4u_identity), field_E4(mat4u_identity) { + +} + +MotionBlendCross::~MotionBlendCross() { + +} + +void MotionBlendCross::Reset() { + MotionBlend::Reset(); + field_20 = false; + field_21 = false; + field_24 = mat4u_identity; + field_64 = mat4u_identity; + field_A4 = mat4u_identity; + field_E4 = mat4u_identity; +} + +void MotionBlendCross::Field_10(float_t a2, float_t a3, int32_t a4) { + +} + +void MotionBlendCross::Field_18(struc_400* a2) { + field_20 = a2->field_0; + field_21 = true; + if (duration <= 0.0f || duration <= frame || fabsf(duration - frame) <= 0.000001f) { + field_8 = false; + field_9 = false; + } + else { + field_9 = true; + blend = (frame + offset) / (duration + offset); + frame += step; + } + + if (field_9) { + mat4 mat; + mat4_rotate_y(-a2->prev_eyes_adjust, &mat); + field_24 = mat; + } + else + field_24 = mat4u_identity; +} + +void MotionBlendCross::Field_20(vector_old_bone_data* a2, vector_old_bone_data* a3) { + if (!a2 || !a3) + return; + + bone_data* v4 = a2->begin; + bone_data* v7 = a3->begin; + + mat4_mult(&v4[4].rot_mat[0], &v4[0].rot_mat[0], &field_64); + mat4_mult(&v7[0].rot_mat[0], &field_24, &field_A4); + mat4_blend_rotation(&v4[0].rot_mat[0], &field_A4, &v4[0].rot_mat[0], blend); + mat4_mult(&v7[4].rot_mat[0], &field_A4, &field_A4); + mat4_blend_rotation(&v4[4].rot_mat[0], &v7[4].rot_mat[0], &v4[4].rot_mat[0], blend); + mat4_mult(&v4[4].rot_mat[0], &v4[0].rot_mat[0], &field_E4); + mat4_transpose(&field_E4, &field_E4); +} + +void MotionBlendCross::Blend(bone_data* a2, bone_data* a3) { + if (!a2 || !a3 || a2->flags) + return; + + mat4u v15; + mat4u v16; + + switch (a2->type) { + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + vec3_lerp_scalar(a3->trans, a2->trans, a2->trans, blend); + break; + case BONE_DATABASE_BONE_POSITION_ROTATION: + if (field_21) { + a2->trans.x = lerp(a3->trans.x, a2->trans.x, blend); + a2->trans.z = lerp(a3->trans.z, a2->trans.z, blend); + } + if (field_20) + a2->trans.y = lerp(a3->trans.y, a2->trans.y, blend); + break; + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + if (a2->motion_bone_index == MOTION_BONE_CL_MUNE) { + mat4_mult(&a3->rot_mat[0], &field_A4, &v15); + mat4_mult(&a3->rot_mat[1], &v15, &v15); + mat4_mult(&a2->rot_mat[0], &field_64, &v16); + mat4_mult(&a2->rot_mat[1], &v16, &v16); + mat4_blend_rotation(&v16, &v15, &v16, blend); + mat4_mult(&v16, &field_E4, &v16); + } + else { + mat4_mult(&a3->rot_mat[1], &a3->rot_mat[0], &v15); + mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v16); + mat4_blend_rotation(&v16, &v15, &v16, blend); + } + mat4_transpose(&a2->rot_mat[0], &v15); + mat4_mult(&v16, &v15, &a2->rot_mat[1]); + break; + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + mat4_blend_rotation(&a2->rot_mat[2], &a3->rot_mat[2], &a2->rot_mat[2], blend); + mat4_mult(&a3->rot_mat[1], &a3->rot_mat[0], &v15); + mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v16); + mat4_blend_rotation(&v16, &v15, &v16, blend); + mat4_transpose(&a2->rot_mat[0], &v15); + mat4_mult(&v16, &v15, &a2->rot_mat[1]); + break; + default: + if (a2->motion_bone_index == MOTION_BONE_KL_KOSI_Y) { + mat4_mult(&a3->rot_mat[0], &field_A4, &v16); + mat4_mult(&a2->rot_mat[0], &field_64, &v15); + mat4_blend_rotation(&v15, &v16, &v15, blend); + mat4_mult(&v15, &field_E4, &a2->rot_mat[0]); + } + else if (a2->motion_bone_index > MOTION_BONE_N_HARA) + mat4_blend_rotation(&a2->rot_mat[0], &a3->rot_mat[0], &a2->rot_mat[0], blend); + break; + } +} + +MotionBlendCombine::MotionBlendCombine() { + +} + +MotionBlendCombine::~MotionBlendCombine() { + +} + +void MotionBlendCombine::Field_18(struc_400* a2) { + field_20 = a2->field_0; + field_21 = true; + if (field_9) { + mat4 mat; + mat4_rotate_y(-a2->prev_eyes_adjust, &mat); + field_24 = mat; + } + else + field_24 = mat4u_identity; +} + +bool MotionBlendCombine::Field_30() { + return true; +} + +MotionBlendFreeze::MotionBlendFreeze() : field_20(),field_21(), field_24(), field_28(), field_2C(), field_30(), +field_34(mat4u_identity), field_74(mat4u_identity), field_B4(mat4u_identity), field_F4(mat4u_identity) { + +} + +MotionBlendFreeze::~MotionBlendFreeze() { + +} + +void MotionBlendFreeze::Reset() { + MotionBlend::Reset(); + field_20 = false; + field_21 = false; + field_24 = 2; + field_28 = 0.0f; + field_2C = 0.0f; + field_30 = 2; + field_34 = mat4u_identity; + field_74 = mat4u_identity; + field_B4 = mat4u_identity; + field_F4 = mat4u_identity; +} + +void MotionBlendFreeze::Field_10(float_t a2, float_t a3, int32_t a4) { + field_2C = a3; + field_30 = a4; + if (a2 < 0.0f) + field_28 = 0.0f; + else + field_28 = a2; +} + +void MotionBlendFreeze::Field_18(struc_400* a2) { + field_24 = 2; + if (duration <= 0.0f || duration <= frame || fabsf(duration - frame) <= 0.000001f) { + float_t v7 = a2->frame; + float_t v8 = field_2C; + float_t v9 = v7 - v8; + if (v7 < v8 || field_28 <= 0.0f || field_28 <= v9 || fabsf(field_28 - v9) <= 0.000001f) { + field_8 = false; + field_9 = false; + } + else { + field_9 = true; + field_24 = field_30; + blend = 1.0f - (v9 + offset) / (field_28 + offset); + if (a2->field_4) + field_24 = field_30 + 1; + field_20 = a2->field_2; + field_21 = a2->field_3; + } + } + else { + field_9 = true; + field_24 = 0; + blend = (frame + offset) / (duration + offset); + frame += step; + field_20 = a2->field_0; + field_21 = a2->field_1; + } + + if (field_9) { + mat4 mat; + if (field_24) + mat4_rotate_y(a2->eyes_adjust, &mat); + else + mat4_rotate_y(-a2->prev_eyes_adjust, &mat); + field_34 = mat; + } + else + field_34 = mat4u_identity; +} + +void MotionBlendFreeze::Field_20(vector_old_bone_data* a2, vector_old_bone_data* a3) { + if (!a2) + return; + + bone_data* v2 = a2->begin; + mat4_mult(&v2[4].rot_mat[0], &v2->rot_mat[0], &field_74); + mat4_mult(&v2->rot_mat_dup[field_24], &field_34, &field_B4); + mat4_blend_rotation(v2->rot_mat, &field_B4, v2->rot_mat, blend); + mat4_mult(&v2[4].rot_mat_dup[field_24], &field_B4, &field_B4); + mat4_blend_rotation(&v2[4].rot_mat[0], &v2[4].rot_mat_dup[field_24], &v2[4].rot_mat[0], blend); + mat4_mult(&v2[4].rot_mat[0], &v2->rot_mat[0], &field_F4); + mat4_transpose(&field_F4, &field_F4); +} + +void MotionBlendFreeze::Blend(bone_data* a2, bone_data* a3) { + if (!a2 || a2->flags) + return; + + mat4u v15; + mat4u v16; + switch (a2->type) { + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + vec3_lerp_scalar(a2->trans_dup[field_24], a2->trans, a2->trans, blend); + break; + case BONE_DATABASE_BONE_POSITION_ROTATION: + if (field_21) { + a2->trans.x = lerp(a2->trans_dup[field_24].x, a2->trans.x, blend); + a2->trans.z = lerp(a2->trans_dup[field_24].z, a2->trans.z, blend); + } + if (field_20) + a2->trans.y = lerp(a2->trans_dup[field_24].y, a2->trans.y, blend); + break; + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + if (a2->motion_bone_index == MOTION_BONE_CL_MUNE) { + mat4_mult(&a2->rot_mat_dup[field_24], &field_B4, &v15); + mat4_mult(&a2->rot_mat_dup[field_24 + 2], &v15, &v15); + mat4_mult(&a2->rot_mat[0], &field_74, &v16); + mat4_mult(&a2->rot_mat[1], &v16, &v16); + mat4_blend_rotation(&v16, &v15, &v16, blend); + mat4_mult(&v16, &field_F4, &v16); + } + else { + mat4_mult(&a2->rot_mat_dup[field_24 + 2], &a2->rot_mat_dup[field_24], &v15); + mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v16); + mat4_blend_rotation(&v16, &v15, &v16, blend); + } + mat4_transpose(&a2->rot_mat[0], &v15); + mat4_mult(&v16, &v15, &a2->rot_mat[1]); + break; + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + mat4_blend_rotation(&a2->rot_mat[2], &a2->rot_mat_dup[field_24 + 4], &a2->rot_mat[2], blend); + mat4_mult(&a2->rot_mat_dup[field_24 + 2], &a2->rot_mat_dup[field_24], &v15); + mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v16); + mat4_blend_rotation(&v16, &v15, &v16, blend); + mat4_transpose(&a2->rot_mat[0], &v15); + mat4_mult(&v16, &v15, &a2->rot_mat[1]); + break; + default: + if (a2->motion_bone_index == MOTION_BONE_KL_KOSI_Y) { + mat4_mult(&a2->rot_mat_dup[field_24], &field_B4, &v16); + mat4_mult(&a2->rot_mat[0], &field_74, &v15); + mat4_blend_rotation(&v15, &v16, &v15, blend); + mat4_mult(&v15, &field_F4, &a2->rot_mat[0]); + } + else if (a2->motion_bone_index > MOTION_BONE_N_HARA) + mat4_blend_rotation(a2->rot_mat, &a2->rot_mat_dup[field_24], a2->rot_mat, blend); + break; + } +} + +PartialMotionBlendFreeze::PartialMotionBlendFreeze() { + +} + +PartialMotionBlendFreeze::~PartialMotionBlendFreeze() { + +} + +void PartialMotionBlendFreeze::Reset() { + MotionBlendFreeze::Reset(); +} + +void PartialMotionBlendFreeze::Field_10(float_t a2, float_t a3, int32_t a4) { + +} + +void PartialMotionBlendFreeze::Field_18(struc_400* a1) { + +} + +void PartialMotionBlendFreeze::Field_20(vector_old_bone_data* a1, vector_old_bone_data* a2) { + +} + +void PartialMotionBlendFreeze::Blend(bone_data* a1, bone_data* a2) { + +} + +struc_313::struc_313() : motion_bone_count() { + bitfield.reserve(16); +} + +struc_313::~struc_313() { + +} + +struc_240::struc_240() : bone_check_func(), motion_bone_count() { + +} + +struc_240::~struc_240() { + +} + +motion_blend_mot::motion_blend_mot() : bone_data(), +mot_key_data(), mot_play_data(), field_4F8(), field_5CC(), blend() { + bone_data_parent_reset(&bone_data); + mot_key_data_reset(&mot_key_data); + mot_play_data_reset(&mot_play_data); + field_4F8.field_C0 = 1.0f; + field_4F8.field_C4 = 1.0f; +} + +motion_blend_mot::~motion_blend_mot() { + mot_key_data_free(&mot_key_data); + bone_data_parent_free(&bone_data); +} + +rob_chara_bone_data_ik_scale::rob_chara_bone_data_ik_scale() { + ratio0 = 1.0f; + ratio1 = 1.0f; + ratio2 = 1.0f; + ratio3 = 1.0f; +} + +mot_blend::mot_blend() : field_30(), mot_key_data(), mot_play_data() { + +} + +mot_blend::~mot_blend() { + mot_key_data_free(&mot_key_data); +} + +rob_chara_bone_data::rob_chara_bone_data() : field_0(), field_1(), object_bone_count(), +total_bone_count(), motion_bone_count(), ik_bone_count(), chain_pos(), +field_758(), field_76C(), field_778(), field_784(), field_788(), field_958() { + base_skeleton_type = BONE_DATABASE_SKELETON_NONE; + skeleton_type = BONE_DATABASE_SKELETON_NONE; +} + +rob_chara_bone_data::~rob_chara_bone_data() { + for (motion_blend_mot*& i : motions) + delete i; +} + +rob_chara_pv_data::rob_chara_pv_data() { + type = ROB_CHARA_TYPE_2; + field_4 = true; + field_5 = false; + field_6 = false; + field_8 = vec3_null; + rot_y_int16 = 0x00; + field_16 = 0xC9; + field_18 = {}; + field_44 = {}; + field_70 = 0; + field_74[0] = -1; + field_74[1] = -1; + field_74[2] = -1; + field_74[3] = -1; + field_74[4] = -1; + field_74[5] = -1; + field_74[6] = -1; + field_74[7] = -1; + field_74[8] = -1; + field_74[9] = -1; + chara_size_index = 1; + height_adjust = false; + item_no[0] = 0; + item_no[1] = 0; + item_no[2] = 0; + item_no[3] = 0; + eyes_adjust.base_adjust = EYES_BASE_ADJUST_DIRECTION; + eyes_adjust.neg = -1.0f; + eyes_adjust.pos = -1.0f; +} + +rob_chara_pv_data::~rob_chara_pv_data() { + } ExNodeBlock::ExNodeBlock() : bone_node_ptr(), type(), name(), parent_bone_node(), -parent_name(), parent_node(), item_equip_object(), field_58(), field_59(), field_5A() { - ExNodeBlock::InitMembers(); +parent_name(), parent_node(), item_equip_object(), field_58(), field_59(), has_parent_node() { + } ExNodeBlock::~ExNodeBlock() { - string_free(&parent_name); + } void ExNodeBlock::Field_10() { @@ -6621,24 +10416,20 @@ void ExNodeBlock::Field_58() { field_59 = false; } -void ExNodeBlock::InitData(ExNodeBlock* node, bone_node* bone_node, ex_node_type type, - char* name, rob_chara_item_equip_object* itm_eq_obj) { - node->bone_node_ptr = bone_node; - node->type = type; +void ExNodeBlock::InitData(bone_node* bone_node, ex_node_type type, + const char* name, rob_chara_item_equip_object* itm_eq_obj) { + bone_node_ptr = bone_node; + this->type = type; if (name) - node->name = name; + this->name = name; else - node->name = (char*)"(null)"; - node->parent_bone_node = 0; - node->item_equip_object = itm_eq_obj; -} - -void ExNodeBlock::InitMembers() { - + this->name = "(null)"; + parent_bone_node = 0; + item_equip_object = itm_eq_obj; } ExNullBlock::ExNullBlock() { - ExNullBlock::InitMembers(); + Init(); } ExNullBlock::~ExNullBlock() { @@ -6658,15 +10449,14 @@ void ExNullBlock::Field_10() { field_59 = false; } -void ExNullBlock::Field_18(int32_t a2, bool a3) { +void ExNullBlock::Field_18(int32_t stage, bool a3) { } -void ExNullBlock::Update() { +void ExNullBlock::Field_20() { if (!bone_node_ptr) return; - bone_node* parent_bone_node = this->parent_bone_node; mat4 mat; mat4 ex_data_mat = *parent_bone_node->ex_data_mat; bone_node_expression_data_mat_set(&bone_node_ptr->exp_data, @@ -6675,8 +10465,8 @@ void ExNullBlock::Update() { *bone_node_ptr->mat = mat; } -void ExNullBlock::Field_28() { - Update(); +void ExNullBlock::SetOsagePlayData() { + Field_20(); } void ExNullBlock::Disp() { @@ -6692,7 +10482,7 @@ void ExNullBlock::Field_40() { } void ExNullBlock::Field_48() { - Update(); + Field_20(); } void ExNullBlock::Field_50() { @@ -6703,24 +10493,20 @@ void ExNullBlock::Field_58() { field_59 = false; } -void ExNullBlock::InitData(ExNullBlock* null, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_constraint* cns_data, char* cns_data_name, bone_database* bone_data) { +void ExNullBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, + object_skin_block_constraint* cns_data, const char* cns_data_name, bone_database* bone_data) { bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( itm_eq_obj, cns_data_name, bone_data); - null->type = EX_NONE; - null->bone_node_ptr = node; - null->cns_data = cns_data; - null->name = node->name; - null->item_equip_object = itm_eq_obj; -} - -void ExNullBlock::InitMembers() { - Init(); + type = EX_NONE; + bone_node_ptr = node; + this->cns_data = cns_data; + name = node->name; + item_equip_object = itm_eq_obj; } ExConstraintBlock::ExConstraintBlock() : constraint_type(), -source_node_bone_node(), direction_up_vector_old_bone_node(), cns_data() { - ExConstraintBlock::InitMembers(); +source_node_bone_node(), direction_up_vector_bone_node(), cns_data() { + Init(); } ExConstraintBlock::~ExConstraintBlock() { @@ -6730,39 +10516,38 @@ ExConstraintBlock::~ExConstraintBlock() { void ExConstraintBlock::Init() { constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_NONE; source_node_bone_node = 0; - direction_up_vector_old_bone_node = 0; + direction_up_vector_bone_node = 0; cns_data = 0; field_80 = 0; } void ExConstraintBlock::Field_10() { if (bone_node_ptr) { - bone_node_expression_data* exp_data = &bone_node_ptr->exp_data; - object_skin_block_constraint* cns_data = this->cns_data; - exp_data->position = cns_data->base.position; - exp_data->rotation = cns_data->base.rotation; - exp_data->scale = cns_data->base.scale; + bone_node_expression_data* node_exp_data = &bone_node_ptr->exp_data; + node_exp_data->position = cns_data->base.position; + node_exp_data->rotation = cns_data->base.rotation; + node_exp_data->scale = cns_data->base.scale; } field_59 = false; } -void ExConstraintBlock::Field_18(int32_t a2, bool a3) { +void ExConstraintBlock::Field_18(int32_t stage, bool a3) { if (field_59) return; - if (a2 == 0) { + if (stage == 0) { if (field_58) - Update(); + Field_20(); } - else if (a2 == 2) { - if (field_5A) - DataSet(this); + else if (stage == 2) { + if (has_parent_node) + DataSet(); } - else if (a2 == 5) - Update(); + else if (stage == 5) + Field_20(); } -void ExConstraintBlock::Update() { +void ExConstraintBlock::Field_20() { if (!parent_bone_node) return; @@ -6771,13 +10556,13 @@ void ExConstraintBlock::Update() { return; } - Calc(this); - DataSet(this); + Calc(); + DataSet(); field_59 = true; } -void ExConstraintBlock::Field_28() { - Update(); +void ExConstraintBlock::SetOsagePlayData() { + Field_20(); } void ExConstraintBlock::Disp() { @@ -6793,17 +10578,194 @@ void ExConstraintBlock::Field_40() { } void ExConstraintBlock::Field_48() { - Update(); + Field_20(); } void ExConstraintBlock::Field_50() { - Update(); + Field_20(); } void ExConstraintBlock::Field_58() { field_59 = false; } +void ExConstraintBlock::Calc() { + bone_node* node = bone_node_ptr; + if (!node) + return; + + vec3 pos; + vec3_mult(parent_bone_node->exp_data.parent_scale, node->exp_data.position, pos); + + mat4 mat; + mat4_translate_mult(parent_bone_node->ex_data_mat, pos.x, pos.y, pos.z, &mat); + + switch (constraint_type) { + case OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION: { + vec3 trans; + mat4_get_translation(&mat, &trans); + + mat3 rot; + mat3_from_mat4(source_node_bone_node->mat, &rot); + mat3_normalize_rotation(&rot, &rot); + + vec3 offset = cns_data->orientation.offset; + mat3_rotate_mult(&rot, offset.x, offset.y, offset.z, &rot); + + mat4_from_mat3(&rot, node->mat); + mat4_set_translation(node->mat, &trans); + } break; + case OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION: { + vec3 align_axis = cns_data->direction.align_axis; + vec3 target_offset = cns_data->direction.target_offset; + mat4_mult_vec3_trans(source_node_bone_node->mat, &target_offset, &target_offset); + mat4_mult_vec3_inv_trans(&mat, &target_offset, &target_offset); + float_t target_offset_length; + vec3_length_squared(target_offset, target_offset_length); + if (target_offset_length <= 0.000001f) + break; + + mat4 v59; + sub_1401EB410(&v59, &align_axis, &target_offset); + if (direction_up_vector_bone_node) { + vec3 affected_axis = cns_data->direction.up_vector_old.affected_axis; + mat4 v56; + mat4_mult(&v59, &mat, &v56); + mat4_mult_vec3(&v56, &affected_axis, &affected_axis); + mat4* v20 = direction_up_vector_bone_node->mat; + + vec3 v23; + vec3 v24; + mat4_get_translation(v20, &v23); + mat4_get_translation(&v56, &v24); + vec3_sub(v23, v24, v23); + + vec3 v50; + mat4_mult_vec3(&mat, &target_offset, &v50); + + vec3 v25; + vec3 v29; + vec3_cross(v50, affected_axis, v25); + vec3_cross(v50, v23, v29); + vec3_normalize(v25, v25); + vec3_normalize(v29, v29); + + vec3 v35; + vec3_cross(v25, v29, v35); + + float_t v39; + float_t v36; + vec3_dot(v29, v25, v39); + vec3_dot(v35, v50, v36); + + float_t v40; + vec3_length(v35, v40); + if (v36 >= 0.0f) + v40 = -v40; + + sub_1405F10D0(&v56, &target_offset, v39, v40); + mat4_mult(&v59, &v56, &v59); + } + mat4_mult(&v59, &mat, node->mat); + } break; + case OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION: { + vec3 constraining_offset = cns_data->position.constraining_object.offset; + vec3 constrained_offset = cns_data->position.constrained_object.offset; + if (cns_data->position.constraining_object.affected_by_orientation) + mat4_mult_vec3(source_node_bone_node->mat, &constraining_offset, &constraining_offset); + + vec3 source_node_trans; + mat4_get_translation(source_node_bone_node->mat, &source_node_trans); + vec3_add(constraining_offset, source_node_trans, source_node_trans); + mat4_set_translation(&mat, &source_node_trans); + if (direction_up_vector_bone_node) { + vec3 up_vector_old_trans; + mat4_get_translation(direction_up_vector_bone_node->mat, &up_vector_old_trans); + mat4_mult_vec3_inv_trans(&mat, &up_vector_old_trans, &up_vector_old_trans); + + mat4 v26; + sub_1401EB410(&v26, &cns_data->position.up_vector_old.affected_axis, &up_vector_old_trans); + mat4_mult(&v26, &mat, &mat); + } + if (cns_data->position.constrained_object.affected_by_orientation) + mat4_mult_vec3(&mat, &constrained_offset, &constrained_offset); + + mat4 constrained_offset_mat; + mat4_translate(constrained_offset.x, constrained_offset.y, + constrained_offset.z, &constrained_offset_mat); + mat4_mult(&mat, &constrained_offset_mat, node->mat); + } break; + case OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE: + default: + *node->mat = mat; + break; + } +} + +void ExConstraintBlock::DataSet() { + if (!bone_node_ptr) + return; + + bone_node_expression_data* exp_data = &bone_node_ptr->exp_data; + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + + mat4 mat; + mat4_inverse_normalized(parent_bone_node->ex_data_mat, &mat); + mat4_mult(bone_node_ptr->mat, &mat, &mat); + mat4_get_rotation(&mat, &bone_node_ptr->exp_data.rotation); + mat4_get_translation(&mat, &exp_data->position); + if (fabsf(parent_scale.x) > 0.000001f) + exp_data->position.x /= parent_scale.x; + if (fabsf(parent_scale.y) > 0.000001f) + exp_data->position.y /= parent_scale.z; + if (fabsf(parent_scale.z) > 0.000001f) + exp_data->position.z /= parent_scale.z; + *bone_node_ptr->ex_data_mat = *bone_node_ptr->mat; + mat4_scale_rot(bone_node_ptr->mat, parent_scale.x, parent_scale.y, parent_scale.z, bone_node_ptr->mat); + vec3_mult(exp_data->scale, parent_scale, exp_data->parent_scale); +} + +void ExConstraintBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, + object_skin_block_constraint* cns_data, const char* cns_data_name, bone_database* bone_data) { + bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( + itm_eq_obj, cns_data_name, bone_data); + type = EX_CONSTRAINT; + bone_node_ptr = node; + this->cns_data = cns_data; + name = node->name; + item_equip_object = itm_eq_obj; + + source_node_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( + itm_eq_obj, string_data(&cns_data->source_node_name), bone_data); + + object_skin_block_constraint_type type = cns_data->type; + char* up_vector_old_name; + if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION) { + constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION; + up_vector_old_name = string_data(&cns_data->direction.up_vector_old.name); + } + else if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION) { + constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION; + up_vector_old_name = string_data(&cns_data->position.up_vector_old.name); + } + else if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE) { + constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE; + up_vector_old_name = string_data(&cns_data->distance.up_vector_old.name); + } + else if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION) { + constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION; + return; + } + else { + constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_NONE; + return; + } + + if (up_vector_old_name) + direction_up_vector_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( + itm_eq_obj, up_vector_old_name, bone_data); +} + void ExConstraintBlock::sub_1405F10D0(mat4* mat, vec3* a2, float_t a3, float_t a4) { vec3 v5; vec3 v6; @@ -6849,197 +10811,9 @@ void ExConstraintBlock::sub_1401EB410(mat4* mat, vec3* a2, vec3* target_offset) sub_1405F10D0(mat, &v13, v18, v20); } -void ExConstraintBlock::Calc(ExConstraintBlock* cns) { - bone_node* node = cns->bone_node_ptr; - if (!node) - return; +ExExpressionBlock::ExExpressionBlock() : values(), types(), expressions(), +stack_data(), exp_data(), field_3D20(), field_3D28(), frame(), step(true) { - vec3 pos; - bone_node* parent_node = cns->parent_bone_node; - vec3_mult(parent_node->exp_data.parent_scale, node->exp_data.position, pos); - - mat4 mat; - mat4_translate_mult(parent_node->ex_data_mat, pos.x, pos.y, pos.z, &mat); - - bone_node* source_node_bone_node = cns->source_node_bone_node; - switch (cns->constraint_type) { - case OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION: { - object_skin_block_constraint* cns_data = cns->cns_data; - vec3 trans; - mat4_get_translation(&mat, &trans); - - mat3 rot; - mat3_from_mat4(source_node_bone_node->mat, &rot); - mat3_normalize_rotation(&rot, &rot); - - vec3 offset = cns_data->orientation.offset; - mat3_rotate_mult(&rot, offset.x, offset.y, offset.z, &rot); - - mat4_from_mat3(&rot, node->mat); - mat4_set_translation(node->mat, &trans); - } break; - case OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION: { - object_skin_block_constraint* cns_data = cns->cns_data; - vec3 align_axis = cns_data->direction.align_axis; - vec3 target_offset = cns_data->direction.target_offset; - mat4_mult_vec3_trans(source_node_bone_node->mat, &target_offset, &target_offset); - mat4_mult_vec3_inv_trans(&mat, &target_offset, &target_offset); - float_t target_offset_length; - vec3_length_squared(target_offset, target_offset_length); - if (target_offset_length <= 0.000001f) - break; - - mat4 v59; - sub_1401EB410(&v59, &align_axis, &target_offset); - if (cns->direction_up_vector_old_bone_node) { - vec3 affected_axis = cns_data->direction.up_vector_old.affected_axis; - mat4 v56; - mat4_mult(&v59, &mat, &v56); - mat4_mult_vec3(&v56, &affected_axis, &affected_axis); - mat4* v20 = cns->direction_up_vector_old_bone_node->mat; - - vec3 v23; - vec3 v24; - mat4_get_translation(v20, &v23); - mat4_get_translation(&v56, &v24); - vec3_sub(v23, v24, v23); - - vec3 v50; - mat4_mult_vec3(&mat, &target_offset, &v50); - - vec3 v25; - vec3 v29; - vec3_cross(v50, affected_axis, v25); - vec3_cross(v50, v23, v29); - vec3_normalize(v25, v25); - vec3_normalize(v29, v29); - - vec3 v35; - vec3_cross(v25, v29, v35); - - float_t v39; - float_t v36; - vec3_dot(v29, v25, v39); - vec3_dot(v35, v50, v36); - - float_t v40; - vec3_length(v35, v40); - if (v36 >= 0.0f) - v40 = -v40; - - sub_1405F10D0(&v56, &target_offset, v39, v40); - mat4_mult(&v59, &v56, &v59); - } - mat4_mult(&v59, &mat, node->mat); - } break; - case OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION: { - object_skin_block_constraint* cns_data = cns->cns_data; - vec3 constraining_offset = cns_data->position.constraining_object.offset; - vec3 constrained_offset = cns_data->position.constrained_object.offset; - if (cns_data->position.constraining_object.affected_by_orientation) - mat4_mult_vec3(source_node_bone_node->mat, &constraining_offset, &constraining_offset); - - vec3 source_node_trans; - mat4_get_translation(source_node_bone_node->mat, &source_node_trans); - vec3_add(constraining_offset, source_node_trans, source_node_trans); - mat4_set_translation(&mat, &source_node_trans); - if (cns->direction_up_vector_old_bone_node) { - vec3 up_vector_old_trans; - mat4_get_translation(cns->direction_up_vector_old_bone_node->mat, &up_vector_old_trans); - mat4_mult_vec3_inv_trans(&mat, &up_vector_old_trans, &up_vector_old_trans); - - mat4 v26; - sub_1401EB410(&v26, &cns_data->position.up_vector_old.affected_axis, &up_vector_old_trans); - mat4_mult(&v26, &mat, &mat); - } - if (cns_data->position.constrained_object.affected_by_orientation) - mat4_mult_vec3(&mat, &constrained_offset, &constrained_offset); - - mat4 constrained_offset_mat; - mat4_translate(constrained_offset.x, constrained_offset.y, - constrained_offset.z, &constrained_offset_mat); - mat4_mult(&mat, &constrained_offset_mat, node->mat); - } break; - case OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE: - default: - *node->mat = mat; - break; - } -} - -void ExConstraintBlock::DataSet(ExConstraintBlock* cns) { - if (!cns->bone_node_ptr) - return; - - bone_node* node = cns->bone_node_ptr; - bone_node_expression_data* exp_data = &node->exp_data; - bone_node* parent_node = cns->parent_bone_node; - vec3 parent_scale = parent_node->exp_data.parent_scale; - - mat4 mat; - mat4_inverse_normalized(parent_node->ex_data_mat, &mat); - mat4_mult(node->mat, &mat, &mat); - mat4_get_rotation(&mat, &node->exp_data.rotation); - mat4_get_translation(&mat, &exp_data->position); - if (fabsf(parent_scale.x) > 0.000001f) - exp_data->position.x /= parent_scale.x; - if (fabsf(parent_scale.y) > 0.000001f) - exp_data->position.y /= parent_scale.z; - if (fabsf(parent_scale.z) > 0.000001f) - exp_data->position.z /= parent_scale.z; - *node->ex_data_mat = *node->mat; - mat4_scale_rot(node->mat, parent_scale.x, parent_scale.y, parent_scale.z, node->mat); - vec3_mult(exp_data->scale, parent_scale, exp_data->parent_scale); -} - -void ExConstraintBlock::InitData(ExConstraintBlock* cns, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_constraint* cns_data, char* cns_data_name, bone_database* bone_data) { - bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( - itm_eq_obj, cns_data_name, bone_data); - cns->type = EX_CONSTRAINT; - cns->bone_node_ptr = node; - cns->cns_data = cns_data; - cns->name = node->name; - cns->item_equip_object = itm_eq_obj; - - cns->source_node_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( - itm_eq_obj, string_data(&cns_data->source_node_name), bone_data); - - object_skin_block_constraint_type type = cns_data->type; - char* up_vector_old_name; - if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION) { - cns->constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION; - up_vector_old_name = string_data(&cns_data->direction.up_vector_old.name); - } - else if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION) { - cns->constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION; - up_vector_old_name = string_data(&cns_data->position.up_vector_old.name); - } - else if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE) { - cns->constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE; - up_vector_old_name = string_data(&cns_data->distance.up_vector_old.name); - } - else if (type == OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION) { - cns->constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION; - return; - } - else { - cns->constraint_type = OBJECT_SKIN_BLOCK_CONSTRAINT_NONE; - return; - } - - if (up_vector_old_name) - cns->direction_up_vector_old_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( - itm_eq_obj, up_vector_old_name, bone_data); -} - -void ExConstraintBlock::InitMembers() { - Init(); -} - -ExExpressionBlock::ExExpressionBlock() : stack_data(), exp_data(), -expressions(), types(), field_3D20(), frame(), field_3D28(), step(true) { - ExExpressionBlock::InitMembers(); } ExExpressionBlock::~ExExpressionBlock() { @@ -7051,31 +10825,30 @@ void ExExpressionBlock::Init() { } void ExExpressionBlock::Field_10() { - bone_node_expression_data* exp_data = &bone_node_ptr->exp_data; - object_skin_block_expression* exp_exp_data = this->exp_data; - exp_data->position = exp_exp_data->base.position; - exp_data->rotation = exp_exp_data->base.rotation; - exp_data->scale = exp_exp_data->base.scale; + bone_node_expression_data* node_exp_data = &bone_node_ptr->exp_data; + node_exp_data->position = exp_data->base.position; + node_exp_data->rotation = exp_data->base.rotation; + node_exp_data->scale = exp_data->base.scale; field_59 = false; } -void ExExpressionBlock::Field_18(int32_t a2, bool a3) { +void ExExpressionBlock::Field_18(int32_t stage, bool a3) { if (field_59) return; - if (a2 == 0) { + if (stage == 0) { if (field_58) - Update(); + Field_20(); } - else if (a2 == 2) { - if (field_5A) - DataSet(this); + else if (stage == 2) { + if (has_parent_node) + DataSet(); } - else if (a2 == 5) - Update(); + else if (stage == 5) + Field_20(); } -void ExExpressionBlock::Update() { +void ExExpressionBlock::Field_20() { if (!parent_bone_node) return; @@ -7084,13 +10857,13 @@ void ExExpressionBlock::Update() { return; } - Calc(this); - DataSet(this); + Calc(); + DataSet(); field_59 = true; } -void ExExpressionBlock::Field_28() { - Update(); +void ExExpressionBlock::SetOsagePlayData() { + Field_20(); } void ExExpressionBlock::Disp() { @@ -7106,75 +10879,73 @@ void ExExpressionBlock::Field_40() { } void ExExpressionBlock::Field_48() { - Update(); + Field_20(); } void ExExpressionBlock::Field_50() { - Update(); + Field_20(); } void ExExpressionBlock::Field_58() { field_59 = false; } -void ExExpressionBlock::Calc(ExExpressionBlock* exp) { +void ExExpressionBlock::Calc() { float_t delta_frame = get_delta_frame(); - if (exp->step) - delta_frame *= exp->item_equip_object->item_equip->step; - float_t frame = exp->frame + delta_frame; - exp->frame = frame >= 65535.0f ? frame - 65535.0f : frame; + if (step) + delta_frame *= item_equip_object->item_equip->step; + float_t frame = this->frame + delta_frame; + this->frame = frame >= 65535.0f ? frame - 65535.0f : frame; - if (exp->field_3D28) { - exp->field_3D28(&exp->bone_node_ptr->exp_data); + if (field_3D28) { + field_3D28(&bone_node_ptr->exp_data); return; } for (int32_t i = 0; i < 9; i++) { - if (!exp->expressions[i]) + if (!expressions[i]) break; - float_t value = ex_expression_block_stack_get_value(exp->expressions[i]); - if (exp->types[i] == EX_EXPRESSION_BLOCK_STACK_VARIABLE_RADIAN) + float_t value = ex_expression_block_stack_get_value(expressions[i]); + if (types[i] == EX_EXPRESSION_BLOCK_STACK_VARIABLE_RADIAN) value *= DEG_TO_RAD_FLOAT; - *exp->values[i] = value; + *values[i] = value; } } -void ExExpressionBlock::DataSet(ExExpressionBlock* exp) { - bone_node* node = exp->bone_node_ptr; - bone_node* parent_node = exp->parent_bone_node; - bone_node_expression_data* data = &node->exp_data; - vec3 parent_scale = exp->parent_bone_node->exp_data.parent_scale; - mat4 ex_data_mat = *parent_node->ex_data_mat; +void ExExpressionBlock::DataSet() { + bone_node_expression_data* data = &bone_node_ptr->exp_data; + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + mat4 ex_data_mat = *parent_bone_node->ex_data_mat; mat4 mat = mat4_identity; bone_node_expression_data_mat_set(data, &parent_scale, &ex_data_mat, &mat); - *node->mat = mat; - *node->ex_data_mat = ex_data_mat; + *bone_node_ptr->mat = mat; + *bone_node_ptr->ex_data_mat = ex_data_mat; } -void ExExpressionBlock::InitData(ExExpressionBlock* exp, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_expression* exp_data, char* exp_data_name, object_info a4, +void ExExpressionBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, + object_skin_block_expression* exp_data, const char* exp_data_name, object_info a4, size_t index, bone_database* bone_data) { ex_expression_block_stack* stack_buf[28]; ex_expression_block_stack** stack_buf_val = stack_buf; bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( itm_eq_obj, exp_data_name, bone_data); - exp->type = EX_EXPRESSION; - exp->bone_node_ptr = node; - exp->exp_data = exp_data; - exp->name = node->name; - exp->item_equip_object = itm_eq_obj; + type = EX_EXPRESSION; + bone_node_ptr = node; + this->exp_data = exp_data; + name = node->name; + item_equip_object = itm_eq_obj; node->exp_data.position = exp_data->base.position; node->exp_data.rotation = exp_data->base.rotation; node->exp_data.scale = exp_data->base.scale; - exp->field_3D28 = 0; + field_3D28 = 0; - ex_expression_block_stack* stack_val = exp->stack_data; + ex_expression_block_stack* stack_val = stack_data; for (int32_t i = 0; i < 9; i++) { - exp->values[i] = 0; - exp->expressions[i] = 0; + values[i] = 0; + expressions[i] = 0; } for (int32_t i = 0; i < 9; i++) { @@ -7186,7 +10957,7 @@ void ExExpressionBlock::InitData(ExExpressionBlock* exp, rob_chara_item_equip_ob int32_t index = 0; expression = str_utils_get_next_int32_t(expression, &index, ' '); - exp->values[i] = bone_node_get_exp_data_component(exp->bone_node_ptr, index, &exp->types[i]); + values[i] = bone_node_get_exp_data_component(bone_node_ptr, index, &types[i]); while (expression) { string v73; @@ -7217,7 +10988,7 @@ void ExExpressionBlock::InitData(ExExpressionBlock* exp, rob_chara_item_equip_ob } } else - stack_val->var.value = &exp->frame; + stack_val->var.value = &frame; *stack_buf_val++ = stack_val; string_free(&func_str); } @@ -7254,16 +11025,16 @@ void ExExpressionBlock::InitData(ExExpressionBlock* exp, rob_chara_item_equip_ob string_free(&func_str); } string_free(&v73); - exp->expressions[i] = stack_buf_val[-1]; + expressions[i] = stack_buf_val[-1]; stack_val++; } } - exp->step = !((ssize_t)index - ITEM_TE_R <= 1); + step = !((ssize_t)index - ITEM_TE_R <= 1); } -void ExExpressionBlock::InitMembers() { - +ExOsageBlock::ExOsageBlock() : rob(), mats(), step(1.0f) { + Reset(); } ExOsageBlock::~ExOsageBlock() { @@ -7271,10 +11042,6 @@ ExOsageBlock::~ExOsageBlock() { rob_osage_free(&rob); } -void ExOsageBlock::InitMembers() { - Reset(); -} - void ExOsageBlock::Init() { Reset(); } @@ -7283,34 +11050,32 @@ void ExOsageBlock::Field_10() { field_59 = false; } -void ExOsageBlock::Field_18(int32_t a2, bool a3) { - rob_chara_item_equip* rob_item_equip = item_equip_object->item_equip; - float_t step = get_delta_frame() * rob_item_equip->step; - if (rob_item_equip->field_940.begin != rob_item_equip->field_940.end - && rob_item_equip->field_940.begin->field_C) +void ExOsageBlock::Field_18(int32_t stage, bool a3) { + rob_chara_item_equip* rob_itm_equip = item_equip_object->item_equip; + float_t step = get_delta_frame() * rob_itm_equip->step; + if (rob_itm_equip->opd_blend_data.size() && rob_itm_equip->opd_blend_data[0].field_C) step = 1.0f; - bone_node* parent_node = parent_bone_node; - mat4* parent_node_mat = parent_node->ex_data_mat; - vec3 parent_scale = parent_node->exp_data.parent_scale; - switch (a2) { - case 0: { - sub_1404803B0(&rob, parent_node_mat, &parent_scale, field_5A); - } break; + mat4* parent_node_mat = parent_bone_node->ex_data_mat; + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + switch (stage) { + case 0: + sub_1404803B0(&rob, parent_node_mat, &parent_scale, has_parent_node); + break; case 1: - case 2: { - if ((a2 == 1 && field_58) || (a2 == 2 && rob.field_2A0)) { - SetWindDirection(this); - sub_14047C800(&rob, parent_node_mat, &parent_scale, step, a3, true, field_5A); + case 2: + if ((stage == 1 && field_58) || (stage == 2 && rob.field_2A0)) { + SetWindDirection(); + sub_14047C800(&rob, parent_node_mat, &parent_scale, step, a3, true, has_parent_node); } - } break; - case 3: { - rob_osage_coli_set(&rob, mat); + break; + case 3: + rob_osage_coli_set(&rob, mats); sub_14047ECA0(&rob, step); - } break; - case 4: { + break; + case 4: sub_14047D620(&rob, step); - } break; + break; case 5: { sub_14047D8C0(&rob, parent_node_mat, &parent_scale, step, false); sub_140480260(&rob, parent_node_mat, &parent_scale, step, a3); @@ -7319,38 +11084,35 @@ void ExOsageBlock::Field_18(int32_t a2, bool a3) { } } -void ExOsageBlock::Update() { +void ExOsageBlock::Field_20() { field_1FF8 &= ~2; if (field_59) { field_59 = false; return; } - rob_chara_item_equip* rob_item_equip = item_equip_object->item_equip; - float_t step = get_delta_frame() * rob_item_equip->step; - if (rob_item_equip->field_940.begin != rob_item_equip->field_940.end - && rob_item_equip->field_940.begin->field_C) + rob_chara_item_equip* rob_itm_equip = item_equip_object->item_equip; + float_t step = get_delta_frame() * rob_itm_equip->step; + if (rob_itm_equip->opd_blend_data.size() && rob_itm_equip->opd_blend_data[0].field_C) step = 1.0f; - bone_node* parent_node = parent_bone_node; - vec3 parent_scale = parent_node->exp_data.parent_scale; - vec3 scale = parent_node->exp_data.scale; + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + vec3 scale = parent_bone_node->exp_data.scale; - mat4 mat = *parent_node->ex_data_mat; + mat4 mat = *parent_bone_node->ex_data_mat; if (scale.x != 1.0f || scale.y != 1.0f || scale.z != 1.0f) { vec3_div(vec3_identity, scale, scale); mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat); } - SetWindDirection(this); - rob_osage_coli_set(&rob, this->mat); - sub_14047C770(&rob, &mat, &parent_scale, step, false); + SetWindDirection(); + rob_osage_coli_set(&rob, mats); + sub_14047C750(&rob, &mat, &parent_scale, step); } -void ExOsageBlock::Field_28() { - //rob_chara_item_equip* rob_itm_equip = item_equip_object->item_equip; - //bone_node* parent_node = parent_bone_node; - //vec3 parent_scale = parent_node->exp_data.parent_scale; - //sub_14047E240(&rob, parent_node->ex_data_mat, &parent_scale, &rob_itm_equip->field_940); +void ExOsageBlock::SetOsagePlayData() { + rob_chara_item_equip* rob_itm_equip = item_equip_object->item_equip; + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + sub_14047E240(&rob, parent_bone_node->ex_data_mat, &parent_scale, &rob_itm_equip->opd_blend_data); } void ExOsageBlock::Disp() { @@ -7359,9 +11121,9 @@ void ExOsageBlock::Disp() { void ExOsageBlock::Reset() { index = 0; - rob_osage_init(&rob); + rob_osage_reset(&rob); field_1FF8 &= ~3; - mat = 0; + mats = 0; step = 1.0f; ExNodeBlock::Reset(); } @@ -7372,95 +11134,98 @@ void ExOsageBlock::Field_40() { void ExOsageBlock::Field_48() { step = 4.0f; - SetWindDirection(this); - rob_osage_coli_set(&rob, mat); - bone_node* parent_node = parent_bone_node; - vec3 parent_scale = parent_node->exp_data.parent_scale; - sub_14047F990(&rob, parent_node->ex_data_mat, &parent_scale, 0); + SetWindDirection(); + rob_osage_coli_set(&rob, mats); + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + sub_14047F990(&rob, parent_bone_node->ex_data_mat, &parent_scale, 0); field_1FF8 &= ~2; } void ExOsageBlock::Field_50() { if (field_59) { - field_59 = 0; + field_59 = false; return; } - SetWindDirection(this); + SetWindDirection(); - bone_node* parent_node = parent_bone_node; - vec3 parent_scale = parent_node->exp_data.parent_scale; - rob_osage_coli_set(&rob, mat); - sub_14047C770(&rob, parent_node->ex_data_mat, &parent_scale, step, 1); + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; + rob_osage_coli_set(&rob, mats); + sub_14047C770(&rob, parent_bone_node->ex_data_mat, &parent_scale, step, 1); float_t step = 0.5f * this->step; this->step = max(step, 1.0f); } void ExOsageBlock::Field_58() { - bone_node* parent_node = parent_bone_node; - vec3 parent_scale = parent_node->exp_data.parent_scale; + vec3 parent_scale = parent_bone_node->exp_data.parent_scale; sub_14047E1C0(&rob, &parent_scale); field_59 = false; } -void ExOsageBlock::InitData(ExOsageBlock* osg, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_osage* osg_data, char* osg_data_name, object_skin_osage_node* osg_nodes, +void ExOsageBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, + object_skin_block_osage* osg_data, const char* osg_data_name, object_skin_osage_node* osg_nodes, bone_node* bone_nodes, bone_node* ex_data_bone_nodes, object_skin* skin) { - ExNodeBlock::InitData(osg, &ex_data_bone_nodes[osg_data->external_name_index & 0x7FFF], + ExNodeBlock::InitData(&ex_data_bone_nodes[osg_data->external_name_index & 0x7FFF], EX_OSAGE, osg_data_name, itm_eq_obj); - rob_osage_init_data(&osg->rob, osg_data, osg_nodes, ex_data_bone_nodes, skin); - osg->field_1FF8 &= ~2; - osg->mat = bone_nodes->mat; + rob_osage_init_data(&rob, osg_data, osg_nodes, ex_data_bone_nodes, skin); + field_1FF8 &= ~2; + mats = bone_nodes->mat; } -void ExOsageBlock::SetWindDirection(ExOsageBlock* osg) { - vec3_mult_scalar(wind_ptr->wind_direction, - osg->item_equip_object->item_equip->wind_strength, - osg->rob.wind_direction); +float_t* ExOsageBlock::LoadOpdData(size_t node_index, float_t* opd_data, size_t opd_count) { + return rob_osage_load_opd_data(&rob, node_index, opd_data, opd_count); } -void ExOsageBlock::sub_1405F3E10(ExOsageBlock* osg, object_skin_block_osage* osg_data, - object_skin_osage_node* osg_nodes, vector_old_pair_uint32_t_ptr_rob_osage_node* a4, - vector_old_pair_name_ExOsageBlock* a5) { - rob_osage* v5 = &osg->rob; +void ExOsageBlock::SetMotionResetData(int32_t motion_id, float_t frame) { + rob_osage_set_motion_reset_data(&rob, motion_id, frame); +} - rob_osage_node* v9 = rob_osage_get_node(&osg->rob, 0); - pair_uint32_t_ptr_rob_osage_node* v38 - = vector_old_pair_uint32_t_ptr_rob_osage_node_reserve_back(a4); - v38->key = osg_data->external_name_index; - v38->value = v9; +void ExOsageBlock::SetOsageReset() { + rob.osage_reset = true; +} - for (size_t i = 0; i < osg_data->count; i++) { - v9 = rob_osage_get_node(v5, i); - v38 = vector_old_pair_uint32_t_ptr_rob_osage_node_reserve_back(a4); - v38->key = osg_nodes[i].name_index; - v38->value = v9; - - if (v9->bone_node_ptr && v9->bone_node_ptr->name) { - pair_name_ExOsageBlock* v39 = vector_old_pair_name_ExOsageBlock_reserve_back(a5); - v39->name = v9->bone_node_ptr->name; - v39->block = osg; - } +void ExOsageBlock::SetSkinParam(struc_571* skp) { + if (skp->nodes_data.size() == rob.nodes.size() - 1) { + size_t node_index = 0; + for (auto i = rob.nodes.begin() + 1; i != rob.nodes.end(); i++) + i->data_ptr = &skp->nodes_data[node_index++]; } - - v9 = rob_osage_get_node(v5, osg_data->count + 1ULL); - v38 = vector_old_pair_uint32_t_ptr_rob_osage_node_reserve_back(a4); - v38->key = osg_data->name_index; - v38->value = v9; - - if (v9->bone_node_ptr && v9->bone_node_ptr->name) { - pair_name_ExOsageBlock* v39 = vector_old_pair_name_ExOsageBlock_reserve_back(a5); - v39->name = v9->bone_node_ptr->name; - v39->block = osg; + else { + rob.skin_param_ptr = &rob.skin_param; + for (rob_osage_node& i : rob.nodes) + i.data_ptr = &i.data; } } -ExOsageBlock::ExOsageBlock() : rob(), mat(), step() { - ExOsageBlock::InitMembers(); +void ExOsageBlock::SetWindDirection() { + vec3_mult_scalar(task_wind.ptr->wind_direction, + item_equip_object->item_equip->wind_strength, + rob.wind_direction); +} + +void ExOsageBlock::sub_1405F3E10(object_skin_block_osage* osg_data, + object_skin_osage_node* osg_nodes, std::vector>* a4, + std::map* a5) { + rob_osage_node* v9 = rob_osage_get_node(&rob, 0); + a4->push_back({ osg_data->external_name_index, v9 }); + + for (int32_t i = 0; i < osg_data->count; i++) { + v9 = rob_osage_get_node(&rob, i); + a4->push_back({ osg_nodes[i].name_index, v9 }); + + if (v9->bone_node_ptr && v9->bone_node_ptr->name) + a5->insert({ v9->bone_node_ptr->name, this }); + } + + v9 = rob_osage_get_node(&rob, osg_data->count + 1ULL); + a4->push_back({ osg_data->name_index, v9 }); + + if (v9->bone_node_ptr && v9->bone_node_ptr->name) + a5->insert({ v9->bone_node_ptr->name, this }); } ExClothBlock::ExClothBlock() { - ExClothBlock::InitMembers(); + Init(); } ExClothBlock::~ExClothBlock() { @@ -7478,23 +11243,22 @@ void ExClothBlock::Field_10() { field_59 = false; } -void ExClothBlock::Field_18(int32_t a2, bool a3) { +void ExClothBlock::Field_18(int32_t stage, bool a3) { } -void ExClothBlock::Update() { +void ExClothBlock::Field_20() { //sub_14021FD00(&rob, field_2428); //rob.__vftable->set_wind_direction(&rob, wind_task_struct_get_wind_direction()); - rob_chara_item_equip* rob_item_equip = item_equip_object->item_equip; - float_t step = get_delta_frame() * rob_item_equip->step; - if (rob_item_equip->field_940.begin != rob_item_equip->field_940.end - && rob_item_equip->field_940.begin->field_C) + rob_chara_item_equip* rob_itm_equip = item_equip_object->item_equip; + float_t step = get_delta_frame() * rob_itm_equip->step; + if (rob_itm_equip->opd_blend_data.size() && rob_itm_equip->opd_blend_data[0].field_C) step = 1.0f; //sub_140218560(&rob, step, 0); } -void ExClothBlock::Field_28() { - //sub_140218E40(&cls->rob, &cls->base.item_equip_object->item_equip->field_940); +void ExClothBlock::SetOsagePlayData() { + //sub_140218E40(&cls->rob, &cls->base.item_equip_object->item_equip->opd_blend_data); } void ExClothBlock::Disp() { @@ -7525,224 +11289,782 @@ void ExClothBlock::Field_58() { field_59 = false; } -void ExClothBlock::InitMembers() { - Init(); +float_t* ExClothBlock::LoadOpdData(size_t node_index, float_t* opd_data, size_t opd_count) { + return opd_data;//rob_cloth_load_opd_data(&rob, node_index, opd_data, opd_count); } -RobImplTask::RobImplTask() : init_chara(), ctrl_chara(), free_chara() { - InitMembers(); +void ExClothBlock::SetMotionResetData(int32_t motion_id, float_t frame) { + //rob_cloth::set_motion_reset_data(&rob, motion_id, frame); } -RobImplTask::~RobImplTask() { +void ExClothBlock::SetOsageReset() { + //rob.osage_reset = true; +} + +void ExClothBlock::SetSkinParam(struc_571* skp) { + //rob.skin_param_ptr = &skp->skin_param; +} + +skin_param_hinge::skin_param_hinge() { + ymin = -90.0f; + ymax = 90.0f; + zmin = -90.0f; + zmax = 90.0f; +} + +skin_param_hinge::~skin_param_hinge() { } -bool RobImplTask::Init() { - return true; +void skin_param_hinge::limit() { + ymin = max(ymin, -179.0f) * DEG_TO_RAD_FLOAT; + ymax = min(ymax, 179.0f) * DEG_TO_RAD_FLOAT; + zmin = max(zmin, -179.0f) * DEG_TO_RAD_FLOAT; + zmax = min(zmax, 179.0f) * DEG_TO_RAD_FLOAT; } -bool RobImplTask::Ctrl() { - return false; +skin_param_osage_node::skin_param_osage_node() : coli_r(0.0f), weight(1.0f), inertial_cancel(0.0f) { + hinge.limit(); } -bool RobImplTask::Dest() { - return true; -} - -void RobImplTask::Disp() { +skin_param_osage_node::~skin_param_osage_node() { } -void RobImplTask::InitMembers() { +rob_osage_node_data::rob_osage_node_data() : force(), normal_ref() { } -TaskRobManager::TaskRobManager() : field_68(), field_6C(), init_chara(), -load_chara(), free_chara(), loaded_chara(), bone_data(), mot_db() { - InitMembers(); -} - -TaskRobManager::~TaskRobManager() { +rob_osage_node_data::~rob_osage_node_data() { } -bool TaskRobManager::Init() { - return true; +rob_osage_node::rob_osage_node() : length(), trans(), trans_orig(), trans_diff(), field_28(), +child_length(), bone_node_ptr(), bone_node_mat(), sibling_node(), max_distance(), field_94(), +reset_data(), field_C8(), field_CC(1.0f), external_force(), force(1.0f), mat(), field_1B0() { + data_ptr = &data; + opd_data.resize(3); } -bool TaskRobManager::Ctrl() { - return false; -} - -bool TaskRobManager::Dest() { - return true; -} - -void TaskRobManager::Disp() { +rob_osage_node::~rob_osage_node() { } -void TaskRobManager::InitMembers() { +skin_param_osage_root_coli::skin_param_osage_root_coli() : type(), +bone0_index(), bone1_index(), radius(0.2f), bone0_pos(), bone1_pos() { } -void task_rob_manager_init() { - task_rob_manager.init_chara = vector_old_ptr_empty(rob_chara); - task_rob_manager.load_chara = vector_old_ptr_empty(rob_chara); - task_rob_manager.free_chara = vector_old_ptr_empty(rob_chara); - task_rob_manager.loaded_chara = vector_old_ptr_empty(rob_chara); +skin_param_osage_root_coli::~skin_param_osage_root_coli() { + } -void task_rob_manager_free() { - task_rob_manager.init_chara.end = task_rob_manager.init_chara.begin; - vector_old_ptr_rob_chara_free(&task_rob_manager.init_chara, 0); - task_rob_manager.load_chara.end = task_rob_manager.load_chara.begin; - vector_old_ptr_rob_chara_free(&task_rob_manager.load_chara, 0); - task_rob_manager.free_chara.end = task_rob_manager.free_chara.begin; - vector_old_ptr_rob_chara_free(&task_rob_manager.free_chara, 0); - task_rob_manager.loaded_chara.end = task_rob_manager.loaded_chara.begin; - vector_old_ptr_rob_chara_free(&task_rob_manager.loaded_chara, 0); +skin_param_osage_root_normal_ref::skin_param_osage_root_normal_ref() { + } -bool task_rob_manager_struct_ctrl(TaskRobManager* rob_mgr) { - /*if (rob_mgr->field_68 == 0) { - if (task_rob_load_check_load_req_data()) - return 0; +skin_param_osage_root_normal_ref::~skin_param_osage_root_normal_ref() { - if (vector_old_length(rob_mgr->load_chara)) { - for (rob_chara** i = rob_mgr->load_chara.begin; i != rob_mgr->load_chara.end; i++) { - rob_chara_reset_data(*i, &(*i)->pv_data, rob_mgr->bone_data, rob_mgr->mot_db); - task_rob_manager_struct_append_loaded_chara(rob_mgr, *i); - } +} - sub_140531160(rob_mgr, &rob_mgr->load_chara); - task_rob_manager.load_chara.end = task_rob_manager.load_chara.begin; - } - rob_mgr->field_68 = 1; +skin_param_osage_root_boc::skin_param_osage_root_boc() : ed_node(), st_node() { + +} + +skin_param_osage_root_boc::~skin_param_osage_root_boc() { + +} + +skin_param_osage_root::skin_param_osage_root() : field_0(), force(), force_gain(), air_res(0.5f), +rot_y(), rot_z(), init_rot_y(), init_rot_z(), hinge_y(90.0f), hinge_z(90.0f), name("NO-PARAM"), +coli_r(), friction(), wind_afc(), yz_order(), coli_type(), stiffness(), move_cancel(-0.01f) { + coli.reserve(12); +} + +skin_param_osage_root::~skin_param_osage_root() { + +} + +skin_param::skin_param() : friction(1.0f), wind_afc(), air_res(1.0f), rot(), init_rot(), +coli_type(), stiffness(), move_cancel(-0.01f), coli_r(), force(), force_gain(), colli_tgt_osg() { + hinge.limit(); + coli.resize(12); +} + +skin_param::~skin_param() { + +} + +struc_571::struc_571() : field_88() { + +} + +struc_571::~struc_571() { + +} + +osage_coli::osage_coli() : type(), radius(), bone0_pos(), bone1_pos(), +bone_pos_diff(), bone_pos_diff_length(), bone_pos_diff_length_squared(), field_34() { + +} + +osage_coli::~osage_coli() { + +} + +osage_ring_data::osage_ring_data() : ring_rectangle_x(0.0f), ring_rectangle_y(0.0f), ring_rectangle_width(0.0f), +ring_rectangle_height(0.0f), ring_height(-1000.0f), ring_out_height(-1000.0f), field_18() { + +} + +osage_ring_data::~osage_ring_data() { + +} + +osage_setting_osg_cat::osage_setting_osg_cat() : parts(-1), exf() { + +} + +rob_osage::rob_osage() : skin_param_ptr(), osage_setting(), field_2A0(), field_2A1(), field_2A4(), +wind_direction(), field_1EB4(), yz_order(), field_1EBC(), parent_mat_ptr(), parent_mat(), move_cancel(), +field_1F0C(), osage_reset(), field_1F0E(), field_1F0F(), set_external_force(), external_force(), reset_data_list() { + +} + +rob_osage::~rob_osage() { + +} + +rob_chara_item_equip_object::rob_chara_item_equip_object() : index(), mats(), obj_info(), field_14(), +texture_data(), field_64(), alpha(), draw_task_flags(), disp(), field_A4(), mat(), osage_iterations(), +bone_nodes(), field_138(), field_1B8(), field_1C0(), use_opd(), skin_ex_data(), skin(), item_equip() { + rob_chara_item_equip_object_init_members(this, 0x12345678); +} + +rob_chara_item_equip_object::~rob_chara_item_equip_object() { + rob_chara_item_equip_object_init_members(this, 0xDDDDDDDD); +} + +rob_chara_item_equip::rob_chara_item_equip() : bone_nodes(), matrices(), item_equip_object(), field_18(), +item_equip_range(), first_item_equip_object(), max_item_equip_object(), field_A0(), shadow_type(), position(), +eyes_adjust(), field_D4(), field_D8(), field_DC(), texture_color_coeff(), wet(), wind_strength(), chara_color(), +npr_flag(), mat(), field_13C(), field_8BC(), field_8C0(), field_8C4(), field_8C8(), field_8CC(), field_8D0(), +field_8D4(), field_8D8(), field_8DC(), field_8E0(), field_8E4(), field_8E8(), field_8EC(), field_8F0(), +field_8F4(), field_8F8(), field_8FC(), field_900(), field_908(), field_910(), field_918(), field_920(), +field_928(), field_930(), step(1.0f), use_opd(), parts_short(), parts_append(), parts_white_one_l() { + item_equip_object = new rob_chara_item_equip_object[ITEM_MAX]; + wind_strength = 1.0f; + chara_color = true; + for (int32_t i = ITEM_BODY; i < ITEM_MAX; i++) + item_equip_object[i].item_equip = this; +} + +rob_chara_item_equip::~rob_chara_item_equip() { + rob_chara_item_equip_reset(this); + delete[] item_equip_object; +} + +item_sub_data_texture_change_tex::item_sub_data_texture_change_tex() : org(), chg(), changed() { + +} + +item_sub_data_texture_change_tex::~item_sub_data_texture_change_tex() { + +} + +item_sub_data_texture_change::item_sub_data_texture_change() : item_no() { + +} + +item_sub_data_texture_change::~item_sub_data_texture_change() { + +} + +item_sub_data_item_change::item_sub_data_item_change() : id() { + +} + +item_sub_data_item_change::~item_sub_data_item_change() { + +} + +rob_chara_item_sub_data::rob_chara_item_sub_data() : chara_index_1st(), chara_index_2nd(), item(), item_2nd() { + +} + +rob_chara_item_sub_data::~rob_chara_item_sub_data() { + +} + +struc_523::struc_523() : field_0(), field_1(), field_4(), field_8(), field_C(), +field_10(), field_1C(), field_20(), field_24(), field_28(), field_2C(), field_30(), +field_34(), field_38(), field_3C(), field_40(), field_44(), field_48(), field_4C(), +field_50(), field_54(), field_68(), field_70(), field_78(), field_7C(), field_80() { + +} + +struc_523::~struc_523() { + +} + +struc_264::struc_264() : field_0(), field_4(), field_18(), field_2C(), field_40(), field_54(), field_68(), +field_6C(), field_70(), field_74(), field_78(), field_7C(), field_80(), field_84(), field_88(), field_8C(), +field_90(), field_94(), field_98(), field_9C(), field_A0(), field_A4(), field_A5(), field_A8(), field_AC(), +field_B0(), eyes_adjust(), field_140(), field_144(), field_145(), field_146(), field_147(), field_148(), +field_14C(), field_150(), field_152(), field_154(), field_158(), field_15C(), field_160(), field_164(), field_168(), +field_16C(), field_170(), field_174(), field_178(), field_17C(), field_180(), field_184(), field_188(), field_18C(), +field_190(), field_194(), field_198(), field_19C(), field_1A0(), field_1A4(), field_1A8(), field_1B0(), field_1B4(), +field_1B8(), field_1BC(), field_1C0(), field_1C8(), field_1C9(), field_1CA(), field_1CC(), field_1D0(), field_1D4() { + +} + +struc_264::~struc_264() { + +} + +SubActExec::SubActExec(SubActExecType type) { + this->type = type; + field_C = 0; +}; + +SubActExec::~SubActExec() { + +}; + +SubActExecAngry::SubActExecAngry() : SubActExec(SUB_ACTION_EXECUTE_ANGRY) { + +}; + +SubActExecAngry::~SubActExecAngry() { + +}; + +void SubActExecAngry::Field_8() { + type = SUB_ACTION_EXECUTE_ANGRY; + field_C = 0; +}; + +void SubActExecAngry::Field_10(SubActParam* param) { + Field_8(); +}; + +void SubActExecAngry::Field_18(rob_chara* rob_chr) { + rob_chr->data.rob_sub_action.data.field_8 = this; +}; + +void SubActExecAngry::Field_20(rob_chara* rob_chr) { + +}; + +SubActExecCountNum::SubActExecCountNum() : SubActExec(SUB_ACTION_EXECUTE_COUNT_NUM) { + field_10 = 0; + field_14 = 0; + field_18 = 0; +}; + +SubActExecCountNum::~SubActExecCountNum() { + +}; + +void SubActExecCountNum::Field_8() { + type = SUB_ACTION_EXECUTE_COUNT_NUM; + field_C = 0; + field_10 = 0; + field_14 = 0; + field_18 = 0; +}; + +void SubActExecCountNum::Field_10(SubActParam* param) { + Field_8(); + if (param) { + SubActParamCountNum* param_count_num = dynamic_cast(param); + if (param_count_num) + field_10 = param_count_num->field_10; } - else if (rob_mgr->field_68 != 1) - return false; +}; - if (vector_old_length(rob_mgr->free_chara)) { - for (rob_chara** i = rob_mgr->free_chara.begin; i != rob_mgr->free_chara.end; i++) { - task_rob_load_append_free_req_data((*i)->chara_id); - task_rob_load_append_free_req_data_obj((*i)->chara_id, &(*i)->item_sub_data.item.data); - TaskRobManager__FreeLoadedCharaList(rob_mgr, &(*i)->chara_id); - } - sub_140532AF0(rob_mgr, &rob_mgr->free_chara); - task_rob_manager.free_chara.end = task_rob_manager.free_chara.begin; +void SubActExecCountNum::Field_18(rob_chara* rob_chr) { + rob_chr->data.rob_sub_action.data.field_8 = this; +}; + +void SubActExecCountNum::Field_20(rob_chara* rob_chr) { + +}; + +SubActExecCry::SubActExecCry() : SubActExec(SUB_ACTION_EXECUTE_CRY) { + +}; + +SubActExecCry::~SubActExecCry() { + +}; + +void SubActExecCry::Field_8() { + type = SUB_ACTION_EXECUTE_CRY; + field_C = 0; +}; + +void SubActExecCry::Field_10(SubActParam* param) { + Field_8(); +}; + +void SubActExecCry::Field_18(rob_chara* rob_chr) { + rob_chr->data.rob_sub_action.data.field_8 = this; +}; + +void SubActExecCry::Field_20(rob_chara* rob_chr) { + +}; + +SubActExecEmbarrassed::SubActExecEmbarrassed() : SubActExec(SUB_ACTION_EXECUTE_EMBARRASSED) { + field_10 = 0; +}; + +SubActExecEmbarrassed::~SubActExecEmbarrassed() { + +}; + +void SubActExecEmbarrassed::Field_8() { + type = SUB_ACTION_EXECUTE_EMBARRASSED; + field_C = 0; + field_10 = 0; +}; + +void SubActExecEmbarrassed::Field_10(SubActParam* param) { + Field_8(); +}; + +void SubActExecEmbarrassed::Field_18(rob_chara* rob_chr) { + rob_chr->data.rob_sub_action.data.field_8 = this; +}; + +void SubActExecEmbarrassed::Field_20(rob_chara* rob_chr) { + +}; + +SubActExecLaugh::SubActExecLaugh() : SubActExec(SUB_ACTION_EXECUTE_LAUGH) { + +}; + +SubActExecLaugh::~SubActExecLaugh() { + +}; + +void SubActExecLaugh::Field_8() { + type = SUB_ACTION_EXECUTE_LAUGH; + field_C = 0; +}; + +void SubActExecLaugh::Field_10(SubActParam* param) { + Field_8(); +}; + +void SubActExecLaugh::Field_18(rob_chara* rob_chr) { + rob_chr->data.rob_sub_action.data.field_8 = this; +}; + +void SubActExecLaugh::Field_20(rob_chara* rob_chr) { + +}; + +SubActExecShakeHand::SubActExecShakeHand() : SubActExec(SUB_ACTION_EXECUTE_SHAKE_HAND) { + field_10 = 0; + field_14 = 0; + field_18 = 0; +}; + +SubActExecShakeHand::~SubActExecShakeHand() { + +}; + +void SubActExecShakeHand::Field_8() { + type = SUB_ACTION_EXECUTE_SHAKE_HAND; + field_C = 0; + field_10 = 0; + field_14 = 0; + field_18 = 0; +}; + +void SubActExecShakeHand::Field_10(SubActParam* param) { + Field_8(); + if (param) { + SubActParamShakeHand* param_shake_hand = dynamic_cast(param); + if (param_shake_hand) + field_10 = param_shake_hand->field_10; } +}; - if (vector_old_length(rob_mgr->init_chara)) { - for (rob_chara** i = rob_mgr->init_chara.begin; i != rob_mgr->init_chara.end; i++) { - if (TaskRobManager__CheckRobCharaLoaded(rob_mgr, *i)) - continue; +void SubActExecShakeHand::Field_18(rob_chara* rob_chr) { + rob_chr->data.rob_sub_action.data.field_8 = this; +}; - vector_old_ptr_rob_chara_push_back(&rob_mgr->load_chara, i); - task_rob_load_append_load_req_data((*i)->chara_index); - task_rob_load_append_load_req_data_obj((*i)->chara_index, (*i)->item_sub_data.item.data); - } - task_rob_manager.init_chara.end = task_rob_manager.init_chara.begin; - rob_mgr->field_68 = 0; - }*/ - return false; +void SubActExecShakeHand::Field_20(rob_chara* rob_chr) { + +}; + +SubActParam::SubActParam(SubActParamType type) { + this->type = type; } -static void task_rob_manager_struct_append_init_chara(TaskRobManager* rob_mgr, rob_chara* rob_chr) { - if (!rob_chr) - return; +SubActParam::~SubActParam() { - int8_t chara_id = rob_chr->chara_id; - if (chara_id > 5 || vector_old_length(rob_mgr->init_chara) > 5) - return; - - for (rob_chara** i = rob_mgr->loaded_chara.begin; i != rob_mgr->loaded_chara.end; i++) - if ((*i)->chara_id == chara_id) - return; - - for (rob_chara** i = rob_mgr->load_chara.begin; i != rob_mgr->load_chara.end; i++) - if ((*i)->chara_id == chara_id) - return; - - vector_old_ptr_rob_chara_push_back(&rob_mgr->init_chara, &rob_chr); } -static void task_rob_manager_struct_append_loaded_chara(TaskRobManager* rob_mgr, rob_chara* rob_chr) { - int8_t chara_id = rob_chr->chara_id; - if (chara_id > 5 || vector_old_length(rob_mgr->loaded_chara) > 5) - return; +SubActParamAngry::SubActParamAngry() : SubActParam(SUB_ACTION_PARAM_ANGRY) { - vector_old_ptr_rob_chara_push_back(&rob_mgr->loaded_chara, &rob_chr); } -static void task_rob_manager_struct_append_free_chara(TaskRobManager* rob_mgr, rob_chara* rob_chr) { - if (!rob_chr) - return; +SubActParamAngry::~SubActParamAngry() { - int8_t chara_id = rob_chr->chara_id; - if (chara_id > 5 || vector_old_length(rob_mgr->free_chara) > 5) - return; +} - for (rob_chara** i = rob_mgr->loaded_chara.begin; i != rob_mgr->loaded_chara.end; i++) - if ((*i)->chara_id == chara_id) - return; +SubActParamCountNum::SubActParamCountNum() : SubActParam(SUB_ACTION_PARAM_COUNT_NUM) { + field_10 = 0; +} - for (rob_chara** i = rob_mgr->load_chara.begin; i != rob_mgr->load_chara.end; i++) - if ((*i)->chara_id == chara_id) - return; +SubActParamCountNum::~SubActParamCountNum() { - vector_old_ptr_rob_chara_push_back(&rob_mgr->free_chara, &rob_chr); +} + +SubActParamCry::SubActParamCry() : SubActParam(SUB_ACTION_PARAM_CRY) { + +} + +SubActParamCry::~SubActParamCry() { + +} + +SubActParamEmbarrassed::SubActParamEmbarrassed() : SubActParam(SUB_ACTION_PARAM_EMBARRASSED) { + +} + +SubActParamEmbarrassed::~SubActParamEmbarrassed() { + +} + +SubActParamLaugh::SubActParamLaugh() : SubActParam(SUB_ACTION_PARAM_LAUGH) { + +} + +SubActParamLaugh::~SubActParamLaugh() { + +} + +SubActParamShakeHand::SubActParamShakeHand() : SubActParam(SUB_ACTION_PARAM_SHAKE_HAND) { + field_10 = 0; +} + +SubActParamShakeHand::~SubActParamShakeHand() { + +} + +RobSubAction::Data::Data() : field_0(), field_8(), field_10(), field_18() { + +} + +RobSubAction::Data::~Data() { + +} + +RobSubAction::RobSubAction() { + Reset(); +} + +RobSubAction::~RobSubAction() { + Reset(); +} + +void RobSubAction::Reset() { + data.field_0 = 0; + data.field_8 = 0; + data.field_10 = 0; + data.field_18 = 0; + data.cry.Field_8(); + data.shake_hand.Field_8(); + data.embarrassed.Field_8(); + data.angry.Field_8(); + data.laugh.Field_8(); +} + +RobPartialMotion::Data::Data() : motion_id(-1), mottbl_index(6), state(-1), frame(), play_frame_step(1.0f), +frame_count(), duration(), step(1.0f), offset(), field_24(), frame_data(), step_data(), field_38() { + +} + +RobPartialMotion::Data::~Data() { + +} + +RobPartialMotion::RobPartialMotion() { + +} + +RobPartialMotion::~RobPartialMotion() { + +} + +RobFaceMotion::RobFaceMotion() { + Reset(); +} + +RobFaceMotion::~RobFaceMotion() { + +} + +void RobFaceMotion::Reset() { + data.motion_id = -1; + data.mottbl_index = 6; + data.state = -1; + data.frame = 0.0f; + data.play_frame_step = 1.0f; + data.frame_count = 0.0f; + data.duration = 0.0f; + data.step = 1.0f; + data.offset = 1.0f; + data.field_24 = 0.0f; + data.frame_data = 0; + data.step_data = 0; + data.field_38 = -1; +} + +RobHandMotion::RobHandMotion() { + Reset(); +} + +RobHandMotion::~RobHandMotion() { + +} + +void RobHandMotion::Reset() { + data.motion_id = -1; + data.mottbl_index = 6; + data.state = -1; + data.frame = 0.0f; + data.play_frame_step = 1.0f; + data.frame_count = 0.0f; + data.duration = 0.0f; + data.step = 1.0f; + data.offset = 1.0f; + data.field_24 = 0.0f; + data.frame_data = 0; + data.step_data = 0; + data.field_38 = -1; +} + +RobMouthMotion::RobMouthMotion() { + Reset(); +} + +RobMouthMotion::~RobMouthMotion() { + +} + +void RobMouthMotion::Reset() { + data.motion_id = -1; + data.mottbl_index = 6; + data.state = -1; + data.frame = 0.0f; + data.play_frame_step = 1.0f; + data.frame_count = 0.0f; + data.duration = 0.0f; + data.step = 1.0f; + data.offset = 1.0f; + data.field_24 = 0.0f; + data.frame_data = 0; + data.step_data = 0; + data.field_38 = -1; +} + +RobEyesMotion::RobEyesMotion() { + Reset(); +} + +RobEyesMotion::~RobEyesMotion() { + +} + +void RobEyesMotion::Reset() { + data.motion_id = -1; + data.mottbl_index = 6; + data.state = -1; + data.frame = 0.0f; + data.play_frame_step = 1.0f; + data.frame_count = 0.0f; + data.duration = 0.0f; + data.step = 1.0f; + data.offset = 1.0f; + data.field_24 = 0.0f; + data.frame_data = 0; + data.step_data = 0; + data.field_38 = -1; +} + +RobEyelidMotion::RobEyelidMotion() { + Reset(); +} + +RobEyelidMotion::~RobEyelidMotion() { + +} + +void RobEyelidMotion::Reset() { + data.motion_id = -1; + data.mottbl_index = 6; + data.state = -1; + data.frame = 0.0f; + data.play_frame_step = 1.0f; + data.frame_count = 0.0f; + data.duration = 0.0f; + data.step = 1.0f; + data.offset = 1.0f; + data.field_24 = 0.0f; + data.frame_data = 0; + data.step_data = 0; + data.field_38 = -1; +} + +struc_405::struc_405() : field_1C0(), time() { + +} + +struc_405::~struc_405() { + +} + +void struc_405::Reset() { + face.Reset(); + hand_l.Reset(); + hand_r.Reset(); + mouth.Reset(); + eye.Reset(); + eyelid.Reset(); + head_object = object_info(); + hand_l_object = object_info(); + hand_r_object = object_info(); + face_object = object_info(); + field_1C0 = 0; + time = 0.0f; +} + +rob_chara_adjust::rob_chara_adjust() : motion_id(-1), prev_motion_id(-1), frame_data(), step_data(), step(1.0f), +field_24(), field_28(), field_29(), field_2A(), field_2C(), field_30(), field_34(), field_36(), +field_38(), field_B8(), field_138(), field_13C(), field_140(), field_14C(), field_314(), +parts_adjust(), parts_adjust_prev(), field_10D8(), hand_adjust(), hand_adjust_prev(), field_12C8() { + +} + +rob_chara_adjust::~rob_chara_adjust() { + +} + +struc_223::struc_223() : field_0(), frame_count(), field_8(), field_C(), field_10(), field_20(), +field_30(), field_40(), field_50(), field_52(), field_54(), field_58(), field_5C(), field_60(), +field_64(), field_68(), field_6C(), field_70(), field_74(), field_78(), field_7C(), field_80(), +field_84(), field_88(), field_8C(), field_90(), field_94(), field_96(), field_98(), field_9C(), +field_A0(), field_A4(), field_A8(), field_B0(), field_1E8(), field_1EC(), field_1F0(), field_1F4(), +field_1F8(), field_1FC(), field_200(), field_204(), field_208(), field_20C(), field_210(), field_218(), +field_21C(), field_220(), field_238(), field_23C(), field_240(), field_244(), field_248(), field_250(), +field_258(), field_25C(), field_260(), field_268(), field_270(), field_274(), field_276(), field_278(), +field_27C(), field_280(), field_284(), field_288(), field_290(), field_294(), field_298(), field_29C(), +field_2A0(), field_2A4(), field_2A8(), field_2AC(), field_2B0(), field_2B8(), field_2BC(), field_2C0(), +field_2C4(), field_2C8(), field_2CC(), field_2D0(), field_2D8(), field_2E0(), field_2E8(), field_2EC(), +field_2F0(), field_2F4(), field_2F8(), field_2FC(), field_300(), field_304(), field_308(), field_30C(), +field_310(), field_314(), field_318(), field_31C(), field_320(), field_324(), field_328(), iterations(), +field_330(), field_340(), field_344(), field_348(), field_34C(), field_350(), field_35C(), field_3B0(), +field_4F4(), field_638(), field_640(), field_644(), field_648(), field_64C(), field_650(), field_654(), +field_658(), field_65C(), field_660(), field_664(), field_668(), field_66C(), field_7A0(), field_7A8() { + +} + +struc_223::~struc_223() { + +} + +struc_209::struc_209() : field_0(), field_4(), field_8(), field_C(), field_10(), field_14(), field_18(), +field_1C(), field_20(), field_24(), field_28(), field_2C(), field_30(), field_34(), field_38(), field_3C(), +field_40(), field_44(), field_48(), field_4C(), field_50(), field_54(), field_58(), field_5C(), field_60(), +field_64(), field_68(), field_6C(), field_70(), field_74(), field_78(), field_738(), field_DF8(), field_1230(), +field_1668(), field_1AA0(), field_1BE4(), field_1C68(), field_1C70(), field_1C78(), field_1C80(), field_1C88(), +field_1CF4(), field_1D60(), field_1DCC(), field_1DD0(), field_1DD4(), field_1DD8(), field_1DDC(), field_1DE0(), +field_1DE4(), field_1DE8(), field_1DEC(), field_1DF0(), field_1DF4(), field_1DF8(), field_1DFC(), field_1E00(), +field_1E04(), field_1E08(), field_1E0C(), field_1E10(), field_1E14(), field_1E18(), field_1E1C(), field_1E20(), +field_1E24(), field_1E28(), field_1E2C(), field_1E30(), field_1E34(), field_1E38(), field_1E3C(), field_1E40(), +field_1E44(), field_1E48(), field_1E4C(), field_1E50(), field_1E54(), field_1E58(), field_1E5C(), field_1E60(), +field_1E64(), field_1E68(), field_1E6C(), field_1E70(), field_1E74(), field_1E78(), field_1E7C(), field_1E80(), +field_1E84(), field_1E88(), field_1E8C(), field_1E90(), field_1E94(), field_1E98(), field_1E9C(), +field_1EA0(), field_1EA4(), field_1EA8(), field_1EAC(), field_1EB0(), field_1EB4(), field_1EF4(), +field_1F04(), field_1F08(), field_1F0C(), field_1F10(), field_1F14(), field_1F18(), field_1F1C(), +field_1F20(), field_1F21(), field_1F22(), field_1F23(), field_1F24(), field_1F25(), field_1F26() { + +} + +struc_209::~struc_209() { + +} + +rob_chara_data::rob_chara_data() : field_0(), field_1(), field_2(), field_3(), field_4(), miku_rot(), +adjust_data(), field_3D90(), field_3D94(), field_3D98(), field_3D9A(), field_3D9C(), field_3D9D(), field_3DA0(), +field_3DA4(), field_3DA8(), field_3DB0(), field_3DB8(), field_3DBC(), field_3DC0(), field_3DC4(), +field_3DC8(), field_3DCC(), field_3DD0(), field_3DD4(), field_3DD8(), field_3DDC(), field_3DE0() { + +} + +rob_chara_data::~rob_chara_data() { + +} + +rob_chara::rob_chara() : chara_id(), type(), field_C(), +field_D(), chara_index(), module_index(), chara_init_data() { + bone_data = new rob_chara_bone_data(); + item_equip = new rob_chara_item_equip(); +} + +rob_chara::~rob_chara() { + delete bone_data; + delete item_equip; } inline void motion_storage_init() { - motion_storage_data = vector_old_empty(motion_storage); + motion_storage_data = {}; } inline void motion_storage_append_mot_set(uint32_t set_id) { - for (motion_storage* i = motion_storage_data.begin; - i != motion_storage_data.end; i++) - if (i->set_id == set_id) { - i->count++; + for (motion_storage& i : motion_storage_data) + if (i.set_id == set_id) { + i.count++; return; } } inline void motion_storage_insert_motion_set(mot_set* set, uint32_t set_id) { - for (motion_storage* i = motion_storage_data.begin; - i != motion_storage_data.end; i++) - if (i->set_id == set_id) { - mot_set_free(&i->set); - i->count++; - i->set = *set; + for (motion_storage& i : motion_storage_data) + if (i.set_id == set_id) { + i.count++; + i.set = *set; return; } - motion_storage* mot_set_storage = vector_old_motion_storage_reserve_back(&motion_storage_data); - mot_set_storage->set_id = set_id; - mot_set_storage->count = 1; - mot_set_storage->set = *set; + motion_storage mot_set_storage;; + mot_set_storage.set_id = set_id; + mot_set_storage.count = 1; + mot_set_storage.set = *set; + motion_storage_data.push_back(mot_set_storage); } inline mot_set* motion_storage_get_motion_set(uint32_t set_id) { - for (motion_storage* i = motion_storage_data.begin; - i != motion_storage_data.end; i++) - if (i->set_id == set_id) - return &i->set; + for (motion_storage& i : motion_storage_data) + if (i.set_id == set_id) + return &i.set; return 0; } inline void motion_storage_delete_motion_set(uint32_t set_id) { - for (motion_storage* i = motion_storage_data.begin; - i != motion_storage_data.end; i++) - if (i->set_id == set_id) { - i->count--; - if (i->count > 0) - break; - - mot_set_free(&i->set); - - vector_old_motion_storage_erase(&motion_storage_data, - i - motion_storage_data.begin, 0); + for (std::vector::iterator i = motion_storage_data.begin(); + i != motion_storage_data.end(); i++) + if (i._Ptr->set_id == set_id) { + i._Ptr->count--; + if (i._Ptr->count <= 0) + motion_storage_data.erase(i); break; } } @@ -7766,17 +12088,1490 @@ inline mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database if (set_id == -1) return 0; - for (motion_storage* i = motion_storage_data.begin; - i != motion_storage_data.end; i++) - if (i->set_id == set_id) - return &i->set.vec.begin[motion_index]; + for (motion_storage& i : motion_storage_data) + if (i.set_id == set_id) + return &i.set.vec[motion_index]; return 0; } +inline float_t motion_storage_get_mot_data_frame_count(uint32_t motion_id, motion_database* mot_db) { + mot_data* mot = motion_storage_get_mot_data(motion_id, mot_db); + if (mot) + return mot->frame_count; + return 0.0f; +} + inline void motion_storage_free() { - for (motion_storage* i = motion_storage_data.begin; - i != motion_storage_data.end; i++) { - mot_set_free(&i->set); + motion_storage_data.clear(); +} + +motion_storage::motion_storage() : set_id(), count() { + +} + +motion_storage::~motion_storage() { + +} + +ReqData::ReqData(::chara_index chara_index, int32_t count) { + this->chara_index = chara_index; + this->count = count; +} + +ReqData::~ReqData() { + +} + +void ReqData::Reset() { + chara_index = CHARA_MAX; + count = 0; +} + +ReqDataObj::ReqDataObj(::chara_index chara_index, int32_t count) : ReqData(chara_index, count) { + data = {}; +} + +ReqDataObj::~ReqDataObj() { + +} + +void ReqDataObj::Reset() { + ReqData::Reset(); + for (int32_t& i : data.data) + i = 0; +} + +osage_set_motion::osage_set_motion() : motion_id() { + +} + +osage_set_motion::~osage_set_motion() { + +} + +pv_data_set_motion::pv_data_set_motion() : motion_id() { + +} + +pv_data_set_motion::~pv_data_set_motion() { + +} + +PvOsageManager::PvOsageManager() : state(), chara_id(), reset(), field_74(), +motion_index(), pv(), thread(), disp(), not_reset(), exit(), field_D4() { + Reset(); + disp_mtx.lock(); + disp = false; + disp_mtx.unlock(); + not_reset_mtx.lock(); + not_reset = false; + not_reset_mtx.unlock(); + exit_mtx.lock(); + exit = false; + exit_mtx.unlock(); + thread = new std::thread(PvOsageManager::ThreadMain, this); +} + +PvOsageManager::~PvOsageManager() { + exit_mtx.lock(); + exit = true; + exit_mtx.unlock(); + cnd.notify_one(); + thread->join(); + delete thread; +} + +bool PvOsageManager::Init() { + state = 0; + return true; +} + +bool PvOsageManager::Ctrl() { + if (!state) { + //sub_1404F8AA0(this); + if (sub_1404F7AF0()) + return false; + state = 1; } - vector_old_motion_storage_free(&motion_storage_data, 0); + else if (state != 1) + return false; + sub_1404F7BD0(false); + return true; +} + +bool PvOsageManager::Dest() { + return true; +} + +void PvOsageManager::Disp() { + +} + +bool PvOsageManager::GetDisp() { + std::unique_lock u_disp_lock(disp_mtx); + bool disp = this->disp; + u_disp_lock.unlock(); + return disp; +} + +void PvOsageManager::SetNotResetTrue() { + std::unique_lock u_not_reset_lock(not_reset_mtx); + not_reset = true; + u_not_reset_lock.unlock(); +} + +bool PvOsageManager::sub_1404F7AF0() { + if (osage_set_motion.size() > 1) { + osage_set_motion.pop_back(); + return true; + } + return false; +} + +static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, + RobEyelidMotion* motion, int32_t type, motion_database* mot_db) { + if (type == 1 || type == 2) { + rob_chr->data.adjust.field_3B0.eyelid.data = motion->data; + if (rob_chr->data.adjust.field_29 & 0x80) + return; + } + else { + rob_chr->data.adjust.field_150.eyelid.data = motion->data; + if (rob_chr->data.adjust.field_29 & 0x80) + return; + } + + rob_chara_bone_data_load_eyelid_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); + rob_chara_bone_data_set_eyelid_frame(rob_chr->bone_data, motion->data.frame); + rob_chara_bone_data_set_eyelid_play_frame_step(rob_chr->bone_data, motion->data.play_frame_step); + rob_chara_bone_data_set_eyelid_anim_duration(rob_chr->bone_data, + motion->data.duration, motion->data.step, motion->data.offset); +} + +static void rob_chara_set_eyes_motion(rob_chara* rob_chr, + RobEyesMotion* motion, int32_t type, motion_database* mot_db) { + if (type == 1 || type == 2) { + rob_chr->data.adjust.field_3B0.eye.data = motion->data; + if (!(rob_chr->data.adjust.field_29 & 0x40)) + return; + } + else { + rob_chr->data.adjust.field_150.eye.data = motion->data; + if (rob_chr->data.adjust.field_29 & 0x40) + return; + } + + rob_chara_bone_data_load_eyes_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); + rob_chara_bone_data_set_eyes_frame(rob_chr->bone_data, motion->data.frame); + rob_chara_bone_data_set_eyes_play_frame_step(rob_chr->bone_data, motion->data.play_frame_step); + rob_chara_bone_data_set_eyes_anim_duration(rob_chr->bone_data, + motion->data.duration, motion->data.step, motion->data.offset); +} + +static void rob_chara_set_face_motion(rob_chara* rob_chr, + RobFaceMotion* motion, int32_t type, motion_database* mot_db) { + if (type == 2 || type == 1) { + rob_chr->data.adjust.field_3B0.face.data = motion->data; + if (!(rob_chr->data.adjust.field_29 & 0x04)) + return; + } + else { + rob_chr->data.adjust.field_150.face.data = motion->data; + if (rob_chr->data.adjust.field_29 & 0x04) + return; + } + + rob_chara_bone_data_load_face_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); + rob_chara_bone_data_set_face_frame(rob_chr->bone_data, motion->data.frame); + rob_chara_bone_data_set_face_play_frame_step(rob_chr->bone_data, motion->data.play_frame_step); + rob_chara_bone_data_set_face_anim_duration(rob_chr->bone_data, + motion->data.duration, motion->data.step, motion->data.offset); +} + +static void rob_chara_set_hand_l_motion(rob_chara* rob_chr, + RobHandMotion* motion, int32_t type, motion_database* mot_db) { + if (type == 2) + rob_chr->data.adjust.field_3B0.hand_l.data = motion->data; + else if (type == 1) + rob_chr->data.adjust.field_150.hand_l.data = motion->data; + else + rob_chr->data.adjust.hand_l.data = motion->data; + + if (!(rob_chr->data.adjust.field_29 & 0x08) || rob_chr->data.adjust.field_2A & 0x04) + return; + + rob_chara_bone_data_load_hand_l_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); + rob_chara_bone_data_set_hand_l_frame(rob_chr->bone_data, motion->data.frame); + rob_chara_bone_data_set_hand_l_play_frame_step(rob_chr->bone_data, motion->data.play_frame_step); + rob_chara_bone_data_set_hand_l_anim_duration(rob_chr->bone_data, + motion->data.duration, motion->data.step, motion->data.offset); +} + +static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, + RobHandMotion* motion, int32_t type, motion_database* mot_db) { + if (type == 2) + rob_chr->data.adjust.field_3B0.hand_r.data = motion->data; + else if (type == 1) + rob_chr->data.adjust.field_150.hand_r.data = motion->data; + else + rob_chr->data.adjust.hand_r.data = motion->data; + + if (!(rob_chr->data.adjust.field_29 & 0x10) || rob_chr->data.adjust.field_2A & 0x08) + return; + + rob_chara_bone_data_load_hand_r_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); + rob_chara_bone_data_set_hand_r_frame(rob_chr->bone_data, motion->data.frame); + rob_chara_bone_data_set_hand_r_play_frame_step(rob_chr->bone_data, motion->data.play_frame_step); + rob_chara_bone_data_set_hand_r_anim_duration(rob_chr->bone_data, + motion->data.duration, motion->data.step, motion->data.offset); +} + +static void rob_chara_set_mouth_motion(rob_chara* rob_chr, + RobMouthMotion* motion, int32_t type, motion_database* mot_db) { + if (type == 1 || type == 2) { + rob_chr->data.adjust.field_3B0.mouth.data = motion->data; + if (!(rob_chr->data.adjust.field_29 & 0x20)) + return; + } + else { + rob_chr->data.adjust.field_150.mouth.data = motion->data; + if (rob_chr->data.adjust.field_29 & 0x20) + return; + } + + rob_chara_bone_data_load_mouth_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); + rob_chara_bone_data_set_mouth_frame(rob_chr->bone_data, motion->data.frame); + rob_chara_bone_data_set_mouth_play_frame_step(rob_chr->bone_data, motion->data.play_frame_step); + rob_chara_bone_data_set_mouth_anim_duration(rob_chr->bone_data, + motion->data.duration, motion->data.step, motion->data.offset); +} + +static void sub_1405500F0(rob_chara* rob_chr) { + rob_chr->data.adjust.field_29 &= ~0x01; + int32_t v1 = rob_chr->data.adjust.field_150.field_1C0; + if (v1 == 2 || v1 == 3) + return; + + switch (rob_chr->data.adjust.field_150.face.data.mottbl_index) { + case 0x07: + case 0x09: + case 0x0B: + case 0x0D: + case 0x13: + case 0x15: + case 0x19: + case 0x1B: + case 0x1D: + case 0x1F: + case 0x21: + case 0x23: + case 0x25: + case 0x27: + case 0x29: + case 0x2B: + case 0x2D: + case 0x2F: + case 0x31: + case 0x33: + case 0x35: + case 0x37: + case 0x41: + case 0x43: + case 0x45: + case 0x47: + case 0x49: + case 0x4B: + case 0x4D: + case 0x4F: + case 0x51: + case 0x53: + case 0x55: + case 0x57: + case 0x59: + case 0x5B: + case 0x5D: + case 0x5F: + case 0x61: + case 0x63: + case 0x65: + case 0x67: + case 0x69: + case 0x6B: + rob_chr->data.adjust.field_29 |= 0x01; + break; + } +} + +static void rob_chara_set_eyelid_rob_cmn_mottbl_motion_from_face(rob_chara* rob_chr, + int32_t a2, float_t duration, float_t value, float_t offset, motion_database* mot_db) { + if (!a2) + a2 = rob_chr->data.adjust.field_150.field_1C0; + + RobEyelidMotion v13; + switch (a2) { + case 0: + case 2: + v13.data = rob_chr->data.adjust.field_150.face.data; + break; + case 1: + value = 1.0f; + case 3: { + int32_t mottbl_index = rob_chr->data.adjust.field_150.face.data.mottbl_index; + switch (mottbl_index) { + case 0x07: + case 0x09: + case 0x0B: + case 0x0D: + case 0x0F: + case 0x11: + case 0x13: + case 0x15: + case 0x17: + case 0x19: + case 0x1B: + case 0x1D: + case 0x1F: + case 0x21: + case 0x23: + case 0x25: + case 0x27: + case 0x29: + case 0x2B: + case 0x2D: + case 0x2F: + case 0x31: + case 0x33: + case 0x35: + case 0x37: + case 0x3D: + case 0x3F: + case 0x41: + case 0x43: + case 0x45: + case 0x47: + case 0x49: + case 0x4B: + case 0x4D: + case 0x4F: + case 0x51: + case 0x53: + case 0x55: + case 0x57: + case 0x59: + case 0x5B: + case 0x5D: + case 0x5F: + case 0x61: + case 0x63: + case 0x65: + case 0x67: + case 0x69: + case 0x6B: + case 0x6D: + case 0x6F: + case 0x71: + case 0x73: + case 0x7F: + case 0x81: + case 0xEC: + case 0xEE: + case 0xF0: + case 0xF2: + v13.data.mottbl_index = ++mottbl_index; + break; + } + + int32_t motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.motion_id = motion_id; + if (motion_id == -1) { + duration = 0.0f; + a2 = 0; + v13.data = rob_chr->data.adjust.field_150.face.data; + } + else if (value <= 0.0f) { + a2 = 0; + v13.data = rob_chr->data.adjust.field_150.face.data; + } + else { + v13.data.state = 0; + v13.data.frame = (v13.data.frame_count - 1.0f) * value; + v13.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + } + } break; + } + v13.data.offset = offset; + v13.data.duration = duration; + + rob_chr->data.adjust.field_150.field_1C0 = a2; + sub_1405500F0(rob_chr); + rob_chr->data.adjust.field_29 &= ~0x02; + rob_chr->data.adjust.field_150.time = 0.0; + rob_chara_set_eyelid_motion(rob_chr, &v13, 0, mot_db); +} + +static void rob_chara_set_eyes_rob_cmn_mottbl_motion(rob_chara* rob_chr, + int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { + RobEyesMotion v13; + v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.mottbl_index = mottbl_index; + v13.data.state = state; + v13.data.play_frame_step = step; + v13.data.duration = duration; + v13.data.offset = offset; + v13.data.field_24 = a7; + if (sub_14053F290(&v13)) { + v13.data.frame_data = &rob_chr->data.adjust.frame_data; + v13.data.step_data = &rob_chr->data.adjust.step_data; + } + v13.data.field_38 = a9; + if (v13.data.motion_id != -1) { + v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); + v13.data.frame = (v13.data.frame_count - 1.0f) * value; + } + rob_chara_set_eyes_motion(rob_chr, &v13, type, mot_db); +} + +static void sub_140553970(rob_chara* rob_chr, object_info a2, int32_t type) { + if (type == 1) + rob_chr->data.adjust.field_150.head_object = a2; + else + rob_chr->data.adjust.field_3B0.head_object = a2; +} + +static void rob_chara_set_face_rob_cmn_mottbl_motion(rob_chara* rob_chr, + int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, bool a11, motion_database* mot_db) { + RobFaceMotion v27; + v27.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v27.data.mottbl_index = mottbl_index; + v27.data.state = state; + v27.data.play_frame_step = step; + v27.data.duration = duration; + v27.data.offset = offset; + v27.data.field_24 = a7; + if (sub_14053F290(&v27)) { + v27.data.frame_data = &rob_chr->data.adjust.frame_data; + v27.data.step_data = &rob_chr->data.adjust.step_data; + } + v27.data.field_38 = a9; + if (v27.data.motion_id != -1) { + v27.data.frame_count = motion_storage_get_mot_data_frame_count(v27.data.motion_id, mot_db); + v27.data.frame = (v27.data.frame_count - 1.0f) * value; + } + rob_chara_set_face_motion(rob_chr, &v27, type, mot_db); + + int32_t head_object_id = 0; + switch (mottbl_index) { + case 57: + head_object_id = 1; + break; + case 59: + head_object_id = 7; + break; + case 117: + head_object_id = 2; + break; + case 119: + head_object_id = 3; + break; + case 121: + head_object_id = 4; + break; + case 123: + head_object_id = 5; + break; + case 125: + head_object_id = 6; + break; + } + + object_info v17 = rob_chara_get_head_object(rob_chr, head_object_id); + if (head_object_id) { + sub_140553970(rob_chr, v17, type); + duration = 0.0f; + } + else if (type == 2) { + if (rob_chara_get_object_info(rob_chr, ITEM_ATAMA) != v17) { + sub_140553970(rob_chr, v17, 2); + duration = 0.0f; + } + + } + else if (rob_chr->data.adjust.field_150.head_object != v17) { + sub_140553970(rob_chr, v17, type); + rob_chr->data.adjust.field_150.eye.data.duration = 0.0; + rob_chara_set_eyes_motion(rob_chr, &rob_chr->data.adjust.field_150.eye, 0, mot_db); + duration = 0.0f; + } + + if (type == 1 || type == 2) { + if (a11) + rob_chara_set_eyelid_rob_cmn_mottbl_motion_from_face(rob_chr, 2, duration, -1.0f, offset, mot_db); + else if (rob_chr->data.adjust.field_29 & 0x02) { + rob_chara_set_eyelid_rob_cmn_mottbl_motion_from_face(rob_chr, + rob_chr->data.adjust.field_150.field_1C0, 3.0f, -1.0f, 0.0f, mot_db); + rob_chr->data.adjust.field_29 |= 0x02; + } + else { + float_t v21 = -1.0f; + if (rob_chr->data.adjust.field_150.field_1C0 == 3) { + float_t v23 = rob_chr->data.adjust.field_150.eyelid.data.frame_count - 1.0f; + if (v23 > 0.0) + v21 = rob_chr->data.adjust.field_150.eyelid.data.frame / v23; + + float_t v25 = rob_chr->bone_data->eyelid.blend.duration; + float_t v26 = rob_chr->bone_data->eyelid.blend.frame; + if (v25 > v26) { + duration = v25 - v26; + offset = 1.0f; + } + } + rob_chara_set_eyelid_rob_cmn_mottbl_motion_from_face(rob_chr, 0, duration, v21, offset, mot_db); + } + } + else { + RobEyelidMotion v28; + v28.data = v27.data; + v28.data.duration = duration; + v28.data.offset = offset; + rob_chr->data.adjust.field_29 |= 0x80; + rob_chara_set_eyelid_motion(rob_chr, &v28, 2, mot_db); + } +} + +static void rob_chara_set_hand_l_rob_cmn_mottbl_motion(rob_chara* rob_chr, + int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { + RobHandMotion v13; + v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.mottbl_index = mottbl_index; + v13.data.state = state; + v13.data.play_frame_step = step; + v13.data.duration = duration; + v13.data.offset = offset; + v13.data.field_24 = a7; + if (sub_14053F290(&v13)) { + v13.data.frame_data = &rob_chr->data.adjust.frame_data; + v13.data.step_data = &rob_chr->data.adjust.step_data; + } + v13.data.field_38 = a9; + if (v13.data.motion_id != -1) { + v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); + v13.data.frame = (v13.data.frame_count - 1.0f) * value; + } + rob_chara_set_hand_l_motion(rob_chr, &v13, type, mot_db); +} + +static void rob_chara_set_hand_r_rob_cmn_mottbl_motion(rob_chara* rob_chr, + int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { + RobHandMotion v13; + v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.mottbl_index = mottbl_index; + v13.data.state = state; + v13.data.play_frame_step = step; + v13.data.duration = duration; + v13.data.offset = offset; + v13.data.field_24 = a7; + if (sub_14053F290(&v13)) { + v13.data.frame_data = &rob_chr->data.adjust.frame_data; + v13.data.step_data = &rob_chr->data.adjust.step_data; + } + v13.data.field_38 = a9; + if (v13.data.motion_id != -1) { + v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); + v13.data.frame = (v13.data.frame_count - 1.0f) * value; + } + rob_chara_set_hand_r_motion(rob_chr, &v13, type, mot_db); +} + +static void rob_chara_set_mouth_rob_cmn_mottbl_motion(rob_chara* rob_chr, + int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { + RobMouthMotion v13; + v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.mottbl_index = mottbl_index; + v13.data.state = state; + v13.data.play_frame_step = step; + v13.data.duration = duration; + v13.data.offset = offset; + v13.data.field_24 = a7; + if (sub_14053F290(&v13)) { + v13.data.frame_data = &rob_chr->data.adjust.frame_data; + v13.data.step_data = &rob_chr->data.adjust.step_data; + } + v13.data.field_38 = a9; + if (v13.data.motion_id != -1) { + v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); + v13.data.frame = (v13.data.frame_count - 1.0f) * value; + } + rob_chara_set_mouth_motion(rob_chr, &v13, type, mot_db); +} + +void PvOsageManager::sub_1404F7BD0(bool not_reset) { + if (reset && !not_reset) { + data_struct* data = rctx_ptr->data; + bone_database* bone_data = &data->data_ft.bone_data; + motion_database* mot_db = &data->data_ft.mot_db; + rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara_set_motion_id(rob_chr, rob_cmn_mottbl_get_motion_id(rob_chr, 0), + 0.0f, 0.0f, 1, 0, MOTION_BLEND_CROSS, bone_data, mot_db); + rob_chara_set_face_rob_cmn_mottbl_motion(rob_chr, 0, 6, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, true, mot_db); + rob_chara_set_hand_l_rob_cmn_mottbl_motion(rob_chr, 0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chara_set_hand_r_rob_cmn_mottbl_motion(rob_chr, 0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chara_set_mouth_rob_cmn_mottbl_motion(rob_chr, 0, 131, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chara_set_eyes_rob_cmn_mottbl_motion(rob_chr, 0, 165, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chara_set_eyelid_rob_cmn_mottbl_motion_from_face(rob_chr, 0, 0.0f, -1.0f, 0.0f, mot_db); + } + Reset(); +} + +void PvOsageManager::Reset() { + state = 1; + chara_id = -1; + reset = true; + pv = 0; + reset_frames_list.clear(); + osage_set_motion.clear(); + pv_set_motion.clear(); +} + +void PvOsageManager::sub_1404F82F0() { + do { + std::unique_lock u_not_reset_lock(not_reset_mtx); + bool not_reset = this->not_reset; + u_not_reset_lock.unlock(); + if (not_reset) + break; + + //sub_1404F8AA0(); + } while (sub_1404F7AF0()); + + std::unique_lock u_not_reset_lock(not_reset_mtx); + bool not_reset = this->not_reset; + u_not_reset_lock.unlock(); + sub_1404F7BD0(not_reset); +} + +void PvOsageManager::ThreadMain(PvOsageManager* pv_osg_mgr) { + std::unique_lock u_lock(pv_osg_mgr->mtx); + while (true) { + pv_osg_mgr->cnd.wait(u_lock); + std::unique_lock u_exit_lock(pv_osg_mgr->exit_mtx); + bool exit = pv_osg_mgr->exit; + u_exit_lock.unlock(); + if (exit) + break; + + pv_osg_mgr->sub_1404F82F0(); + + std::unique_lock u_not_reset_lock(pv_osg_mgr->not_reset_mtx); + u_not_reset_lock.unlock(); + + std::unique_lock u_disp_lock(pv_osg_mgr->disp_mtx); + pv_osg_mgr->disp = false; + u_disp_lock.unlock(); + } + + std::unique_lock u_disp_lock(pv_osg_mgr->disp_mtx); + pv_osg_mgr->disp = false; + u_disp_lock.unlock(); + u_lock.unlock(); +} + +RobThreadParent::RobThreadParent() : exit(), thread() { + thread = new std::thread(RobThreadParent::ThreadMain, this); +} + +RobThreadParent::~RobThreadParent() { + +} + +void RobThreadParent::AppendRobCharaFunc(rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)) { + std::unique_lock u_lock(mtx); + RobThread thrd; + thrd.data = rob_chr; + thrd.func = rob_chr_func; + AppendRobThread(&thrd); + cnd.notify_one(); + u_lock.unlock(); +} + +void RobThreadHandler::sub_14054E3F0() { + for (RobThreadParent*& i : arr) + i->sub_14054E370(); +} + +void RobThreadParent::AppendRobThread(RobThread* thread) { + std::unique_lock u_lock(threads_mtx); + threads.push_back(*thread); + u_lock.unlock(); +} + +bool RobThreadParent::CheckThreadsNotNull() { + std::unique_lock u_lock(threads_mtx); + bool not_null = !!threads.size(); + u_lock.unlock(); + return not_null; +} + +void RobThreadParent::sub_14054E0D0() { + std::unique_lock u_lock(threads_mtx); + threads.pop_front(); + bool v5 = this->threads.size() == 0; + u_lock.unlock(); + + if (v5) { + std::unique_lock u_lock(field_28); + field_30.notify_one(); + u_lock.unlock(); + } +} + +void RobThreadParent::sub_14054E370() { + std::unique_lock u_lock(field_28); + if (CheckThreadsNotNull()) + field_30.wait(u_lock); + u_lock.unlock(); +} + +void RobThreadParent::ThreadMain(RobThreadParent* rob_thrd_parent) { + std::unique_lock u_lock(rob_thrd_parent->mtx); + while (!rob_thrd_parent->exit) { + if (rob_thrd_parent->threads.size()) { + RobThread* thread = &rob_thrd_parent->threads.front(); + if (thread->func) + thread->func(thread->data); + rob_thrd_parent->sub_14054E0D0(); + } + else + rob_thrd_parent->cnd.wait(u_lock); + } + u_lock.unlock(); +} + +RobThreadHandler::RobThreadHandler() { + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + arr[i] = new RobThreadParent; +} + +RobThreadHandler::~RobThreadHandler() { + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + delete arr[i]; +} + +void RobThreadHandler::AppendRobCharaFunc(int32_t chara_id, rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)) { + arr[chara_id]->AppendRobCharaFunc(rob_chr, rob_chr_func); +} + +RobImplTask::RobImplTask() { + +} + +RobImplTask::~RobImplTask() { + +} + +bool RobImplTask::Init() { + return true; +} + +bool RobImplTask::Ctrl() { + return false; +} + +bool RobImplTask::Dest() { + return true; +} + +void RobImplTask::Disp() { + +} + +void RobImplTask::AppendList(rob_chara* rob_chr, std::list* list) { + if (!rob_chr || !list || rob_chr->chara_id >= ROB_CHARA_COUNT || list->size() >= ROB_CHARA_COUNT) + return; + + bool found = false; + for (rob_chara*& i : *list) + if (i->chara_id == rob_chr->chara_id) { + found = true; + break; + } + + if (!found) + list->push_back(rob_chr); +} + +void RobImplTask::AppendCtrlCharaList(rob_chara* rob_chr) { + AppendList(rob_chr, &ctrl_chara); +} + +void RobImplTask::AppendFreeCharaList(rob_chara* rob_chr) { + AppendList(rob_chr, &free_chara); +} + +void RobImplTask::AppendInitCharaList(rob_chara* rob_chr) { + AppendList(rob_chr, &init_chara); +} + +void RobImplTask::FreeList(int8_t* chara_id, std::list* list) { + if (!chara_id || !list || *chara_id >= ROB_CHARA_COUNT || !list->size()) + return; + + for (auto i = list->begin(); i != list->end();) { + rob_chara* rob_chr = i._Ptr->_Myval; + if (rob_chr->chara_id == *chara_id) + i = list->erase(i); + else + i++; + } +} + +void RobImplTask::FreeCharaLists() { + init_chara.clear(); + ctrl_chara.clear(); + free_chara.clear(); +} + +void RobImplTask::FreeCtrlCharaList(int8_t* chara_id) { + FreeList(chara_id, &ctrl_chara); +} + +void RobImplTask::FreeFreeCharaList(int8_t* chara_id) { + FreeList(chara_id, &free_chara); +} + +void RobImplTask::FreeInitCharaList(int8_t* chara_id) { + FreeList(chara_id, &init_chara); +} + +TaskRobBase::TaskRobBase() { + +} + +TaskRobBase::~TaskRobBase() { + +} + +bool TaskRobBase::Init() { + return true; +} + +bool TaskRobBase::Ctrl() { + if (pv_osage_manager_array_ptr_get_disp()) + return false; + + for (rob_chara*& i : init_chara) { + rob_base_rob_chara_init(i); + AppendCtrlCharaList(i); + } + init_chara.clear(); + + for (rob_chara*& i : ctrl_chara) + if (i) + rob_thread_handler->AppendRobCharaFunc(i->chara_id, i, rob_base_rob_chara_ctrl_thread_main); + + rob_thread_handler->sub_14054E3F0(); + + for (rob_chara*& i : ctrl_chara) + if (i && i->data.field_3 > -1) + rob_base_rob_chara_ctrl(i); + + for (rob_chara*& i : free_chara) + if (i) + rob_base_rob_chara_free(i); + free_chara.clear(); + return false; +} + +bool TaskRobBase::Dest() { + if (!pv_osage_manager_array_ptr_get_disp()) { + pv_osage_manager_array_ptr_set_not_reset_true(); + return false; + } + + init_chara.clear(); + + for (rob_chara*& i : ctrl_chara) + AppendFreeCharaList(i); + ctrl_chara.clear(); + + for (rob_chara*& i : free_chara) + rob_base_rob_chara_free(i); + free_chara.clear(); + + FreeCharaLists(); + return true; +} + +bool TaskRobBase::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +} + +bool TaskRobBase::Field38() { + return true; +} + +TaskRobCollision::TaskRobCollision() { + +} + +TaskRobCollision::~TaskRobCollision() { + +} + +bool TaskRobCollision::Init() { + return true; +} + +bool TaskRobCollision::Ctrl() { + for (rob_chara*& i : init_chara) + AppendCtrlCharaList(i); + init_chara.clear(); + + /*if (sub_140227DD0())*/ { + for (rob_chara*& i : ctrl_chara) { + sub_140509D30(i); + //sub_14050F4D0(i); + //sub_14050E930(i); + } + + /*for (rob_chara*& i : ctrl_chara) + if (i && i->data.field_3 > -1) + sub_14050EA90(v13);*/ + } + + free_chara.clear(); + return false; +} + +bool TaskRobCollision::Dest() { + FreeCharaLists(); + return true; +} + +bool TaskRobCollision::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +} + +bool TaskRobCollision::Field38() { + return true; +} + +TaskRobDisp::TaskRobDisp() { + +} + +TaskRobDisp::~TaskRobDisp() { + +} + +bool TaskRobDisp::Init() { + return true; +} + +bool TaskRobDisp::Ctrl() { + if (pv_osage_manager_array_ptr_get_disp()) + return false; + + data_struct* data = rctx_ptr->data; + bone_database* bone_data = &data->data_ft.bone_data; + object_database* obj_db = &data->data_ft.obj_db; + for (rob_chara*& i : init_chara) { + rob_disp_rob_chara_init(i, bone_data, data, obj_db); + AppendCtrlCharaList(i); + } + init_chara.clear(); + + for (rob_chara*& i : ctrl_chara) + if (i && i->data.field_3 > -1) + rob_disp_rob_chara_ctrl(i); + + for (rob_chara*& i : ctrl_chara) + if (i && i->data.field_3 > -1) + rob_thread_handler->AppendRobCharaFunc(i->chara_id, i, rob_disp_rob_chara_ctrl_thread_main); + + rob_thread_handler->sub_14054E3F0(); + + for (rob_chara*& i : free_chara) + rob_disp_rob_chara_free(i); + free_chara.clear(); + return false; +} + +bool TaskRobDisp::Dest() { + if (pv_osage_manager_array_ptr_get_disp()) { + pv_osage_manager_array_ptr_set_not_reset_true(); + return false;; + } + /*else if (sub_14047A430()) { + sub_140475B30(); + return false;; + }*/ + + init_chara.clear(); + + for (rob_chara*& i : ctrl_chara) + AppendFreeCharaList(i); + ctrl_chara.clear(); + + for (rob_chara*& i : free_chara) { + //sub_140541260(i->chara_id); + rob_chara_item_equip_reset(i->item_equip); + } + free_chara.clear(); + + FreeCharaLists(); + return true; +} + +void TaskRobDisp::Disp() { + for (rob_chara*& i : ctrl_chara) { + if (!i) + continue; + + int32_t chara_id = i->chara_id; + if (pv_osage_manager_array_get_disp(&chara_id)) + continue; + + if (i->data.field_0 & 1 && i->data.field_3 > -1) + rob_disp_rob_chara_disp(i); + } +} + +bool TaskRobDisp::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_3; +} + +bool TaskRobDisp::Field38() { + return false; +} + +TaskRobInfo::TaskRobInfo() { + +} + +TaskRobInfo::~TaskRobInfo() { + +} + +bool TaskRobInfo::Init() { + return true; +} + +bool TaskRobInfo::Ctrl() { + for (rob_chara*& i : init_chara) + AppendCtrlCharaList(i); + init_chara.clear(); + + /*for (rob_chara*& i : ctrl_chara) + if (i && i->data.field_3 > -1) + sub_140518190(i);*/ + + free_chara.clear(); + return false; +} + +bool TaskRobInfo::Dest() { + FreeCharaLists(); + return true; +} + +bool TaskRobInfo::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +} + +bool TaskRobInfo::Field38() { + return true; +} + +TaskRobLoad::TaskRobLoad() : field_68(), field_6C(), field_F0() { + +} + +TaskRobLoad::~TaskRobLoad() { + +} + +bool TaskRobLoad::Init() { + field_F0 = 0; + return true; +} + +bool TaskRobLoad::Ctrl() { + return false; +} + +bool TaskRobLoad::Dest() { + if (pv_osage_manager_array_ptr_get_disp()) { + pv_osage_manager_array_ptr_set_not_reset_true(); + return false; + } + /*else if (sub_14047A430()) { + sub_140475B30(); + return false; + }*/ + + if (field_68) + field_68 = 0; + + //TaskRobLoad::UnloadLoadedChara(this); + //TaskRobLoad::ResetReqDataObj(this); + //TaskRobLoad::ResetReqData(this); + field_F0 = -1; + return true; +} + +TaskRobManager::TaskRobManager() : field_68(), state() { + +} + +TaskRobManager::~TaskRobManager() { + +} + +bool TaskRobManager::Init() { + TaskWork::AppendTask(&task_rob_load, 0, "ROB_LOAD", 0); + rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); + for (; rob_impls1->task; rob_impls1++) { + RobImplTask* task = rob_impls1->task; + TaskWork::AppendTask(task, rob_impls1->name); + task->field_2D = task->Field38(); + task->FreeCharaLists(); + } + + rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); + for (; rob_impls2->task; rob_impls2++) { + RobImplTask* task = rob_impls2->task; + TaskWork::AppendTask(task, rob_impls2->name); + task->field_2D = task->Field38(); + task->FreeCharaLists(); + } + + field_68 = 0; + state = 0; + return true; +} + +static void sub_140532AF0(TaskRobManager* task, std::list* rob_chr_list) { +} + +bool TaskRobManager::Ctrl() { + if (!field_68) { + //if (task_rob_load_check_load_req_data()) + // return false; + if (load_chara.size()) { + data_struct* data = rctx_ptr->data; + bone_database* bone_data = &data->data_ft.bone_data; + motion_database* mot_db = &data->data_ft.mot_db; + + for (rob_chara*& i : load_chara) { + rob_chara_reset_data(i, &i->pv_data, bone_data, mot_db); + AppendLoadedCharaList(i); + } + CheckTypeAppendInitCharaLists(&load_chara); + load_chara.clear(); + } + field_68 = 1; + } + else if (field_68 != 1) + return false; + + if (free_chara.size()) { + for (rob_chara*& i : free_chara) { + chara_index chara_index = i->chara_index; + //task_rob_load_append_free_req_data(chara_index); + //task_rob_load_append_free_req_data_obj(chara_index, + // rob_chara_item_sub_data_get_item(&v10->value->item_sub_data)); + FreeLoadedCharaList(&i->chara_id); + } + + for (rob_chara*& i : free_chara) { + rob_chara_type type = i->type; + for (rob_manager_rob_impl* j = rob_manager_rob_impls1_get(this); j->task; j++) { + if (j->task->CheckType(type)) + continue; + + j->task->FreeInitCharaList(&i->chara_id); + j->task->FreeCtrlCharaList(&i->chara_id); + j->task->AppendFreeCharaList(i); + } + for (rob_manager_rob_impl* j = rob_manager_rob_impls2_get(this); j->task; j++) { + if (!j->task->CheckType(type)) + continue; + + j->task->FreeInitCharaList(&i->chara_id); + j->task->FreeCtrlCharaList(&i->chara_id); + j->task->AppendFreeCharaList(i); + } + } + free_chara.clear(); + } + + if (init_chara.size()) { + for (rob_chara*& i : init_chara) { + if (CheckHasRobCharaLoad(i)) + continue; + + load_chara.push_back(i); + chara_index chara_index = i->chara_index; + //task_rob_load_append_load_req_data(chara_index); + //task_rob_load_append_load_req_data_obj(chara_index, + // rob_chara_item_sub_data_get_item(&i->item_sub_data)); + } + init_chara.clear(); + field_68 = 0; + } + return false; +} + +bool TaskRobManager::Dest() { + if (state == 0) { + rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); + for (; rob_impls1->task; rob_impls1++) + rob_impls1->task->SetDest(); + + rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); + for (; rob_impls2->task; rob_impls2++) + rob_impls2->task->SetDest(); + + init_chara.clear(); + load_chara.clear(); + free_chara.clear(); + loaded_chara.clear(); + state = 1; + } + else if (state != 1) + return false; + + task_rob_load.SetDest(); + state = 2; + return true; +} + +void TaskRobManager::Disp() { + +} + +void TaskRobManager::AppendFreeCharaList(rob_chara* rob_chr) { + if (!rob_chr || rob_chr->chara_id >= ROB_CHARA_COUNT || free_chara.size() >= ROB_CHARA_COUNT) + return; + + int32_t chara_id = rob_chr->chara_id; + for (std::list::iterator i = init_chara.begin(); i != init_chara.end();) + if (i._Ptr->_Myval->chara_id == chara_id) { + init_chara.erase(i); + return; + } + else + i++; + + bool loaded_chara_found = false; + for (rob_chara*& i : loaded_chara) + if (i->chara_id == chara_id) { + loaded_chara_found = true; + break; + } + + bool load_chara_found = false; + for (rob_chara*& i : load_chara) + if (i->chara_id == chara_id) { + load_chara_found = true; + break; + } + + if (!loaded_chara_found && !load_chara_found) + return; + + bool free_chara_found = false; + for (rob_chara*& i : free_chara) + if (i->chara_id == chara_id) { + free_chara_found = true; + break; + } + + if (!free_chara_found) + free_chara.push_back(rob_chr); +} + +void TaskRobManager::AppendInitCharaList(rob_chara* rob_chr) { + if (!rob_chr || rob_chr->chara_id >= ROB_CHARA_COUNT || init_chara.size() >= ROB_CHARA_COUNT) + return; + + int32_t chara_id = rob_chr->chara_id; + bool loaded_chara_found = false; + for (rob_chara*& i : loaded_chara) + if (i->chara_id == chara_id) { + loaded_chara_found = true; + break; + } + + bool load_chara_found = false; + for (rob_chara*& i : load_chara) + if (i->chara_id == chara_id) { + load_chara_found = true; + break; + } + + if (loaded_chara_found || load_chara_found) + return; + + bool init_chara_found = false; + for (rob_chara*& i : init_chara) + if (i->chara_id == chara_id) { + init_chara_found = true; + break; + } + + if (!init_chara_found) + init_chara.push_back(rob_chr); +} + +void TaskRobManager::AppendLoadedCharaList(rob_chara* rob_chr) { + if (!rob_chr || rob_chr->chara_id >= ROB_CHARA_COUNT || loaded_chara.size() >= ROB_CHARA_COUNT) + return; + + int32_t chara_id = rob_chr->chara_id; + bool loaded_chara_found = false; + for (rob_chara*& i : loaded_chara) + if (i->chara_id == chara_id) { + loaded_chara_found = true; + break; + } + + if (!loaded_chara_found) + loaded_chara.push_back(rob_chr); +} + +bool TaskRobManager::CheckHasRobCharaLoad(rob_chara* rob_chr) { + if (!rob_chr || rob_chr->chara_id >= ROB_CHARA_COUNT || !load_chara.size()) + return false; + + int32_t chara_id = rob_chr->chara_id; + for (rob_chara*& i : load_chara) + if (i->chara_id == chara_id) + return true; + + return false; +} + +void TaskRobManager::CheckTypeAppendInitCharaLists(std::list* rob_chr_list) { + for (rob_chara*& i : *rob_chr_list) { + rob_chara_type type = i->type; + rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); + for (; rob_impls1->task; rob_impls1++) { + RobImplTask* task = rob_impls1->task; + if (task->CheckType(type)) + task->AppendInitCharaList(i); + } + + rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); + for (; rob_impls2->task; rob_impls2++) { + RobImplTask* task = rob_impls2->task; + if (task->CheckType(type)) + task->AppendInitCharaList(i); + } + } +} + +void TaskRobManager::FreeLoadedCharaList(int8_t* chara_id) { + if (!chara_id || *chara_id >= ROB_CHARA_COUNT || !loaded_chara.size()) + return; + + for (std::list::iterator i = loaded_chara.begin(); i != loaded_chara.end();) + if (i._Ptr->_Myval->chara_id == *chara_id) { + loaded_chara.erase(i); + return; + } + else + i++; +} + +TaskRobMotionModifier::TaskRobMotionModifier() { + +} + +TaskRobMotionModifier::~TaskRobMotionModifier() { + +} + +bool TaskRobMotionModifier::Init() { + return true; +} + +bool TaskRobMotionModifier::Ctrl() { + return false; +} + +bool TaskRobMotionModifier::Dest() { + FreeCharaLists(); + return true; +} + +bool TaskRobMotionModifier::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +} + +bool TaskRobMotionModifier::Field38() { + return true; +} + +TaskRobPrepareAction::TaskRobPrepareAction() { + +} + +TaskRobPrepareAction::~TaskRobPrepareAction() { + +} + +bool TaskRobPrepareAction::Init() { + return true; +} + +bool TaskRobPrepareAction::Ctrl() { + return false; +} + +bool TaskRobPrepareAction::Dest() { + FreeCharaLists(); + return true; +} + +bool TaskRobPrepareAction::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +} + +bool TaskRobPrepareAction::Field38() { + return true; +} + +TaskRobPrepareControl::TaskRobPrepareControl() { + +} + +TaskRobPrepareControl::~TaskRobPrepareControl() { + +} + +bool TaskRobPrepareControl::Init() { + return true; +} + +bool TaskRobPrepareControl::Ctrl() { + return false; +} + +bool TaskRobPrepareControl::Dest() { + FreeCharaLists(); + return true; +} + +bool TaskRobPrepareControl::CheckType(rob_chara_type type) { + return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +} + +bool TaskRobPrepareControl::Field38() { + return true; } diff --git a/src/CRE/rob.h b/src/CRE/rob.h index 65b70008..b3008d19 100644 --- a/src/CRE/rob.h +++ b/src/CRE/rob.h @@ -16,6 +16,7 @@ #include "static_var.h" typedef enum chara_index { + CHARA_NONE = -1, CHARA_MIKU = 0, CHARA_RIN = 1, CHARA_LEN = 2, @@ -118,13 +119,97 @@ typedef enum item_sub_id { ITEM_SUB_MAX = 0x19, } item_sub_id; -typedef enum motion_blend_type { +typedef enum mothead_data_type { + MOTHEAD_DATA_TYPE_0 = 0x00, + MOTHEAD_DATA_TYPE_1 = 0x01, + MOTHEAD_DATA_TYPE_2 = 0x02, + MOTHEAD_DATA_TYPE_3 = 0x03, + MOTHEAD_DATA_TYPE_4 = 0x04, + MOTHEAD_DATA_TYPE_5 = 0x05, + MOTHEAD_DATA_TYPE_6 = 0x06, + MOTHEAD_DATA_TYPE_7 = 0x07, + MOTHEAD_DATA_TYPE_8 = 0x08, + MOTHEAD_DATA_TYPE_9 = 0x09, + MOTHEAD_DATA_TYPE_10 = 0x0A, + MOTHEAD_DATA_TYPE_11 = 0x0B, + MOTHEAD_DATA_TYPE_12 = 0x0C, + MOTHEAD_DATA_TYPE_13 = 0x0D, + MOTHEAD_DATA_TYPE_14 = 0x0E, + MOTHEAD_DATA_TYPE_15 = 0x0F, + MOTHEAD_DATA_TYPE_16 = 0x10, + MOTHEAD_DATA_TYPE_17 = 0x11, + MOTHEAD_DATA_TYPE_18 = 0x12, + MOTHEAD_DATA_TYPE_19 = 0x13, + MOTHEAD_DATA_TYPE_20 = 0x14, + MOTHEAD_DATA_TYPE_21 = 0x15, + MOTHEAD_DATA_TYPE_22 = 0x16, + MOTHEAD_DATA_TYPE_23 = 0x17, + MOTHEAD_DATA_TYPE_24 = 0x18, + MOTHEAD_DATA_TYPE_25 = 0x19, + MOTHEAD_DATA_TYPE_26 = 0x1A, + MOTHEAD_DATA_TYPE_27 = 0x1B, + MOTHEAD_DATA_TYPE_28 = 0x1C, + MOTHEAD_DATA_TYPE_29 = 0x1D, + MOTHEAD_DATA_TYPE_30 = 0x1E, + MOTHEAD_DATA_TYPE_31 = 0x1F, + MOTHEAD_DATA_TYPE_32 = 0x20, + MOTHEAD_DATA_TYPE_33 = 0x21, + MOTHEAD_DATA_TYPE_34 = 0x22, + MOTHEAD_DATA_TYPE_35 = 0x23, + MOTHEAD_DATA_TYPE_36 = 0x24, + MOTHEAD_DATA_TYPE_37 = 0x25, + MOTHEAD_DATA_TYPE_38 = 0x26, + MOTHEAD_DATA_TYPE_39 = 0x27, + MOTHEAD_DATA_TYPE_40 = 0x28, + MOTHEAD_DATA_TYPE_41 = 0x29, + MOTHEAD_DATA_TYPE_42 = 0x2A, + MOTHEAD_DATA_TYPE_43 = 0x2B, + MOTHEAD_DATA_TYPE_44 = 0x2C, + MOTHEAD_DATA_TYPE_45 = 0x2D, + MOTHEAD_DATA_TYPE_46 = 0x2E, + MOTHEAD_DATA_TYPE_47 = 0x2F, + MOTHEAD_DATA_TYPE_48 = 0x30, + MOTHEAD_DATA_TYPE_49 = 0x31, + MOTHEAD_DATA_TYPE_50 = 0x32, + MOTHEAD_DATA_TYPE_51 = 0x33, + MOTHEAD_DATA_TYPE_52 = 0x34, + MOTHEAD_DATA_TYPE_53 = 0x35, + MOTHEAD_DATA_TYPE_54 = 0x36, + MOTHEAD_DATA_TYPE_55 = 0x37, + MOTHEAD_DATA_TYPE_56 = 0x38, + MOTHEAD_DATA_TYPE_57 = 0x39, + MOTHEAD_DATA_TYPE_58 = 0x3A, + MOTHEAD_DATA_TYPE_59 = 0x3B, + MOTHEAD_DATA_TYPE_60 = 0x3C, + MOTHEAD_DATA_TYPE_61 = 0x3D, + MOTHEAD_DATA_TYPE_62 = 0x3E, + MOTHEAD_DATA_TYPE_63 = 0x3F, + MOTHEAD_DATA_WIND_RESET = 0x40, + MOTHEAD_DATA_ROB_RESET = 0x41, + MOTHEAD_DATA_ROB_STEP = 0x42, + MOTHEAD_DATA_TYPE_67 = 0x43, + MOTHEAD_DATA_TYPE_68 = 0x44, + MOTHEAD_DATA_TYPE_69 = 0x45, + MOTHEAD_DATA_TYPE_70 = 0x46, + MOTHEAD_DATA_HAND_ADJUST = 0x49, + MOTHEAD_DATA_TYPE_72 = 0x48, + MOTHEAD_DATA_TYPE_73 = 0x49, + MOTHEAD_DATA_TYPE_74 = 0x4A, + MOTHEAD_DATA_TYPE_75 = 0x4B, + MOTHEAD_DATA_TYPE_76 = 0x4C, + MOTHEAD_DATA_TYPE_77 = 0x4D, + MOTHEAD_DATA_TYPE_78 = 0x4E, + MOTHEAD_DATA_TYPE_79 = 0x4F, + MOTHEAD_DATA_TYPE_80 = 0x50, +} mothead_data_type; + +typedef enum MotionBlendType { MOTION_BLEND_NONE = -1, MOTION_BLEND = 0x00, MOTION_BLEND_FREEZE = 0x01, MOTION_BLEND_CROSS = 0x02, MOTION_BLEND_COMBINE = 0x03, -} motion_blend_type; +} MotionBlendType; typedef enum motion_bone_index { MOTION_BONE_NONE = -1, @@ -316,46 +401,306 @@ typedef enum motion_bone_index { MOTION_BONE_MAX = 0xB9, } motion_bone_index; -typedef enum rob_sub_action_execute_type { - ROB_SUB_ACTION_EXECUTE_NONE = 0, - ROB_SUB_ACTION_EXECUTE_CRY = 1, - ROB_SUB_ACTION_EXECUTE_SHAKE_HAND = 2, - ROB_SUB_ACTION_EXECUTE_EMBARRASSED = 3, - ROB_SUB_ACTION_EXECUTE_ANGRY = 4, - ROB_SUB_ACTION_EXECUTE_LAUGH = 5, - ROB_SUB_ACTION_EXECUTE_COUNT_NUM = 6, -} rob_sub_action_execute_type; +typedef enum rob_bone_index { + ROB_BONE_NONE = -1, + ROB_BONE_N_HARA_CP = 0x00, + ROB_BONE_KG_HARA_Y = 0x01, + ROB_BONE_KL_HARA_XZ = 0x02, + ROB_BONE_KL_HARA_ETC = 0x03, + ROB_BONE_N_HARA = 0x04, + ROB_BONE_CL_MUNE = 0x05, + ROB_BONE_N_MUNE_B = 0x06, + ROB_BONE_KL_MUNE_B_WJ = 0x07, + ROB_BONE_KL_KUBI = 0x08, + ROB_BONE_N_KAO = 0x09, + ROB_BONE_CL_KAO = 0x0A, + ROB_BONE_FACE_ROOT = 0x0B, + ROB_BONE_N_AGO = 0x0C, + ROB_BONE_KL_AGO_WJ = 0x0D, + ROB_BONE_N_TOOTH_UNDER = 0x0E, + ROB_BONE_TL_TOOTH_UNDER_WJ = 0x0F, + ROB_BONE_N_EYE_L = 0x10, + ROB_BONE_KL_EYE_L = 0x11, + ROB_BONE_N_EYE_L_WJ_EX = 0x12, + ROB_BONE_KL_HIGHLIGHT_L_WJ = 0x13, + ROB_BONE_N_EYE_R = 0x14, + ROB_BONE_KL_EYE_R = 0x15, + ROB_BONE_N_EYE_R_WJ_EX = 0x16, + ROB_BONE_KL_HIGHLIGHT_R_WJ = 0x17, + ROB_BONE_N_EYELID_L_A = 0x18, + ROB_BONE_TL_EYELID_L_A_WJ = 0x19, + ROB_BONE_N_EYELID_L_B = 0x1A, + ROB_BONE_TL_EYELID_L_B_WJ = 0x1B, + ROB_BONE_N_EYELID_R_A = 0x1C, + ROB_BONE_TL_EYELID_R_A_WJ = 0x1D, + ROB_BONE_N_EYELID_R_B = 0x1E, + ROB_BONE_TL_EYELID_R_B_WJ = 0x1F, + ROB_BONE_N_KUTI_D = 0x20, + ROB_BONE_TL_KUTI_D_WJ = 0x21, + ROB_BONE_N_KUTI_D_L = 0x22, + ROB_BONE_TL_KUTI_D_L_WJ = 0x23, + ROB_BONE_N_KUTI_D_R = 0x24, + ROB_BONE_TL_KUTI_D_R_WJ = 0x25, + ROB_BONE_N_KUTI_DS_L = 0x26, + ROB_BONE_TL_KUTI_DS_L_WJ = 0x27, + ROB_BONE_N_KUTI_DS_R = 0x28, + ROB_BONE_TL_KUTI_DS_R_WJ = 0x29, + ROB_BONE_N_KUTI_L = 0x2A, + ROB_BONE_TL_KUTI_L_WJ = 0x2B, + ROB_BONE_N_KUTI_M_L = 0x2C, + ROB_BONE_TL_KUTI_M_L_WJ = 0x2D, + ROB_BONE_N_KUTI_M_R = 0x2E, + ROB_BONE_TL_KUTI_M_R_WJ = 0x2F, + ROB_BONE_N_KUTI_R = 0x30, + ROB_BONE_TL_KUTI_R_WJ = 0x31, + ROB_BONE_N_KUTI_U = 0x32, + ROB_BONE_TL_KUTI_U_WJ = 0x33, + ROB_BONE_N_KUTI_U_L = 0x34, + ROB_BONE_TL_KUTI_U_L_WJ = 0x35, + ROB_BONE_N_KUTI_U_R = 0x36, + ROB_BONE_TL_KUTI_U_R_WJ = 0x37, + ROB_BONE_N_MABU_L_D_A = 0x38, + ROB_BONE_TL_MABU_L_D_A_WJ = 0x39, + ROB_BONE_N_MABU_L_D_B = 0x3A, + ROB_BONE_TL_MABU_L_D_B_WJ = 0x3B, + ROB_BONE_N_MABU_L_D_C = 0x3C, + ROB_BONE_TL_MABU_L_D_C_WJ = 0x3D, + ROB_BONE_N_MABU_L_U_A = 0x3E, + ROB_BONE_TL_MABU_L_U_A_WJ = 0x3F, + ROB_BONE_N_MABU_L_U_B = 0x40, + ROB_BONE_TL_MABU_L_U_B_WJ = 0x41, + ROB_BONE_N_EYELASHES_L = 0x42, + ROB_BONE_TL_EYELASHES_L_WJ = 0x43, + ROB_BONE_N_MABU_L_U_C = 0x44, + ROB_BONE_TL_MABU_L_U_C_WJ = 0x45, + ROB_BONE_N_MABU_R_D_A = 0x46, + ROB_BONE_TL_MABU_R_D_A_WJ = 0x47, + ROB_BONE_N_MABU_R_D_B = 0x48, + ROB_BONE_TL_MABU_R_D_B_WJ = 0x49, + ROB_BONE_N_MABU_R_D_C = 0x4A, + ROB_BONE_TL_MABU_R_D_C_WJ = 0x4B, + ROB_BONE_N_MABU_R_U_A = 0x4C, + ROB_BONE_TL_MABU_R_U_A_WJ = 0x4D, + ROB_BONE_N_MABU_R_U_B = 0x4E, + ROB_BONE_TL_MABU_R_U_B_WJ = 0x4F, + ROB_BONE_N_EYELASHES_R = 0x50, + ROB_BONE_TL_EYELASHES_R_WJ = 0x51, + ROB_BONE_N_MABU_R_U_C = 0x52, + ROB_BONE_TL_MABU_R_U_C_WJ = 0x53, + ROB_BONE_N_MAYU_L = 0x54, + ROB_BONE_TL_MAYU_L_WJ = 0x55, + ROB_BONE_N_MAYU_L_B = 0x56, + ROB_BONE_TL_MAYU_L_B_WJ = 0x57, + ROB_BONE_N_MAYU_L_C = 0x58, + ROB_BONE_TL_MAYU_L_C_WJ = 0x59, + ROB_BONE_N_MAYU_R = 0x5A, + ROB_BONE_TL_MAYU_R_WJ = 0x5B, + ROB_BONE_N_MAYU_R_B = 0x5C, + ROB_BONE_TL_MAYU_R_B_WJ = 0x5D, + ROB_BONE_N_MAYU_R_C = 0x5E, + ROB_BONE_TL_MAYU_R_C_WJ = 0x5F, + ROB_BONE_N_TOOTH_UPPER = 0x60, + ROB_BONE_TL_TOOTH_UPPER_WJ = 0x61, + ROB_BONE_N_KUBI_WJ_EX = 0x62, + ROB_BONE_N_WAKI_L = 0x63, + ROB_BONE_KL_WAKI_L_WJ = 0x64, + ROB_BONE_TL_UP_KATA_L = 0x65, + ROB_BONE_C_KATA_L = 0x66, + ROB_BONE_KATA_L_WJ_CU = 0x67, + ROB_BONE_UDE_L_WJ = 0x68, + ROB_BONE_KL_TE_L_WJ = 0x69, + ROB_BONE_N_HITO_L_EX = 0x6A, + ROB_BONE_NL_HITO_L_WJ = 0x6B, + ROB_BONE_NL_HITO_B_L_WJ = 0x6C, + ROB_BONE_NL_HITO_C_L_WJ = 0x6D, + ROB_BONE_N_KO_L_EX = 0x6E, + ROB_BONE_NL_KO_L_WJ = 0x6F, + ROB_BONE_NL_KO_B_L_WJ = 0x70, + ROB_BONE_NL_KO_C_L_WJ = 0x71, + ROB_BONE_N_KUSU_L_EX = 0x72, + ROB_BONE_NL_KUSU_L_WJ = 0x73, + ROB_BONE_NL_KUSU_B_L_WJ = 0x74, + ROB_BONE_NL_KUSU_C_L_WJ = 0x75, + ROB_BONE_N_NAKA_L_EX = 0x76, + ROB_BONE_NL_NAKA_L_WJ = 0x77, + ROB_BONE_NL_NAKA_B_L_WJ = 0x78, + ROB_BONE_NL_NAKA_C_L_WJ = 0x79, + ROB_BONE_N_OYA_L_EX = 0x7A, + ROB_BONE_NL_OYA_L_WJ = 0x7B, + ROB_BONE_NL_OYA_B_L_WJ = 0x7C, + ROB_BONE_NL_OYA_C_L_WJ = 0x7D, + ROB_BONE_N_STE_L_WJ_EX = 0x7E, + ROB_BONE_N_SUDE_L_WJ_EX = 0x7F, + ROB_BONE_N_SUDE_B_L_WJ_EX = 0x80, + ROB_BONE_N_HIJI_L_WJ_EX = 0x81, + ROB_BONE_N_UP_KATA_L_EX = 0x82, + ROB_BONE_N_SKATA_L_WJ_CD_EX = 0x83, + ROB_BONE_N_SKATA_B_L_WJ_CD_CU_EX = 0x84, + ROB_BONE_N_SKATA_C_L_WJ_CD_CU_EX = 0x85, + ROB_BONE_N_WAKI_R = 0x86, + ROB_BONE_KL_WAKI_R_WJ = 0x87, + ROB_BONE_TL_UP_KATA_R = 0x88, + ROB_BONE_C_KATA_R = 0x89, + ROB_BONE_KATA_R_WJ_CU = 0x8A, + ROB_BONE_UDE_R_WJ = 0x8B, + ROB_BONE_KL_TE_R_WJ = 0x8C, + ROB_BONE_N_HITO_R_EX = 0x8D, + ROB_BONE_NL_HITO_R_WJ = 0x8E, + ROB_BONE_NL_HITO_B_R_WJ = 0x8F, + ROB_BONE_NL_HITO_C_R_WJ = 0x90, + ROB_BONE_N_KO_R_EX = 0x91, + ROB_BONE_NL_KO_R_WJ = 0x92, + ROB_BONE_NL_KO_B_R_WJ = 0x93, + ROB_BONE_NL_KO_C_R_WJ = 0x94, + ROB_BONE_N_KUSU_R_EX = 0x95, + ROB_BONE_NL_KUSU_R_WJ = 0x96, + ROB_BONE_NL_KUSU_B_R_WJ = 0x97, + ROB_BONE_NL_KUSU_C_R_WJ = 0x98, + ROB_BONE_N_NAKA_R_EX = 0x99, + ROB_BONE_NL_NAKA_R_WJ = 0x9A, + ROB_BONE_NL_NAKA_B_R_WJ = 0x9B, + ROB_BONE_NL_NAKA_C_R_WJ = 0x9C, + ROB_BONE_N_OYA_R_EX = 0x9D, + ROB_BONE_NL_OYA_R_WJ = 0x9E, + ROB_BONE_NL_OYA_B_R_WJ = 0x9F, + ROB_BONE_NL_OYA_C_R_WJ = 0xA0, + ROB_BONE_N_STE_R_WJ_EX = 0xA1, + ROB_BONE_N_SUDE_R_WJ_EX = 0xA2, + ROB_BONE_N_SUDE_B_R_WJ_EX = 0xA3, + ROB_BONE_N_HIJI_R_WJ_EX = 0xA4, + ROB_BONE_N_UP_KATA_R_EX = 0xA5, + ROB_BONE_N_SKATA_R_WJ_CD_EX = 0xA6, + ROB_BONE_N_SKATA_B_R_WJ_CD_CU_EX = 0xA7, + ROB_BONE_N_SKATA_C_R_WJ_CD_CU_EX = 0xA8, + ROB_BONE_KL_KOSI_Y = 0xA9, + ROB_BONE_KL_KOSI_XZ = 0xAA, + ROB_BONE_KL_KOSI_ETC_WJ = 0xAB, + ROB_BONE_CL_MOMO_L = 0xAC, + ROB_BONE_J_MOMO_L_WJ = 0xAD, + ROB_BONE_J_SUNE_L_WJ = 0xAE, + ROB_BONE_KL_ASI_L_WJ_CO = 0xAF, + ROB_BONE_KL_TOE_L_WJ = 0xB0, + ROB_BONE_N_HIZA_L_WJ_EX = 0xB1, + ROB_BONE_CL_MOMO_R = 0xB2, + ROB_BONE_J_MOMO_R_WJ = 0xB3, + ROB_BONE_J_SUNE_R_WJ = 0xB4, + ROB_BONE_KL_ASI_R_WJ_CO = 0xB5, + ROB_BONE_KL_TOE_R_WJ = 0xB6, + ROB_BONE_N_HIZA_R_WJ_EX = 0xB7, + ROB_BONE_N_MOMO_A_L_WJ_CD_EX = 0xB8, + ROB_BONE_N_MOMO_B_L_WJ_EX = 0xB9, + ROB_BONE_N_MOMO_C_L_WJ_EX = 0xBA, + ROB_BONE_N_MOMO_A_R_WJ_CD_EX = 0xBB, + ROB_BONE_N_MOMO_B_R_WJ_EX = 0xBC, + ROB_BONE_N_MOMO_C_R_WJ_EX = 0xBD, + ROB_BONE_N_HARA_CD_EX = 0xBE, + ROB_BONE_N_HARA_B_WJ_EX = 0xBF, + ROB_BONE_N_HARA_C_WJ_EX = 0xC0, + ROB_BONE_MAX = 0xC1, +} rob_bone_index; -typedef enum rob_sub_action_param_type { - ROB_SUB_ACTION_PARAM_NONE = 0x0, - ROB_SUB_ACTION_PARAM_CRY = 0x1, - ROB_SUB_ACTION_PARAM_SHAKE_HAND = 0x2, - ROB_SUB_ACTION_PARAM_EMBARRASSED = 0x3, - ROB_SUB_ACTION_PARAM_ANGRY = 0x4, - ROB_SUB_ACTION_PARAM_LAUGH = 0x5, - ROB_SUB_ACTION_PARAM_COUNT_NUM = 0x6, -} rob_sub_action_param_type; +typedef enum rob_chara_type { + ROB_CHARA_TYPE_NONE = -1, + ROB_CHARA_TYPE_0 = 0x00, + ROB_CHARA_TYPE_1 = 0x01, + ROB_CHARA_TYPE_2 = 0x02, + ROB_CHARA_TYPE_3 = 0x03, +} rob_chara_type; -typedef struct bone_node bone_node; -typedef struct rob_chara rob_chara; -typedef struct rob_chara_bone_data rob_chara_bone_data; +typedef enum rob_chara_data_hand_adjust_type : uint16_t { + ROB_CHARA_DATA_HAND_ADJUST_NONE = (uint16_t)-1, + ROB_CHARA_DATA_HAND_ADJUST_NORMAL = 0x00, + ROB_CHARA_DATA_HAND_ADJUST_SHORT = 0x01, + ROB_CHARA_DATA_HAND_ADJUST_TALL = 0x02, + ROB_CHARA_DATA_HAND_ADJUST_MIN = 0x03, + ROB_CHARA_DATA_HAND_ADJUST_MAX = 0x04, + ROB_CHARA_DATA_HAND_ADJUST_OPPOSITE_CHARA = 0x05, + ROB_CHARA_DATA_HAND_ADJUST_CUSTOM = 0x06, + ROB_CHARA_DATA_HAND_ADJUST_1P = 0x07, + ROB_CHARA_DATA_HAND_ADJUST_2P = 0x08, + ROB_CHARA_DATA_HAND_ADJUST_3P = 0x09, + ROB_CHARA_DATA_HAND_ADJUST_4P = 0x0A, +} rob_chara_data_hand_adjust_type; -typedef struct bone_node_expression_data { +typedef enum rob_osage_parts { + ROB_OSAGE_PARTS_NONE = -1, + ROB_OSAGE_PARTS_LEFT = 0x00, + ROB_OSAGE_PARTS_RIGHT = 0x01, + ROB_OSAGE_PARTS_CENTER = 0x02, + ROB_OSAGE_PARTS_LONG_C = 0x03, + ROB_OSAGE_PARTS_SHORT_L = 0x04, + ROB_OSAGE_PARTS_SHORT_R = 0x05, + ROB_OSAGE_PARTS_APPEND_L = 0x06, + ROB_OSAGE_PARTS_APPEND_R = 0x07, + ROB_OSAGE_PARTS_MUFFLER = 0x08, + ROB_OSAGE_PARTS_WHITE_ONE_L = 0x09, + ROB_OSAGE_PARTS_PONY = 0x0A, + ROB_OSAGE_PARTS_ANGEL_L = 0x0B, + ROB_OSAGE_PARTS_ANGEL_R = 0x0C, + ROB_OSAGE_PARTS_MAX = 0x0D, +} rob_osage_parts; + +typedef enum rob_osage_parts_bit { + ROB_OSAGE_PARTS_LEFT_BIT = 0x0001, + ROB_OSAGE_PARTS_RIGHT_BIT = 0x0002, + ROB_OSAGE_PARTS_CENTER_BIT = 0x0004, + ROB_OSAGE_PARTS_LONG_C_BIT = 0x0008, + ROB_OSAGE_PARTS_SHORT_L_BIT = 0x0010, + ROB_OSAGE_PARTS_SHORT_R_BIT = 0x0020, + ROB_OSAGE_PARTS_APPEND_L_BIT = 0x0040, + ROB_OSAGE_PARTS_APPEND_R_BIT = 0x0080, + ROB_OSAGE_PARTS_MUFFLER_BIT = 0x0100, + ROB_OSAGE_PARTS_WHITE_ONE_L_BIT = 0x0200, + ROB_OSAGE_PARTS_PONY_BIT = 0x0400, + ROB_OSAGE_PARTS_ANGEL_L_BIT = 0x0800, + ROB_OSAGE_PARTS_ANGEL_R_BIT = 0x1000, +} rob_osage_parts_bit; + +typedef enum SubActExecType { + SUB_ACTION_EXECUTE_NONE = 0, + SUB_ACTION_EXECUTE_CRY = 1, + SUB_ACTION_EXECUTE_SHAKE_HAND = 2, + SUB_ACTION_EXECUTE_EMBARRASSED = 3, + SUB_ACTION_EXECUTE_ANGRY = 4, + SUB_ACTION_EXECUTE_LAUGH = 5, + SUB_ACTION_EXECUTE_COUNT_NUM = 6, +} SubActExecType; + +typedef enum SubActParamType { + SUB_ACTION_PARAM_NONE = 0x0, + SUB_ACTION_PARAM_CRY = 0x1, + SUB_ACTION_PARAM_SHAKE_HAND = 0x2, + SUB_ACTION_PARAM_EMBARRASSED = 0x3, + SUB_ACTION_PARAM_ANGRY = 0x4, + SUB_ACTION_PARAM_LAUGH = 0x5, + SUB_ACTION_PARAM_COUNT_NUM = 0x6, +} SubActParamType; + +class rob_chara; +class rob_chara_bone_data; + +class bone_node_expression_data { +public: vec3 position; vec3 rotation; vec3 scale; vec3 parent_scale; -} bone_node_expression_data; -struct bone_node { - char* name; + bone_node_expression_data(); + ~bone_node_expression_data(); +}; + +class bone_node { +public: + const char* name; mat4* mat; bone_node* parent; bone_node_expression_data exp_data; mat4* ex_data_mat; -}; -vector_old(bone_node) + bone_node(); + ~bone_node(); +}; typedef struct struc_314 { uint32_t* field_0; @@ -411,11 +756,6 @@ typedef struct eyes_adjust { float_t pos; } eyes_adjust; -typedef struct struc_313 { - vector_old_uint32_t bitfield; - size_t motion_bone_count; -} struc_313; - typedef struct mot { uint16_t key_set_count; uint16_t frame_count; @@ -428,7 +768,7 @@ typedef struct struc_369 { float_t field_4; } struc_369; -typedef struct mot_parent { +typedef struct mot_key_data { bool key_sets_ready; size_t key_set_count; vector_old_mot_key_set key_set; @@ -440,7 +780,7 @@ typedef struct mot_parent { int32_t motion_id; float_t frame; struc_369 field_68; -} mot_parent; +} mot_key_data; typedef struct bone_data { bone_database_bone_type type; @@ -485,10 +825,10 @@ typedef struct bone_data_parent { float_t rotation_y; } bone_data_parent; -typedef struct struc_346 { +typedef struct mot_play_frame_data { float_t frame; float_t step; - float_t field_8; + float_t step_prev; float_t frame_count; float_t last_frame; float_t field_14; @@ -498,16 +838,16 @@ typedef struct struc_346 { float_t field_24; bool field_28; int32_t field_2C; -} struc_346; +} mot_play_frame_data; -typedef struct struc_370 { - struc_346 field_0; +typedef struct mot_play_data { + mot_play_frame_data frame_data; int32_t field_30; bool field_34; float_t field_38; float_t* field_40; float_t* field_48; -} struc_370; +} mot_play_data; typedef struct struc_308 { int32_t field_0; @@ -520,7 +860,7 @@ typedef struct struc_308 { vec3 field_9C; vec3 field_A8; float_t eyes_adjust; - float_t field_B8; + float_t prev_eyes_adjust; uint8_t field_BC; uint8_t field_BD; float_t field_C0; @@ -528,40 +868,240 @@ typedef struct struc_308 { vec3 field_C8; } struc_308; -typedef struct motion_blend_mot { - bone_data_parent bone_data; - mot_parent mot_data; - struc_370 field_4A8; - struc_308 field_4F8; -} motion_blend_mot; +typedef struct struc_400 { + bool field_0; + bool field_1; + bool field_2; + bool field_3; + bool field_4; + float_t frame; + float_t eyes_adjust; + float_t prev_eyes_adjust; +} struc_400; -vector_old_ptr(motion_blend_mot) +class MotionBlend { +public: + bool field_8; + bool field_9; + float_t duration; + float_t frame; + float_t step; + float_t offset; + float_t blend; + + MotionBlend(); + virtual ~MotionBlend(); + virtual void Reset(); + virtual void Field_10(float_t a2, float_t a3, int32_t a4) = 0; + virtual void Field_18(struc_400*) = 0; + virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) = 0; + virtual void Blend(bone_data*, bone_data*) = 0; + virtual bool Field_30(); + + void SetDuration(float_t duration, float_t step, float_t offset); +}; + +class MotionBlendCross : public MotionBlend { +public: + bool field_20; + bool field_21; + mat4u field_24; + mat4u field_64; + mat4u field_A4; + mat4u field_E4; + + MotionBlendCross(); + virtual ~MotionBlendCross() override; + virtual void Reset() override; + virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; + virtual void Field_18(struc_400*) override; + virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) override; + virtual void Blend(bone_data*, bone_data*) override; +}; + +class MotionBlendCombine : public MotionBlendCross { +public: + MotionBlendCombine(); + virtual ~MotionBlendCombine() override; + virtual void Field_18(struc_400*) override; + virtual bool Field_30() override; +}; + +class MotionBlendFreeze : public MotionBlend { +public: + bool field_20; + bool field_21; + int32_t field_24; + float_t field_28; + float_t field_2C; + int32_t field_30; + mat4u field_34; + mat4u field_74; + mat4u field_B4; + mat4u field_F4; + + MotionBlendFreeze(); + virtual ~MotionBlendFreeze() override; + virtual void Reset() override; + virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; + virtual void Field_18(struc_400*) override; + virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) override; + virtual void Blend(bone_data*, bone_data*) override; +}; + +class PartialMotionBlendFreeze : public MotionBlendFreeze { +public: + PartialMotionBlendFreeze(); + virtual ~PartialMotionBlendFreeze() override; + virtual void Reset() override; + virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; + virtual void Field_18(struc_400*) override; + virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) override; + virtual void Blend(bone_data*, bone_data*) override; +}; + +class struc_313 { +public: + std::vector bitfield; + size_t motion_bone_count; + + struc_313(); + ~struc_313(); +}; + + +class struc_240 { +public: + bool(*bone_check_func)(motion_bone_index bone_index); + struc_313 field_8; + size_t motion_bone_count; + + struc_240(); + ~struc_240(); +}; + +class motion_blend_mot { +public: + struc_240 field_0; + MotionBlendCross cross; + MotionBlendFreeze freeze; + MotionBlendCombine combine; + bone_data_parent bone_data; + mot_key_data mot_key_data; + mot_play_data mot_play_data; + struc_308 field_4F8; + int32_t field_5CC; + MotionBlend* blend; + + motion_blend_mot(); + ~motion_blend_mot(); +}; typedef struct rob_chara_bone_data_ik_scale { float_t ratio0; float_t ratio1; float_t ratio2; float_t ratio3; + + rob_chara_bone_data_ik_scale(); } rob_chara_bone_data_ik_scale; -struct rob_chara_bone_data { - size_t object_bone_count; - size_t total_bone_count; - size_t motion_bone_count; - size_t ik_bone_count; - size_t chain_pos; - vector_old_mat4 mats; - vector_old_mat4 mats2; - vector_old_bone_node nodes; - bone_database_skeleton_type base_skeleton_type; - bone_database_skeleton_type skeleton_type; - vector_old_ptr_motion_blend_mot motions; - vector_old_size_t motion_indices; - vector_old_size_t motion_loaded_indices; - vector_old_ptr_motion_blend_mot motion_loaded; - rob_chara_bone_data_ik_scale ik_scale; +class mot_blend { +public: + struc_240 field_0; + bool field_30; + mot_key_data mot_key_data; + mot_play_data mot_play_data; + PartialMotionBlendFreeze blend; + + mot_blend(); + ~mot_blend(); }; +typedef struct struc_241 { + float_t field_0; + float_t field_4; + float_t field_8; + float_t field_C; + float_t field_10; + float_t field_14; + float_t field_18; + float_t field_1C; + float_t field_20; + float_t field_24; + float_t field_28; + float_t field_2C; + float_t field_30; + float_t field_34; + float_t field_38; + float_t field_3C; + float_t field_40; +} struc_241; + +typedef struct struc_243 { + float_t field_0; + float_t field_4; + float_t field_8; + float_t field_C; + int32_t field_10; + int32_t field_14; + int32_t field_18; + int32_t field_1C; + float_t field_20; + float_t field_24; +} struc_243; + +typedef struct struc_258 { + std::vector* field_0; + mat4u field_8; + struc_241 field_48; + bool field_8C; + bool field_8D; + bool field_8E; + bool field_8F; + bool field_90; + bool field_91; + float_t field_94; + float_t field_98; + float_t field_9C; + float_t field_A0; + float_t field_A4; + float_t field_A8; + float_t field_AC; + float_t field_B0; + vec3 field_B4; + vec3 field_C0; + mat4u field_CC; + mat4u field_10C; + bool field_14C; + float_t field_150; + float_t field_154; + float_t field_158; + struc_243 field_15C; + float_t field_184; + float_t field_188; + float_t field_18C; + bool field_190; + bool field_191; + bool field_192; + bool field_193; + bool field_194; + bool field_195; + float_t field_198; + float_t field_19C; + float_t field_1A0; + int32_t field_1A4; + int32_t field_1A8; + float_t field_1AC; + float_t field_1B0; + int32_t field_1B4; + int32_t field_1B8; + vec2 field_1BC; + bool field_1C4; + int32_t field_1C8; + int32_t field_1CC; +} struc_258; + typedef struct struc_242 { float_t field_0; float_t field_4; @@ -576,13 +1116,65 @@ typedef struct struc_242 { float_t field_28; } struc_242; -typedef struct rob_chara_pv_data { - int32_t field_0; +class struc_312 { +public: + struc_242 field_0; + struc_242 field_2C; + bool field_58; + bool field_59; + vec3 field_5C; + vec3 field_68; + vec3 field_74; + vec3 field_80; + float_t field_8C; + std::vector* field_90; + float_t field_98; +}; + +class rob_chara_bone_data { +public: + bool field_0; + bool field_1; + size_t object_bone_count; + size_t total_bone_count; + size_t motion_bone_count; + size_t ik_bone_count; + size_t chain_pos; + std::vector mats; + std::vector mats2; + std::vector nodes; + bone_database_skeleton_type base_skeleton_type; + bone_database_skeleton_type skeleton_type; + std::vector motions; + std::list motion_indices; + std::list motion_loaded_indices; + std::list motion_loaded; + mot_blend face; + mot_blend hand_l; + mot_blend hand_r; + mot_blend mouth; + mot_blend eyes; + mot_blend eyelid; + bool field_758; + rob_chara_bone_data_ik_scale ik_scale; + vec3 field_76C; + vec3 field_778; + int32_t field_784; + struc_258 field_788; + struc_312 field_958; + + rob_chara_bone_data(); + ~rob_chara_bone_data(); +}; + +class rob_chara_pv_data { +public: + rob_chara_type type; bool field_4; bool field_5; bool field_6; vec3 field_8; - int16_t field_14; + int16_t rot_y_int16; int16_t field_16; struc_242 field_18; struc_242 field_44; @@ -592,7 +1184,10 @@ typedef struct rob_chara_pv_data { bool height_adjust; int32_t item_no[4]; eyes_adjust eyes_adjust; -} rob_chara_pv_data; + + rob_chara_pv_data(); + ~rob_chara_pv_data(); +}; typedef struct struc_218 { vec3 bone_offset; @@ -622,48 +1217,28 @@ typedef struct chara_init_data { object_info face_objects[15]; } chara_init_data; -typedef struct struc_241 { - float_t field_0; - float_t field_4; - float_t field_8; - float_t field_C; - float_t field_10; - float_t field_14; - float_t field_18; - float_t field_1C; - float_t field_20; - float_t field_24; - float_t field_28; - float_t field_2C; - float_t field_30; - float_t field_34; - float_t field_38; - float_t field_3C; - float_t field_40; -} struc_241; - -typedef struct rob_chara_item_equip_object rob_chara_item_equip_object; +class rob_chara_item_equip_object; class ExNodeBlock { public: bone_node* bone_node_ptr; ex_node_type type; - char* name; + const char* name; bone_node* parent_bone_node; - string parent_name; + std::string parent_name; ExNodeBlock* parent_node; rob_chara_item_equip_object* item_equip_object; bool field_58; bool field_59; - bool field_5A; + bool has_parent_node; ExNodeBlock(); virtual ~ExNodeBlock(); virtual void Init() = 0; virtual void Field_10() = 0; - virtual void Field_18(int32_t a2, bool a3) = 0; - virtual void Update() = 0; - virtual void Field_28() = 0; + virtual void Field_18(int32_t stage, bool a3) = 0; + virtual void Field_20() = 0; + virtual void SetOsagePlayData() = 0; virtual void Disp() = 0; virtual void Reset(); virtual void Field_40() = 0; @@ -671,11 +1246,8 @@ public: virtual void Field_50() = 0; virtual void Field_58(); - static void InitData(ExNodeBlock* node, bone_node* bone_node, ex_node_type type, - char* name, rob_chara_item_equip_object* itm_eq_obj); - -private: - void InitMembers(); + void InitData(bone_node* bone_node, ex_node_type type, + const char* name, rob_chara_item_equip_object* itm_eq_obj); }; class ExNullBlock : public ExNodeBlock { @@ -686,9 +1258,9 @@ public: virtual ~ExNullBlock() override; virtual void Init() override; virtual void Field_10(); - virtual void Field_18(int32_t a2, bool a3) override; - virtual void Update() override; - virtual void Field_28() override; + virtual void Field_18(int32_t stage, bool a3) override; + virtual void Field_20() override; + virtual void SetOsagePlayData() override; virtual void Disp() override; virtual void Reset(); virtual void Field_40() override; @@ -696,13 +1268,12 @@ public: virtual void Field_50() override; virtual void Field_58(); - static void InitData(ExNullBlock* null, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_constraint* cns_data, char* cns_data_name, bone_database* bone_data); - -private: - void InitMembers(); + void InitData(rob_chara_item_equip_object* itm_eq_obj, object_skin_block_constraint* cns_data, + const char* cns_data_name, bone_database* bone_data); }; +class struc_571; + struct ExClothBlock : public ExNodeBlock { public: //rob_cloth rob; @@ -714,9 +1285,9 @@ public: virtual ~ExClothBlock() override; virtual void Init() override; virtual void Field_10(); - virtual void Field_18(int32_t a2, bool a3) override; - virtual void Update() override; - virtual void Field_28() override; + virtual void Field_18(int32_t stage, bool a3) override; + virtual void Field_20() override; + virtual void SetOsagePlayData() override; virtual void Disp() override; virtual void Reset() override; virtual void Field_40() override; @@ -724,19 +1295,19 @@ public: virtual void Field_50() override; virtual void Field_58(); -private: - void InitMembers(); + float_t* LoadOpdData(size_t node_index, float_t* opd_data, size_t opd_count); + void SetMotionResetData(int32_t motion_id, float_t frame); + void SetOsageReset(); + void SetSkinParam(struc_571* skp); }; -typedef struct struc_331 { - int64_t field_0; - int64_t field_8; - int64_t field_10; -} struc_331; +typedef struct opd_vec3_data { + float_t* x; + float_t* y; + float_t* z; +} opd_vec3_data; -vector_old(struc_331) - -typedef struct rob_osage_node rob_osage_node; +class rob_osage_node; typedef struct rob_osage_node_data_normal_ref { bool field_0; @@ -748,39 +1319,60 @@ typedef struct rob_osage_node_data_normal_ref { mat4u mat; } rob_osage_node_data_normal_ref; -typedef struct skin_param_hinge { +class skin_param_hinge { +public: float_t ymin; float_t ymax; float_t zmin; float_t zmax; -} skin_param_hinge; -typedef struct skin_param_osage_node { + skin_param_hinge(); + ~skin_param_hinge(); + + void limit(); +}; + +class skin_param_osage_node { +public: float_t coli_r; float_t weight; float_t inertial_cancel; skin_param_hinge hinge; -} skin_param_osage_node; -vector_old(skin_param_osage_node) + skin_param_osage_node(); + ~skin_param_osage_node(); +}; -vector_old_ptr(rob_osage_node) - -typedef struct rob_osage_node_data { +class rob_osage_node_data { +public: float_t force; - vector_old_ptr_rob_osage_node boc; + std::vector boc; rob_osage_node_data_normal_ref normal_ref; skin_param_osage_node skp_osg_node; -} rob_osage_node_data; -typedef struct struc_479 { + rob_osage_node_data(); + ~rob_osage_node_data(); +}; + +typedef struct struc_477 { + float_t length; + vec3 angle; +} struc_477; + +typedef struct struc_476 { + struc_477 field_0; + struc_477 field_10; +} struc_476; + +typedef struct rob_osage_node_reset_data { vec3 trans; vec3 trans_diff; vec3 rotation; - float_t field_24; -} struc_479; + float_t length; +} rob_osage_node_reset_data; -struct rob_osage_node { +class rob_osage_node { +public: float_t length; vec3 trans; vec3 trans_orig; @@ -791,60 +1383,59 @@ struct rob_osage_node { mat4* bone_node_mat; mat4u mat; rob_osage_node* sibling_node; - float_t distance; + float_t max_distance; vec3 field_94; - struc_479 field_A0; + rob_osage_node_reset_data reset_data; float_t field_C8; float_t field_CC; - vec3 field_D0; + vec3 external_force; float_t force; rob_osage_node_data* data_ptr; rob_osage_node_data data; - vector_old_struc_331 field_198; - float_t field_1B0; - vec3 field_1B4; - vec3 field_1C0; - float_t field_1CC; + std::vector opd_data; + struc_476 field_1B0; + + rob_osage_node(); + ~rob_osage_node(); }; -vector_old(rob_osage_node) - -typedef struct pair_uint32_t_ptr_rob_osage_node { - uint32_t key; - rob_osage_node* value; -} pair_uint32_t_ptr_rob_osage_node; - -vector_old(pair_uint32_t_ptr_rob_osage_node) - -typedef struct skin_param_osage_root_coli { +class skin_param_osage_root_coli { +public: int32_t type; int32_t bone0_index; int32_t bone1_index; float_t radius; vec3 bone0_pos; vec3 bone1_pos; -} skin_param_osage_root_coli; -vector_old(skin_param_osage_root_coli) + skin_param_osage_root_coli(); + ~skin_param_osage_root_coli(); +}; -typedef struct skin_param_osage_root_normal_ref { - string n; - string u; - string d; - string l; - string r; -} skin_param_osage_root_normal_ref; +class skin_param_osage_root_normal_ref { +public: + std::string n; + std::string u; + std::string d; + std::string l; + std::string r; -typedef struct skin_param_osage_root_boc { + skin_param_osage_root_normal_ref(); + ~skin_param_osage_root_normal_ref(); +}; + +class skin_param_osage_root_boc { +public: int32_t ed_node; - string ed_root; + std::string ed_root; int32_t st_node; -} skin_param_osage_root_boc; -vector_old(skin_param_osage_root_boc) -vector_old(skin_param_osage_root_normal_ref) + skin_param_osage_root_boc(); + ~skin_param_osage_root_boc(); +}; -typedef struct skin_param_osage_root { +class skin_param_osage_root { +public: int32_t field_0; float_t force; float_t force_gain; @@ -855,21 +1446,26 @@ typedef struct skin_param_osage_root { float_t init_rot_z; float_t hinge_y; float_t hinge_z; - char* name; - vector_old_skin_param_osage_root_coli coli; + const char* name; + std::vector coli; float_t coli_r; float_t friction; float_t wind_afc; - vector_old_skin_param_osage_root_boc boc; + int32_t yz_order; + std::vector boc; int32_t coli_type; float_t stiffness; float_t move_cancel; - string colli_tgt_osg; - vector_old_skin_param_osage_root_normal_ref normal_ref; -} skin_param_osage_root; + std::string colli_tgt_osg; + std::vector normal_ref; -typedef struct skin_param { - vector_old_skin_param_osage_root_coli coli; + skin_param_osage_root(); + ~skin_param_osage_root(); +}; + +class skin_param { +public: + std::vector coli; float_t friction; float_t wind_afc; float_t air_res; @@ -882,10 +1478,24 @@ typedef struct skin_param { skin_param_hinge hinge; float_t force; float_t force_gain; - vector_old_rob_osage_node* colli_tgt_osg; -} skin_param; + std::vector* colli_tgt_osg; -typedef struct osage_coli { + skin_param(); + ~skin_param(); +}; + +class struc_571 { +public: + skin_param skin_param; + std::vector nodes_data; + bool field_88; + + struc_571(); + ~struc_571(); +}; + +class osage_coli { +public: int32_t type; float_t radius; vec3 bone0_pos; @@ -894,11 +1504,13 @@ typedef struct osage_coli { float_t bone_pos_diff_length; float_t bone_pos_diff_length_squared; float_t field_34; -} osage_coli; -vector_old(osage_coli) + osage_coli(); + ~osage_coli(); +}; -typedef struct osage_ring_data { +class osage_ring_data { +public: float_t ring_rectangle_x; float_t ring_rectangle_y; float_t ring_rectangle_width; @@ -906,18 +1518,28 @@ typedef struct osage_ring_data { float_t ring_height; float_t ring_out_height; bool field_18; - vector_old_osage_coli coli; - vector_old_skin_param_osage_root_coli skp_root_coli; -} osage_ring_data; + std::vector coli; + std::vector skp_root_coli; -typedef struct rob_osage { + osage_ring_data(); + ~osage_ring_data(); +}; + +typedef struct osage_setting_osg_cat { + int32_t parts; + size_t exf; + + osage_setting_osg_cat(); +} osage_setting_osg_cat; + +class rob_osage { +public: skin_param* skin_param_ptr; bone_node_expression_data exp_data; - vector_old_rob_osage_node nodes; + std::vector nodes; rob_osage_node node; skin_param skin_param; - int32_t field_290; - int64_t field_298; + osage_setting_osg_cat osage_setting; bool field_2A0; bool field_2A1; float_t field_2A4; @@ -925,31 +1547,30 @@ typedef struct rob_osage { osage_coli coli_ring[64]; vec3 wind_direction; float_t field_1EB4; - int32_t field_1EB8; + int32_t yz_order; int32_t field_1EBC; mat4* parent_mat_ptr; mat4u parent_mat; float_t move_cancel; bool field_1F0C; - bool wind_reset; + bool osage_reset; bool field_1F0E; bool field_1F0F; osage_ring_data ring; - //tree_295 field_1F60; - int64_t field_1F70; - bool field_1F78; - vec3 field_1F7C; -} rob_osage; + std::map, std::list> motion_reset_data; + std::list* reset_data_list; + bool set_external_force; + vec3 external_force; -typedef struct pair_name_ExOsageBlock pair_name_ExOsageBlock; - -vector_old(pair_name_ExOsageBlock) + rob_osage(); + ~rob_osage(); +}; class ExOsageBlock : public ExNodeBlock { public: size_t index; rob_osage rob; - mat4* mat; + mat4* mats; int32_t field_1FF8; float_t step; @@ -957,9 +1578,9 @@ public: virtual ~ExOsageBlock() override; virtual void Init() override; virtual void Field_10(); - virtual void Field_18(int32_t a2, bool a3) override; - virtual void Update() override; - virtual void Field_28() override; + virtual void Field_18(int32_t stage, bool a3) override; + virtual void Field_20() override; + virtual void SetOsagePlayData() override; virtual void Disp() override; virtual void Reset() override; virtual void Field_40() override; @@ -967,29 +1588,24 @@ public: virtual void Field_50() override; virtual void Field_58() override; - static void InitData(ExOsageBlock* osg, - rob_chara_item_equip_object* itm_eq_obj, object_skin_block_osage* osg_data, - char* osg_data_name, object_skin_osage_node* osg_nodes, bone_node* bone_nodes, + void InitData(rob_chara_item_equip_object* itm_eq_obj, object_skin_block_osage* osg_data, + const char* osg_data_name, object_skin_osage_node* osg_nodes, bone_node* bone_nodes, bone_node* ex_data_bone_nodes, object_skin* skin); - static void SetWindDirection(ExOsageBlock* osg); - static void sub_1405F3E10(ExOsageBlock* osg, object_skin_block_osage* osg_data, - object_skin_osage_node* osg_nodes, vector_old_pair_uint32_t_ptr_rob_osage_node* a4, - vector_old_pair_name_ExOsageBlock* a5); - -private: - void InitMembers(); -}; - -struct pair_name_ExOsageBlock { - char* name; - ExOsageBlock* block; + float_t* LoadOpdData(size_t node_index, float_t* opd_data, size_t opd_count); + void SetMotionResetData(int32_t motion_id, float_t frame); + void SetOsageReset(); + void SetSkinParam(struc_571* skp); + void SetWindDirection(); + void sub_1405F3E10(object_skin_block_osage* osg_data, object_skin_osage_node* osg_nodes, + std::vector>* a4, + std::map* a5); }; class ExConstraintBlock : public ExNodeBlock { public: object_skin_block_constraint_type constraint_type; bone_node* source_node_bone_node; - bone_node* direction_up_vector_old_bone_node; + bone_node* direction_up_vector_bone_node; object_skin_block_constraint* cns_data; int64_t field_80; @@ -997,9 +1613,9 @@ public: virtual ~ExConstraintBlock() override; virtual void Init() override; virtual void Field_10() override; - virtual void Field_18(int32_t a2, bool a3) override; - virtual void Update() override; - virtual void Field_28() override; + virtual void Field_18(int32_t stage, bool a3) override; + virtual void Field_20() override; + virtual void SetOsagePlayData() override; virtual void Disp() override; virtual void Reset(); virtual void Field_40() override; @@ -1007,17 +1623,13 @@ public: virtual void Field_50() override; virtual void Field_58(); + void Calc(); + void DataSet(); + void InitData(rob_chara_item_equip_object* itm_eq_obj, object_skin_block_constraint* cns_data, + const char* cns_data_name, bone_database* bone_data); + static void sub_1405F10D0(mat4* mat, vec3* a2, float_t a3, float_t a4); static void sub_1401EB410(mat4* mat, vec3* a2, vec3* target_offset); - - static void Calc(ExConstraintBlock* cns); - static void DataSet(ExConstraintBlock* cns); - static void InitData(ExConstraintBlock* cns, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_constraint* cns_data, char* cns_data_name, bone_database* bone_data); - - -private: - void InitMembers(); }; typedef struct ex_expression_block_stack ex_expression_block_stack; @@ -1080,9 +1692,9 @@ public: virtual ~ExExpressionBlock() override; virtual void Init() override; virtual void Field_10() override; - virtual void Field_18(int32_t a2, bool a3) override; - virtual void Update() override; - virtual void Field_28() override; + virtual void Field_18(int32_t stage, bool a3) override; + virtual void Field_20() override; + virtual void SetOsagePlayData() override; virtual void Disp() override; virtual void Reset(); virtual void Field_40() override; @@ -1090,38 +1702,28 @@ public: virtual void Field_50() override; virtual void Field_58(); - static void Calc(ExExpressionBlock* exp); - static void DataSet(ExExpressionBlock* exp); - static void InitData(ExExpressionBlock* exp, rob_chara_item_equip_object* itm_eq_obj, - object_skin_block_expression* exp_data, char* exp_data_name, object_info a4, - size_t index, bone_database* bone_data); - -private: - void InitMembers(); + void Calc(); + void DataSet(); + void InitData(rob_chara_item_equip_object* itm_eq_obj, object_skin_block_expression* exp_data, + const char* exp_data_name, object_info a4, size_t index, bone_database* bone_data); }; typedef struct ex_data_name_bone_index { - char* name; + const char* name; int32_t bone_index; } ex_data_name_bone_index; vector_old(ex_data_name_bone_index) -typedef struct rob_chara_item_equip rob_chara_item_equip; +class rob_chara_item_equip; -vector_old_ptr(ExConstraintBlock) -vector_old_ptr(ExClothBlock) -vector_old_ptr(ExExpressionBlock) -vector_old_ptr(ExOsageBlock) -vector_old_ptr(ExNodeBlock) -vector_old_ptr(ExNullBlock) - -struct rob_chara_item_equip_object { +class rob_chara_item_equip_object { +public: size_t index; - mat4* mat; + mat4* mats; object_info obj_info; int32_t field_14; - vector_old_texture_pattern_struct texture_pattern; + std::vector texture_pattern; texture_data_struct texture_data; bool field_64; bone_node_expression_data exp_data; @@ -1129,40 +1731,42 @@ struct rob_chara_item_equip_object { draw_task_flags draw_task_flags; bool disp; int32_t field_A4; - mat4* field_A8; - int32_t field_B0; + mat4* mat; + int32_t osage_iterations; bone_node* bone_nodes; - vector_old_ptr_ExNodeBlock node_blocks; - vector_old_bone_node ex_data_bone_nodes; - vector_old_mat4 field_F0; - vector_old_mat4 field_108; - vector_old_ex_data_name_bone_index ex_bones; + std::vector node_blocks; + std::vector ex_data_bone_nodes; + std::vector ex_data_mats; + std::vector ex_data_block_mats; + std::vector ex_bones; int64_t field_138; - vector_old_ptr_ExNullBlock null_blocks; - vector_old_ptr_ExOsageBlock osage_blocks; - vector_old_ptr_ExConstraintBlock constraint_blocks; - vector_old_ptr_ExExpressionBlock expression_blocks; - vector_old_ptr_ExClothBlock cloth_blocks; + std::vector null_blocks; + std::vector osage_blocks; + std::vector constraint_blocks; + std::vector expression_blocks; + std::vector cloth_blocks; bool field_1B8; int64_t field_1C0; - bool field_1C8; + bool use_opd; object_skin_ex_data* skin_ex_data; object_skin* skin; rob_chara_item_equip* item_equip; + + rob_chara_item_equip_object(); + ~rob_chara_item_equip_object(); }; -typedef struct struc_373 { +typedef struct opd_blend_data { int32_t motion_id; float_t frame; float_t frame_count; bool field_C; - motion_blend_type type; + MotionBlendType type; float_t blend; -} struc_373; +} opd_blend_data; -vector_old(struc_373) - -struct rob_chara_item_equip { +class rob_chara_item_equip { +public: bone_node* bone_nodes; mat4* matrices; rob_chara_item_equip_object* item_equip_object; @@ -1174,7 +1778,7 @@ struct rob_chara_item_equip { shadow_type_enum shadow_type; vec3 position; int32_t eyes_adjust; - vector_old_texture_pattern_struct texture_pattern; + std::vector texture_pattern; object_info field_D0; int32_t field_D4; bool field_D8; @@ -1211,11 +1815,14 @@ struct rob_chara_item_equip { int64_t field_928; int64_t field_930; float_t step; - bool field_93C; - vector_old_struc_373 field_940; - bool field_958; - bool field_959; - bool field_95A; + bool use_opd; + std::vector opd_blend_data; + bool parts_short; + bool parts_append; + bool parts_white_one_l; + + rob_chara_item_equip(); + ~rob_chara_item_equip(); }; typedef union item_sub_data { @@ -1249,88 +1856,110 @@ typedef union item_sub_data { int32_t data[25]; } item_sub_data; -typedef struct pair_object_info_item_id { - object_info key; - item_id value; -} pair_object_info_item_id; - -vector_old(pair_object_info_item_id) - -typedef struct item_sub_data_texture_change_tex { +class item_sub_data_texture_change_tex { +public: texture* org; texture* chg; bool changed; -} item_sub_data_texture_change_tex; -vector_old(item_sub_data_texture_change_tex) + item_sub_data_texture_change_tex(); + ~item_sub_data_texture_change_tex(); +}; -typedef struct item_sub_data_texture_change { +class item_sub_data_texture_change { +public: uint32_t item_no; - vector_old_item_sub_data_texture_change_tex tex; -} item_sub_data_texture_change; + std::vector tex; -vector_old(item_sub_data_texture_change) + item_sub_data_texture_change(); + ~item_sub_data_texture_change(); +}; -typedef struct item_sub_data_item_change { +class item_sub_data_item_change { +public: item_id id; - vector_old_uint32_t item_ids; -} item_sub_data_item_change; + std::vector item_ids; -vector_old(item_sub_data_item_change) + item_sub_data_item_change(); + ~item_sub_data_item_change(); +}; -typedef struct struc_294 { - int32_t key; - int32_t value; -} struc_294; - -vector_old(struc_294) - -typedef struct pair_int32_t_object_info { - int32_t key; - object_info value; -} pair_int32_t_object_info; - -vector_old(pair_int32_t_object_info) - -typedef struct rob_chara_item_sub_data { +class rob_chara_item_sub_data { +public: chara_index chara_index_1st; chara_index chara_index_2nd; item_sub_data item; item_sub_data item_2nd; - vector_old_item_sub_data_texture_change texture_change; - vector_old_item_sub_data_item_change item_change; - vector_old_pair_object_info_item_id field_F0; - vector_old_struc_294 field_100; - vector_old_texture_pattern_struct texture_pattern[31]; - vector_old_pair_int32_t_object_info field_3F8; -} rob_chara_item_sub_data; + std::vector texture_change; + std::vector item_change; + std::vector> field_F0; + std::vector> field_100; + std::vector texture_pattern[31]; + std::vector> field_3F8; -typedef struct struc_264 { - int8_t field_0; + rob_chara_item_sub_data(); + ~rob_chara_item_sub_data(); +}; + +typedef struct struc_525 { + int32_t field_0; int32_t field_4; - int32_t field_8; +} struc_525; + +typedef struct struc_524 { + int32_t field_0; + struc_525 field_4; + int32_t motion_id; + int8_t field_10; +} struc_524; + +class struc_523 { +public: + int8_t field_0; + int8_t field_1; + int32_t field_4; + int16_t field_8; int32_t field_C; - int32_t field_10; - int8_t field_14; - int32_t field_18; + vec3 field_10; int32_t field_1C; int32_t field_20; int32_t field_24; - int8_t field_28; + int32_t field_28; int32_t field_2C; int32_t field_30; int32_t field_34; int32_t field_38; - int8_t field_3C; + int32_t field_3C; int32_t field_40; int32_t field_44; int32_t field_48; int32_t field_4C; int8_t field_50; int32_t field_54; - int64_t field_58; - int32_t field_60; - int8_t field_64; + std::list field_58; + int64_t field_68; + int64_t field_70; + int32_t field_78; + float_t field_7C; + float_t field_80; + + struc_523(); + ~struc_523(); +}; + +typedef struct struc_526 { + int32_t field_0; + int32_t field_4; +} struc_526; + +class struc_264 { +public: + int8_t field_0; + struc_524 field_4; + struc_524 field_18; + struc_524 field_2C; + struc_524 field_40; + struc_524 field_54; int32_t field_68; int32_t field_6C; int32_t field_70; @@ -1351,33 +1980,8 @@ typedef struct struc_264 { int32_t field_A8; int32_t field_AC; int32_t field_B0; - int8_t field_B4; - int32_t field_B8; - int32_t field_BC; - int16_t field_C0; - int32_t field_C4; - vec3 field_C8; - int64_t field_D8; - int64_t field_E0; - int32_t field_E8; - int32_t field_EC; - int32_t field_F0; - int32_t field_F4; - int32_t field_F8; - int32_t field_FC; - int32_t field_100; - int32_t field_104; - int32_t field_108; - int32_t field_10C; - vector_old_ptr_void field_110; - int32_t field_120; - int32_t field_124; - int32_t field_128; - int32_t field_12C; - int32_t field_130; - float_t field_134; - float_t field_138; - int32_t field_13C; + bool eyes_adjust; + struc_523 field_B8; int32_t field_140; int8_t field_144; int8_t field_145; @@ -1413,240 +2017,327 @@ typedef struct struc_264 { int32_t field_1B4; int32_t field_1B8; int32_t field_1BC; - int32_t field_1C0; - int32_t field_1C4; + struc_526 field_1C0; int8_t field_1C8; int8_t field_1C9; int8_t field_1CA; int32_t field_1CC; int32_t field_1D0; int32_t field_1D4; -} struc_264; -typedef struct rob_sub_action_execute rob_sub_action_execute; - -typedef struct rob_sub_action_execute_vtbl { - void(*dispose)(rob_sub_action_execute*); - void(*field_8)(rob_sub_action_execute*); - void(*field_10)(rob_sub_action_execute*); - void(*field_18)(rob_sub_action_execute*, rob_chara*); - void(*field_20)(rob_sub_action_execute*, rob_chara*); -} rob_sub_action_execute_vtbl; - -struct rob_sub_action_execute { - rob_sub_action_execute_vtbl* vftable; - rob_sub_action_execute_type type; - int32_t field_C; + struc_264(); + ~struc_264(); }; -typedef struct rob_sub_action_execute_cry { - rob_sub_action_execute base; -} rob_sub_action_execute_cry; +class SubActParam; -typedef struct rob_sub_action_execute_shake_hand { - rob_sub_action_execute base; - int64_t field_10; - int8_t field_18; -} rob_sub_action_execute_shake_hand; +class SubActExec { +public: + SubActExecType type; + int32_t field_C; -typedef struct rob_sub_action_execute_embarrassed { - rob_sub_action_execute base; - int8_t field_10; -} rob_sub_action_execute_embarrassed; + SubActExec(SubActExecType type); + virtual ~SubActExec(); + virtual void Field_8() = 0; + virtual void Field_10(SubActParam* param) = 0; + virtual void Field_18(rob_chara* rob_chr) = 0; + virtual void Field_20(rob_chara* rob_chr) = 0; +}; -typedef struct rob_sub_action_execute_angry { - rob_sub_action_execute base; -} rob_sub_action_execute_angry; +class SubActExecAngry : public SubActExec { +public: + SubActExecAngry(); + virtual ~SubActExecAngry() override; + virtual void Field_8() override; + virtual void Field_10(SubActParam* param) override; + virtual void Field_18(rob_chara* rob_chr) override; + virtual void Field_20(rob_chara* rob_chr) override; +}; -typedef struct rob_sub_action_execute_laugh { - rob_sub_action_execute base; -} rob_sub_action_execute_laugh; - -typedef struct rob_sub_action_execute_count_num { - rob_sub_action_execute base; - int64_t field_10; +class SubActExecCountNum : public SubActExec { +public: + int32_t field_10; + int32_t field_14; int32_t field_18; -} rob_sub_action_execute_count_num; -typedef struct rob_sub_action_param { - rob_sub_action_param_type type; -} rob_sub_action_param; + SubActExecCountNum(); + virtual ~SubActExecCountNum() override; + virtual void Field_8() override; + virtual void Field_10(SubActParam* param) override; + virtual void Field_18(rob_chara* rob_chr) override; + virtual void Field_20(rob_chara* rob_chr) override; +}; -typedef struct rob_sub_action_param_count_num { - rob_sub_action_param base; +class SubActExecCry : public SubActExec { +public: + SubActExecCry(); + virtual ~SubActExecCry() override; + virtual void Field_8() override; + virtual void Field_10(SubActParam* param) override; + virtual void Field_18(rob_chara* rob_chr) override; + virtual void Field_20(rob_chara* rob_chr) override; +}; + +class SubActExecEmbarrassed : public SubActExec { +public: + int8_t field_10; + SubActExecEmbarrassed(); + virtual ~SubActExecEmbarrassed() override; + virtual void Field_8() override; + virtual void Field_10(SubActParam* param) override; + virtual void Field_18(rob_chara* rob_chr) override; + virtual void Field_20(rob_chara* rob_chr) override; +}; + +class SubActExecLaugh : public SubActExec { +public: + SubActExecLaugh(); + virtual ~SubActExecLaugh() override; + virtual void Field_8() override; + virtual void Field_10(SubActParam* param) override; + virtual void Field_18(rob_chara* rob_chr) override; + virtual void Field_20(rob_chara* rob_chr) override; +}; + +class SubActExecShakeHand : public SubActExec { +public: int32_t field_10; -} rob_sub_action_param_count_num; + int32_t field_14; + int8_t field_18; + SubActExecShakeHand(); + virtual ~SubActExecShakeHand() override; + virtual void Field_8() override; + virtual void Field_10(SubActParam* param) override; + virtual void Field_18(rob_chara* rob_chr) override; + virtual void Field_20(rob_chara* rob_chr) override; +}; -typedef struct rob_sub_action_param_laugh { - rob_sub_action_param base; -} rob_sub_action_param_laugh; +class SubActParam { +public: + SubActParamType type; -typedef struct rob_sub_action_param_angry { - rob_sub_action_param base; -} rob_sub_action_param_angry; + SubActParam(SubActParamType type); + virtual ~SubActParam(); +}; -typedef struct rob_sub_action_param_embarrassed { - rob_sub_action_param base; -} rob_sub_action_param_embarrassed; +class SubActParamAngry : public SubActParam { +public: + SubActParamAngry(); + virtual ~SubActParamAngry(); +}; -typedef struct rob_sub_action_param_shake_hand { - rob_sub_action_param base; +class SubActParamCountNum : public SubActParam { +public: int32_t field_10; -} rob_sub_action_param_shake_hand; -typedef struct rob_sub_action_param_cry { - rob_sub_action_param base; -} rob_sub_action_param_cry; + SubActParamCountNum(); + virtual ~SubActParamCountNum(); +}; -typedef struct rob_sub_action_data { - rob_sub_action_execute* field_0; - rob_sub_action_execute* field_8; - rob_sub_action_param* field_10; - rob_sub_action_execute* field_18; - rob_sub_action_execute_cry cry; - rob_sub_action_execute_shake_hand shake_hand; - rob_sub_action_execute_embarrassed embarrassed; - rob_sub_action_execute_angry angry; - rob_sub_action_execute_laugh laugh; - rob_sub_action_execute_count_num count_num; -} rob_sub_action_data; +class SubActParamCry : public SubActParam { +public: + SubActParamCry(); + virtual ~SubActParamCry(); +}; -typedef struct rob_sub_action { - rob_sub_action_data data; -} rob_sub_action; +class SubActParamEmbarrassed : public SubActParam { +public: + SubActParamEmbarrassed(); + virtual ~SubActParamEmbarrassed(); +}; + +class SubActParamLaugh : public SubActParam { +public: + SubActParamLaugh(); + virtual ~SubActParamLaugh(); +}; + +class SubActParamShakeHand : public SubActParam { +public: + int32_t field_10; + + SubActParamShakeHand(); + virtual ~SubActParamShakeHand(); +}; + +class RobSubAction { +public: + class Data { + public: + SubActExec* field_0; + SubActExec* field_8; + SubActParam* field_10; + SubActExec* field_18; + SubActExecCry cry; + SubActExecShakeHand shake_hand; + SubActExecEmbarrassed embarrassed; + SubActExecAngry angry; + SubActExecLaugh laugh; + SubActExecCountNum count_num; + + Data(); + ~Data(); + } data; + + RobSubAction(); + ~RobSubAction(); + + void Reset(); +}; typedef struct struc_389 { float_t frame; float_t prev_frame; - float_t last_frame; + float_t last_set_frame; } struc_389; typedef struct struc_406 { float_t frame; float_t field_4; - float_t field_8; + float_t step; } struc_406; -typedef struct rob_partial_motion rob_partial_motion; +class RobPartialMotion { +public: + class Data { + public: + int32_t motion_id; + int32_t mottbl_index; + int32_t state; + float_t frame; + float_t play_frame_step; + float_t frame_count; + float_t duration; + float_t step; + float_t offset; + float_t field_24; + struc_389* frame_data; + struc_406* step_data; + int32_t field_38; -typedef struct rob_partial_motion_vtbl { - void(*dispose)(rob_partial_motion*); - void(*field_8)(rob_partial_motion*); -} rob_partial_motion_vtbl; + Data(); + ~Data(); + } data; -typedef struct rob_partial_motion_data { - int32_t motion_id; - int32_t mottbl_index; - int32_t field_8; - float_t frame; - float_t field_10; - float_t frame_count; - float_t field_18; - float_t field_1C; - float_t field_20; - float_t field_24; - struc_389* field_28; - struc_406* field_30; - int32_t field_38; -} rob_partial_motion_data; - -struct rob_partial_motion { - rob_partial_motion_vtbl* __vftable; - rob_partial_motion_data data; + RobPartialMotion(); + virtual ~RobPartialMotion(); + virtual void Reset() = 0; }; -typedef struct rob_face_motion { - rob_partial_motion base; -} rob_face_motion; +class RobFaceMotion : public RobPartialMotion { +public: + RobFaceMotion(); + virtual ~RobFaceMotion() override; + virtual void Reset() override; +}; -typedef struct rob_hand_motion { - rob_partial_motion base; -} rob_hand_motion; +class RobHandMotion : public RobPartialMotion { +public: + RobHandMotion(); + virtual ~RobHandMotion() override; + virtual void Reset() override; +}; -typedef struct rob_mouth_motion { - rob_partial_motion base; -} rob_mouth_motion; +class RobMouthMotion : public RobPartialMotion { +public: + RobMouthMotion(); + virtual ~RobMouthMotion() override; + virtual void Reset() override; +}; -typedef struct rob_eyes_motion { - rob_partial_motion base; -} rob_eyes_motion; +class RobEyesMotion : public RobPartialMotion { +public: + RobEyesMotion(); + virtual ~RobEyesMotion() override; + virtual void Reset() override; +}; -typedef struct rob_eyelid_motion { - rob_partial_motion base; -} rob_eyelid_motion; +class RobEyelidMotion : public RobPartialMotion { +public: + RobEyelidMotion(); + virtual ~RobEyelidMotion() override; + virtual void Reset() override; +}; -typedef struct struc_405 { - rob_face_motion field_0; - rob_hand_motion field_48; - rob_hand_motion field_90; - rob_mouth_motion field_D8; - rob_eyes_motion field_120; - rob_eyelid_motion field_168; - object_info field_1B0; - object_info field_1B4; - object_info field_1B8; - object_info field_1BC; +class struc_405 { +public: + RobFaceMotion face; + RobHandMotion hand_l; + RobHandMotion hand_r; + RobMouthMotion mouth; + RobEyesMotion eye; + RobEyelidMotion eyelid; + object_info head_object; + object_info hand_l_object; + object_info hand_r_object; + object_info face_object; int32_t field_1C0; -} struc_405; + float_t time; -typedef struct struc_269 { - int8_t field_0; - float_t field_4; - float_t field_8; - vec3 field_C; - float_t field_18; - float_t field_1C; - int32_t field_20; - int32_t field_24; - float_t field_28; - int32_t field_2C; - int32_t field_30; - int8_t field_34; - vec3 field_38; - vec3 field_44; - vec3 field_50; - float_t field_5C; - float_t field_60; - float_t field_64; - float_t field_68; - float_t field_6C; -} struc_269; + struc_405(); + ~struc_405(); -typedef struct struc_229 { - int8_t field_0; - int8_t field_1; - int16_t field_2; - int16_t field_4; - float_t field_8; - float_t field_C; - float_t field_10; - float_t field_14; - float_t field_18; - float_t field_1C; - int8_t field_20; - int8_t field_21; - int8_t field_22; - int8_t field_23; - vec3 field_24; + void Reset(); +}; + +typedef struct rob_chara_data_parts_adjust { + bool enable; + float_t frame; + float_t transition_frame; + vec3 curr_external_force; + float_t curr_force; + float_t curr_strength; + int32_t motion_id; + int32_t set_frame; + float_t force_duration; + int32_t type; + int32_t cycle_type; + bool ignore_gravity; + vec3 external_force_min; + vec3 external_force_strength; + vec3 external_force; + float_t cycle; + float_t phase; + float_t force; + float_t strength; + float_t strength_transition; +} rob_chara_data_parts_adjust; + +typedef struct rob_chara_data_hand_adjust { + bool enable; + int16_t scale_select; + rob_chara_data_hand_adjust_type type; + float_t current_scale; + float_t scale; + float_t transition_time; + float_t current_time; + float_t rotation_blend; + float_t offset_blend; + bool enable_scale; + bool disable_x; + bool disable_y; + bool disable_z; + vec3 offset; vec3 field_30; - int32_t field_3C; + float_t field_3C; int32_t field_40; -} struc_229; +} rob_chara_data_hand_adjust; typedef struct struc_222 { int8_t field_0; float_t field_4; float_t field_8; float_t field_C; - float_t field_10; - float_t field_14; + float_t duration; + float_t frame; } struc_222; -typedef struct struc_268 { +class rob_chara_adjust { +public: int32_t motion_id; int32_t prev_motion_id; - struc_389 field_8; - struc_406 field_14; + struc_389 frame_data; + struc_406 step_data; float_t step; int32_t field_24; int8_t field_28; @@ -1654,60 +2345,31 @@ typedef struct struc_268 { int8_t field_2A; int32_t field_2C; int32_t field_30; - int32_t field_34; - int64_t field_38; - int64_t field_40; - int64_t field_48; - int64_t field_50; - int64_t field_58; - int64_t field_60; - int64_t field_68; - int64_t field_70; - int64_t field_78; - int64_t field_80; - int64_t field_88; - int64_t field_90; - int64_t field_98; - int64_t field_A0; - int64_t field_A8; - int64_t field_B0; - int64_t field_B8; - int64_t field_C0; - int64_t field_C8; - int64_t field_D0; - int64_t field_D8; - int64_t field_E0; - int64_t field_E8; - int64_t field_F0; - int64_t field_F8; - int64_t field_100; - int64_t field_108; - int64_t field_110; - int64_t field_118; - int64_t field_120; - int64_t field_128; - int64_t field_130; + int16_t field_34; + int16_t field_36; + int32_t field_38[32]; + int32_t field_B8[32]; float_t field_138; float_t field_13C; - int32_t field_140; - int32_t field_144; - int32_t field_148; + vec3 field_140; int32_t field_14C; struc_405 field_150; float_t field_314; - rob_hand_motion field_318; - rob_hand_motion field_360; - object_info field_3A8; - object_info field_3AC; + RobHandMotion hand_l; + RobHandMotion hand_r; + object_info hand_l_object; + object_info hand_r_object; struc_405 field_3B0; - struc_269 field_578[13]; - struc_269 field_B28[13]; - struc_269 field_10D8; - struc_269 field_1148; - struc_229 field_11B8[2]; - struc_229 field_1240[2]; + rob_chara_data_parts_adjust parts_adjust[13]; + rob_chara_data_parts_adjust parts_adjust_prev[13]; + rob_chara_data_parts_adjust field_10D8[2]; + rob_chara_data_hand_adjust hand_adjust[2]; + rob_chara_data_hand_adjust hand_adjust_prev[2]; struc_222 field_12C8[2]; -} struc_268; + + rob_chara_adjust(); + ~rob_chara_adjust(); +}; typedef struct struc_228 { int32_t field_0; @@ -1722,9 +2384,55 @@ typedef struct struc_227 { float_t field_8; } struc_227; +typedef struct mothead_data { + mothead_data_type type; + int32_t frame; + void* data; +} mothead_data; + +typedef struct mothead_data2 { + int32_t type; + void* data; +} mothead_data2; + +typedef struct mothead_sub { + struc_228 field_0; + int16_t field_10; + int16_t field_12; + mothead_data2* field_18; + mothead_data* data; + int64_t* field_28; +} mothead_sub; + +typedef struct mothead { + int32_t mot_set_id; + int32_t first_mot_id; + int32_t last_mot_id; + mothead_sub** sub; +} mothead; + +typedef struct mothead_file { + int32_t mot_set_id; + int32_t first_mot_id; + int32_t last_mot_id; + int32_t field_C; +} mothead_file; + +typedef struct mothead_sub_file { + int32_t field_0; + int32_t field_4; + int32_t field_8; + int32_t field_C; + int16_t field_10; + int16_t field_12; + uint32_t field_14; + uint32_t field_18; + uint32_t field_1C; +} mothead_sub_file; + typedef struct struc_377 { - void/*mothead_data*/* field_0; - void/*mothead_data*/* field_8; + mothead_data* field_0; + mothead_data* field_8; } struc_377; typedef struct struc_226 { @@ -1735,14 +2443,13 @@ typedef struct struc_225 { float field_0[27]; } struc_225; -typedef struct struc_224 -{ +typedef struct struc_224 { int32_t field_0[27]; } struc_224; typedef struct struc_306 { int16_t field_0; - float_t field_4; + float_t frame; float_t field_8; int16_t field_C; int16_t field_E; @@ -1757,7 +2464,8 @@ typedef struct struc_306 { int32_t field_48; } struc_306; -typedef struct struc_223 { +class struc_223 { +public: int32_t field_0; float_t frame_count; float_t field_8; @@ -1806,7 +2514,7 @@ typedef struct struc_223 { float_t field_218; float_t field_21C; int16_t field_220; - vector_old_ptr_void field_228; + std::list field_228; int16_t field_238; int32_t field_23C; int32_t field_240; @@ -1860,7 +2568,7 @@ typedef struct struc_223 { float_t field_320; float_t field_324; float_t field_328; - int32_t field_32C; + int32_t iterations; struc_377 field_330; int32_t field_340; int32_t field_344; @@ -1885,10 +2593,13 @@ typedef struct struc_223 { struc_306 field_66C[4]; int64_t* field_7A0; int32_t field_7A8; -} struc_223; -typedef struct struc_399 { - int16_t field_0; + struc_223(); + ~struc_223(); +}; + +typedef struct rob_chara_data_miku_rot { + int16_t rot_y_int16; int16_t field_2; int16_t field_4; int16_t field_6; @@ -1896,11 +2607,9 @@ typedef struct struc_399 { int32_t field_C; float_t field_10; int32_t field_14; - vec3 field_18; + vec3 position; vec3 field_24; - float_t field_30; - float_t field_34; - float_t field_38; + vec3 field_30; vec3 field_3C; vec3 field_48; vec3 field_54; @@ -1908,7 +2617,7 @@ typedef struct struc_399 { int32_t field_64; int32_t field_68; mat4u field_6C; -} struc_399; +} rob_chara_data_miku_rot; typedef struct rob_chara_adjust_data { float_t scale; @@ -1942,23 +2651,16 @@ typedef struct struc_210 { float_t scale; } struc_210; -typedef struct struc_215 { - int64_t field_0; - float_t field_8; -} struc_215; - -vector_old(struc_215) - typedef struct struc_267 { float_t field_0; int16_t field_4; int16_t field_6; float_t field_8; int16_t field_C; - int16_t field_E; } struc_267; -typedef struct struc_209 { +class struc_209 { +public: int16_t field_0; int32_t field_4; int32_t field_8; @@ -1995,11 +2697,12 @@ typedef struct struc_209 { struc_195 field_1230[27]; struc_195 field_1668[27]; struc_210 field_1AA0[27]; - float field_1BE4[27]; - vector_old_struc_215 field_1C50; + float_t field_1BE4[27]; + std::vector> field_1C50; int64_t field_1C68; int64_t field_1C70; - int32_t field_1C78[4]; + int64_t field_1C78; + int64_t field_1C80; int32_t field_1C88[27]; int32_t field_1CF4[27]; int32_t field_1D60[27]; @@ -2062,10 +2765,7 @@ typedef struct struc_209 { int32_t field_1EAC; int32_t field_1EB0; struc_267 field_1EB4[4]; - int32_t field_1EF4; - int32_t field_1EF8; - int32_t field_1EFC; - int32_t field_1F00; + int32_t field_1EF4[4]; int8_t field_1F04; int32_t field_1F08; int32_t field_1F0C; @@ -2080,19 +2780,23 @@ typedef struct struc_209 { int8_t field_1F24; int8_t field_1F25; int8_t field_1F26; -} struc_209; -typedef struct rob_chara_data { + struc_209(); + ~struc_209(); +}; + +class rob_chara_data { +public: uint8_t field_0; uint8_t field_1; uint8_t field_2; uint8_t field_3; int32_t field_4; struc_264 field_8; - rob_sub_action rob_sub_action; - struc_268 field_290; + RobSubAction rob_sub_action; + rob_chara_adjust adjust; struc_223 field_1588; - struc_399 field_1D38; + rob_chara_data_miku_rot miku_rot; rob_chara_adjust_data adjust_data; struc_209 field_1E68; float_t field_3D90; @@ -2116,10 +2820,17 @@ typedef struct rob_chara_data { int32_t field_3DD8; float_t field_3DDC; uint8_t field_3DE0; -} rob_chara_data; -struct rob_chara { + rob_chara_data(); + ~rob_chara_data(); +}; + +class rob_chara { +public: int8_t chara_id; + rob_chara_type type; + bool field_C; + bool field_D; chara_index chara_index; int32_t module_index; rob_chara_bone_data* bone_data; @@ -2129,6 +2840,9 @@ struct rob_chara { rob_chara_data data_prev; chara_init_data* chara_init_data; rob_chara_pv_data pv_data; + + rob_chara(); + ~rob_chara(); }; typedef struct skeleton_rotation_offset { @@ -2138,93 +2852,53 @@ typedef struct skeleton_rotation_offset { vec3 rotation; } skeleton_rotation_offset; -vector_old_ptr(rob_chara) - -class RobImplTask : public Task { -public: - vector_old_ptr_rob_chara init_chara; - vector_old_ptr_rob_chara ctrl_chara; - vector_old_ptr_rob_chara free_chara; - - RobImplTask(); - virtual ~RobImplTask() override; - virtual bool Init() override; - virtual bool Ctrl() override; - virtual bool Dest() override; - virtual void Disp() override; - -private: - void InitMembers(); -}; - -struct TaskRobManager : public Task { -public: - int32_t field_68; - int32_t field_6C; - vector_old_ptr_rob_chara init_chara; - vector_old_ptr_rob_chara load_chara; - vector_old_ptr_rob_chara free_chara; - vector_old_ptr_rob_chara loaded_chara; - bone_database* bone_data; - motion_database* mot_db; - - TaskRobManager(); - virtual ~TaskRobManager() override; - virtual bool Init() override; - virtual bool Ctrl() override; - virtual bool Dest() override; - virtual void Disp() override; - -private: - void InitMembers(); -}; - #define ROB_CHARA_COUNT 6 extern rob_chara rob_chara_array[]; extern rob_chara_pv_data rob_chara_pv_data_array[]; -extern TaskRobManager task_rob_manager; extern chara_init_data* chara_init_data_get(chara_index chara_index); extern void motion_set_load_motion(uint32_t set, std::string* motion_name, motion_database* mot_db); extern void motion_set_unload(uint32_t set); -extern void rob_chara_init(rob_chara* rob_chr); -extern mat4* rob_chara_bone_data_get_mats_mat(rob_chara_bone_data* rob_bone_data, ssize_t index); -extern void rob_chara_calc(rob_chara* rob_chr); -extern void rob_chara_disp(rob_chara* rob_chr, render_context* rctx); +extern void pv_osage_manager_array_reset(int32_t chara_id); + +extern void pv_osage_manager_array_ptr_init(); +extern void pv_osage_manager_array_ptr_free(); + +extern mat4* rob_chara_bone_data_get_mats_mat(rob_chara_bone_data* rob_bone_data, size_t index); extern mat4* rob_chara_get_bone_data_mat(rob_chara* chara, size_t index); extern float_t rob_chara_get_frame(rob_chara* rob_chr); extern float_t rob_chara_get_frame_count(rob_chara* rob_chr); -extern void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, - int32_t index, bone_database* bone_data, motion_database* mot_db); +extern void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, bool a3, float_t frame, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); extern void rob_chara_reload_items(rob_chara* rob_chr, item_sub_data* sub_data, bone_database* bone_data, void* data, object_database* obj_db); -extern void rob_chara_reset(rob_chara* rob_chr, bone_database* bone_data, - void* data, object_database* obj_db); extern void rob_chara_reset_data(rob_chara* rob_chr, rob_chara_pv_data* pv_data, bone_database* bone_data, motion_database* mot_db); extern void rob_chara_set_frame(rob_chara* rob_chr, float_t frame); +extern bool rob_chara_set_motion_id(rob_chara* rob_chr, int32_t motion_id, + float_t frame, float_t duration, bool a5, bool set_motion_reset_data, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); extern void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, chara_index chara_index, uint32_t module_index, rob_chara_pv_data* pv_data); extern void rob_chara_set_visibility(rob_chara* rob_chr, bool value); -extern void rob_chara_free(rob_chara* rob_chr); -extern void rob_chara_array_init(); extern rob_chara* rob_chara_array_get(int32_t chara_id); extern int32_t rob_chara_array_init_chara_index(chara_index chara_index, rob_chara_pv_data* pv_data, uint32_t module_index, bool a4); -extern void rob_chara_array_free(); +extern void rob_chara_array_free_chara_id(int32_t chara_id); -extern void rob_chara_pv_data_init(rob_chara_pv_data* pv_data); extern bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id); -extern void rob_chara_pv_data_array_init(); +extern void rob_mot_tbl_init(); +extern void rob_mot_tbl_free(); -extern void task_rob_manager_init(); -extern bool task_rob_manager_struct_ctrl(TaskRobManager* rob_mgr); -extern void task_rob_manager_free(); +extern void rob_thread_handler_init(); +extern void rob_thread_handler_free(); + +extern void task_rob_manager_append_task(); extern void motion_storage_init(); extern void motion_storage_append_mot_set(uint32_t set_id); @@ -2232,4 +2906,5 @@ extern void motion_storage_insert_motion_set(mot_set* set, uint32_t set_id); extern mot_set* motion_storage_get_motion_set(uint32_t set_id); extern void motion_storage_delete_motion_set(uint32_t set_id); extern mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database* mot_db); +extern float_t motion_storage_get_mot_data_frame_count(uint32_t motion_id, motion_database* mot_db); extern void motion_storage_free(); \ No newline at end of file diff --git a/src/CRE/shader.c b/src/CRE/shader.c index b97a6f04..91ee2ea6 100644 --- a/src/CRE/shader.c +++ b/src/CRE/shader.c @@ -126,7 +126,7 @@ void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load wcscat_s(temp_buf, sizeof(temp_buf) / sizeof(wchar_t), buf); swprintf_s(buf, sizeof(buf) / sizeof(wchar_t), L"%ls.farc", temp_buf); - if (path_wcheck_file_exists(buf) && !not_load_cache) + if (path_check_file_exists(buf) && !not_load_cache) shader_cache_farc.read(buf, true, false); } @@ -2240,7 +2240,7 @@ static GLuint shader_compile_shader(GLenum type, char* data, char* file) { buf[sizeof(buf) / sizeof(wchar_t) - 1] = 0; stream s; - io_wopen(&s, buf, L"wb"); + io_open(&s, buf, L"wb"); io_write(&s, data, utf8_length(data)); io_free(&s); } diff --git a/src/CRE/shader_glsl.c b/src/CRE/shader_glsl.c index 06dd34dd..363a5f1a 100644 --- a/src/CRE/shader_glsl.c +++ b/src/CRE/shader_glsl.c @@ -313,7 +313,7 @@ void shader_glsl_wload_file(shader_glsl* s, wchar_t* vert_path, char* frag = 0; char* geom = 0; - io_wopen(&st, vert_path, L"rb"); + io_open(&st, vert_path, L"rb"); if (st.io.stream) { l = st.length; vert = force_malloc_s(char, l + 1); @@ -322,7 +322,7 @@ void shader_glsl_wload_file(shader_glsl* s, wchar_t* vert_path, } io_free(&st); - io_wopen(&st, frag_path, L"rb"); + io_open(&st, frag_path, L"rb"); if (st.io.stream) { l = st.length; frag = force_malloc_s(char, l + 1); @@ -331,7 +331,7 @@ void shader_glsl_wload_file(shader_glsl* s, wchar_t* vert_path, } io_free(&st); - io_wopen(&st, geom_path, L"rb"); + io_open(&st, geom_path, L"rb"); if (st.io.stream) { l = st.length; geom = force_malloc_s(char, l + 1); diff --git a/src/CRE/stage.c b/src/CRE/stage.c index 2306f8e1..231a13cb 100644 --- a/src/CRE/stage.c +++ b/src/CRE/stage.c @@ -6,170 +6,727 @@ #include "stage.h" #include "../KKdLib/hash.h" #include "../KKdLib/str_utils.h" +#include "../KKdLib/vec.h" #include "draw_task.h" +#include "light_param.h" +#include "render_context.h" +#include "rob.h" -void stage_init(stage* s) { - memset(s, 0, sizeof(stage)); +namespace stage_detail { + static void TaskStage_CtrlInner(stage_detail::TaskStage* a1); + static void TaskStage_DispShadow(stage_detail::TaskStage* a1); + static stage* TaskStage_GetCurrentStage(stage_detail::TaskStage* a1); + static stage* TaskStage_GetStage(stage_detail::TaskStage* a1, task_stage_info stg_info); + static void TaskStage_GetTaskStageInfo(stage_detail::TaskStage* a1, + task_stage_info* stg_info, size_t index); + static void TaskStage_GetCurrentStageInfo(stage_detail::TaskStage* a1, + task_stage_info* stg_info); + static void TaskStage_GetLoadedStageInfos(stage_detail::TaskStage* a1, + std::vector* vec); + static bool TaskStage_Load(stage_detail::TaskStage* a1, const char* name); + static void TaskStage_Reset(stage_detail::TaskStage* a1); + static void TaskStage_SetStage(stage_detail::TaskStage* a1, task_stage_info stg_info); + static void TaskStage_TaskWindAppend(stage_detail::TaskStage* a1); + static void TaskStage_Unload(stage_detail::TaskStage* a1); } -void stage_ctrl(stage* s, render_context* rctx) { - if (!s || s->modern || !s->stage_data) - return; +static bool object_bounding_sphere_check_visibility_shadow(object_bounding_sphere* sphere, camera* cam, mat4* mat); +static bool object_bounding_sphere_check_visibility_shadow_chara(object_bounding_sphere* sphere, camera* cam); +static bool object_bounding_sphere_check_visibility_shadow_stage(object_bounding_sphere* sphere, camera* cam); + +static bool stage_ctrl(stage* s); +static void stage_disp(stage* s); +static void stage_disp_shadow(stage* s); +static void stage_disp_shadow_object(object_info object, mat4* mat); +static void stage_free(stage* s); +static void stage_load(stage* s); +static void stage_reset(stage* s); +static void stage_set(stage* s, stage* other); +static void stage_set_by_stage_index(stage* s, int32_t stage_index, uint16_t stage_counter); + +const task_stage_info task_stage_info_null = { -1, 0 }; + +stage_detail::TaskStage task_stage; + +extern render_context* rctx_ptr; + +extern bool light_chara_ambient; +extern vec4 npr_spec_color; + +static uint16_t stage_counter; + +stage::stage() : index(), counter(), state(), stage_data(), stage_display(), +lens_flare(), ground(), ring(), sky(), auth_3d_loaded(), mat(), rot_y(), obj_set(), effects() { + } -void stage_ctrl_modern(stage* s, render_context* rctx) { - if (!s || !s->modern || !s->stage_modern) - return; +stage::~stage() { + } -void stage_disp(stage* s, render_context* rctx) { - if (!s || s->modern || !s->stage_data || !s->display) - return; +stage_detail::TaskStage::TaskStage() : state(), current_stage(), stage_display(), +field_FB1(), field_FB2(), field_FB3(), field_FB4(), mat(), field_FF8() { - stage_data* data = s->stage_data; - - if (s->ground) - draw_task_add_draw_object_by_object_info_opaque(rctx, - (mat4*)&mat4_identity, data->object_ground); - - if (s->sky) - draw_task_add_draw_object_by_object_info_opaque(rctx, - (mat4*)&mat4_identity, data->object_sky); } -void stage_disp_modern(stage* s, render_context* rctx) { - if (!s || !s->modern || !s->stage_modern || !s->display) - return; +stage_detail::TaskStage:: ~TaskStage() { - stage_data_modern* data = s->stage_modern; - - if (s->ground) - draw_task_add_draw_object_by_object_info_opaque(rctx, - (mat4*)&mat4_identity, data->object_ground); - - if (s->sky) - draw_task_add_draw_object_by_object_info_opaque(rctx, - (mat4*)&mat4_identity, data->object_sky); } -void stage_load(stage* s, data_struct* data, auth_3d_database* auth_3d_db, object_database* obj_db, - texture_database* tex_db, stage_database* stage_data, char* name, render_context* rctx) { - if (!s || !stage_data || !name) - return; +bool stage_detail::TaskStage::Init() { + return true; +} - size_t name_len = utf8_length(name); +bool stage_detail::TaskStage::Ctrl() { + stage_detail::TaskStage_CtrlInner(this); - s->modern = stage_data->modern; - s->display = true; - s->ring = true; - s->ground = true; - s->sky = true; - s->effects = true; - - string auth_3d_category = string_empty; - uint32_t auth_3d_count = 0; - uint32_t* auth_3d_ids = 0; - uint32_t render_texture = -1; - uint32_t movie_texture = -1; - s->light_param_name = 0; - if (!s->modern) { - s->stage_data = 0; - vector_old_stage_data* stage = &stage_data->stage_data; - for (::stage_data* i = stage->begin; i != stage->end; i++) - if (!str_utils_compare_length(name, name_len + 1, - string_data(&i->name), i->name.length + 1)) { - string_copy(&i->auth_3d_name, &auth_3d_category); - s->stage_data = i; - auth_3d_count = i->auth_3d_count; - auth_3d_ids = i->auth_3d_ids; - render_texture = i->render_texture; - movie_texture = i->movie_texture; - s->light_param_name = light_param_get_stage_name_string(string_data(&i->name)); - break; - } - - if (!s->stage_data) - return; - } - else { - s->stage_modern = 0; - vector_old_stage_data_modern* stage = &stage_data->stage_modern; - for (stage_data_modern* i = stage->begin; i != stage->end; i++) - if (!str_utils_compare_length(name, name_len + 1, - string_data(&i->name), i->name.length + 1)) { - string_copy(&i->auth_3d_name, &auth_3d_category); - s->stage_modern = i; - auth_3d_count = i->auth_3d_count; - auth_3d_ids = i->auth_3d_ids; - render_texture = i->render_texture; - movie_texture = i->movie_texture; - s->light_param_name = light_param_get_stage_name_string(string_data(&i->name)); - break; - } - - if (!s->stage_modern) - return; - } - - light_param_storage_load_light_param_data(data, s->light_param_name); - - auth_3d_database_uid* uids = auth_3d_db->uid.data(); - if (auth_3d_category.length) { - for (auth_3d_database_category& i : auth_3d_db->category) { - if (str_utils_compare_length(i.name.c_str(), i.name.size(), - string_data(&auth_3d_category), auth_3d_category.length)) - continue; - else if (i.name.size() > (size_t)auth_3d_category.length - && i.name.c_str()[auth_3d_category.length] != 'S') - continue; - - std::string auth_3d_farc = i.name;; - auth_3d_farc += ".farc"; - - farc f; - data_struct_load_file(data, &f, "rom/auth_3d/", auth_3d_farc.c_str(), farc::load_file); - - if (f.files.size() < 1) - continue; - - for (int32_t& j : i.uid) - for (uint32_t k = 0; k < auth_3d_count; k++) { - if (uids[j].enabled && uids[j].org_uid != auth_3d_ids[k]) - continue; - - std::string auth_3d_file = uids[j].category; - auth_3d_file += ".a3da"; - - farc_file* ff = f.read_file(auth_3d_file.c_str()); - - if (!ff || !ff->data || !ff->size) - continue; - - const char* l_str = ff->name.c_str(); - const char* t = strrchr(l_str, '.'); - size_t l_len = ff->name.size(); - if (t) - l_len = t - l_str; - - uint32_t h = hash_murmurhash((uint8_t*)l_str, l_len, 0, false, false); - - a3da a3da_file; - a3da_file.read(ff->data, ff->size); - if (!a3da_file.ready) - continue; - a3da_file.hash = h; - - int32_t id = auth_3d_data_load_uid(uids[j].org_uid, auth_3d_db); - auth_3d* auth = auth_3d_data_get_auth_3d(id); - if (auth) { - auth->load(&a3da_file, obj_db, tex_db); - vector_old_int32_t_push_back(&s->auth_3d_ids, &id); - } - } + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + if (stages[i].index != -1 && stage_ctrl(&stages[i])) break; + return false; +} + +bool stage_detail::TaskStage::Dest() { + stage_detail::TaskStage_Unload(this); + if (state) + return false; + stage_detail::TaskStage_Reset(this); + return true; +} + +void stage_detail::TaskStage::Disp() { + if (state != 6 || !stage_display) + return; + + stage* s = stage_detail::TaskStage_GetCurrentStage(this); + if (s) + stage_disp(s); +} + +static void stage_detail::TaskStage_CtrlInner(stage_detail::TaskStage* a1) { + if (a1->load_stage_indices.size()) + if (!a1->state) + { + a1->state = 3; + int32_t stage_count = (int32_t)a1->load_stage_indices.size(); + stage_count = min(stage_count, TASK_STAGE_STAGE_COUNT); + for (int32_t i = 0; i < stage_count; i++) + if (a1->stages[i].index == -1) + stage_set_by_stage_index(&a1->stages[i], a1->load_stage_indices[i], stage_counter++); + a1->stage_indices = a1->load_stage_indices; + a1->load_stage_indices.clear(); + } + else if (a1->state == 6) { + stage_detail::TaskStage_Unload(a1); + return; + } + + if (a1->state == 3) { + //sub_140229F30("rom/STGTST_COLI.000.bin"); + light_param_storage_data_load_stages(&a1->stage_indices); + a1->state = 4; + } + else if (a1->state == 4 && !light_param_storage_data_load_file()/* && !sub_14022A380()*/) { + bool v5 = 0; + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + if (a1->stages[i].index != -1 && a1->stages[i].state != 6) { + v5 = 1; + break; + } + + if (!v5) { + //sub_140343B20(&a1->stage_indices); + //task_stage_current_set_effect_display(a1->stage_display); + a1->state = 5; + //sub_14064DC10(); } } - string_free(&auth_3d_category); + else if (a1->state == 5/* && !sub_1403446E0()*/) { + std::vector vec; + stage_detail::TaskStage_GetLoadedStageInfos(a1, &vec); + if (vec.size()) + stage_detail::TaskStage_SetStage(a1, vec[0]); + a1->state = 6; + } + else if (a1->state >= 7 && a1->state <= 9) + stage_detail::TaskStage_Unload(a1); +} + +static void stage_detail::TaskStage_DispShadow(stage_detail::TaskStage* a1) { + stage* s = stage_detail::TaskStage_GetCurrentStage(a1); + if (s) + stage_disp_shadow(s); +} + +static stage* stage_detail::TaskStage_GetCurrentStage(stage_detail::TaskStage* a1) { + if (a1->current_stage >= 0 && a1->current_stage <= TASK_STAGE_STAGE_COUNT) + return &a1->stages[a1->current_stage]; + return 0; +} + +static stage* stage_detail::TaskStage_GetStage(stage_detail::TaskStage* a1, task_stage_info stg_info) { + if (stg_info.load_index >= 0 && stg_info.load_index <= TASK_STAGE_STAGE_COUNT) { + stage* s = &a1->stages[stg_info.load_index]; + if (s->index != -1 && s->counter == stg_info.load_counter) + return s; + } + return 0; +} + +void stage_detail::TaskStage_GetTaskStageInfo(stage_detail::TaskStage* a1, + task_stage_info* stg_info, size_t index) { + *stg_info = task_stage_info_null; + if (index >= 0 && index < TASK_STAGE_STAGE_COUNT) { + stg_info->load_index = (int16_t)index; + stg_info->load_counter = a1->stages[index].counter; + } +} + +bool task_stage_check_not_loaded() { + return task_stage.load_stage_indices.size() || task_stage.state != 6; +} + +void task_stage_disp_shadow() { + stage_detail::TaskStage_DispShadow(&task_stage); +} + +stage* task_stage_get_current_stage() { + return stage_detail::TaskStage_GetCurrentStage(&task_stage); +} + +void task_stage_get_current_stage_info(task_stage_info* stg_info) { + stage_detail::TaskStage_GetCurrentStageInfo(&task_stage, stg_info); +} + +void task_stage_get_loaded_stage_infos(std::vector* vec) { + stage_detail::TaskStage_GetLoadedStageInfos(&task_stage, vec); +} + +bool task_stage_load(char* name) { + return stage_detail::TaskStage_Load(&task_stage, (const char*)name); +} + +bool task_stage_load(const char* name) { + return stage_detail::TaskStage_Load(&task_stage, name); +} + +void task_stage_set_mat(mat4* mat) { + task_stage.mat = *mat; +} + +void task_stage_set_mat(mat4u* mat) { + task_stage.mat = *mat; +} + +void task_stage_set_stage(task_stage_info* stg_info) { + stage_detail::TaskStage_SetStage(&task_stage, *stg_info); +} + +void task_stage_set_stage_index(int32_t stage_index) { + data_struct* data = rctx_ptr->data; + stage_database* stage_data = &data->data_ft.stage_data; + + if (stage_index >= vector_old_length(stage_data->stage_data)) + return; + + std::vector stage_indices; + stage_indices.push_back(stage_index); + task_stage.load_stage_indices = stage_indices; +} + +void task_stage_set_stage_indices(std::vector* stage_indices) { + task_stage.load_stage_indices = *stage_indices; +} + +bool task_stage_unload() { + return task_stage.SetDest(); +} + +static void stage_detail::TaskStage_GetCurrentStageInfo(stage_detail::TaskStage* a1, + task_stage_info* stg_info) { + stage_detail::TaskStage_GetTaskStageInfo(a1, stg_info, a1->current_stage); +} + +static void stage_detail::TaskStage_GetLoadedStageInfos(stage_detail::TaskStage* a1, + std::vector* vec) { + vec->clear(); + vec->shrink_to_fit(); + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + if (a1->stages[i].index != -1) { + task_stage_info stg_info; + stage_detail::TaskStage_GetTaskStageInfo(a1, &stg_info, i); + vec->push_back(stg_info); + } +} + +static bool stage_detail::TaskStage_Load(stage_detail::TaskStage* a1, const char* name) { + if (TaskWork::AppendTask(a1, name)) { + stage_detail::TaskStage_Reset(a1); + stage_detail::TaskStage_TaskWindAppend(a1); + return false; + } + else { + if (!TaskWork::HasTaskDest(a1)) + a1->SetDest(); + return true; + } +} + +static void stage_detail::TaskStage_Reset(stage_detail::TaskStage* a1) { + a1->state = 0; + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + stage_reset(&a1->stages[i]); + a1->current_stage = -1; + a1->stage_indices.clear(); + a1->load_stage_indices.clear(); + a1->stage_display = true; + a1->field_FB1 = true; + a1->field_FB2 = true; + a1->field_FB3 = true; + a1->field_FB4 = true; + a1->mat = mat4u_identity; + a1->field_FF8 = 0.0f; +} + +static void stage_detail::TaskStage_SetStage(stage_detail::TaskStage* a1, task_stage_info stg_info) { + int16_t load_index = stg_info.load_index; + stage* s = stage_detail::TaskStage_GetStage(a1, stg_info); + stage* curr = stage_detail::TaskStage_GetCurrentStage(a1); + stage_set(curr, s); + a1->current_stage = load_index; +} + +static void stage_detail::TaskStage_TaskWindAppend(stage_detail::TaskStage* a1) { + TaskWork::AppendTask(&task_wind, a1, "CHARA WIND"); +} + +static void stage_detail::TaskStage_Unload(stage_detail::TaskStage* a1) { + if (!a1->state) + return; + + if (a1->state == 3 || a1->state == 4) { + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + stage_free(&a1->stages[i]); + a1->state = 9; + } + else if (a1->state == 5 || a1->state == 6) { + if (a1->state == 6) + stage_detail::TaskStage_SetStage(a1, task_stage_info_null); + + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + stage_free(&a1->stages[i]); + a1->state = 7; + } + + if (a1->state == 7) { + //sub_140343C30(); + a1->state = 8; + } + else if (a1->state == 8) { + //if (!sub_140344700()) + a1->state = 9; + } + else if (a1->state == 9) { + bool v5 = 0; + for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) + if (a1->stages[i].state == 6) { + v5 = 1; + break; + } + + if (!v5) { + //sub_140228ED0(); + light_param_storage_data_free_file_handlers(); + a1->stage_indices.clear(); + a1->state = 0; + } + } +} + +static bool object_bounding_sphere_check_visibility_shadow(object_bounding_sphere* sphere, camera* cam, mat4* mat) { + vec3 center; + mat4_mult_vec3_trans(mat, &sphere->center, ¢er); + mat4_mult_vec3_trans(&cam->view, ¢er, ¢er); + float_t radius = sphere->radius; + + shadow* shad = rctx_ptr->draw_pass.shadow_ptr; + float_t v9 = shad->field_170 * shad->field_174; + if ((center.x + radius) < -v9 + || (center.x - radius) > v9 + || (center.y + radius) < -v9 + || (center.y - radius) > v9 + || (center.z - radius) > -shad->z_near + || (center.z + radius) < -shad->z_far) + return false; + return true; +} + +static bool object_bounding_sphere_check_visibility_shadow_chara(object_bounding_sphere* sphere, camera* cam) { + mat4 mat; + shadow* shad = rctx_ptr->draw_pass.shadow_ptr; + mat4_look_at(&shad->view_point[0], &shad->interest[0], &mat); + return object_bounding_sphere_check_visibility_shadow(sphere, cam, &mat); +} + +static bool object_bounding_sphere_check_visibility_shadow_stage(object_bounding_sphere* sphere, camera* cam) { + mat4 mat; + shadow* shad = rctx_ptr->draw_pass.shadow_ptr; + mat4_look_at(&shad->view_point[1], &shad->interest[1], &mat); + return object_bounding_sphere_check_visibility_shadow(sphere, cam, &mat); +} + +static bool stage_ctrl(stage* s) { + if (s->state >= 1 && s->state <= 5) { + stage_load(s); + return true; + } + else if (s->state >= 7 && s->state <= 9) { + stage_free(s); + return true; + } + + for (int32_t& i : s->auth_3d_uids) + auth_3d_data_set_visibility(&i, s->effects); + return false; +} + +static void stage_disp(stage* s) { + if (s->state != 6 || !s->stage_display) + return; + + object_data* object_data = &rctx_ptr->object_data; + + mat4 mat; + mat4_rotate_y(s->rot_y, &mat); + + if (s->stage_data->object_ground.not_null() && s->ground) + draw_task_add_draw_object_by_object_info(rctx_ptr, &mat, s->stage_data->object_ground, 0, 0, 0, 0, 0, 0); + + if (s->stage_data->object_ring.not_null() && s->ring) + draw_task_add_draw_object_by_object_info(rctx_ptr, &mat, s->stage_data->object_ring, 0, 0, 0, 0, 0, 0); + + if (s->stage_data->object_reflect.not_null()) { + object_data_set_draw_task_flags(object_data, + (draw_task_flags)(DRAW_TASK_NO_TRANSLUCENCY | DRAW_TASK_REFRACT)); + draw_task_add_draw_object_by_object_info(rctx_ptr, &mat, s->stage_data->object_reflect, 0, 0, 0, 0, 0, 0); + object_data_set_draw_task_flags(object_data, (draw_task_flags)0); + } + + if (s->stage_data->object_refract.not_null()) { + object_data_set_draw_task_flags(object_data, + (draw_task_flags)(DRAW_TASK_NO_TRANSLUCENCY | DRAW_TASK_REFRACT)); + draw_task_add_draw_object_by_object_info(rctx_ptr, &mat, s->stage_data->object_refract, 0, 0, 0, 0, 0, 0); + object_data_set_draw_task_flags(object_data, (draw_task_flags)0); + } + + if (s->stage_data->object_sky.not_null() && s->sky) { + mat4 t = s->mat; + mat4_mult(&t, &mat, &t); + draw_task_add_draw_object_by_object_info(rctx_ptr, &t, s->stage_data->object_sky, 0, 0, 0, 0, 0, 0); + } + + if (s->stage_data->lens_flare_texture != -1 && s->lens_flare) { + int32_t object_set_id = s->stage_data->object_set_id; + GLuint* textures = object_storage_get_textures(object_set_id); + int32_t textures_count = object_storage_get_textures_count(object_set_id); + uint32_t* texture_ids = object_storage_get_texture_ids(object_set_id); + int32_t texture_ids_count = object_storage_get_texture_ids_count(object_set_id); + + GLuint texs[3]; + texs[0] = 0; + uint32_t lens_flare_texture = s->stage_data->lens_flare_texture; + for (int32_t i = 0; i < texture_ids_count; i++) + if (texture_ids[i] == lens_flare_texture) { + texs[0] = textures[i]; + break; + } + + texs[1] = 0; + uint32_t lens_shaft_texture = s->stage_data->lens_shaft_texture; + for (int32_t i = 0; i < texture_ids_count; i++) + if (texture_ids[i] == lens_shaft_texture) { + texs[1] = textures[i]; + break; + } + + texs[2] = 0; + uint32_t lens_ghost_texture = s->stage_data->lens_ghost_texture; + for (int32_t i = 0; i < texture_ids_count; i++) + if (texture_ids[i] == lens_ghost_texture) { + texs[2] = textures[i]; + break; + } + + post_process_struct* pp = &rctx_ptr->post_process; + pp->lens_flare_texture = texs[0]; + pp->lens_shaft_texture = texs[1]; + pp->lens_ghost_texture = texs[2]; + pp->lens_flare_count = 16; + pp->lens_shaft_inv_scale = s->stage_data->lens_shaft_inv_scale; + } +} + +static void stage_disp_shadow(stage* s) { + if (s->state != 6 || !s->stage_display) + return; + + mat4 mat; + mat4_rotate_y(s->rot_y, &mat); + if (s->stage_data->object_shadow.not_null()) + stage_disp_shadow_object(s->stage_data->object_shadow, &mat); +} + +static void stage_disp_shadow_object(object_info object, mat4* mat) { + object_data* object_data = &rctx_ptr->object_data; + + for (int32_t i = SHADOW_CHARA; i < SHADOW_MAX; i++) { + object_data_set_shadow_type(object_data, (shadow_type_enum)i); + object_data_set_object_bounding_sphere_check_func(object_data, + i == SHADOW_CHARA ? object_bounding_sphere_check_visibility_shadow_chara : object_bounding_sphere_check_visibility_shadow_stage); + object_data_set_draw_task_flags(object_data, + (draw_task_flags)(DRAW_TASK_NO_TRANSLUCENCY | DRAW_TASK_SHADOW_OBJECT)); + draw_task_add_draw_object_by_object_info(rctx_ptr, mat, object, 0, 0, 0, 0, 0, 0); + } + + object_data_set_draw_task_flags(object_data, (draw_task_flags)0); + object_data_set_object_bounding_sphere_check_func(object_data, 0); + object_data_set_shadow_type(object_data, SHADOW_CHARA); +} + +static void stage_free(stage* s) { + if (!s->state) + return; + + if (s->state >= 1 && s->state <= 6) { + s->state = 9; + } + + if (s->state < 7 || s->state > 9) + return; + + draw_pass* draw_pass = &rctx_ptr->draw_pass; + if (s->stage_data->render_texture != -1) { + post_process_render_texture_free(&rctx_ptr->post_process, + texture_storage_get_texture(s->stage_data->render_texture), 0); + s->stage_data->render_texture = -1; + } + + if (s->stage_data->movie_texture != -1) { + post_process_movie_texture_free(&rctx_ptr->post_process, + texture_storage_get_texture(s->stage_data->movie_texture)); + s->stage_data->movie_texture = -1; + } + + draw_pass->shadow = true; + //rctx_ptr->post_process.field_14 = 0; + //rctx_ptr->post_process.field_ED8 = 1; + npr_spec_color.w = 1.0f; + draw_pass->field_31D = 0; + draw_pass->field_31E = 0; + draw_pass->field_31F = false; + draw_pass->field_320 = 0; + light_chara_ambient = false; + + if (s->auth_3d_loaded) { + auth_3d_data_unload_category(string_data(&s->stage_data->auth_3d_name)); + auth_3d_data_unload_category(string_data(&s->stage_data->name)); + s->auth_3d_loaded = false; + } + + object_storage_delete_object_set(s->stage_data->object_set_id); + if (s->obj_set >= 0) + object_storage_delete_object_set(s->obj_set); + + s->obj_set = -1; + s->index = -1; + s->state = 0; +} + +static void stage_load(stage* s) { + if (s->state == 1) { + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + object_set_info* set_info = 0; + if (obj_db->get_object_set_info_by_set_id(s->obj_set, &set_info)) + object_set_load_by_db_index(&set_info, data, obj_db, set_info->id); + s->state = 2; + } + else if (s->state == 2) { + if (s->obj_set < 0 || true/*!obj_database_load_obj_set_check_not_read(s->obj_set)*/) + s->state = 3; + } + else if (s->state == 3) { + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + object_set_info* set_info = 0; + if (obj_db->get_object_set_info_by_set_id(s->stage_data->object_set_id, &set_info)) + object_set_load_by_db_index(&set_info, data, obj_db, set_info->id); + + auth_3d_data_load_category(string_data(&s->stage_data->name)); + auth_3d_data_load_category(string_data(&s->stage_data->auth_3d_name)); + s->auth_3d_loaded = true; + s->state = 4; + } + else if (s->state == 4 + && true/*!obj_database_load_obj_set_check_not_read(s->stage_data->object_set_id)*/ + && auth_3d_data_check_category_loaded(string_data(&s->stage_data->name)) + && auth_3d_data_check_category_loaded(string_data(&s->stage_data->auth_3d_name))) { + if (s->stage_data->render_texture != -1) + post_process_render_texture_set(&rctx_ptr->post_process, + texture_storage_get_texture(s->stage_data->render_texture), 0); + + if (s->stage_data->movie_texture != -1) + post_process_movie_texture_set(&rctx_ptr->post_process, + texture_storage_get_texture(s->stage_data->movie_texture)); + s->state = 6; + + data_struct* data = rctx_ptr->data; + auth_3d_database* auth_3d_db = &data->data_ft.auth_3d_db; + int32_t auth_3d_count = s->stage_data->auth_3d_count; + int32_t* auth_3d_ids = s->stage_data->auth_3d_ids; + for (int32_t i = 0; i < auth_3d_count; i++) { + int32_t id = auth_3d_data_load_uid(auth_3d_ids[i], auth_3d_db); + auth_3d_data_read_file(&id, auth_3d_db); + s->auth_3d_uids.push_back(id); + } + + for (int32_t& i : s->auth_3d_uids) + auth_3d_data_set_visibility(&i, true); + } +} + +static void stage_reset(stage* s) { + s->index = -1; + s->counter = 0; + s->state = 0; + s->stage_data = 0; + s->stage_display = true; + s->lens_flare = true; + s->ground = true; + s->ring = true; + s->sky = true; + s->auth_3d_loaded = 0; + s->mat = mat4u_identity; + s->rot_y = 0.0; + s->obj_set = -1; + + for (int32_t& i : s->auth_3d_uids) + auth_3d_data_unload_id(i, rctx_ptr); + s->auth_3d_uids.clear(); + s->auth_3d_uids.shrink_to_fit(); + s->effects = true; +} + +static void stage_set(stage* s, stage* other) { + if (other && s == other) + return; + + draw_pass* draw_pass = &rctx_ptr->draw_pass; + if (s) { + //flt_14CC925C0 = 0.0; + //flt_140CB3704 = -1001.0; + draw_pass->enable[DRAW_PASS_REFLECT] = false; + draw_pass->reflect = false; + draw_pass->enable[DRAW_PASS_REFRACT] = false; + draw_pass->refract = true; + draw_pass->field_31D = 0; + draw_pass->field_31E = 0; + draw_pass->field_31F = false; + draw_pass->field_320 = 0; + draw_pass->shadow = true; + //rctx_ptr->post_process.field_14 = 0; + //rctx_ptr->post_process.field_ED8 = 1; + npr_spec_color.w = 1.0f; + draw_pass->npr_param = 0; + light_chara_ambient = false; + } + + if (other) { + rctx_ptr->chara_reflect = other->stage_data->reflect_type != STAGE_DATA_REFLECT_DISABLE; + draw_pass->reflect_type = other->stage_data->reflect_type; + rctx_ptr->chara_refract = other->stage_data->refract_enable; + + if (other->stage_data->reflect) { + stage_data_reflect* reflect = &other->stage_data->reflect_data; + draw_pass->enable[DRAW_PASS_REFLECT] = true; + draw_pass->reflect_blur_num = reflect->blur_num; + draw_pass->reflect_blur_filter = (blur_filter_mode)reflect->blur_filter; + draw_pass->reflect = true; + /*reflect_refract_resolution_mode reflect_resolution_mode = REFLECT_REFRACT_RESOLUTION_512x512; + if (other->stage_data->reflect_type != STAGE_DATA_REFLECT_REFLECT_MAP) + reflect_resolution_mode = (reflect_refract_resolution_mode)reflect->mode; + draw_pass_data_set_reflect_resolution_mode(reflect_resolution_mode);*/ + } + + if (other->stage_data->refract) { + stage_data_refract* refract = &other->stage_data->refract_data; + draw_pass->enable[DRAW_PASS_REFRACT] = true; + //draw_pass_data_set_refract_resolution_mode(refract->mode); + draw_pass->refract = true; + } + + if (other->stage_data->flags & STAGE_DATA_FLAG_1) + draw_pass->field_31D = true; + if (other->stage_data->flags & STAGE_DATA_FLAG_4) + draw_pass->field_31E = true; + if (other->stage_data->flags & STAGE_DATA_FLAG_8) + draw_pass->field_320 = true; + if (other->stage_data->flags & STAGE_DATA_LIGHT_CHARA_AMBIENT) + light_chara_ambient = true; + //if (stru_14CC92630.pv_id == 421) + //draw_pass->field_31F = true; + //sub_14064DC10(); + //sub_140344160(other->index); + } + //else + //sub_140344160(-1); + + if (other) + light_param_storage_data_set_stage(other->index); + else + light_param_storage_data_set_default_light_param(); + + if (s) + for (int32_t& i : s->auth_3d_uids) { + auth_3d_data_set_req_frame(&i, 0.0f); + auth_3d_data_set_visibility(&i, false); + } + + if (other) + for (int32_t& i : other->auth_3d_uids) { + auth_3d_data_set_req_frame(&i, 0.0f); + auth_3d_data_set_visibility(&i, true); + } + + //sub_140344180(0); + + if (/*!pv_osage_manager_array_ptr_get_disp() && */other) + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { + rob_chara* rob_chr = rob_chara_array_get(i); + //if (rob_chr) + //sub_1405559D0(rob_chr, &other->index); + } +} + +static void stage_set_by_stage_index(stage* s, int32_t stage_index, uint16_t stage_counter) { + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + stage_database* stage_data = &data->data_ft.stage_data; + + stage_reset(s); + s->index = stage_index; + s->counter = stage_counter; + s->state = 1; + + if (stage_index >= vector_old_length(stage_data->stage_data)) { + s->stage_data = 0; + return; + } + + s->stage_data = &stage_data->stage_data.begin[stage_index]; + + char* name = string_data(&s->stage_data->name); + size_t name_len = s->stage_data->name.length; char set_name[11]; set_name[0] = 0; @@ -178,83 +735,14 @@ void stage_load(stage* s, data_struct* data, auth_3d_database* auth_3d_db, objec set_name[8] = 0; } - else if(!str_utils_compare_length(name, name_len, "STGD2PV", 7)) { + else if (!str_utils_compare_length(name, name_len, "STGD2PV", 7)) { memcpy(set_name, name, 10); set_name[10] = 0; } + s->obj_set = -1; object_set_info* set_info; - s->set_id = -1; - if (set_name[0] && object_database_get_object_set_info(obj_db, set_name, &set_info)) { - s->set_id = set_info->id; - object_set_load_by_db_index(&set_info, data, obj_db, set_info->id); + if (set_name[0] && obj_db->get_object_set_info(set_name, &set_info)) { + s->obj_set = set_info->id; } - - s->stage_set_id = -1; - if (object_database_get_object_set_info(obj_db, name, &set_info)) { - s->stage_set_id = set_info->id; - object_set_load_by_db_index(&set_info, data, obj_db, set_info->id); - } - - if (render_texture != -1) - post_process_render_texture_set(&rctx->post_process, - texture_storage_get_texture(render_texture), 0); - - if (movie_texture != -1) - post_process_movie_texture_set(&rctx->post_process, - texture_storage_get_texture(movie_texture)); -} - -inline void stage_load(stage* s, data_struct* data, auth_3d_database* auth_3d_db, object_database* obj_db, - texture_database* tex_db, stage_database* stage_data, const char* name, render_context* rctx) { - stage_load(s, data, auth_3d_db, obj_db, tex_db, stage_data, (char*)name, rctx); -} - -extern int32_t stage_index; - -void stage_set(stage* s, render_context* rctx) { - if (!s || !rctx || s == rctx->stage) - return; - - rctx->stage = s; - stage_index = (uint32_t)(s->modern ? s->stage_modern->id : s->stage_data->id); - render_context_set_light_param(rctx, - light_param_storage_get_light_param_data(s->light_param_name)); -} - -void stage_free(stage* s, render_context* rctx) { - uint32_t render_texture = -1; - uint32_t movie_texture = -1; - if (!s->modern && s->stage_data) { - stage_data* info = s->stage_data; - render_texture = info->render_texture; - movie_texture = info->movie_texture; - - for (int32_t* i = s->auth_3d_ids.begin; i != s->auth_3d_ids.end; i++) - auth_3d_data_unload_id(*i, rctx); - vector_old_int32_t_free(&s->auth_3d_ids, 0); - } - else if (s->modern && s->stage_modern) { - stage_data_modern* info = s->stage_modern; - render_texture = info->render_texture; - movie_texture = info->movie_texture; - - for (int32_t* i = s->auth_3d_ids.begin; i != s->auth_3d_ids.end; i++) - auth_3d_data_unload_id(*i, rctx); - vector_old_int32_t_free(&s->auth_3d_ids, 0); - } - - if (render_texture != -1) - post_process_render_texture_free(&rctx->post_process, - texture_storage_get_texture(render_texture), false); - - if (movie_texture != -1) - post_process_movie_texture_free(&rctx->post_process, - texture_storage_get_texture(movie_texture)); - - object_storage_delete_object_set(s->set_id); - object_storage_delete_object_set(s->stage_set_id); - free(s->light_param_name); - - rctx->stage = 0; } diff --git a/src/CRE/stage.h b/src/CRE/stage.h index de4fc078..4343185b 100644 --- a/src/CRE/stage.h +++ b/src/CRE/stage.h @@ -5,40 +5,78 @@ #pragma once +#include #include "../KKdLib/default.h" #include "../KKdLib/database/stage.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" #include "render_context.h" #include "auth_3d.h" -typedef struct stage { - union { - stage_data* stage_data; - stage_data_modern* stage_modern; - }; - - bool modern; - bool display; - bool ring; +class stage { +public: + int32_t index; + uint16_t counter; + int32_t state; + stage_data* stage_data; + bool stage_display; + bool lens_flare; bool ground; + bool ring; bool sky; + bool auth_3d_loaded; + mat4u mat; + float_t rot_y; + int32_t obj_set; + + // Temp + std::vector auth_3d_uids; bool effects; - uint32_t set_id; - uint32_t stage_set_id; - char* light_param_name; - vector_old_int32_t auth_3d_ids; -} stage; + stage(); + ~stage(); +}; -extern void stage_init(stage* s); -extern void stage_ctrl(stage* s, render_context* rctx); -extern void stage_ctrl_modern(stage* s, render_context* rctx); -extern void stage_disp(stage* s, render_context* rctx); -extern void stage_disp_modern(stage* s, render_context* rctx); -extern void stage_load(stage* s, data_struct* data, auth_3d_database* auth_3d_db, object_database* obj_db, - texture_database* tex_db, stage_database* stage_data, char* name, render_context* rctx); -extern void stage_load(stage* s, data_struct* data, auth_3d_database* auth_3d_db, object_database* obj_db, - texture_database* tex_db, stage_database* stage_data, const char* name, render_context* rctx); -extern void stage_set(stage* s, render_context* rctx); -extern void stage_free(stage* s, render_context* rctx); +#define TASK_STAGE_STAGE_COUNT 37 + +namespace stage_detail { + class TaskStage : public Task { + public: + int32_t state; + stage stages[TASK_STAGE_STAGE_COUNT]; + int16_t current_stage; + std::vector stage_indices; + std::vector load_stage_indices; + bool stage_display; + bool field_FB1; + bool field_FB2; + bool field_FB3; + bool field_FB4; + mat4u mat; + float_t field_FF8; + + TaskStage(); + virtual ~TaskStage() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + }; +} + +typedef struct task_stage_info { + int16_t load_index; + uint16_t load_counter; +} task_stage_info; + +extern bool task_stage_check_not_loaded(); +extern void task_stage_disp_shadow(); +extern stage* task_stage_get_current_stage(); +extern void task_stage_get_current_stage_info(task_stage_info* stg_info); +extern void task_stage_get_loaded_stage_infos(std::vector* vec); +extern bool task_stage_load(char* name); +extern bool task_stage_load(const char* name); +extern void task_stage_set_mat(mat4* mat); +extern void task_stage_set_mat(mat4u* mat); +extern void task_stage_set_stage(task_stage_info* stg_info); +extern void task_stage_set_stage_index(int32_t stage_index); +extern void task_stage_set_stage_indices(std::vector* stage_indices); +extern bool task_stage_unload(); diff --git a/src/CRE/task.c b/src/CRE/task.c index 3ed97946..b24733db 100644 --- a/src/CRE/task.c +++ b/src/CRE/task.c @@ -10,7 +10,6 @@ extern float_t get_delta_frame(); extern uint32_t get_frame_counter(); static void Task_add_base_calc_time(Task* t, uint32_t calc_time); -static void Task_add_disp_time(Task* t, uint32_t disp_time); static void Task_do_basic(Task* t); static void Task_do_ctrl(Task* t); static void Task_do_ctrl_frames(int32_t frames, bool a2); @@ -23,7 +22,6 @@ static void Task_sub_14019C480(Task* t, uint32_t a2); static void Task_sub_14019C5A0(Task* t); static bool TaskWork_has_task_dest(Task* t); -static bool TaskWork_sub_14019B6B0(Task* t); TaskWork task_work; @@ -71,6 +69,34 @@ void Task::Basic() { } +uint32_t Task::GetCalcTime() { + return calc_time; +} + +uint32_t Task::GetCalcTimeMax() { + return calc_time_max; +} + +uint32_t Task::GetDispTime() { + return disp_time; +} + +uint32_t Task::GetDispTimeMax() { + return disp_time_max; +} + +char* Task::GetName() { + return name; +} + +bool Task::SetDest() { + if (!TaskWork::HasTask(this) || !Task_sub_14019B810(this, 2)) + return 0; + + Task_sub_14019C480(this, 2); + return 1; +} + void Task::SetName(char* name) { if (!name) { this->name[0] = 0; @@ -129,6 +155,10 @@ void TaskWork::Basic() { Task_do_basic(j); } +bool TaskWork::CheckTaskNotReady(Task* t) { + return TaskWork::HasTask(t) && (t->field_18 == TASK_NONE || t->field_1C); +} + void TaskWork::Ctrl() { std::vector* tasks = &task_work.tasks; for (Task*& i : task_work.tasks) { @@ -148,17 +178,17 @@ void TaskWork::Ctrl() { task_work.current = tsk; Task_do_ctrl(tsk); task_work.current = 0; - Task_add_base_calc_time(tsk, (uint32_t)time_struct_calc_time(&t)); + Task_add_base_calc_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); } for (Task** i = task_work.tasks.begin()._Ptr; i != task_work.tasks.end()._Ptr; ) { - if (TaskWork_sub_14019B6B0(*i)) { + if (TaskWork::CheckTaskNotReady(*i)) { i++; continue; } task_work.tasks.erase(task_work.tasks.begin() - + (i - task_work.tasks.begin()._Ptr)); + + (i - task_work.tasks.data())); } int32_t delta_frame = (int32_t)get_delta_frame(); @@ -183,11 +213,21 @@ void TaskWork::Disp() { time_struct t; time_struct_init(&t); Task_do_disp(tsk); - Task_add_disp_time(tsk, (uint32_t)time_struct_calc_time(&t)); + Task_set_disp_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); } task_work.disp = false; } +Task* TaskWork::GetTaskByIndex(int32_t index) { + int32_t k = 0; + for (int32_t i = 0; i < 3; i++) + for (Task*& j : task_work.tasks) + if (j->priority == i) + if (k++ == index) + return j; + return 0; +} + bool TaskWork::HasTask(Task* t) { std::vector* tasks = &task_work.tasks; for (Task*& i : task_work.tasks) @@ -196,12 +236,15 @@ bool TaskWork::HasTask(Task* t) { return false; } -static void Task_add_base_calc_time(Task* t, uint32_t calc_time) { - t->base_calc_time += calc_time; +bool TaskWork::HasTaskDest(Task* t) { + if (TaskWork::HasTask(t)) + return t->field_18 == TASK_DEST; + else + return false; } -static void Task_add_disp_time(Task* t, uint32_t disp_time) { - t->disp_time += disp_time; +static void Task_add_base_calc_time(Task* t, uint32_t calc_time) { + t->base_calc_time += calc_time; } static void Task_do_basic(Task* t) { @@ -246,7 +289,7 @@ static void Task_do_ctrl_frames(int32_t frames, bool a2) { task_work.current = tsk; Task_do_ctrl(tsk); task_work.current = 0; - Task_add_base_calc_time(tsk, (uint32_t)time_struct_calc_time(&t)); + Task_add_base_calc_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); } } @@ -335,7 +378,3 @@ static bool TaskWork_has_task_dest(Task* t) { return t->field_18 == TASK_DEST; return false; } - -static bool TaskWork_sub_14019B6B0(Task* t) { - return TaskWork::HasTask(t) && (t->field_18 == TASK_NONE || t->field_1C); -} diff --git a/src/CRE/task.h b/src/CRE/task.h index 96c4fdc6..c0dab27a 100644 --- a/src/CRE/task.h +++ b/src/CRE/task.h @@ -44,6 +44,13 @@ public: virtual void Disp(); virtual void Basic(); + uint32_t GetCalcTime(); + uint32_t GetCalcTimeMax(); + uint32_t GetDispTime(); + uint32_t GetDispTimeMax(); + char* GetName(); + + bool SetDest(); void SetName(char* name); void SetName(const char* name); void SetPriority(int32_t priority); @@ -67,7 +74,10 @@ public: static bool AppendTask(Task* t, Task* parent_task = task_work.current, const char* name = "(unknown)", int32_t priority = 1); static void Basic(); + static bool CheckTaskNotReady(Task* t); static void Ctrl(); static void Disp(); + static Task* GetTaskByIndex(int32_t index); static bool HasTask(Task* t); + static bool HasTaskDest(Task* t); }; diff --git a/src/CRE/texture.c b/src/CRE/texture.c index 48428ee5..cb65c5c6 100644 --- a/src/CRE/texture.c +++ b/src/CRE/texture.c @@ -41,18 +41,18 @@ texture* texture_load_tex_cube_map(uint32_t id, GLenum internal_format, int32_t } texture* texture_txp_load(txp* t, uint32_t id) { - if (!t || !t->data.begin) + if (!t || !t->mipmaps.size()) return 0; int32_t count = t->array_size * t->mipmaps_count; void** data_ptr = force_malloc_s(void*, count); for (uint32_t i = 0, k = 0; i < t->array_size; i++) for (uint32_t j = 0; j < t->mipmaps_count; j++, k++) - data_ptr[k] = t->data.begin[k].data; + data_ptr[k] = t->mipmaps[k].data.data(); GLenum internal_format = texture_txp_get_internal_format(t); - int32_t width = t->data.begin->width; - int32_t height = t->data.begin->height; + int32_t width = t->mipmaps[0].width; + int32_t height = t->mipmaps[0].height; int32_t max_mipmap_level = t->mipmaps_count - 1; texture* tex; @@ -72,11 +72,11 @@ bool texture_txp_set_load(txp_set* t, texture*** texs, uint32_t* ids) { if (!t || !texs || !ids) return false; - size_t count = vector_old_length(*t); + size_t count = t->textures.size(); *texs = force_malloc_s(texture*, count + 1); texture** tex = *texs; for (size_t i = 0; i < count; i++) - tex[i] = texture_txp_load(&t->begin[i], ids[i]); + tex[i] = texture_txp_load(&t->textures[i], ids[i]); tex[count] = 0; return true; } @@ -491,10 +491,10 @@ static void texture_set_params(GLenum target, int32_t max_mipmap_level, bool use } static GLenum texture_txp_get_internal_format(txp* t) { - if (!t || !t->data.begin) + if (!t || !t->mipmaps.size()) return GL_ZERO; - switch (t->data.begin->format) { + switch (t->mipmaps[0].format) { case TXP_A8: return GL_ALPHA8; case TXP_RGB8: diff --git a/src/DivaGL/DivaGL.vcxproj b/src/DivaGL/DivaGL.vcxproj index 4ea4a39b..939285dc 100644 --- a/src/DivaGL/DivaGL.vcxproj +++ b/src/DivaGL/DivaGL.vcxproj @@ -188,7 +188,6 @@ true MultiThreadedDebug $(IntDir)/%(RelativeDir) - false 26812 @@ -224,7 +223,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" true MultiThreadedDebug $(IntDir)/%(RelativeDir) - false 26812 @@ -264,7 +262,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" MultiThreadedDebug /Gw %(AdditionalOptions) $(IntDir)/%(RelativeDir) - false Speed false 26812 @@ -300,10 +297,9 @@ del "$(SolutionDir)bin\$(TargetName).lib" true FastCall CompileAsCpp - MultiThreaded + MultiThreadedDebug /Gw %(AdditionalOptions) $(IntDir)/%(RelativeDir) - false Speed false 26812 @@ -345,7 +341,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" MultiThreaded /Gw %(AdditionalOptions) $(IntDir)/%(RelativeDir) - false Speed false 26812 @@ -386,7 +381,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" MultiThreaded /Gw %(AdditionalOptions) $(IntDir)/%(RelativeDir) - false Speed false 26812 @@ -431,7 +425,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" MultiThreaded /Gw %(AdditionalOptions) $(IntDir)/%(RelativeDir) - false Speed false 26812 @@ -474,7 +467,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" MultiThreaded /Gw %(AdditionalOptions) $(IntDir)/%(RelativeDir) - false Speed false 26812 diff --git a/src/DivaGL/bone_data.c b/src/DivaGL/bone_data.c index 2abfef57..5aa534f9 100644 --- a/src/DivaGL/bone_data.c +++ b/src/DivaGL/bone_data.c @@ -44,7 +44,8 @@ static void* (*HeapCMallocAllocate)(HeapCMallocType type, size_t size, const cha = (void* (*)(HeapCMallocType, size_t, const char*))0x00000001403F2A00; static void(*HeapCMallocFree)(HeapCMallocType type, void* data) = (void(*)(HeapCMallocType, void*))0x00000001403F2960; -static void(*j_free_2)(void*) = (void(*)(void*))0x0000000140845378; +static void(*operator_new)(void*) = (void(*)(void*))0x0000000140845378; +static void(*operator_delete)(void*) = (void(*)(void*))0x0000000140845378; static const float_t get_osage_gravity_const() { return 0.00299444468691945f; @@ -435,11 +436,11 @@ static void bone_data_parent_data_init(bone_data_parent* bone, bone_data_parent_load_bone_database(bone, common_bone_data, common_translation, translation); } -static void mot_parent_get_key_set_count(mot_parent* a1, size_t motion_bone_count, size_t ik_bone_count) { +static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t motion_bone_count, size_t ik_bone_count) { a1->key_set_count = (motion_bone_count + ik_bone_count) * 3 + 16; } -static void mot_parent_reserve_key_sets(mot_parent* a1) { +static void mot_key_data_reserve_key_sets(mot_key_data* a1) { if (a1->key_set.begin) HeapCMallocFree(HeapCMallocSystem, a1->key_set.begin); @@ -473,10 +474,10 @@ static void mot_parent_reserve_key_sets(mot_parent* a1) { a1->key_sets_ready = true; } -static void mot_parent_init_key_sets(mot_parent* a1, aft_bone_database_skeleton_type type, +static void mot_key_data_init_key_sets(mot_key_data* a1, aft_bone_database_skeleton_type type, size_t motion_bone_count, size_t ik_bone_count) { - mot_parent_get_key_set_count(a1, motion_bone_count, ik_bone_count); - mot_parent_reserve_key_sets(a1); + mot_key_data_get_key_set_count(a1, motion_bone_count, ik_bone_count); + mot_key_data_reserve_key_sets(a1); a1->skeleton_type = type; } @@ -801,8 +802,8 @@ static void sub_140413350(struc_240* a1, bool(*bone_check_func)(motion_bone_inde static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, rob_chara_bone_data* rob_bone_data, bool(*bone_check_func)(motion_bone_index)) { bone_data_parent_data_init(&a1->bone_data, rob_bone_data); - mot_parent_init_key_sets( - &a1->mot_data, + mot_key_data_init_key_sets( + &a1->mot_key_data, a1->bone_data.rob_bone_data->base_skeleton_type, a1->bone_data.motion_bone_count, a1->bone_data.ik_bone_count); @@ -1385,7 +1386,7 @@ static void sub_140413EB0(struc_308* a1) { static void sub_1404117F0(motion_blend_mot* a1) { sub_140413EB0(&a1->field_4F8); - int32_t skeleton_select = a1->mot_data.skeleton_select; + int32_t skeleton_select = a1->mot_key_data.skeleton_select; for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) bone_data_mult_0(i, skeleton_select); } @@ -1415,7 +1416,7 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { float_t v9 = a1->field_4F8.field_C4; vec3 v10 = a1->field_4F8.field_C8; a1->field_4F8.field_A8 = b_n_hara_cp->trans; - if (!a1->mot_data.skeleton_select) { + if (!a1->mot_key_data.skeleton_select) { if (a2 != v9) { b_n_hara_cp->trans.x = (b_n_hara_cp->trans.x - v10.x) * v9 + v10.x; b_n_hara_cp->trans.z = (b_n_hara_cp->trans.z - v10.z) * v9 + v10.z; @@ -1437,7 +1438,7 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { } static bool sub_1404136B0(motion_blend_mot* a1) { - motion_blend* v1 = a1->field_5D0; + motion_blend* v1 = a1->blend; if (v1) return v1->__vftable->field_30(v1); else @@ -1449,7 +1450,7 @@ static bool sub_140410250(struc_313* a1, size_t a2) { } static void sub_140410A40(motion_blend_mot* a1, vector_old_bone_data* a2, vector_old_bone_data* a3) { - motion_blend* v1 = a1->field_5D0; + motion_blend* v1 = a1->blend; if (!v1 || !v1->field_9) return; @@ -1466,7 +1467,7 @@ static void sub_140410A40(motion_blend_mot* a1, vector_old_bone_data* a2, vector } static void sub_140410B70(motion_blend_mot* a1, vector_old_bone_data* a2) { - motion_blend* v1 = a1->field_5D0; + motion_blend* v1 = a1->blend; if (!v1 || !v1->field_9) return; @@ -1478,12 +1479,12 @@ static void sub_140410B70(motion_blend_mot* a1, vector_old_bone_data* a2) { bone_data* v6 = 0; if (a2) v6 = &a2->begin[i->motion_bone_index]; - v1->__vftable->field_28(a1->field_5D0, &a1->bone_data.bones.begin[i->motion_bone_index], v6); + v1->__vftable->field_28(a1->blend, &a1->bone_data.bones.begin[i->motion_bone_index], v6); } } static motion_blend_type sub_1404125C0(motion_blend_mot* a1) { - motion_blend* v1 = a1->field_5D0; + motion_blend* v1 = a1->blend; if (v1 == &a1->cross.base) return MOTION_BLEND_CROSS; if (v1 == &a1->freeze.base) @@ -1494,13 +1495,13 @@ static motion_blend_type sub_1404125C0(motion_blend_mot* a1) { } static void sub_140410CB0(mot_blend* a1, vector_old_bone_data* a2) { - motion_blend* v1 = &a1->field_F8; + motion_blend* v1 = &a1->blend.base; if (!v1->field_9) return; for (bone_data* i = a2->begin; i != a2->end; i++) if (sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) - v1->__vftable->field_28(&a1->field_F8, &a2->begin[i->motion_bone_index], 0); + v1->__vftable->field_28(&a1->blend.base, &a2->begin[i->motion_bone_index], 0); } static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { @@ -1583,17 +1584,17 @@ void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* a2) { static mot_blend* mot_blend_init(mot_blend* a1) { memset(a1, 0, sizeof(mot_blend)); - a1->field_38.frame = -1.0f; - a1->field_38.motion_id = -1; - a1->field_A8.field_8 = 1.0f; - a1->field_A8.field_4 = 1.0f; - a1->field_A8.field_10 = -1.0f; - a1->field_A8.field_14 = -1.0f; - a1->field_A8.field_18 = -1; - a1->field_A8.field_1C = -1; - a1->field_A8.field_24 = -1.0f; - a1->field_A8.field_2C = -1; - a1->field_F8.field_14 = 1.0f; + a1->mot_key_data.frame = -1.0f; + a1->mot_key_data.motion_id = -1; + a1->mot_play_data.frame_data.field_8 = 1.0f; + a1->mot_play_data.frame_data.field_4 = 1.0f; + a1->mot_play_data.frame_data.field_10 = -1.0f; + a1->mot_play_data.frame_data.field_14 = -1.0f; + a1->mot_play_data.frame_data.field_18 = -1; + a1->mot_play_data.frame_data.field_1C = -1; + a1->mot_play_data.frame_data.field_24 = -1.0f; + a1->mot_play_data.frame_data.field_2C = -1; + a1->blend.base.field_14 = 1.0f; return a1; } @@ -1689,7 +1690,7 @@ static bool mot_blend_eyelid_check(motion_bone_index bone_index) { || (bone_index >= MOTION_BONE_N_MABU_L_D_A && bone_index <= MOTION_BONE_TL_MABU_R_U_C_WJ); } -static void mot_parent_get_key_set_count_by_bone_database_bones(mot_parent* a1, aft_bone_database_bone* bones) { +static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, aft_bone_database_bone* bones) { size_t object_bone_count; size_t motion_bone_count; size_t total_bone_count; @@ -1697,19 +1698,19 @@ static void mot_parent_get_key_set_count_by_bone_database_bones(mot_parent* a1, size_t chain_pos; aft_bone_database_bones_calculate_count(bones, &object_bone_count, &motion_bone_count, &total_bone_count, &ik_bone_count, &chain_pos); - mot_parent_get_key_set_count(a1, motion_bone_count, ik_bone_count); + mot_key_data_get_key_set_count(a1, motion_bone_count, ik_bone_count); } -static void mot_parent_reserve_key_sets_by_skeleton_type(mot_parent* a1, +static void mot_key_data_reserve_key_sets_by_skeleton_type(mot_key_data* a1, aft_bone_database_skeleton_type type) { - mot_parent_get_key_set_count_by_bone_database_bones(a1, aft_bone_database_get_bones_by_type(type)); - mot_parent_reserve_key_sets(a1); + mot_key_data_get_key_set_count_by_bone_database_bones(a1, aft_bone_database_get_bones_by_type(type)); + mot_key_data_reserve_key_sets(a1); a1->skeleton_type = type; } static void mot_blend_reserve_key_sets(mot_blend* blend, aft_bone_database_skeleton_type type, bool(*a3)(motion_bone_index), size_t motion_bone_count) { - mot_parent_reserve_key_sets_by_skeleton_type(&blend->field_38, type); + mot_key_data_reserve_key_sets_by_skeleton_type(&blend->mot_key_data, type); sub_140413350(&blend->field_0, a3, motion_bone_count); } @@ -1770,7 +1771,7 @@ static void sub_140506C20(struc_523* a1) { a1->field_58.size = 0; while (v3 != a1->field_58.head) { list_ptr_void_node* v4 = v3->next; - j_free_2(v3); + operator_delete(v3); v3 = v4; } a1->field_68 = 0; @@ -1889,15 +1890,15 @@ static int32_t* sub_140507180(int32_t* a1) { return a1; } -static void sub_140506440(struc_268* a1) { +static void sub_140506440(rob_chara_adjust* a1) { a1->motion_id = -1; a1->prev_motion_id = -1; - a1->field_8.frame = 0.0f; - a1->field_8.prev_frame = 0.0f; - a1->field_8.last_frame = 0.0f; - a1->field_14.frame = 0.0f; - a1->field_14.field_4 = 0.0f; - a1->field_14.field_8 = -1.0f; + a1->frame_data.frame = 0.0f; + a1->frame_data.prev_frame = 0.0f; + a1->frame_data.last_set_frame = 0.0f; + a1->step_data.frame = 0.0f; + a1->step_data.field_4 = 0.0f; + a1->step_data.field_8 = -1.0f; a1->step = -1.0f; a1->field_24 = 0; a1->field_28 = 0; @@ -1943,120 +1944,120 @@ static void sub_140506440(struc_268* a1) { a1->field_3B0.field_1BC = aft_object_info_null; a1->field_3B0.field_1C0 = 0; - struc_269* v5 = a1->field_578; - struc_269* v6 = a1->field_B28; + rob_chara_data_parts_adjust* parts_adjust = a1->parts_adjust; + rob_chara_data_parts_adjust* parts_adjust_prev = a1->parts_adjust_prev; for (int32_t i = 0; i < 13; i++) { - v5->field_0 = 0; - v5->field_4 = 0; - v5->field_8 = 0; - v5->field_C = vec3_null; - v5->force = 1.0f; - v5->field_1C = 1.0f; - v5->field_20 = -1; - v5->field_24 = 0; - v5->field_28 = 0.0f; - v5->field_2C = 6; - v5->field_30 = 0; - v5->field_34 = 0; - v5->field_38 = vec3_null; - v5->field_44 = vec3_null; - v5->field_50 = vec3_null; - v5->field_5C = 1.0f; - v5->field_60 = 0.0f; - v5->field_64 = 1.0f; - v5->field_68 = 1.0f; - v5->field_6C = 0.0f; - v6->field_0 = 0; - v6->field_4 = 0; - v6->field_8 = 0; - v6->field_C = vec3_null; - v6->force = 1.0f; - v6->field_1C = 1.0f; - v6->field_20 = -1; - v6->field_24 = 0; - v6->field_28 = 0.0f; - v6->field_2C = 6; - v6->field_30 = 0; - v6->field_34 = 0; - v6->field_38 = vec3_null; - v6->field_44 = vec3_null; - v6->field_50 = vec3_null; - v6->field_5C = 1.0f; - v6->field_60 = 0.0f; - v6->field_64 = 1.0f; - v6->field_68 = 1.0f; - v6->field_6C = 0.0f; - v5++; - v6++; + parts_adjust->enable = false; + parts_adjust->frame = 0.0f; + parts_adjust->transition_frame = 0.0f; + parts_adjust->curr_external_force = vec3_null; + parts_adjust->curr_force = 1.0f; + parts_adjust->curr_strength = 1.0f; + parts_adjust->motion_id = -1; + parts_adjust->set_frame = 0; + parts_adjust->force_duration = 0.0f; + parts_adjust->type = 6; + parts_adjust->cycle_type = 0; + parts_adjust->ignore_gravity = false; + parts_adjust->external_force_min = vec3_null; + parts_adjust->external_force_strength = vec3_null; + parts_adjust->external_force = vec3_null; + parts_adjust->cycle = 1.0f; + parts_adjust->phase = 0.0f; + parts_adjust->force = 1.0f; + parts_adjust->strength = 1.0f; + parts_adjust->strength_transition = 0.0f; + parts_adjust_prev->enable = false; + parts_adjust_prev->frame = 0.0f; + parts_adjust_prev->transition_frame = 0.0f; + parts_adjust_prev->curr_external_force = vec3_null; + parts_adjust_prev->curr_force = 1.0f; + parts_adjust_prev->curr_strength = 1.0f; + parts_adjust_prev->motion_id = -1; + parts_adjust_prev->set_frame = 0; + parts_adjust_prev->force_duration = 0.0f; + parts_adjust_prev->type = 6; + parts_adjust_prev->cycle_type = 0; + parts_adjust_prev->ignore_gravity = false; + parts_adjust_prev->external_force_min = vec3_null; + parts_adjust_prev->external_force_strength = vec3_null; + parts_adjust_prev->external_force = vec3_null; + parts_adjust_prev->cycle = 1.0f; + parts_adjust_prev->phase = 0.0f; + parts_adjust_prev->force = 1.0f; + parts_adjust_prev->strength = 1.0f; + parts_adjust_prev->strength_transition = 0.0f; + parts_adjust++; + parts_adjust_prev++; } - struc_269* v7 = a1->field_10D8; + rob_chara_data_parts_adjust* v7 = a1->field_10D8; struc_222* v8 = a1->field_12C8; - struc_229* v9 = a1->field_11B8; - struc_229* v10 = a1->field_1240; + rob_chara_data_hand_adjust* hand_adjust = a1->hand_adjust; + rob_chara_data_hand_adjust* hand_adjust_prev = a1->hand_adjust_prev; for (int32_t i = 0; i < 2; i++) { - v7->field_0 = 0; - v7->field_4 = 0; - v7->field_8 = 0; - v7->field_C = vec3_null; + v7->enable = false; + v7->frame = 0.0f; + v7->transition_frame = 0.0f; + v7->curr_external_force = vec3_null; + v7->curr_force = 1.0f; + v7->curr_strength = 1.0f; + v7->motion_id = -1; + v7->set_frame = 0; + v7->force_duration = 0.0f; + v7->type = 6; + v7->cycle_type = 0; + v7->ignore_gravity = false; + v7->external_force_min = vec3_null; + v7->external_force_strength = vec3_null; + v7->external_force = vec3_null; + v7->cycle = 1.0f; + v7->phase = 0.0f; v7->force = 1.0f; - v7->field_1C = 1.0f; - v7->field_20 = -1; - v7->field_24 = 0; - v7->field_28 = 0.0f; - v7->field_2C = 6; - v7->field_30 = 0; - v7->field_34 = 0; - v7->field_38 = vec3_null; - v7->field_44 = vec3_null; - v7->field_50 = vec3_null; - v7->field_5C = 1.0f; - v7->field_60 = 0.0f; - v7->field_64 = 1.0f; - v7->field_68 = 1.0f; - v7->field_6C = 0.0f; + v7->strength = 1.0f; + v7->strength_transition = 0.0f; v8->field_0 = 0; v8->field_4 = 0.0f; v8->field_8 = 0.0f; v8->field_C = 0.0f; - v8->field_10 = 0.0f; - v8->field_14 = 0.0f; - v9->field_0 = 0; - v9->field_2 = 0; - v9->field_4 = -1; - v9->field_8 = 1.0f; - v9->field_C = 1.0f; - v9->field_10 = 0.0f; - v9->field_14 = 0.0f; - v9->field_18 = 1.0f; - v9->field_1C = 1.0f; - v9->field_20 = 0; - v9->field_21 = 0; - v9->field_22 = 0; - v9->field_23 = 0; - v9->field_24 = vec3_null; - v9->field_30 = vec3_null; - v9->field_3C = 0; - v10->field_0 = 0; - v10->field_2 = 0; - v10->field_4 = -1; - v10->field_8 = 1.0f; - v10->field_C = 1.0f; - v10->field_10 = 0.0f; - v10->field_14 = 0.0f; - v10->field_18 = 1.0f; - v10->field_1C = 1.0f; - v10->field_20 = 0; - v10->field_21 = 0; - v10->field_22 = 0; - v10->field_23 = 0; - v10->field_24 = vec3_null; - v10->field_30 = vec3_null; - v10->field_3C = 0; + v8->duration = 0.0f; + v8->frame = 0.0f; + hand_adjust->field_0 = 0; + hand_adjust->field_2 = 0; + hand_adjust->field_4 = -1; + hand_adjust->field_8 = 1.0f; + hand_adjust->field_C = 1.0f; + hand_adjust->field_10 = 0.0f; + hand_adjust->field_14 = 0.0f; + hand_adjust->field_18 = 1.0f; + hand_adjust->field_1C = 1.0f; + hand_adjust->field_20 = 0; + hand_adjust->field_21 = 0; + hand_adjust->field_22 = 0; + hand_adjust->field_23 = 0; + hand_adjust->field_24 = vec3_null; + hand_adjust->field_30 = vec3_null; + hand_adjust->field_3C = 0; + hand_adjust_prev->field_0 = 0; + hand_adjust_prev->field_2 = 0; + hand_adjust_prev->field_4 = -1; + hand_adjust_prev->field_8 = 1.0f; + hand_adjust_prev->field_C = 1.0f; + hand_adjust_prev->field_10 = 0.0f; + hand_adjust_prev->field_14 = 0.0f; + hand_adjust_prev->field_18 = 1.0f; + hand_adjust_prev->field_1C = 1.0f; + hand_adjust_prev->field_20 = 0; + hand_adjust_prev->field_21 = 0; + hand_adjust_prev->field_22 = 0; + hand_adjust_prev->field_23 = 0; + hand_adjust_prev->field_24 = vec3_null; + hand_adjust_prev->field_30 = vec3_null; + hand_adjust_prev->field_3C = 0; v7++; v8++; - v9++; - v10++; + hand_adjust++; + hand_adjust_prev++; } } @@ -2082,10 +2083,10 @@ static void sub_140539750(struc_223* a1) { a1->field_7A8 = -1; } -static void sub_140505EA0(rob_chara_data* a1) { - void(*sub_140506A20)(struc_399 * a1) - = (void(*)(struc_399*))0x0000000140506A20; - void(*sub_140506AE0)(rob_chara_adjust_data * a1) +static void rob_chara_data_reset(rob_chara_data* a1) { + void(*rob_chara_data_miku_rot_reset)(rob_chara_data_miku_rot * a1) + = (void(*)(rob_chara_data_miku_rot*))0x0000000140506A20; + void(*rob_chara_data_adjuct_reset)(rob_chara_adjust_data * a1) = (void(*)(rob_chara_adjust_data*))0x0000000140506AE0; void(*sub_140505FB0)(struc_209 * a1) = (void(*)(struc_209*))0x0000000140505FB0; @@ -2093,10 +2094,10 @@ static void sub_140505EA0(rob_chara_data* a1) { a1->field_0 = 0; sub_140505C90(&a1->field_8); rob_sub_action_init_sub(&a1->rob_sub_action); - sub_140506440(&a1->field_290); + sub_140506440(&a1->adjust); sub_140539750(&a1->field_1588); - sub_140506A20(&a1->field_1D38); - sub_140506AE0(&a1->adjust_data); + rob_chara_data_miku_rot_reset(&a1->miku_rot); + rob_chara_data_adjuct_reset(&a1->adjust_data); sub_140505FB0(&a1->field_1E68); a1->field_3D90 = 0.0f; a1->field_3D94 = 0; @@ -2144,8 +2145,8 @@ static void sub_140413470(struc_308* a1) { a1->mat = mat4u_identity; a1->field_4C = mat4u_identity; a1->field_8C = false; - a1->eyes_adjust = 0; - a1->field_B8 = 0; + a1->eyes_adjust = 0.0f; + a1->prev_eyes_adjust = 0.0f; a1->field_90 = vec3_identity; a1->field_9C = vec3_identity; a1->field_A8 = vec3_identity; @@ -2158,34 +2159,34 @@ static void sub_140413470(struc_308* a1) { static void motion_blend_mot_reset(motion_blend_mot* a1) { bone_data_parent_reset(&a1->bone_data); - a1->mot_data.key_sets_ready = 0; - a1->mot_data.skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; - a1->mot_data.frame = -1.0f; - a1->mot_data.key_set_count = 0; - a1->mot_data.mot_data = 0; - a1->mot_data.skeleton_select = 0; - a1->mot_data.field_68.field_0 = 0; - a1->mot_data.field_68.field_4 = 0.0f; - a1->mot_data.key_set.end = a1->mot_data.key_set.begin; - a1->mot_data.key_set_data.end = a1->mot_data.key_set_data.begin; - a1->mot_data.motion_id = -1; - a1->field_4A8.field_0.frame = 0.0f; - a1->field_4A8.field_0.field_8 = 1.0f; - a1->field_4A8.field_0.field_4 = 1.0f; - a1->field_4A8.field_0.field_C = 0.0f; - a1->field_4A8.field_0.field_10 = -1.0f; - a1->field_4A8.field_0.field_14 = -1.0f; - a1->field_4A8.field_0.field_18 = -1; - a1->field_4A8.field_0.field_1C = -1; - a1->field_4A8.field_0.field_20 = 0.0f; - a1->field_4A8.field_0.field_24 = -1.0f; - a1->field_4A8.field_0.field_28 = 0; - a1->field_4A8.field_0.field_2C = -1; - a1->field_4A8.field_30 = 0; - a1->field_4A8.field_34 = 0; - a1->field_4A8.field_38 = 0.0f; - a1->field_4A8.field_40 = 0; - a1->field_4A8.field_48 = 0; + a1->mot_key_data.key_sets_ready = 0; + a1->mot_key_data.skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; + a1->mot_key_data.frame = -1.0f; + a1->mot_key_data.key_set_count = 0; + a1->mot_key_data.mot_data = 0; + a1->mot_key_data.skeleton_select = 0; + a1->mot_key_data.field_68.field_0 = 0; + a1->mot_key_data.field_68.field_4 = 0.0f; + a1->mot_key_data.key_set.end = a1->mot_key_data.key_set.begin; + a1->mot_key_data.key_set_data.end = a1->mot_key_data.key_set_data.begin; + a1->mot_key_data.motion_id = -1; + a1->mot_play_data.frame_data.frame = 0.0f; + a1->mot_play_data.frame_data.field_8 = 1.0f; + a1->mot_play_data.frame_data.field_4 = 1.0f; + a1->mot_play_data.frame_data.field_C = 0.0f; + a1->mot_play_data.frame_data.field_10 = -1.0f; + a1->mot_play_data.frame_data.field_14 = -1.0f; + a1->mot_play_data.frame_data.field_18 = -1; + a1->mot_play_data.frame_data.field_1C = -1; + a1->mot_play_data.frame_data.field_20 = 0.0f; + a1->mot_play_data.frame_data.field_24 = -1.0f; + a1->mot_play_data.frame_data.field_28 = 0; + a1->mot_play_data.frame_data.field_2C = -1; + a1->mot_play_data.field_30 = 0; + a1->mot_play_data.field_34 = 0; + a1->mot_play_data.field_38 = 0.0f; + a1->mot_play_data.field_40 = 0; + a1->mot_play_data.field_48 = 0; sub_140413470(&a1->field_4F8); a1->field_0.bone_check_func = 0; sub_1404119A0(&a1->field_0.field_8); @@ -2193,39 +2194,39 @@ static void motion_blend_mot_reset(motion_blend_mot* a1) { a1->cross.base.__vftable->field_8(&a1->cross.base); a1->freeze.base.__vftable->field_8(&a1->freeze.base); a1->combine.base.base.__vftable->field_8(&a1->combine.base.base); - a1->field_5D0 = 0; + a1->blend = 0; } static void mot_blend_reset(mot_blend* a1) { - a1->field_38.key_sets_ready = 0; - a1->field_38.skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; - a1->field_38.frame = -1.0f; - a1->field_38.key_set_count = 0; - a1->field_38.mot_data = 0; - a1->field_38.skeleton_select = 0; - a1->field_38.field_68.field_0 = 0; - a1->field_38.field_68.field_4 = 0.0f; - a1->field_38.key_set.end = a1->field_38.key_set.begin; - a1->field_38.key_set_data.end = a1->field_38.key_set_data.begin; - a1->field_38.motion_id = -1; - a1->field_A8.frame = 0.0f; - a1->field_A8.field_8 = 1.0f; - a1->field_A8.field_4 = 1.0f; - a1->field_A8.field_C = 0.0f; - a1->field_A8.field_10 = -1.0f; - a1->field_A8.field_14 = -1.0f; - a1->field_A8.field_18 = -1; - a1->field_A8.field_1C = -1; - a1->field_A8.field_20 = 0.0f; - a1->field_A8.field_24 = -1.0f; - a1->field_A8.field_28 = 0; - a1->field_A8.field_2C = -1; - a1->field_D8 = 0; - a1->field_DC = 0; - a1->field_E0 = 0; - a1->field_E8 = 0; - a1->field_F0 = 0; - a1->field_F8.__vftable->field_8(&a1->field_F8); + a1->mot_key_data.key_sets_ready = 0; + a1->mot_key_data.skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; + a1->mot_key_data.frame = -1.0f; + a1->mot_key_data.key_set_count = 0; + a1->mot_key_data.mot_data = 0; + a1->mot_key_data.skeleton_select = 0; + a1->mot_key_data.field_68.field_0 = 0; + a1->mot_key_data.field_68.field_4 = 0.0f; + a1->mot_key_data.key_set.end = a1->mot_key_data.key_set.begin; + a1->mot_key_data.key_set_data.end = a1->mot_key_data.key_set_data.begin; + a1->mot_key_data.motion_id = -1; + a1->mot_play_data.frame_data.frame = 0.0f; + a1->mot_play_data.frame_data.field_8 = 1.0f; + a1->mot_play_data.frame_data.field_4 = 1.0f; + a1->mot_play_data.frame_data.field_C = 0.0f; + a1->mot_play_data.frame_data.field_10 = -1.0f; + a1->mot_play_data.frame_data.field_14 = -1.0f; + a1->mot_play_data.frame_data.field_18 = -1; + a1->mot_play_data.frame_data.field_1C = -1; + a1->mot_play_data.frame_data.field_20 = 0.0f; + a1->mot_play_data.frame_data.field_24 = -1.0f; + a1->mot_play_data.frame_data.field_28 = 0; + a1->mot_play_data.frame_data.field_2C = -1; + a1->mot_play_data.field_30 = 0; + a1->mot_play_data.field_34 = 0; + a1->mot_play_data.field_38 = 0; + a1->mot_play_data.field_40 = 0; + a1->mot_play_data.field_48 = 0; + a1->blend.base.__vftable->field_8(&a1->blend.base); a1->field_0.bone_check_func = 0; sub_1404119A0(&a1->field_0.field_8); a1->field_0.motion_bone_count = 0; @@ -2549,7 +2550,7 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, } } -static void mot_parent_interpolate(mot_parent* a1, float_t frame, +static void mot_key_data_interpolate(mot_key_data* a1, float_t frame, uint32_t key_set_offset, uint32_t key_set_count) { mot_key_frame_interpolate(&a1->mot, frame, &a1->key_set_data.begin[key_set_offset], @@ -2588,9 +2589,9 @@ static void sub_140415430(motion_blend_mot* a1) { } static void motion_blend_mot_interpolate(motion_blend_mot* a1) { - vec3* keyframe_data = (vec3*)a1->mot_data.key_set_data.begin; + vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.begin; bool reverse = motion_blend_mot_interpolate_get_reverse(&a1->field_4F8.field_0); - float_t frame = a1->field_4A8.field_0.frame; + float_t frame = a1->mot_play_data.frame_data.frame; aft_bone_database_skeleton_type skeleton_type = a1->bone_data.rob_bone_data->base_skeleton_type; bone_data* bones_data = a1->bone_data.bones.begin; @@ -2601,7 +2602,7 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { data = &bones_data[data->mirror]; if (get_data && frame != data->frame) { - mot_parent_interpolate(&a1->mot_data, frame, data->key_set_offset, data->key_set_count); + mot_key_data_interpolate(&a1->mot_key_data, frame, data->key_set_offset, data->key_set_count); data->frame = frame; } @@ -2609,12 +2610,12 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { } uint32_t bone_key_set_count = a1->bone_data.bone_key_set_count; - if (frame != a1->mot_data.frame) { - mot_parent_interpolate(&a1->mot_data, frame, bone_key_set_count, a1->bone_data.global_key_set_count); - a1->mot_data.frame = frame; + if (frame != a1->mot_key_data.frame) { + mot_key_data_interpolate(&a1->mot_key_data, frame, bone_key_set_count, a1->bone_data.global_key_set_count); + a1->mot_key_data.frame = frame; } - keyframe_data = (vec3*)&a1->mot_data.key_set_data.begin[bone_key_set_count]; + keyframe_data = (vec3*)&a1->mot_key_data.key_set_data.begin[bone_key_set_count]; vec3 global_trans = keyframe_data[0]; vec3 global_rotation = keyframe_data[1]; if (reverse) @@ -2627,17 +2628,17 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { static void mot_blend_interpolate(mot_blend* a1, vector_old_bone_data* bones, vector_old_uint16_t* bone_indices, aft_bone_database_skeleton_type skeleton_type) { - if (!a1->field_38.key_sets_ready || !a1->field_38.mot_data || a1->field_30) + if (!a1->mot_key_data.key_sets_ready || !a1->mot_key_data.mot_data || a1->field_30) return; - float_t frame = a1->field_A8.frame; - vec3* keyframe_data = (vec3*)a1->field_38.key_set_data.begin; + float_t frame = a1->mot_play_data.frame_data.frame; + vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.begin; bone_data* bones_data = bones->begin; for (uint16_t* i = bone_indices->begin; i != bone_indices->end; i++) { bone_data* data = &bones_data[*i]; bool get_data = sub_140410250(&a1->field_0.field_8, data->motion_bone_index); if (get_data) { - mot_parent_interpolate(&a1->field_38, frame, data->key_set_offset, data->key_set_count); + mot_key_data_interpolate(&a1->mot_key_data, frame, data->key_set_offset, data->key_set_count); data->frame = frame; } keyframe_data = bone_data_set_key_data(data, keyframe_data, skeleton_type, get_data, 0); @@ -2748,16 +2749,16 @@ static void sub_140413EA0(struc_240* a1, void(*a2)(struc_313*)) { } static void sub_14041AD90(rob_chara_bone_data* a1) { - if (a1->mouth.field_38.key_sets_ready && a1->mouth.field_38.mot_data && !a1->mouth.field_30) + if (a1->mouth.mot_key_data.key_sets_ready && a1->mouth.mot_key_data.mot_data && !a1->mouth.field_30) sub_140413EA0(&a1->face.field_0, sub_14041B800); - if (a1->eyelid.field_38.key_sets_ready && a1->eyelid.field_38.mot_data && !a1->eyelid.field_30) + if (a1->eyelid.mot_key_data.key_sets_ready && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) sub_140413EA0(&a1->face.field_0, sub_14041B1C0); - else if (a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30 || a1->field_758) + else if (a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30 || a1->field_758) sub_140413EA0(&a1->face.field_0, sub_14041B440); } static void sub_14041AD50(rob_chara_bone_data* a1) { - if (a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30 || a1->field_758) + if (a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30 || a1->field_758) sub_140413EA0(&a1->eyelid.field_0, sub_14041B440); } @@ -2770,7 +2771,7 @@ static void sub_140412F20(mot_blend* a1, vector_old_bone_data* a2) { } } -static mot_data* mot_parent_load_file(mot_parent* a1, int32_t motion_id) { +static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id) { mot_data* (*sub_140403C90)(int32_t a1) = (mot_data * (*)(int32_t))0x0000000140403C90; bool(*mot_load_file)(mot * a1, mot_key_set_file * a2) @@ -2798,8 +2799,8 @@ static mot_data* mot_parent_load_file(mot_parent* a1, int32_t motion_id) { } static void sub_140414ED0(mot_blend* a1, int32_t motion_id) { - mot_parent_load_file(&a1->field_38, motion_id); - a1->field_F8.__vftable->field_8(&a1->field_F8); + mot_key_data_load_file(&a1->mot_key_data, motion_id); + a1->blend.base.__vftable->field_8(&a1->blend.base); } static void sub_14041BE50(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { @@ -2814,29 +2815,37 @@ static void sub_14041ABA0(rob_chara_bone_data* a1) { list_ptr_motion_blend_mot_node* v1 = a1->motion_loaded.head; list_ptr_motion_blend_mot_node* v3 = v1->next; while (v3 != v1) { - if (a1->face.field_38.key_sets_ready && a1->face.field_38.mot_data && !a1->face.field_30) { - if (!a1->field_758 || a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30) + if (a1->face.mot_key_data.key_sets_ready + && a1->face.mot_key_data.mot_data && !a1->face.field_30) { + if (!a1->field_758 || a1->eye.mot_key_data.key_sets_ready + && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B4E0); else sub_140413EA0(&v3->value->field_0, sub_14041B580); } else { - if (a1->mouth.field_38.key_sets_ready && a1->mouth.field_38.mot_data && !a1->mouth.field_30) + if (a1->mouth.mot_key_data.key_sets_ready + && a1->mouth.mot_key_data.mot_data && !a1->mouth.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B800); - if (a1->eyelid.field_38.key_sets_ready && a1->eyelid.field_38.mot_data && !a1->eyelid.field_30) { + if (a1->eyelid.mot_key_data.key_sets_ready + && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) { if (!a1->field_758 - || a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30) + || a1->eye.mot_key_data.key_sets_ready + && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B1C0); else sub_140413EA0(&v3->value->field_0, sub_14041B300); } - else if (a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30) + else if (a1->eye.mot_key_data.key_sets_ready + && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B440); } - if (a1->hand_l.field_38.key_sets_ready && a1->hand_l.field_38.mot_data && !a1->hand_l.field_30) + if (a1->hand_l.mot_key_data.key_sets_ready + && a1->hand_l.mot_key_data.mot_data && !a1->hand_l.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B6B0); - if (a1->hand_r.field_38.key_sets_ready && a1->hand_r.field_38.mot_data && !a1->hand_r.field_30) + if (a1->hand_r.mot_key_data.key_sets_ready + && a1->hand_r.mot_key_data.mot_data && !a1->hand_r.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B750); v3 = v3->next; } @@ -2857,7 +2866,7 @@ static bool sub_1404137A0(struc_308* a1) { } static void sub_140415A10(motion_blend_mot* a1) { - motion_blend* v1 = a1->field_5D0; + motion_blend* v1 = a1->blend; if (!v1) return; @@ -2870,36 +2879,33 @@ static void sub_140415A10(motion_blend_mot* a1) { v7.field_0 = !sub_140413630(&a1->field_4F8); if (!a1->field_4F8.field_BC) v7.field_2 = !sub_140413790(&a1->field_4F8); - - v7.field_1 = sub_1404137A0(&a1->field_4F8) ? 1 : 0; - v7.field_8 = a1->mot_data.frame; - v7.field_C = a1->field_4F8.eyes_adjust; - v7.field_10 = a1->field_4F8.field_B8; - v1->__vftable->field_18(v1, &v7.field_0); + v7.field_1 = sub_1404137A0(&a1->field_4F8); + v7.frame = a1->mot_key_data.frame; + v7.eyes_adjust = a1->field_4F8.eyes_adjust; + v7.prev_eyes_adjust = a1->field_4F8.prev_eyes_adjust; + v1->__vftable->field_18(v1, &v7); } static bool sub_140410A20(motion_blend_mot* a1) { - motion_blend* v1 = a1->field_5D0; + motion_blend* v1 = a1->blend; return !v1 || !v1->field_9; } static void sub_140415B30(mot_blend* a1) { - struc_400 v3; // [rsp+20h] [rbp-28h] BYREF - - motion_blend* v1 = &a1->field_F8; - v3.field_0 = 0; - v3.field_1; - v3.field_2; - v3.field_3; - v3.field_4 = 0; - v3.field_8 = 0.0f; - v3.field_C = 0.0f; - v3.field_10 = 0.0f; - a1->field_F8.__vftable->field_18(&a1->field_F8, &v3.field_0); + struc_400 v3; + v3.field_0 = false; + v3.field_1 = false; + v3.field_2 = false; + v3.field_3 = false; + v3.field_4 = false; + v3.frame = 0.0f; + v3.eyes_adjust = 0.0f; + v3.prev_eyes_adjust = 0.0f; + a1->blend.base.__vftable->field_18(&a1->blend.base, &v3); } static void sub_14041DAC0(rob_chara_bone_data* a1) { - void(*rob_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) + void(*rob_chara_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) = (void(*)(rob_chara_bone_data*, size_t))0x0000000140418E80; size_t v2 = 0; @@ -2911,7 +2917,7 @@ static void sub_14041DAC0(rob_chara_bone_data* a1) { sub_140415A10(v4->value); else { if (v3) { - rob_bone_data_motion_blend_mot_list_free(a1, v2); + rob_chara_bone_data_motion_blend_mot_list_free(a1, v2); break; } sub_140415A10(v4->value); @@ -3007,7 +3013,7 @@ static void sub_1403FBF10(motion_blend* a1, float_t a2) { } static void sub_1404148C0(motion_blend_mot* a1, float_t a2) { - motion_blend* v2 = a1->field_5D0; + motion_blend* v2 = a1->blend; if (v2) sub_1403FBF10(v2, a2); } @@ -3015,20 +3021,20 @@ static void sub_1404148C0(motion_blend_mot* a1, float_t a2) { static void sub_1404147F0(motion_blend_mot* a1, motion_blend_type type, float_t blend) { if (type == MOTION_BLEND_FREEZE) { a1->freeze.base.__vftable->field_8(&a1->freeze.base); - a1->field_5D0 = &a1->freeze.base; + a1->blend = &a1->freeze.base; sub_140412E10(a1, 0); } else if (type == MOTION_BLEND_CROSS) { a1->cross.base.__vftable->field_8(&a1->cross.base); - a1->field_5D0 = &a1->cross.base; + a1->blend = &a1->cross.base; } else if (type == MOTION_BLEND_COMBINE) { a1->combine.base.base.__vftable->field_8(&a1->combine.base.base); - a1->field_5D0 = &a1->combine.base.base; + a1->blend = &a1->combine.base.base; sub_1404148C0(a1, blend); } else - a1->field_5D0 = 0; + a1->blend = 0; } static int32_t sub_1401F0E70(aft_bone_database_skeleton_type type, char* name) { @@ -3109,7 +3115,7 @@ static void sub_140413C30(struc_308* a1) { static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, motion_blend_type a3, float_t blend) { sub_1404147F0(a1, a3, blend); - mot_data* v5 = mot_parent_load_file(&a1->mot_data, motion_id); + mot_data* v5 = mot_key_data_load_file(&a1->mot_key_data, motion_id); bone_data_parent* v6 = &a1->bone_data; if (v5) { bone_data_parent_load_bone_indices_from_mot(v6, v5); @@ -3144,36 +3150,44 @@ static void sub_14041AE40(rob_chara_bone_data* a1) { if (!v3) return; - if (a1->face.field_38.key_sets_ready && a1->face.field_38.mot_data && !a1->face.field_30) { - if (!a1->field_758 || a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30) + if (a1->face.mot_key_data.key_sets_ready + && a1->face.mot_key_data.mot_data && !a1->face.field_30) { + if (!a1->field_758 || a1->eye.mot_key_data.key_sets_ready + && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(v3, sub_14041B4E0); else sub_140413EA0(v3, sub_14041B580); } else { - if (a1->mouth.field_38.key_sets_ready && a1->mouth.field_38.mot_data && !a1->mouth.field_30) + if (a1->mouth.mot_key_data.key_sets_ready + && a1->mouth.mot_key_data.mot_data && !a1->mouth.field_30) sub_140413EA0(&v1->next->value->field_0, sub_14041B800); - else if (a1->eyelid.field_38.key_sets_ready && a1->eyelid.field_38.mot_data && !a1->eyelid.field_30) { - if (!a1->field_758 || a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30) + else if (a1->eyelid.mot_key_data.key_sets_ready + && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) { + if (!a1->field_758 || a1->eye.mot_key_data.key_sets_ready + && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(v3, sub_14041B1C0); else sub_140413EA0(v3, sub_14041B300); } - else if (a1->eye.field_38.key_sets_ready && a1->eye.field_38.mot_data && !a1->eye.field_30) + else if (a1->eye.mot_key_data.key_sets_ready + && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(v3, sub_14041B440); } - if (a1->hand_l.field_38.key_sets_ready && a1->hand_l.field_38.mot_data && !a1->hand_l.field_30) + if (a1->hand_l.mot_key_data.key_sets_ready + && a1->hand_l.mot_key_data.mot_data && !a1->hand_l.field_30) sub_140413EA0(v3, sub_14041B6B0); - if (a1->hand_r.field_38.key_sets_ready && a1->hand_r.field_38.mot_data && !a1->hand_r.field_30) + if (a1->hand_r.mot_key_data.key_sets_ready + && a1->hand_r.mot_key_data.mot_data && !a1->hand_r.field_30) sub_140413EA0(v3, sub_14041B750); } void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, int32_t motion_id, motion_blend_type motion_blend_type) { - void(*rob_bone_data_motion_blend_mot_list_init)(rob_chara_bone_data * rob_bone_data) + void(*rob_chara_bone_data_motion_blend_mot_list_init)(rob_chara_bone_data * rob_bone_data) = (void(*)(rob_chara_bone_data*))0x000000014041A9E0; - void(*rob_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) + void(*rob_chara_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) = (void(*)(rob_chara_bone_data*, size_t))0x0000000140418E80; list_ptr_motion_blend_mot_node* (*sub_140415D30)(list_ptr_motion_blend_mot * a1, list_ptr_motion_blend_mot_node * a2, list_ptr_motion_blend_mot_node * a3, motion_blend_mot * *a4) @@ -3189,7 +3203,7 @@ void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, if (!rob_bone_data->motion_loaded.size) return; if (motion_blend_type == 1) { - rob_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); + rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); sub_14041AE40(rob_bone_data); list_ptr_motion_blend_mot_node*v15 = rob_bone_data->motion_loaded.head; motion_blend_mot_load_file(v15->next->value, motion_id, MOTION_BLEND_FREEZE, 1.0f); @@ -3200,15 +3214,15 @@ void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, if (motion_blend_type != MOTION_BLEND_CROSS) { if (motion_blend_type == MOTION_BLEND_COMBINE) motion_blend_type = MOTION_BLEND; - rob_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); + rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); motion_blend_mot_load_file(rob_bone_data->motion_loaded.head->next->value, motion_id, motion_blend_type, 1.0f); return; } - rob_bone_data_motion_blend_mot_list_free(rob_bone_data, 2); + rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 2); if (rob_bone_data->motion_indices.size) { motion_blend_mot* v6 = rob_bone_data->motion_loaded.head->next->value; - rob_bone_data_motion_blend_mot_list_init(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); sub_140412BB0(rob_bone_data->motion_loaded.head->next->value, &v6->bone_data.bones); motion_blend_mot_load_file(rob_bone_data->motion_loaded.head->next->value, motion_id, MOTION_BLEND_CROSS, 1.0f); return; @@ -3217,7 +3231,7 @@ void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, list_ptr_motion_blend_mot* v7 = &rob_bone_data->motion_loaded; motion_blend_mot* v16 = sub_140411A70(rob_bone_data->motion_loaded.head->next->value, rob_bone_data); if (!v16) { - rob_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); + rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); sub_14041AE40(rob_bone_data); list_ptr_motion_blend_mot_node* v15 = v7->head; motion_blend_mot_load_file(v15->next->value, motion_id, MOTION_BLEND_FREEZE, 1.0f); @@ -3269,7 +3283,7 @@ static void sub_14041BD20(rob_chara_bone_data* rob_bone_data, int32_t motion_id) sub_140414ED0(v3, motion_id); } -static void sub_140414BC0(struc_346* a1, float_t frame) { +static void sub_140414BC0(mot_play_frame_data* a1, float_t frame) { float_t v2 = a1->field_14; a1->frame = frame; a1->field_28 = 0; @@ -3278,7 +3292,7 @@ static void sub_140414BC0(struc_346* a1, float_t frame) { } static void rob_chara_bone_data_set_frame(rob_chara_bone_data* a1, float_t frame) { - sub_140414BC0(&a1->motion_loaded.head->next->value->field_4A8.field_0, frame); + sub_140414BC0(&a1->motion_loaded.head->next->value->mot_play_data.frame_data, frame); } static void sub_14041C680(rob_chara_bone_data* a1, char a2) { @@ -3315,7 +3329,7 @@ static void sub_14041BC40(rob_chara_bone_data* a1, char a2) { } static void sub_140414F00(struc_308* a1, float_t a2) { - a1->field_B8 = a1->eyes_adjust; + a1->prev_eyes_adjust = a1->eyes_adjust; a1->eyes_adjust = a2; } @@ -3324,7 +3338,7 @@ static void sub_14041D270(rob_chara_bone_data* a1, float_t a2) { } static void sub_14041D2A0(rob_chara_bone_data* a1, float_t a2) { - a1->motion_loaded.head->next->value->field_4F8.field_B8 = a2; + a1->motion_loaded.head->next->value->field_4F8.prev_eyes_adjust = a2; } static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y) { @@ -3349,7 +3363,7 @@ static void sub_1403FBED0(motion_blend* a1, float_t a2, float_t a3, float_t a4) } static void sub_140414C60(motion_blend_mot* a1, float_t a2, float_t a3, float_t a4) { - motion_blend* v4 = a1->field_5D0; + motion_blend* v4 = a1->blend; if (v4) sub_1403FBED0(v4, a2, a3, a4); } @@ -3359,7 +3373,7 @@ static void sub_14041BF80(rob_chara_bone_data* a1, float_t a2, float_t a3, float } static void sub_14041D310(rob_chara_bone_data* a1) { - motion_blend* v1 = a1->motion_loaded.head->next->value->field_5D0; + motion_blend* v1 = a1->motion_loaded.head->next->value->blend; if (v1) v1->__vftable->field_10(v1); } @@ -3391,7 +3405,7 @@ int32_t rob_cmn_mottbl_get_motion_index(rob_chara* a1, int32_t a2) { struc_403* rob_cmn_mottbl_data = *rob_cmn_mottbl_data_ptr; if (a2 == 224) - return a1->data.field_290.motion_id; + return a1->data.adjust.motion_id; if (a2 >= 214 && a2 <= 223) return ((uint32_t*)&a1->data_prev.field_1E68.field_1C88)[a2]; if (a2 >= 226 && a2 <= 235) @@ -3629,7 +3643,7 @@ static void sub_140517120(rob_chara* a1, uint32_t a2, bool disp) { void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { float_t(*sub_140228BD0)(vec3 * a1, float_t a2) = (float_t(*)(vec3*, float_t))0x0000000140228BD0; - void(*sub_140505EA0)(rob_chara_data * a1) + void(*rob_chara_data_reset)(rob_chara_data * a1) = (void(*)(rob_chara_data*))0x0000000140505EA0; struc_243* (*sub_140510550)(int32_t a1) = (struc_243 * (*)(int32_t))0x0000000140510550; struc_241* (*sub_1405106E0)(int32_t a1) = (struc_241 * (*)(int32_t))0x00000001405106E0; @@ -3640,8 +3654,8 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { rob_chara_bone_data_reset(a1->bone_data); rob_chara_bone_data_init_data(a1->bone_data, AFT_BONE_DATABASE_SKELETON_COMMON, a1->chara_init_data->skeleton_type); - sub_140505EA0(&a1->data); - sub_140505EA0(&a1->data_prev); + rob_chara_data_reset(&a1->data); + rob_chara_data_reset(&a1->data_prev); rob_chara_item_equip_get_parent_bone_nodes(a1->item_equip, rob_chara_bone_data_get_node(a1->bone_data, 0)); a1->field_4 = a2->index; @@ -3656,11 +3670,11 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { } rob_chara_data* v3 = &a1->data; - v3->field_1D38.field_0 = a2->field_14; - v3->field_1D38.field_6 = a2->field_14; - v3->field_1D38.field_18 = v8; - v3->field_1D38.field_24 = v8; - v3->field_1D38.field_48 = v8; + v3->miku_rot.field_0 = a2->field_14; + v3->miku_rot.field_6 = a2->field_14; + v3->miku_rot.field_18 = v8; + v3->miku_rot.field_24 = v8; + v3->miku_rot.field_48 = v8; v3->adjust_data.scale = chara_size_table_get_value(a1->pv_data.chara_size_index); v3->adjust_data.height_adjust = a1->pv_data.height_adjust; v3->adjust_data.pos_adjust_y = chara_pos_adjust_y_table_get_value(a1->pv_data.chara_size_index); @@ -3673,11 +3687,11 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { sub_14041D560(a1->bone_data, 1, 0); rob_chara_bone_data_get_ik_scale(a1->bone_data); float_t ratio0 = rob_chara_bone_data_get_ik_scale_ratio0(a1->bone_data); - v3->field_290.field_138 = ratio0; - v3->field_290.field_13C = ratio0; - v3->field_290.field_140 = 0; - v3->field_290.field_144 = 0; - v3->field_290.field_148 = 0; + v3->adjust.field_138 = ratio0; + v3->adjust.field_13C = ratio0; + v3->adjust.field_140 = 0; + v3->adjust.field_144 = 0; + v3->adjust.field_148 = 0; rob_chara_load_default_motion(a1); v3->field_8.field_0 = 0; v3->field_8.field_4.field_0 = 1; @@ -3692,8 +3706,8 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { sub_140513C60(a1->item_equip, 10, false); sub_140513C60(a1->item_equip, 11, false); aft_object_info v17 = sub_1405104C0(a1, 0); - v3->field_290.field_150.field_1B0 = v17; - v3->field_290.field_3B0.field_1B0 = v17; + v3->adjust.field_150.field_1B0 = v17; + v3->adjust.field_3B0.field_1B0 = v17; sub_140517120(a1, 0x1F, true); a1->field_20 = 0; } @@ -3723,55 +3737,43 @@ static void rob_osage_node_data_init(rob_osage_node_data *node_data) { } static void rob_osage_node_init(rob_osage_node* node) { - void (*sub_14021DCC0)(vector_old_struc_331 * vec, size_t size) - = (void (*)(vector_old_struc_331*, size_t))0x000000014021DCC0; + void (*sub_14021DCC0)(vector_old_opd_vec3_data * vec, size_t size) + = (void (*)(vector_old_opd_vec3_data*, size_t))0x000000014021DCC0; node->length = 0.0f; node->trans = vec3_null; node->trans_orig = vec3_null; node->trans_diff = vec3_null; node->field_28 = vec3_null; node->child_length = 0.0f; - node->bone_node = 0; + node->bone_node_ptr = 0; node->bone_node_mat = 0; node->sibling_node = 0; node->distance = 0.0f; node->field_94 = vec3_null; - node->field_A0.trans = vec3_null; - node->field_A0.trans_diff = vec3_null; - node->field_A0.rotation = vec3_null; - node->field_A0.field_24 = 0.0f; + node->reset_data.trans = vec3_null; + node->reset_data.trans_diff = vec3_null; + node->reset_data.rotation = vec3_null; + node->reset_data.length = 0.0f; node->field_C8 = 0.0f; node->field_CC = 1.0f; - node->field_D0 = vec3_null; + node->external_force = vec3_null; node->force = 1.0f; rob_osage_node_data_init(&node->data); node->data_ptr = &node->data; - node->field_198.end = node->field_198.begin; - sub_14021DCC0(&node->field_198, 3); + node->opd_data.end = node->opd_data.begin; + sub_14021DCC0(&node->opd_data, 3); node->mat = mat4u_null; } static void skin_param_init(skin_param* skp) { - skp->coli.end = skp->coli.begin; - skp->friction = 1.0f; - skp->wind_afc = 0.0f; - skp->air_res = 1.0f; - skp->rot = vec3_null; - skp->init_rot = vec3_null; - skp->coli_type = 0; - skp->stiffness = 0.0f; - skp->move_cancel = -0.01f; - skp->coli_r = 0.0; - skp->hinge = { -90.0f, 90.0f, -90.0f, 90.0f }; - skin_param_hinge_limit(&skp->hinge); - skp->force = 0.0f; - skp->force_gain = 0.0f; - skp->colli_tgt_osg = 0; + } static void rob_osage_init(rob_osage* rob_osg) { - void (*sub_140216750)(tree_struc_478 * a1, tree_struc_478_node * a2) - = (void (*)(tree_struc_478*, tree_struc_478_node*))0x0000000140216750; + void (*sub_140216750)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data * a1, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * a2) + = (void (*)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data*, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node*))0x0000000140216750; void (*vector_old_rob_osage_node_clear)(vector_old_rob_osage_node * vec, rob_osage_node * begin, rob_osage_node * end) = (void (*)(vector_old_rob_osage_node*, rob_osage_node*, rob_osage_node*))0x00000001404817E0; @@ -3781,16 +3783,16 @@ static void rob_osage_init(rob_osage* rob_osg) { rob_osage_node_init(&rob_osg->node); rob_osg->wind_direction = vec3_null; rob_osg->field_1EB4 = 0.0f; - rob_osg->field_1EB8 = 0; + rob_osg->yz_order = 0; rob_osg->field_2A0 = true; - sub_140216750(&rob_osg->field_1F60, rob_osg->field_1F60.head->parent); - rob_osg->field_1F60.head->parent = rob_osg->field_1F60.head; - rob_osg->field_1F60.head->left = rob_osg->field_1F60.head; - rob_osg->field_1F60.head->right = rob_osg->field_1F60.head; - rob_osg->field_1F60.size = 0; + sub_140216750(&rob_osg->motion_reset_data, rob_osg->motion_reset_data.head->parent); + rob_osg->motion_reset_data.head->parent = rob_osg->motion_reset_data.head; + rob_osg->motion_reset_data.head->left = rob_osg->motion_reset_data.head; + rob_osg->motion_reset_data.head->right = rob_osg->motion_reset_data.head; + rob_osg->motion_reset_data.size = 0; rob_osg->move_cancel = 0.0f; rob_osg->field_1F0C = false; - rob_osg->wind_reset = false; + rob_osg->osage_reset = false; rob_osg->field_1F0E = false; rob_osg->ring.ring_height = -1000.0f; rob_osg->ring.ring_rectangle_x = 0.0f; @@ -3804,27 +3806,27 @@ static void rob_osage_init(rob_osage* rob_osg) { rob_osg->field_1F0F = false; skin_param_init(&rob_osg->skin_param); rob_osg->skin_param_ptr = &rob_osg->skin_param; - rob_osg->field_290 = -1; - rob_osg->field_298 = 0; - rob_osg->field_1F70 = 0; + rob_osg->osage_setting.parts = -1; + rob_osg->osage_setting.exf = 0; + rob_osg->reset_data_list = 0; rob_osg->field_2A4 = 0.0f; rob_osg->field_2A1 = 0; - rob_osg->field_1F78 = 0; - rob_osg->field_1F7C = vec3_null; + rob_osg->set_external_force = false; + rob_osg->external_force = vec3_null; rob_osg->parent_mat_ptr = 0; rob_osg->parent_mat = mat4u_null; } static void rob_osage_node_free(rob_osage_node* node) { - if (node->field_198.begin) { - j_free_2(node->field_198.begin); - node->field_198.begin = 0; - node->field_198.end = 0; - node->field_198.capacity_end = 0; + if (node->opd_data.begin) { + operator_delete(node->opd_data.begin); + node->opd_data.begin = 0; + node->opd_data.end = 0; + node->opd_data.capacity_end = 0; } if (node->data.boc.begin) { - j_free_2(node->data.boc.begin); + operator_delete(node->data.boc.begin); node->data.boc.begin = 0; node->data.boc.end = 0; node->data.boc.capacity_end = 0; @@ -3832,10 +3834,14 @@ static void rob_osage_node_free(rob_osage_node* node) { } static void rob_osage_free(rob_osage* rob_osg) { - void (*sub_14021BEF0)(tree_struc_478 * a1, tree_struc_478_node * *a2, - tree_struc_478_node * a3, tree_struc_478_node * a4) - = (void (*)(tree_struc_478*, tree_struc_478_node**, - tree_struc_478_node*, tree_struc_478_node*))0x000000014021BEF0; + void (*sub_14021BEF0)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data * a1, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * *a2, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * a3, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * a4) + = (void (*)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data*, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node**, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node*, + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node*))0x000000014021BEF0; void (*vector_old_rob_osage_node_clear)(vector_old_rob_osage_node * vec, rob_osage_node * begin, rob_osage_node * end) = (void (*)(vector_old_rob_osage_node*, @@ -3843,26 +3849,27 @@ static void rob_osage_free(rob_osage* rob_osg) { rob_osage_init(rob_osg); - tree_struc_478_node* v6; - sub_14021BEF0(&rob_osg->field_1F60, &v6, rob_osg->field_1F60.head->left, rob_osg->field_1F60.head); - j_free_2(rob_osg->field_1F60.head); + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node* v6; + sub_14021BEF0(&rob_osg->motion_reset_data, &v6, + rob_osg->motion_reset_data.head->left, rob_osg->motion_reset_data.head); + operator_delete(rob_osg->motion_reset_data.head); if (rob_osg->ring.skp_root_coli.begin) { - j_free_2(rob_osg->ring.skp_root_coli.begin); + operator_delete(rob_osg->ring.skp_root_coli.begin); rob_osg->ring.skp_root_coli.begin = 0; rob_osg->ring.skp_root_coli.end = 0; rob_osg->ring.skp_root_coli.capacity_end = 0; } if (rob_osg->ring.coli.begin) { - j_free_2(rob_osg->ring.coli.begin); + operator_delete(rob_osg->ring.coli.begin); rob_osg->ring.coli.begin = 0; rob_osg->ring.coli.end = 0; rob_osg->ring.coli.capacity_end = 0; } if (rob_osg->skin_param.coli.begin) { - j_free_2(rob_osg->skin_param.coli.begin); + operator_delete(rob_osg->skin_param.coli.begin); rob_osg->skin_param.coli.begin = 0; rob_osg->skin_param.coli.end = 0; rob_osg->skin_param.coli.capacity_end = 0; @@ -3872,7 +3879,7 @@ static void rob_osage_free(rob_osage* rob_osg) { if (rob_osg->nodes.begin) { vector_old_rob_osage_node_clear(&rob_osg->nodes, rob_osg->nodes.begin, rob_osg->nodes.end); - j_free_2(rob_osg->nodes.begin); + operator_delete(rob_osg->nodes.begin); rob_osg->nodes.begin = 0; rob_osg->nodes.end = 0; rob_osg->nodes.capacity_end = 0; @@ -3889,35 +3896,32 @@ void* ex_osage_block_dispose(ex_osage_block* osg, bool dispose) { rob_osage_free(&osg->rob); osg->base.__vftable = ex_node_block_vftable; if (osg->base.parent_name.capacity > 0x0F) - j_free_2(osg->base.parent_name.ptr); + operator_delete(osg->base.parent_name.ptr); osg->base.parent_name = string_empty; if (dispose) - j_free_2(osg); + operator_delete(osg); return osg; } -void ex_osage_block_field_8(ex_osage_block* osg) { +void ex_osage_block_init(ex_osage_block* osg) { osg->base.__vftable->reset(&osg->base); } -bool toggle1[10] = { true, true, true, true, true, true, true, true, true, true }; -bool toggle2[10] = { false, false, false, false, false, false, false, false, false, false }; - static void sub_14047EE90(rob_osage* rob_osg, mat4* mat) { - if (rob_osg->field_1F70) { - list_struc_479_node* v5 = rob_osg->field_1F70->head->next; + if (rob_osg->reset_data_list) { + list_rob_osage_node_reset_data_node* v5 = rob_osg->reset_data_list->head->next; for (rob_osage_node* v6 = rob_osg->nodes.begin + 1; v6 != rob_osg->nodes.end; v6++) { - v6->field_A0 = v5->value; + v6->reset_data = v5->value; v5 = v5->next; } - rob_osg->field_1F70 = 0; + rob_osg->reset_data_list = 0; } mat4 temp; mat4_transpose(mat, &temp); for (rob_osage_node* v9 = rob_osg->nodes.begin + 1; v9 != rob_osg->nodes.end; v9++) { - mat4_mult_vec3(&temp, &v9->field_A0.trans_diff, &v9->trans_diff); - mat4_mult_vec3_trans(&temp, &v9->field_A0.trans, &v9->trans); + mat4_mult_vec3(&temp, &v9->reset_data.trans_diff, &v9->trans_diff); + mat4_mult_vec3_trans(&temp, &v9->reset_data.trans, &v9->trans); } rob_osg->parent_mat = *rob_osg->parent_mat_ptr; } @@ -3939,14 +3943,14 @@ static void sub_14047F110(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo mat4_transpose(mat, mat); } -static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4, int32_t a5) { +static bool sub_140482FF0(mat4* mat, vec3* trans, skin_param_hinge* hinge, vec3* rot, int32_t* yz_order) { bool clipped = false; float_t z_rot; float_t y_rot; mat4_transpose(mat, mat); - if (a5 == 1) { - y_rot = atan2f(-a2->z, a2->x); - z_rot = atan2f(a2->y, sqrtf(a2->x * a2->x + a2->z * a2->z)); + if (*yz_order == 1) { + y_rot = atan2f(-trans->z, trans->x); + z_rot = atan2f(trans->y, sqrtf(trans->x * trans->x + trans->z * trans->z)); if (hinge) { if (y_rot > hinge->ymax) { y_rot = hinge->ymax; @@ -3972,8 +3976,8 @@ static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4 mat4_rotate_z_mult(mat, z_rot, mat); } else { - z_rot = atan2f(a2->y, a2->x); - y_rot = atan2f(-a2->z, sqrtf(a2->x * a2->x + a2->y * a2->y)); + z_rot = atan2f(trans->y, trans->x); + y_rot = atan2f(-trans->z, sqrtf(trans->x * trans->x + trans->y * trans->y)); if (hinge) { if (y_rot > hinge->ymax) { y_rot = hinge->ymax; @@ -4000,9 +4004,9 @@ static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4 } mat4_transpose(mat, mat); - if (a4) { - a4->y = y_rot; - a4->z = z_rot; + if (rot) { + rot->y = y_rot; + rot->z = z_rot; } return clipped; } @@ -4013,7 +4017,7 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo vec3_mult(rob_osg->exp_data.position, *parent_scale, v45); mat4_transpose(&v47, &v47); mat4_mult_vec3_trans(&v47, &v45, &rob_osg->nodes.begin[0].trans); - if (rob_osg->wind_reset && !rob_osg->field_1F0E) { + if (rob_osg->osage_reset && !rob_osg->field_1F0E) { rob_osg->field_1F0E = true; sub_14047EE90(rob_osg, mat); } @@ -4044,7 +4048,7 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo if (a4) { mat4_transpose(&v47, &v47); sub_14047F110(rob_osg, &v47, parent_scale, 0); - *rob_osg->nodes.begin->bone_node_mat = v47; + *rob_osg->nodes.begin[0].bone_node_mat = v47; mat4_transpose(&v47, &v47); for (rob_osage_node* v29 = rob_osg->nodes.begin, *v30 = rob_osg->nodes.begin + 1; v30 != rob_osg->nodes.end; v29++, v30++) { @@ -4052,8 +4056,8 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo mat4_mult_vec3_inv_trans(&v47, &v30->trans, &v46); mat4_transpose(&v47, &v47); bool v32 = sub_140482FF0(&v47, &v46, &v30->data_ptr->skp_osg_node.hinge, - &v30->field_A0.rotation, rob_osg->field_1EB8); - *v30->bone_node->ex_data_mat = v47; + &v30->reset_data.rotation, &rob_osg->yz_order); + *v30->bone_node_ptr->ex_data_mat = v47; mat4_transpose(&v47, &v47); float_t v34; vec3_distance(v30->trans, v29->trans, v34); @@ -4070,12 +4074,12 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo mat4_get_translation(&v47, &v30->trans); } - if (rob_osg->nodes.begin != rob_osg->nodes.end && rob_osg->node.bone_node_mat) { - mat4 v48 = *rob_osg->nodes.end[-1].bone_node->ex_data_mat; + if (vector_old_length(rob_osg->nodes) && rob_osg->node.bone_node_mat) { + mat4 v48 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; mat4_transpose(&v48, &v48); mat4_translate_mult(&v48, parent_scale->x * rob_osg->node.length, 0.0f, 0.0f, &v48); mat4_transpose(&v48, &v48); - *rob_osg->node.bone_node->ex_data_mat = v48; + *rob_osg->node.bone_node_ptr->ex_data_mat = v48; } } } @@ -4136,7 +4140,7 @@ static void sub_140482490(rob_osage_node* node, float_t step, float_t a3) { vec3_add(node->trans_orig, v4, node->trans); } - sub_140482F30(&node->trans, &node[-1].trans, node->length * a3); + sub_140482F30(&node[0].trans, &node[-1].trans, node->length * a3); if (node->sibling_node) sub_140482F30(&node->trans, &node->sibling_node->trans, node->distance); } @@ -4158,8 +4162,7 @@ static void sub_140482180(rob_osage_node* node, float_t a2) { static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step, bool a5, bool a6, bool a7) { - rob_osage_node* v7 = rob_osg->nodes.end; - if (rob_osg->nodes.begin == v7) + if (!vector_old_length(rob_osg->nodes)) return; const float_t osage_gravity_const = get_osage_gravity_const(); @@ -4176,8 +4179,8 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3_sub(v17->trans, v17->trans_orig, v17->trans_diff); mat4_transpose(&v130, &v130); sub_14047F110(rob_osg, &v130, parent_scale, 0); - *rob_osg->nodes.begin->bone_node_mat = v130; - *rob_osg->nodes.begin->bone_node->ex_data_mat = v130; + *rob_osg->nodes.begin[0].bone_node_mat = v130; + *rob_osg->nodes.begin[0].bone_node_ptr->ex_data_mat = v130; mat4_transpose(&v130, &v130); v113 = { 1.0f, 0.0f, 0.0f }; @@ -4185,7 +4188,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_mult_vec3(&v130, &v113, &v128); float_t v25 = parent_scale->x; - if (!rob_osg->wind_reset && step <= 0.0f) + if (!rob_osg->osage_reset && step <= 0.0f) return; bool stiffness = rob_osg->skin_param_ptr->stiffness > 0.0f; @@ -4196,7 +4199,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, rob_osage_node_data* v31 = v26->data_ptr; float_t weight = v31->skp_osg_node.weight; vec3 v111; - if (!rob_osg->field_1F78) { + if (!rob_osg->set_external_force) { sub_140482300(&v111, &v26->trans, &v30->trans, osage_gravity_const, weight); if (v26 != &v12[-1]) { @@ -4207,7 +4210,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, } } else - vec3_mult_scalar(rob_osg->field_1F7C, 1.0f / weight, v111); + vec3_mult_scalar(rob_osg->external_force, 1.0f / weight, v111); vec3 v127; vec3_mult_scalar(v128, v31->force * v26->force, v127); @@ -4217,7 +4220,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3_add(v111, v127, v126); vec3_mult_scalar(v26->trans_diff, v41, v111); vec3_sub(v126, v111, v126); - vec3_mult_scalar(v26->field_D0, weight, v111); + vec3_mult_scalar(v26->external_force, weight, v111); vec3_add(v126, v111, v126); if (!a5) { @@ -4263,7 +4266,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_mult_vec3_inv_trans(&v131, &v126, &v129); mat4_transpose(&v131, &v131); - sub_140482FF0(&v131, &v129, 0, 0, rob_osg->field_1EB8); + sub_140482FF0(&v131, &v129, 0, 0, &rob_osg->yz_order); mat4_transpose(&v131, &v131); float_t v58; @@ -4281,7 +4284,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, } for (rob_osage_node* v90 = v12 - 2; v90 != rob_osg->nodes.begin; v90--) - sub_140482F30(&v90->trans, &v90[1].trans, v25 * v90->child_length); + sub_140482F30(&v90[0].trans, &v90[1].trans, v25 * v90->child_length); if (a6) { rob_osage_node* v91 = rob_osg->nodes.begin; @@ -4310,8 +4313,8 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_transpose(&v130, &v130); bool v102 = sub_140482FF0(&v130, &v129, &v99->data_ptr->skp_osg_node.hinge, - &v99->field_A0.rotation, rob_osg->field_1EB8); - *v99->bone_node->ex_data_mat = v130; + &v99->reset_data.rotation, &rob_osg->yz_order); + *v99->bone_node_ptr->ex_data_mat = v130; mat4_transpose(&v130, &v130); float_t v104; @@ -4331,12 +4334,12 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_get_translation(&v130, &v99->trans); } - if (rob_osg->nodes.begin != rob_osg->nodes.end && rob_osg->node.bone_node_mat) { - mat4 v131 = *rob_osg->nodes.end[-1].bone_node->ex_data_mat; + if (vector_old_length(rob_osg->nodes) && rob_osg->node.bone_node_mat) { + mat4 v131 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; mat4_transpose(&v131, &v131); mat4_translate_mult(&v131, v25 * rob_osg->node.length, 0.0f, 0.0f, &v131); mat4_transpose(&v131, &v131); - *rob_osg->node.bone_node->ex_data_mat = v131; + *rob_osg->node.bone_node_ptr->ex_data_mat = v131; } } rob_osg->field_2A0 = false; @@ -4639,7 +4642,7 @@ static void osage_coli_ring_set(osage_coli* osg_coli, vector_old_skin_param_osag } static void rob_osage_coli_set(rob_osage* rob_osg, mat4* mats) { - if (rob_osg->skin_param_ptr->coli.begin != rob_osg->skin_param_ptr->coli.end) + if (vector_old_length(rob_osg->skin_param_ptr->coli)) osage_coli_set(rob_osg->coli, rob_osg->skin_param_ptr->coli.begin, mats); osage_coli_ring_set(rob_osg->coli_ring, &rob_osg->ring.skp_root_coli, mats); } @@ -4773,7 +4776,6 @@ static void sub_14047ECA0(rob_osage* rob_osg, float_t step) { if (step <= 0.0f) return; - osage_coli* coli = rob_osg->coli; osage_coli* coli_ring = rob_osg->coli_ring; vector_old_osage_coli* ring_coli = &rob_osg->ring.coli; @@ -4789,6 +4791,7 @@ static void sub_14047ECA0(rob_osage* rob_osg, float_t step) { k->field_C8 += (float_t)sub_140485180(coli_ring, &k->trans, &data->skp_osg_node); k->field_C8 += (float_t)sub_140485180(coli, &k->trans, &data->skp_osg_node); } + i->field_C8 += (float_t)sub_140485180(coli_ring, &i->trans, &data->skp_osg_node); i->field_C8 += (float_t)sub_140485180(coli, &i->trans, &data->skp_osg_node); } @@ -4826,7 +4829,7 @@ static void sub_14047D620(rob_osage* rob_osg, float_t step) { } static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step, bool a5) { - if (!rob_osg->wind_reset && step <= 0.0f) + if (!rob_osg->osage_reset && step <= 0.0f) return; osage_coli* coli = rob_osg->coli; @@ -4874,7 +4877,7 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo if (rob_osg->skin_param_ptr->colli_tgt_osg) { vector_old_rob_osage_node* v24 = rob_osg->skin_param_ptr->colli_tgt_osg; rob_osage_node* v26 = v24->end; - rob_osage_node* v27 = rob_osg->nodes.begin; + rob_osage_node* v27 = rob_osg->nodes.begin + 1; for (rob_osage_node* v25 = rob_osg->nodes.begin + 1; v25 != rob_osg->nodes.end; v25++, v27++) { vec3 v62 = vec3_null; @@ -4888,26 +4891,26 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo for (rob_osage_node* v35 = rob_osg->nodes.begin + 1; v35 != rob_osg->nodes.end; v35++) { skin_param_osage_node* skp_osg_node = &v35->data_ptr->skp_osg_node; float_t v37 = (1.0f - rob_osg->field_1EB4) * rob_osg->skin_param_ptr->friction; - vec3* v38 = &v35->trans; if (a5) { sub_140482490(v35, step, parent_scale->x); - v35->field_C8 = (float_t)sub_1404851C0(v38, skp_osg_node, vec_ring_coli, &v35->field_CC); + v35->field_C8 = (float_t)sub_1404851C0(&v35->trans, + skp_osg_node, vec_ring_coli, &v35->field_CC); if (!rob_osg->field_1F0F) { - v35->field_C8 += (float_t)sub_140485180(coli_ring, v38, skp_osg_node); - v35->field_C8 += (float_t)sub_140485180(coli, v38, skp_osg_node); + v35->field_C8 += (float_t)sub_140485180(coli_ring, &v35->trans, skp_osg_node); + v35->field_C8 += (float_t)sub_140485180(coli, &v35->trans, skp_osg_node); } sub_140482180(v35, v60); } else - sub_140482F30(v38, &v35[-1].trans, v35->length * parent_scale->x); + sub_140482F30(&v35[0].trans, &v35[-1].trans, v35[0].length * parent_scale->x); vec3 v63; - mat4_mult_vec3_inv_trans(&v64, v38, &v63); + mat4_mult_vec3_inv_trans(&v64, &v35->trans, &v63); mat4_transpose(&v64, &v64); bool v40 = sub_140482FF0(&v64, &v63, &skp_osg_node->hinge, - &v35->field_A0.rotation, rob_osg->field_1EB8); - v35->bone_node->exp_data.parent_scale = *parent_scale; - *v35->bone_node->ex_data_mat = v64; + &v35->reset_data.rotation, &rob_osg->yz_order); + v35->bone_node_ptr->exp_data.parent_scale = *parent_scale; + *v35->bone_node_ptr->ex_data_mat = v64; mat4_transpose(&v64, &v64); if (v35->bone_node_mat) { @@ -4919,7 +4922,7 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo float_t v42 = v35->length * parent_scale->x; float_t v44; bool v45; - vec3_distance_squared(*v38, v35[-1].trans, v44); + vec3_distance_squared(v35[0].trans, v35[-1].trans, v44); if (v44 >= v42 * v42) { v42 = sqrtf(v44); v45 = false; @@ -4928,12 +4931,12 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo v45 = true; mat4_translate_mult(&v64, v42, 0.0f, 0.0f, &v64); - v35->field_A0.field_24 = v42; + v35->reset_data.length = v42; if (v40 || v45) - mat4_get_translation(&v64, v38); + mat4_get_translation(&v64, &v35->trans); vec3 v62; - vec3_sub(*v38, v35->trans_orig, v62); + vec3_sub(v35->trans, v35->trans_orig, v62); vec3_mult_scalar(v62, v9, v35->trans_diff); if (v35->field_C8 > 0.0f) { @@ -4949,33 +4952,32 @@ static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo mat4 v65; mat4_transpose(mat, &v65); - mat4_mult_vec3_inv_trans(&v65, v38, &v35->field_A0.trans); - mat4_mult_vec3_inv(&v65, &v35->trans_diff, &v35->field_A0.trans_diff); + mat4_mult_vec3_inv_trans(&v65, &v35->trans, &v35->reset_data.trans); + mat4_mult_vec3_inv(&v65, &v35->trans_diff, &v35->reset_data.trans_diff); } - if (rob_osg->nodes.begin != rob_osg->nodes.end && rob_osg->node.bone_node_mat) { - mat4 v65 = *rob_osg->nodes.end[-1].bone_node->ex_data_mat; + if (vector_old_length(rob_osg->nodes) && rob_osg->node.bone_node_mat) { + mat4 v65 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; mat4_transpose(&v65, &v65); mat4_translate_mult(&v65, rob_osg->node.length * parent_scale->x, 0.0f, 0.0f, &v65); mat4_transpose(&v65, &v65); - *rob_osg->node.bone_node->ex_data_mat = v65; + *rob_osg->node.bone_node_ptr->ex_data_mat = v65; mat4_transpose(&v65, &v65); mat4_scale_rot(&v65, parent_scale->x, parent_scale->y, parent_scale->z, &v65); mat4_transpose(&v65, &v65); *rob_osg->node.bone_node_mat = v65; - rob_osg->node.bone_node->exp_data.parent_scale = *parent_scale; + rob_osg->node.bone_node_ptr->exp_data.parent_scale = *parent_scale; } } -static void sub_140480F40(rob_osage* rob_osg, vec3* a2, float_t a3) { - if (!a2) { - for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) - i->field_D0 = vec3_null; - return; - } +static void sub_140480F40(rob_osage* rob_osg, vec3* external_force, float_t a3) { + vec3 v4; + if (external_force) + v4 = *external_force; + else + v4 = vec3_null; - vec3 v4 = *a2; - size_t v7 = rob_osg->field_298; + size_t v7 = rob_osg->osage_setting.parts; size_t v8 = 0; if (v7 >= 4) { float_t v9 = a3 * a3 * a3 * a3; @@ -4990,7 +4992,7 @@ static void sub_140480F40(rob_osage* rob_osg, vec3* a2, float_t a3) { vec3_mult_scalar(v4, a3, v4); for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) { - i->field_D0 = v4; + i->external_force = v4; vec3_mult_scalar(v4, a3, v4); } } @@ -5004,8 +5006,8 @@ static void sub_140480260(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo if (!v5) { sub_140480F40(rob_osg, 0, 1.0f); rob_osage_set_nodes_force(rob_osg, 1.0f); - rob_osg->field_1F78 = 0; - rob_osg->field_1F7C = vec3_null; + rob_osg->set_external_force = false; + rob_osg->external_force = vec3_null; } for (rob_osage_node* v6 = rob_osg->nodes.begin; v6 != rob_osg->nodes.end; v6++) { @@ -5017,7 +5019,7 @@ static void sub_140480260(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo rob_osg->field_2A1 = false; rob_osg->field_2A4 = -1.0f; rob_osg->field_1F0C = false; - rob_osg->wind_reset = false; + rob_osg->osage_reset = false; rob_osg->field_1F0E = false; rob_osg->parent_mat = *rob_osg->parent_mat_ptr; } @@ -5027,8 +5029,8 @@ void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3) { rob_chara_item_equip* rob_item_equip = osg->base.item_equip_object->item_equip; float_t step = get_delta_frame() * rob_item_equip->step; - if (rob_item_equip->field_940.begin != rob_item_equip->field_940.end - && rob_item_equip->field_940.begin->field_C) + if (vector_old_length(rob_item_equip->field_940) + && rob_item_equip->field_940.begin[0].field_C) step = 1.0f; bone_node* parent_node = osg->base.parent_bone_node; @@ -5070,7 +5072,7 @@ static void sub_14047C750(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo sub_14047C770(rob_osg, mat, parent_scale, step, 0); } -void ex_osage_block_update(ex_osage_block* osg) { +void ex_osage_block_field_20(ex_osage_block* osg) { osg->field_1FF8 &= ~2; if (osg->base.field_59) { osg->base.field_59 = false; @@ -5078,13 +5080,11 @@ void ex_osage_block_update(ex_osage_block* osg) { } float_t(*get_delta_frame)() = (float_t(*)())0x0000000140192D50; - void (*_sub_14047C750)(rob_osage * rob_osg, mat4 * mat, vec3 * parent_scale, float_t step) - = (void (*)(rob_osage*, mat4*, vec3*, float_t))0x000000014047C770; rob_chara_item_equip* rob_item_equip = osg->base.item_equip_object->item_equip; float_t step = get_delta_frame() * rob_item_equip->step; - if (rob_item_equip->field_940.begin != rob_item_equip->field_940.end - && rob_item_equip->field_940.begin->field_C) + if (vector_old_length(rob_item_equip->field_940) + && rob_item_equip->field_940.begin[0].field_C) step = 1.0f; bone_node* parent_node = osg->base.parent_bone_node; @@ -5100,19 +5100,158 @@ void ex_osage_block_update(ex_osage_block* osg) { } ex_osage_block_set_wind_direction(osg); - if (toggle1[7]) - rob_osage_coli_set(&osg->rob, osg->mat); - if (toggle1[8]) - if (toggle2[8]) - _sub_14047C750(&osg->rob, &mat, &parent_scale, step); - else - sub_14047C750(&osg->rob, &mat, &parent_scale, step); + rob_osage_coli_set(&osg->rob, osg->mat); + sub_14047C750(&osg->rob, &mat, &parent_scale, step); } -void ex_osage_block_field_28(ex_osage_block* osg) { - void (*sub_14047E240) (rob_osage * a1, mat4 * a2, vec3 * a3, vector_old_struc_373 * a4) - = (void (*) (rob_osage*, mat4*, vec3*, vector_old_struc_373*))0x000000014047E240; +void sub_140482DF0(struc_477* dst, struc_477* src0, struc_477* src1, float_t blend) { + dst->length = lerp(src0->length, src1->length, blend); + vec3_lerp_scalar(src0->angle, src1->angle, dst->angle, blend); +} +void sub_140482100(struc_476* a1, opd_blend_data* a2, struc_477* a3) { + if (!a2->field_C) + a1->field_0 = *a3; + else if (a2->type == MOTION_BLEND_FREEZE) { + if (a2->blend == 0.0f) + a1->field_10 = a1->field_0; + sub_140482DF0(&a1->field_0, &a1->field_10, a3, a2->blend); + } + else if (a2->type == MOTION_BLEND_CROSS) + sub_140482DF0(&a1->field_0, &a1->field_0, a3, a2->blend); +} + +void sub_14047E240(rob_osage* rob_osg, mat4* a2, vec3* a3, vector_old_opd_blend_data* a4) { + if (!vector_old_length(*a4)) + return; + + vec3 v63; + vec3_mult(rob_osg->exp_data.position, *a3, v63); + + mat4 v85; + mat4_transpose(a2, &v85); + mat4_mult_vec3_trans(&v85, &v63, &rob_osg->nodes.begin[0].trans); + mat4_transpose(&v85, &v85); + + sub_14047F110(rob_osg, &v85, a3, 0); + *rob_osg->nodes.begin[0].bone_node_mat = v85; + *rob_osg->nodes.begin[0].bone_node_ptr->ex_data_mat = v85; + mat4_transpose(&v85, &v85); + + mat4_transpose(a2, a2); + size_t v17 = vector_old_length(*a4) - 1; + for (opd_blend_data* i = a4->end; i != a4->begin; v17--) { + i--; + mat4 v87 = v85; + float_t frame = i->frame; + vec3 v22 = rob_osg->nodes.begin[0].trans; + vec3 v25 = v22; + if (frame >= i->frame_count) + frame = 0.0f; + + int32_t frame_int = (int32_t)frame; + if (frame != -0.0f && (float_t)frame_int != frame) + frame_int = (frame < 0.0f ? frame_int - 1 : frame_int); + + int32_t curr_key = frame_int; + int32_t next_key = frame_int + 1; + if ((float_t)next_key >= i->frame_count) + next_key = 0; + + float_t blend = frame - (float_t)frame_int; + float_t inv_blend = 1.0f - blend; + for (rob_osage_node* j = rob_osg->nodes.begin + 1; j != rob_osg->nodes.end; j++) { + opd_vec3_data* opd = &j->opd_data.begin[v17]; + float_t* opd_x = opd->x; + float_t* opd_y = opd->y; + float_t* opd_z = opd->z; + + vec3 v62; + v62.x = opd_x[curr_key]; + v62.y = opd_y[curr_key]; + v62.z = opd_z[curr_key]; + + vec3 v77; + v77.x = opd_x[next_key]; + v77.y = opd_y[next_key]; + v77.z = opd_z[next_key]; + + vec3 v84; + mat4_mult_vec3_trans(a2, &v62, &v84); + + vec3 v83; + mat4_mult_vec3_trans(a2, &v77, &v83); + + vec3 v82; + vec3_mult_scalar(v83, blend, v82); + + vec3 v81; + vec3_mult_scalar(v84, inv_blend, v81); + vec3_add(v82, v81, v82); + + vec3 v86; + mat4_mult_vec3_inv_trans(&v87, &v82, &v86); + mat4_transpose(&v87, &v87); + + vec3 v64 = vec3_null; + sub_140482FF0(&v87, &v86, 0, &v64, &rob_osg->yz_order); + mat4_transpose(&v87, &v87); + mat4_set_translation(&v87, &v82); + + float_t v50; + vec3_distance(v83, v25, v50); + + float_t v49; + vec3_distance(v84, v22, v49); + + struc_477 v72; + v72.angle = v64; + v72.length = v49 * inv_blend + v50 * blend; + sub_140482100(&j->field_1B0, i, &v72); + + v22 = v84; + v25 = v83; + } + } + mat4_transpose(a2, a2); + + for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) { + float_t v54 = i->field_1B0.field_0.angle.y; + float_t v55 = i->field_1B0.field_0.angle.z; + v54 = clamp(v54, (float_t)-M_PI, (float_t)M_PI); + v55 = clamp(v55, (float_t)-M_PI, (float_t)M_PI); + mat4_rotate_z_mult(&v85, v55, &v85); + mat4_rotate_y_mult(&v85, v54, &v85); + mat4_transpose(&v85, &v85); + i->bone_node_ptr->exp_data.parent_scale = *a3; + *i->bone_node_ptr->ex_data_mat = v85; + mat4_transpose(&v85, &v85); + if (i->bone_node_mat) { + mat4 mat = v85; + mat4_scale_rot(&mat, a3->x, a3->y, a3->z, &mat); + mat4_transpose(&mat, i->bone_node_mat); + } + mat4_translate_mult(&v85, i->field_1B0.field_0.length, 0.0f, 0.0f, &v85); + i->trans_orig = i->trans; + mat4_get_translation(&v85, &i->trans); + } + + if (vector_old_length(rob_osg->nodes) && rob_osg->node.bone_node_mat) { + mat4 v87 = *rob_osg->nodes.end[-1].bone_node_ptr->ex_data_mat; + mat4_transpose(&v87, &v87); + mat4_translate_mult(&v87, rob_osg->node.length * a3->x, 0.0f, 0.0f, &v87); + mat4_transpose(&v87, &v87); + *rob_osg->node.bone_node_ptr->ex_data_mat = v87; + + mat4_transpose(&v87, &v87); + mat4_scale_rot(&v87, a3->x, a3->y, a3->z, &v87); + mat4_transpose(&v87, &v87); + *rob_osg->node.bone_node_mat = v87; + rob_osg->node.bone_node_ptr->exp_data.parent_scale = *a3; + } +} + +void ex_osage_block_set_osage_play_data(ex_osage_block* osg) { rob_chara_item_equip* rob_itm_equip = osg->base.item_equip_object->item_equip; bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; @@ -5145,8 +5284,8 @@ void ex_osage_block_field_48(ex_osage_block* osg) { rob_osage_coli_set(&osg->rob, osg->mat); bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; - if (toggle1[5]) - sub_14047F990(&osg->rob, parent_node->ex_data_mat, &parent_scale, false); + vec3_mult_scalar(parent_scale, 0.5f, parent_scale); + sub_14047F990(&osg->rob, parent_node->ex_data_mat, &parent_scale, false); osg->field_1FF8 &= ~2; } @@ -5165,21 +5304,92 @@ void ex_osage_block_field_50(ex_osage_block* osg) { bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; rob_osage_coli_set(&osg->rob, osg->mat); - if (toggle1[6]) - if (toggle2[6]) - _sub_14047C770(&osg->rob, parent_node->ex_data_mat, &parent_scale, osg->step, 1); - else - sub_14047C770(&osg->rob, parent_node->ex_data_mat, &parent_scale, osg->step, 1); + sub_14047C770(&osg->rob, parent_node->ex_data_mat, &parent_scale, osg->step, 1); float_t step = 0.5f * osg->step; osg->step = max(step, 1.0f); } +bool sub_14053D1B0(vec3* l_trans, vec3* r_trans, + vec3* u_trans, vec3* d_trans, vec3* a5, vec3* a6, vec3* a7) { + float_t length; + vec3_sub(*d_trans, *u_trans, *a5); + vec3_length_squared(*a5, length); + if (length <= 0.000001f) + return false; + vec3_mult_scalar(*a5, 1.0f / sqrtf(length), *a5); + + vec3 v9; + vec3_sub(*r_trans, *l_trans, v9); + vec3_cross(v9, *a5, *a6); + vec3_length_squared(*a6, length); + if (length <= 0.000001f) + return false; + vec3_mult_scalar(*a6, 1.0f / sqrtf(length), *a6); + + vec3_cross(*a5, *a6, *a7); + vec3_normalize(*a7, *a7); + return true; +} + +void sub_14053CE30(rob_osage_node_data_normal_ref* normal_ref, mat4* a2) { + if (!normal_ref->field_0) + return; + + mat4 mat; + vec3 n_trans; + vec3 u_trans; + vec3 d_trans; + vec3 l_trans; + vec3 r_trans; + mat4_transpose(normal_ref->n->bone_node_ptr->ex_data_mat, &mat); + mat4_get_translation(&mat, &n_trans); + mat4_transpose(normal_ref->u->bone_node_ptr->ex_data_mat, &mat); + mat4_get_translation(&mat, &u_trans); + mat4_transpose(normal_ref->d->bone_node_ptr->ex_data_mat, &mat); + mat4_get_translation(&mat, &d_trans); + mat4_transpose(normal_ref->l->bone_node_ptr->ex_data_mat, &mat); + mat4_get_translation(&mat, &l_trans); + mat4_transpose(normal_ref->r->bone_node_ptr->ex_data_mat, &mat); + mat4_get_translation(&mat, &r_trans); + + vec3 v27; + vec3 v26; + vec3 v28; + if (sub_14053D1B0(&l_trans, &r_trans, &u_trans, &d_trans, &v27, &v26, &v28)) { + mat4 v34; + *(vec3*)&v34.row0 = v28; + *(vec3*)&v34.row1 = v26; + *(vec3*)&v34.row2 = v27; + *(vec3*)&v34.row3 = n_trans; + v34.row0.w = 0.0f; + v34.row1.w = 0.0f; + v34.row2.w = 0.0f; + v34.row3.w = 1.0f; + + mat4 v33 = normal_ref->mat; + mat4_mult(&v33, &v34, a2); + } +} + +void sub_14047E1C0(rob_osage* rob_osg, vec3* a2) { + for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; ++i) { + if (!i->data_ptr->normal_ref.field_0) + continue; + + sub_14053CE30(&i->data_ptr->normal_ref, i->bone_node_mat); + + mat4 mat; + mat4_transpose(i->bone_node_mat, &mat); + mat4_scale_rot(&mat, a2->x, a2->y, a2->z, &mat); + mat4_transpose(&mat, i->bone_node_mat); + } +} + void ex_osage_block_field_58(ex_osage_block* osg) { - void (*sub_14047E1C0) (rob_osage * a1, vec3 * a2) + void (*_sub_14047E1C0) (rob_osage * a1, vec3 * a2) = (void (*) (rob_osage*, vec3*))0x000000014047E1C0; bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; - if (toggle1[4]) - sub_14047E1C0(&osg->rob, &parent_scale); + sub_14047E1C0(&osg->rob, &parent_scale); } diff --git a/src/DivaGL/bone_data.h b/src/DivaGL/bone_data.h index 3cd78cc7..94c54aad 100644 --- a/src/DivaGL/bone_data.h +++ b/src/DivaGL/bone_data.h @@ -1060,7 +1060,7 @@ struct rob_sub_action { typedef struct struc_389 { float_t frame; float_t prev_frame; - float_t last_frame; + float_t last_set_frame; } struc_389; typedef struct struc_406 { @@ -1114,30 +1114,30 @@ typedef struct rob_eyelid_motion { rob_partial_motion base; } rob_eyelid_motion; -typedef struct struc_269 { - uint8_t field_0; - float_t field_4; - float_t field_8; - vec3 field_C; +typedef struct rob_chara_data_parts_adjust { + bool enable; + float_t frame; + float_t transition_frame; + vec3 curr_external_force; + float_t curr_force; + float_t curr_strength; + int32_t motion_id; + int32_t set_frame; + float_t force_duration; + int32_t type; + int32_t cycle_type; + bool ignore_gravity; + vec3 external_force_min; + vec3 external_force_strength; + vec3 external_force; + float_t cycle; + float_t phase; float_t force; - float_t field_1C; - int32_t field_20; - int32_t field_24; - float_t field_28; - int32_t field_2C; - int32_t field_30; - uint8_t field_34; - vec3 field_38; - vec3 field_44; - vec3 field_50; - float_t field_5C; - float_t field_60; - float_t field_64; - float_t field_68; - float_t field_6C; -} struc_269; + float_t strength; + float_t strength_transition; +} rob_chara_data_parts_adjust; -typedef struct struc_229 { +typedef struct rob_chara_data_hand_adjust { uint8_t field_0; uint8_t field_1; int16_t field_2; @@ -1156,15 +1156,15 @@ typedef struct struc_229 { vec3 field_30; int32_t field_3C; int32_t field_40; -} struc_229; +} rob_chara_data_hand_adjust; typedef struct struc_222 { uint8_t field_0; float_t field_4; float_t field_8; float_t field_C; - float_t field_10; - float_t field_14; + float_t duration; + float_t frame; } struc_222; typedef struct aft_object_info { @@ -1187,11 +1187,11 @@ typedef struct struc_405 { float_t field_1C4; } struc_405; -typedef struct struc_268 { +typedef struct rob_chara_adjust { int32_t motion_id; int32_t prev_motion_id; - struc_389 field_8; - struc_406 field_14; + struc_389 frame_data; + struc_406 step_data; float_t step; int32_t field_24; uint8_t field_28; @@ -1214,13 +1214,13 @@ typedef struct struc_268 { aft_object_info field_3A8; aft_object_info field_3AC; struc_405 field_3B0; - struc_269 field_578[13]; - struc_269 field_B28[13]; - struc_269 field_10D8[2]; - struc_229 field_11B8[2]; - struc_229 field_1240[2]; + rob_chara_data_parts_adjust parts_adjust[13]; + rob_chara_data_parts_adjust parts_adjust_prev[13]; + rob_chara_data_parts_adjust field_10D8[2]; + rob_chara_data_hand_adjust hand_adjust[2]; + rob_chara_data_hand_adjust hand_adjust_prev[2]; struc_222 field_12C8[2]; -} struc_268; +} rob_chara_adjust; typedef struct struc_228 { int32_t field_0; @@ -1404,7 +1404,7 @@ typedef struct struc_223 { int32_t field_7A8; } struc_223; -typedef struct struc_399 { +typedef struct rob_chara_data_miku_rot { int16_t field_0; int16_t field_2; int16_t field_4; @@ -1427,7 +1427,7 @@ typedef struct struc_399 { int32_t field_64; int32_t field_68; mat4u field_6C; -} struc_399; +} rob_chara_data_miku_rot; typedef struct rob_chara_adjust_data { float_t scale; @@ -1605,9 +1605,9 @@ typedef struct rob_chara_data { int32_t field_4; struc_264 field_8; rob_sub_action rob_sub_action; - struc_268 field_290; + rob_chara_adjust adjust; struc_223 field_1588; - struc_399 field_1D38; + rob_chara_data_miku_rot miku_rot; rob_chara_adjust_data adjust_data; struc_209 field_1E68; float_t field_3D90; @@ -2345,7 +2345,7 @@ typedef struct mot_data { uint16_t* bone_info; } mot_data; -typedef struct mot_parent { +typedef struct mot_key_data { bool key_sets_ready; size_t key_set_count; vector_old_mot_key_set key_set; @@ -2357,7 +2357,7 @@ typedef struct mot_parent { int32_t motion_id; float_t frame; struc_369 field_68; -} mot_parent; +} mot_key_data; typedef struct bone_data { aft_bone_database_bone_type type; @@ -2388,13 +2388,24 @@ typedef struct bone_data { vector_old(bone_data) +typedef struct struc_400 { + bool field_0; + bool field_1; + bool field_2; + bool field_3; + bool field_4; + float_t frame; + float_t eyes_adjust; + float_t prev_eyes_adjust; +} struc_400; + typedef struct motion_blend motion_blend; typedef struct motion_blend_vtbl { void(*dispose)(motion_blend*); void(*field_8)(motion_blend*); void(*field_10)(motion_blend*); - void(*field_18)(motion_blend*, uint8_t*); + void(*field_18)(motion_blend*, struc_400*); void(*field_20)(motion_blend*, vector_old_bone_data*, vector_old_bone_data*); void(*field_28)(motion_blend*, bone_data*, bone_data*); bool(*field_30)(motion_blend*); @@ -2439,24 +2450,13 @@ typedef struct motion_blend_combine { motion_blend_cross base; } motion_blend_combine; -typedef struct struc_400 { - uint8_t field_0; - char field_1; - char field_2; - char field_3; - char field_4; - float_t field_8; - float_t field_C; - float_t field_10; -} struc_400; - typedef struct struc_240 { bool(*bone_check_func)(motion_bone_index bone_index); struc_313 field_8; size_t motion_bone_count; } struc_240; -typedef struct struc_346 { +typedef struct mot_play_frame_data { float_t frame; float_t field_4; float_t field_8; @@ -2469,20 +2469,23 @@ typedef struct struc_346 { float_t field_24; uint8_t field_28; int32_t field_2C; -} struc_346; +} mot_play_frame_data; + +typedef struct mot_play_data { + mot_play_frame_data frame_data; + int32_t field_30; + bool field_34; + float_t field_38; + float_t* field_40; + float_t* field_48; +} mot_play_data; typedef struct mot_blend { struc_240 field_0; uint8_t field_30; - mot_parent field_38; - struc_346 field_A8; - int32_t field_D8; - uint8_t field_DC; - int32_t field_E0; - int32_t field_E4; - int64_t field_E8; - int64_t field_F0; - motion_blend field_F8; + mot_key_data mot_key_data; + mot_play_data mot_play_data; + motion_blend_freeze blend; } mot_blend; typedef struct struc_241 { @@ -2609,15 +2612,6 @@ typedef struct bone_data_parent { float_t rotation_y; } bone_data_parent; -typedef struct struc_370 { - struc_346 field_0; - int32_t field_30; - bool field_34; - float_t field_38; - float_t* field_40; - float_t* field_48; -} struc_370; - typedef struct struc_308 { int32_t field_0; int32_t field_4; @@ -2629,7 +2623,7 @@ typedef struct struc_308 { vec3 field_9C; vec3 field_A8; float_t eyes_adjust; - float_t field_B8; + float_t prev_eyes_adjust; uint8_t field_BC; uint8_t field_BD; float_t field_C0; @@ -2643,11 +2637,11 @@ typedef struct motion_blend_mot { motion_blend_freeze freeze; motion_blend_combine combine; bone_data_parent bone_data; - mot_parent mot_data; - struc_370 field_4A8; + mot_key_data mot_key_data; + mot_play_data mot_play_data; struc_308 field_4F8; int32_t field_5CC; - motion_blend* field_5D0; + motion_blend* blend; } motion_blend_mot; vector_old_ptr(motion_blend_mot) @@ -2693,16 +2687,16 @@ struct rob_chara_bone_data { struc_312 field_958; }; -typedef struct struc_373 { +typedef struct opd_blend_data { int32_t motion_id; float_t frame; float_t frame_count; uint8_t field_C; - int32_t field_10; + motion_blend_type type; float_t blend; -} struc_373; +} opd_blend_data; -vector_old(struc_373) +vector_old(opd_blend_data) typedef struct aft_obj_skin_block_node { char* parent_name; @@ -2853,12 +2847,12 @@ typedef struct ex_node_block ex_node_block; typedef struct ex_node_block_vtbl { void* (*dispose)(ex_node_block*, bool dispose); - void(*field_8)(ex_node_block*); + void(*init)(ex_node_block*); void(*field_10)(ex_node_block*); void(*field_18)(ex_node_block*, int64_t, int64_t); - void(*update)(ex_node_block*); - void(*field_28)(ex_node_block*); - void(*draw)(ex_node_block*); + void(*field_20)(ex_node_block*); + void(*set_osage_play_data)(ex_node_block*); + void(*disp)(ex_node_block*); void(*reset)(ex_node_block*); void(*field_40)(ex_node_block*); void(*field_48)(ex_node_block*); @@ -2920,13 +2914,13 @@ typedef struct rob_osage_node_data { skin_param_osage_node skp_osg_node; } rob_osage_node_data; -typedef struct struc_331 { - int64_t field_0; - int64_t field_8; - int64_t field_10; -} struc_331; +typedef struct opd_vec3_data { + float_t* x; + float_t* y; + float_t* z; +} opd_vec3_data; -vector_old(struc_331) +vector_old(opd_vec3_data) typedef struct struc_477 { float_t length; @@ -2938,12 +2932,12 @@ typedef struct struc_476 { struc_477 field_10; } struc_476; -typedef struct struc_479 { +typedef struct rob_osage_node_reset_data { vec3 trans; vec3 trans_diff; vec3 rotation; - float_t field_24; -} struc_479; + float_t length; +} rob_osage_node_reset_data; struct rob_osage_node { float_t length; @@ -2952,20 +2946,20 @@ struct rob_osage_node { vec3 trans_diff; vec3 field_28; float_t child_length; - bone_node* bone_node; + bone_node* bone_node_ptr; mat4* bone_node_mat; mat4u mat; rob_osage_node* sibling_node; float_t distance; vec3 field_94; - struc_479 field_A0; + rob_osage_node_reset_data reset_data; float_t field_C8; float_t field_CC; - vec3 field_D0; + vec3 external_force; float_t force; rob_osage_node_data* data_ptr; rob_osage_node_data data; - vector_old_struc_331 field_198; + vector_old_opd_vec3_data opd_data; struc_476 field_1B0; }; @@ -3024,27 +3018,36 @@ typedef struct osage_ring_data { vector_old_skin_param_osage_root_coli skp_root_coli; } osage_ring_data; -typedef struct struc_478 { - int32_t field_0; - int32_t field_4; - int64_t field_8; - int64_t field_10; -} struc_478; +typedef struct pair_int32_t_int32_t { + int32_t key; + int32_t value; +} pair_int32_t_int32_t; -tree_def(struc_478) +typedef struct list_rob_osage_node_reset_data_node list_rob_osage_node_reset_data_node; -typedef struct list_struc_479_node list_struc_479_node; - -struct list_struc_479_node { - list_struc_479_node* next; - list_struc_479_node* prev; - struc_479 value; +struct list_rob_osage_node_reset_data_node { + list_rob_osage_node_reset_data_node* next; + list_rob_osage_node_reset_data_node* prev; + rob_osage_node_reset_data value; }; -typedef struct list_struc_479 { - list_struc_479_node* head; +typedef struct list_rob_osage_node_reset_data { + list_rob_osage_node_reset_data_node* head; size_t size; -} list_struc_479; +} list_rob_osage_node_reset_data; + +typedef struct pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data { + pair_int32_t_int32_t key; + list_rob_osage_node_reset_data value; +} pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data; + +tree_def(pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data) +typedef pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data motion_reset_data; + +typedef struct osage_setting_osg_cat { + int32_t parts; + size_t exf; +} osage_setting_osg_cat; typedef struct rob_osage { skin_param* skin_param_ptr; @@ -3052,8 +3055,7 @@ typedef struct rob_osage { vector_old_rob_osage_node nodes; rob_osage_node node; skin_param skin_param; - int32_t field_290; - int64_t field_298; + osage_setting_osg_cat osage_setting; bool field_2A0; bool field_2A1; float_t field_2A4; @@ -3061,20 +3063,20 @@ typedef struct rob_osage { osage_coli coli_ring[64]; vec3 wind_direction; float_t field_1EB4; - int32_t field_1EB8; + int32_t yz_order; int32_t field_1EBC; mat4* parent_mat_ptr; mat4u parent_mat; float_t move_cancel; bool field_1F0C; - bool wind_reset; + bool osage_reset; bool field_1F0E; bool field_1F0F; osage_ring_data ring; - tree_struc_478 field_1F60; - list_struc_479* field_1F70; - bool field_1F78; - vec3 field_1F7C; + tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data motion_reset_data; + list_rob_osage_node_reset_data* reset_data_list; + bool set_external_force; + vec3 external_force; } rob_osage; typedef struct ex_osage_block { @@ -3090,7 +3092,7 @@ typedef struct ex_constraint_block { ex_node_block base; aft_obj_skin_block_constraint_type type; bone_node* source_node_bone_node; - bone_node* direction_up_vector_old_bone_node; + bone_node* direction_up_vector_bone_node; aft_obj_skin_block_constraint* cns_data; int64_t field_80; } ex_constraint_block; @@ -3510,11 +3512,6 @@ typedef struct aft_obj_bounding_box { vec3 size; } aft_obj_bounding_box; -typedef struct pair_int32_t_int32_t { - int32_t key; - int32_t value; -} pair_int32_t_int32_t; - typedef struct texture { int32_t init_count; int32_t id; @@ -3647,7 +3644,7 @@ struct rob_chara_item_equip_object { bool disp; int32_t field_A4; mat4* field_A8; - int32_t field_B0; + int32_t osage_iterations; bone_node* bone_nodes; vector_old_ptr_ex_node_block node_blocks; vector_old_bone_node ex_data_bone_nodes; @@ -3717,11 +3714,11 @@ struct rob_chara_item_equip { int64_t field_928; int64_t field_930; float_t step; - uint8_t field_93C; - vector_old_struc_373 field_940; - uint8_t field_958; - uint8_t field_959; - uint8_t field_95A; + bool use_opd; + vector_old_opd_blend_data field_940; + bool parts_short; + bool parts_append; + bool parts_white_one_l; }; extern void bone_data_mult_ik(bone_data* a1, int32_t a2); @@ -3736,10 +3733,10 @@ extern void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2); extern void ex_node_block_field_10(ex_node_block* node); extern void* ex_osage_block_dispose(ex_osage_block* osg, bool dispose); -extern void ex_osage_block_field_8(ex_osage_block* osg); +extern void ex_osage_block_init(ex_osage_block* osg); extern void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3); -extern void ex_osage_block_update(ex_osage_block* osg); -extern void ex_osage_block_field_28(ex_osage_block* osg); +extern void ex_osage_block_field_20(ex_osage_block* osg); +extern void ex_osage_block_set_osage_play_data(ex_osage_block* osg); extern void ex_osage_block_disp(ex_osage_block* osg); extern void ex_osage_block_reset(ex_osage_block* osg); extern void ex_osage_block_field_40(ex_osage_block* osg); diff --git a/src/DivaGL/inject.c b/src/DivaGL/inject.c index 25b3f2f6..4c20193e 100644 --- a/src/DivaGL/inject.c +++ b/src/DivaGL/inject.c @@ -75,11 +75,11 @@ static patch_struct patch_data[] = { //{ (void*)0x0000000140418870, (uint64_t)&rob_chara_data_bone_data_interpolate, }, //{ (void*)0x0000000140418A60, (uint64_t)&rob_chara_data_bone_data_update, }, { (void*)0x00000001405EEAE0, (uint64_t)&ex_osage_block_dispose, }, - { (void*)0x00000001405F3640, (uint64_t)&ex_osage_block_field_8, }, + { (void*)0x00000001405F3640, (uint64_t)&ex_osage_block_init, }, { (void*)0x00000001405F39E0, (uint64_t)&ex_node_block_field_10, }, { (void*)0x00000001405F49F0, (uint64_t)&ex_osage_block_field_18, }, - { (void*)0x00000001405F2140, (uint64_t)&ex_osage_block_update, }, - { (void*)0x00000001405F2470, (uint64_t)&ex_osage_block_field_28, }, + { (void*)0x00000001405F2140, (uint64_t)&ex_osage_block_field_20, }, + { (void*)0x00000001405F2470, (uint64_t)&ex_osage_block_set_osage_play_data, }, { (void*)0x00000001405F26F0, (uint64_t)&ex_osage_block_disp, }, { (void*)0x00000001405F2640, (uint64_t)&ex_osage_block_reset, }, { (void*)0x00000001405F2860, (uint64_t)&ex_osage_block_field_40, }, diff --git a/src/KKdLib/a3da.c b/src/KKdLib/a3da.c index 094fcf5a..891d59d5 100644 --- a/src/KKdLib/a3da.c +++ b/src/KKdLib/a3da.c @@ -102,7 +102,7 @@ a3da::~a3da() { } -void a3da::read(char* path) { +void a3da::read(const char* path) { if (!path) return; @@ -117,14 +117,14 @@ void a3da::read(char* path) { free(path_a3da); } -void a3da::read(wchar_t* path) { +void a3da::read(const wchar_t* path) { if (!path) return; wchar_t* path_a3da = str_utils_wadd(path, (wchar_t*)L".a3da"); - if (path_wcheck_file_exists(path_a3da)) { + if (path_check_file_exists(path_a3da)) { stream s; - io_wopen(&s, path_a3da, L"rb"); + io_open(&s, path_a3da, L"rb"); if (s.io.stream) a3da_read_inner(this, &s); io_free(&s); @@ -132,17 +132,17 @@ void a3da::read(wchar_t* path) { free(path_a3da); } -void a3da::read(void* data, size_t length) { +void a3da::read(const void* data, size_t length) { if (!data || !length) return; stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); a3da_read_inner(this, &s); io_free(&s); } -void a3da::write(char* path) { +void a3da::write(const char* path) { if (!path || !this->ready) return; @@ -155,13 +155,13 @@ void a3da::write(char* path) { free(path_a3da); } -void a3da::write(wchar_t* path) { +void a3da::write(const wchar_t* path) { if (!path || !this->ready) return; wchar_t* path_a3da = str_utils_wadd(path, (wchar_t*)L".a3da"); stream s; - io_wopen(&s, path_a3da, L"wb"); + io_open(&s, path_a3da, L"wb"); if (s.io.stream) a3da_write_inner(this, &s); io_free(&s); @@ -173,16 +173,16 @@ void a3da::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); a3da_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -bool a3da::load_file(void* data, char* path, char* file, uint32_t hash) { +bool a3da::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -192,7 +192,6 @@ bool a3da::load_file(void* data, char* path, char* file, uint32_t hash) { a3da* a = (a3da*)data; a->read(string_data(&s)); - a->hash = hash; string_free(&s); return a->ready; @@ -402,7 +401,8 @@ a3da_post_process::~a3da_post_process() { } static void a3da_read_inner(a3da* a, stream* s) { - a3dc_header header = {}; + a3dc_header header; + memset(&header, 0, sizeof(a3dc_header)); a->format = A3DA_FORMAT_F; uint32_t signature = io_read_uint32_t(s); @@ -411,8 +411,8 @@ static void a3da_read_inner(a3da* a, stream* s) { stream _s; if (signature == reverse_endianness_int32_t('A3DA')) { f2_struct st; - f2_struct_sread(&st, s); - io_mopen(&_s, st.data, st.length); + f2_struct_read(&st, s); + io_open(&_s, st.data, st.length); a->format = A3DA_FORMAT_F2; f2_struct_free(&st); } @@ -420,7 +420,7 @@ static void a3da_read_inner(a3da* a, stream* s) { size_t length = s->length; void* data = force_malloc(length); io_read(s, data, length); - io_mopen(&_s, data, length); + io_open(&_s, data, length); free(data); } @@ -496,12 +496,14 @@ static void a3da_write_inner(a3da* a, stream* s) { stream s_a3da; stream* _s = s; if (a->format > A3DA_FORMAT_AFT) { - io_mopen(&s_a3da, 0, 0); + io_open(&s_a3da); _s = &s_a3da; } if (a3dc) { - a3dc_header header = {}; + a3dc_header header; + memset(&header, 0, sizeof(a3dc_header)); + header.string_offset = (uint32_t)0x40; header.string_length = (uint32_t)a3da_data_length; header.binary_offset = (uint32_t)(0x40 + align_val(a3da_data_length, 0x20)); @@ -534,10 +536,11 @@ static void a3da_write_inner(a3da* a, stream* s) { free(a3da_data); if (a->format > A3DA_FORMAT_AFT) { - f2_struct st = {}; + f2_struct st; + memset(&st, 0, sizeof(f2_struct)); io_align_write(&s_a3da, 0x10); - io_mcopy(&s_a3da, &st.data, &st.length); + io_copy(&s_a3da, &st.data, &st.length); io_free(&s_a3da); st.header.signature = reverse_endianness_uint32_t('A3DA'); @@ -546,7 +549,7 @@ static void a3da_write_inner(a3da* a, stream* s) { st.header.use_section_size = true; st.header.inner_signature = a->format == A3DA_FORMAT_XHD ? 0x00131010 : 0x01131010; - f2_struct_swrite(&st, s, true, a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD); + f2_struct_write(&st, s, true, a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD); f2_struct_free(&st); } } @@ -562,25 +565,24 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { size_t off; key_val kv; - key_val_init(&kv, (uint8_t*)data, length); + kv.parse((uint8_t*)data, length); key_val lkv; - if (key_val_get_local_key_val(&kv, "_", &lkv)) { + if (kv.get_local_key_val("_", &lkv)) { len = 1; memcpy(buf, "_", 1); off = len; - key_val_read_int32_t(&lkv, + lkv.read_int32_t( buf, off, ".compress_f16", 14, (int32_t*)&a->_compress_f16); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".converter.version", 19, &a->_converter_version); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".file_name", 11, &a->_file_name); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".property.version", 19, &a->_property_version); - key_val_free(&lkv); } - if (key_val_get_local_key_val(&kv, "camera_auxiliary", &lkv)) { + if (kv.get_local_key_val("camera_auxiliary", &lkv)) { a3da_camera_auxiliary* ca = &a->camera_auxiliary; len = 16; @@ -609,32 +611,30 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (ca->flags & (A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE | A3DA_CAMERA_AUXILIARY_GAMMA_RATE)) if (a->format < A3DA_FORMAT_F || a->format == A3DA_FORMAT_AFT) a->format = A3DA_FORMAT_F; - key_val_free(&lkv); } - if (key_val_get_local_key_val(&kv, "play_control", &lkv)) { + if (kv.get_local_key_val("play_control", &lkv)) { a3da_play_control* pc = &a->play_control; len = 12; memcpy(buf, "play_control", 12); off = len; - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".begin", 5, &pc->begin); - if (key_val_read_int32_t(&lkv, + if (lkv.read_int32_t( buf, off, ".div", 5, &pc->div)) enum_or(pc->flags, A3DA_PLAY_CONTROL_DIV); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".fps", 5, &pc->fps); - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".offset", 8, &pc->offset)) enum_or(pc->flags, A3DA_PLAY_CONTROL_OFFSET); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".size", 6, &pc->size); - key_val_free(&lkv); } - if (key_val_get_local_key_val(&kv, "post_process", &lkv)) { + if (kv.get_local_key_val("post_process", &lkv)) { a3da_post_process* pp = &a->post_process; len = 12; @@ -659,10 +659,9 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_rgba(&lkv, buf, off, ".Specular", 10, &pp->scene_fade)) enum_or(pp->flags, A3DA_POST_PROCESS_SCENE_FADE); - key_val_free(&lkv); } - if (key_val_get_local_key_val(&kv, "dof", &lkv)) { + if (kv.get_local_key_val("dof", &lkv)) { a3da_dof* d = &a->dof; len = 3; @@ -671,15 +670,14 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { d->has_dof = key_val_read_a3da_model_transform(&lkv, buf, off, "", 1, &d->model_transform); - key_val_free(&lkv); } len = 7; memcpy(buf, "ambient", 7); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "ambient", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("ambient", &lkv)) { std::vector& va = a->ambient; va.resize(count); @@ -691,21 +689,20 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_rgba(&lkv, buf, off, ".light.Diffuse", 15, &a->light_diffuse)) enum_or(a->flags, A3DA_AMBIENT_LIGHT_DIFFUSE); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &a->name); if (key_val_read_a3da_rgba(&lkv, buf, off, ".rim.light.Diffuse", 19, &a->rim_light_diffuse)) enum_or(a->flags, A3DA_AMBIENT_RIM_LIGHT_DIFFUSE); } - key_val_free(&lkv); } len = 7; memcpy(buf, "auth_2d", 7); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "auth_2d", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("auth_2d", &lkv)) { std::vector& va2 = a->auth_2d; va2.resize(count); @@ -714,18 +711,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, a2); } - key_val_free(&lkv); } len = 11; memcpy(buf, "camera_root", 11); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "camera_root", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("camera_root", &lkv)) { std::vector& vcr = a->camera_root; vcr.resize(count); @@ -745,21 +741,21 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { memcpy(buf + len + len1, ".view_point", 11); off = len + len1 + len2; - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".aspect", 8, &vp->aspect); memcpy(buf + len + len1 + len2, ".fov_is_horizontal", 19); - if (key_val_has_key(&lkv, buf)) { + if (lkv.has_key(buf)) { key_val_read_a3da_key(&lkv, buf, off, ".fov", 5, &vp->fov); - key_val_read_bool(&lkv, + lkv.read_bool( buf, off, ".fov_is_horizontal", 19, &vp->fov_is_horizontal); enum_or(vp->flags, A3DA_CAMERA_ROOT_VIEW_POINT_FOV); } else { - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".camera_aperture_h", 19, &vp->camera_aperture_h); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".camera_aperture_w", 19, &vp->camera_aperture_w); key_val_read_a3da_key(&lkv, buf, off, ".focal_length", 14, &vp->focal_length); @@ -770,15 +766,14 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { buf, off, ".roll", 6, &vp->roll)) enum_or(vp->flags, A3DA_CAMERA_ROOT_VIEW_POINT_ROLL); } - key_val_free(&lkv); } len = 5; memcpy(buf, "chara", 5); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "chara", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("chara", &lkv)) { std::vector& vc = a->chara; vc.resize(count); @@ -789,7 +784,7 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { key_val_read_a3da_model_transform(&lkv, buf, off, "", 1, &c->model_transform); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &c->name); } } @@ -798,8 +793,8 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { memcpy(buf, "curve", 5); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "curve", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("curve", &lkv)) { std::vector& vc = a->curve; vc.resize(count); @@ -810,18 +805,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { key_val_read_a3da_key(&lkv, buf, off, ".cv", 4, &c->curve); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &c->name); } - key_val_free(&lkv); } len = 5; memcpy(buf, "event", 5); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "event", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("event", &lkv)) { std::vector& ve = a->event; ve.resize(count); @@ -830,34 +824,33 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".begin", 7, &e->begin); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".clip_begin", 12, &e->clip_begin); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".clip_end", 10, &e->clip_end); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".end", 5, &e->end); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &e->name); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".param1", 8, &e->param_1); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".ref", 5, &e->ref); - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".time_ref_scale", 16, &e->time_ref_scale); - key_val_read_int32_t(&lkv, + lkv.read_int32_t( buf, off, ".type", 6, (int32_t*)&e->type); } - key_val_free(&lkv); } len = 3; memcpy(buf, "fog", 3); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "fog", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("fog", &lkv)) { std::vector& vf = a->fog; vf.resize(count); @@ -875,10 +868,10 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_key(&lkv, buf, off, ".end", 5, &f->end)) enum_or(f->flags, A3DA_FOG_END); - key_val_read_int32_t(&lkv, + lkv.read_int32_t( buf, off, ".id", 4, (int32_t*)&f->id); std::string name; - if (key_val_read_string(&lkv, + if (lkv.read_string( buf, off, ".name", 7, &name)) { if (str_utils_compare(name.c_str(), "Z")) f->id = FOG_DEPTH; @@ -889,15 +882,14 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { buf, off, ".start", 7, &f->start)) enum_or(f->flags, A3DA_FOG_START); } - key_val_free(&lkv); } len = 5; memcpy(buf, "light", 5); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "light", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("light", &lkv)) { std::vector& vl = a->light; vl.resize(count); @@ -924,7 +916,7 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_key(&lkv, buf, off, ".FAR", 5, &l->_far)) enum_or(l->flags, A3DA_LIGHT_FAR); - key_val_read_int32_t(&lkv, + lkv.read_int32_t( buf, off, ".id", 4, (int32_t*)&l->id); if (key_val_read_a3da_key(&lkv, buf, off, ".Intensity", 11, &l->intensity)) @@ -947,18 +939,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_rgba(&lkv, buf, off, ".Incandescence", 15, &l->tone_curve)) enum_or(l->flags, A3DA_LIGHT_TONE_CURVE); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".type", 6, &l->type); } - key_val_free(&lkv); } len = 8; memcpy(buf, "m_objhrc", 8); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "m_objhrc", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("m_objhrc", &lkv)) { std::vector& vmoh = a->m_object_hrc; vmoh.resize(count); @@ -973,8 +964,8 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { buf[off] = 0; key_val sub_local_key_val; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count1) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val) ) { + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val) ) { std::vector& voi = moh->instance; voi.resize(count1); @@ -986,20 +977,19 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { key_val_read_a3da_model_transform(&sub_local_key_val, buf, off, "", 1, &oi->model_transform); - key_val_read_string(&sub_local_key_val, + sub_local_key_val.read_string( buf, off, ".name", 6, &oi->name); - key_val_read_bool(&sub_local_key_val, + sub_local_key_val.read_bool( buf, off, ".shadow", 8, &oi->shadow); - key_val_read_string(&sub_local_key_val, + sub_local_key_val.read_string( buf, off, ".uid_name", 10, &oi->uid_name); } - key_val_free(&sub_local_key_val); } off = len + len1; key_val_read_a3da_model_transform(&lkv, buf, off, "", 1, &moh->model_transform); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &moh->name); len2 = 5; @@ -1007,8 +997,8 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { off = len + len1 + len2; buf[off] = 0; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count1) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { std::vector& vmohn = moh->node; vmohn.resize(count1); @@ -1018,28 +1008,26 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); off = len + len1 + len2 + len3; - if (key_val_read_vec3(&sub_local_key_val, + if (sub_local_key_val.read_vec3( buf, off, ".joint_orient", 14, &mohn->joint_orient)) enum_or(mohn->flags, A3DA_OBJECT_NODE_JOINT_ORIENT); key_val_read_a3da_model_transform(&sub_local_key_val, buf, off, "", 1, &mohn->model_transform); - key_val_read_string(&sub_local_key_val, + sub_local_key_val.read_string( buf, off, ".name", 6, &mohn->name); - key_val_read_int32_t(&sub_local_key_val, + sub_local_key_val.read_int32_t( buf, off, ".parent", 8, &mohn->parent); } - key_val_free(&sub_local_key_val); } } - key_val_free(&lkv); } len = 13; memcpy(buf, "m_objhrc_list", 13); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "m_objhrc_list", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("m_objhrc_list", &lkv)) { std::vector& vmohl = a->m_object_hrc_list; vmohl.resize(count); @@ -1048,18 +1036,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, "", 1, mohl); } - key_val_free(&lkv); } len = 13; memcpy(buf, "material_list", 13); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "material_list", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("material_list", &lkv)) { std::vector& vml = a->material_list; vml.resize(count); @@ -1077,18 +1064,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_rgba(&lkv, buf, off, ".incandescence", 15, &ml->incandescence)) enum_or(ml->flags, A3DA_MATERIAL_LIST_INCANDESCENCE); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &ml->name); } - key_val_free(&lkv); } len = 6; memcpy(buf, "motion", 6); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "motion", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("motion", &lkv)) { std::vector& vm = a->motion; vm.resize(count); @@ -1097,18 +1083,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, "", 1, m); } - key_val_free(&lkv); } len = 6; memcpy(buf, "object", 6); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "object", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("object", &lkv)) { std::vector& vo = a->object; vo.resize(count); @@ -1119,19 +1104,19 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { key_val_read_a3da_model_transform(&lkv, buf, off, "", 1, &o->model_transform); - if (key_val_read_string(&lkv, + if (lkv.read_string( buf, off, ".morph", 7, &o->morph)) - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".morph_offset", 14, &o->morph_offset); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &o->name); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".parent_name", 13, &o->parent_name); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".parent_node", 13, &o->parent_node); - if (key_val_read_string(&lkv, + if (lkv.read_string( buf, off, ".pat", 5, &o->pattern)) - key_val_read_float_t(&lkv, + lkv.read_float_t( buf, off, ".pat_offset", 12, &o->pattern_offset); len2 = 8; @@ -1140,8 +1125,8 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { buf[off] = 0; key_val sub_local_key_val; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count1) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { std::vector& votp = o->texture_pattern; votp.resize(count1); @@ -1151,14 +1136,13 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); off = len + len1 + len2 + len3; - key_val_read_string(&sub_local_key_val, + sub_local_key_val.read_string( buf, off, ".name", 6, &otp->name); - if (key_val_read_string(&sub_local_key_val, + if (sub_local_key_val.read_string( buf, off, ".pat", 5, &otp->pattern)) - key_val_read_float_t(&sub_local_key_val, + sub_local_key_val.read_float_t( buf, off, ".pat_offset", 12, &otp->pattern_offset); } - key_val_free(&sub_local_key_val); } len2 = 14; @@ -1166,8 +1150,8 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { off = len + len1 + len2; buf[off] = 0; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count1) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { std::vector& vott = o->texture_transform; vott.resize(count1); @@ -1183,7 +1167,7 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { if (key_val_read_a3da_key(&sub_local_key_val, buf, off, ".coverageV", 11, &ott->coverage_v)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_V); - key_val_read_string(&sub_local_key_val, + sub_local_key_val.read_string( buf, off, ".name", 6, &ott->name); if (key_val_read_a3da_key(&sub_local_key_val, buf, off, ".offsetU", 9, &ott->offset_u)) @@ -1210,22 +1194,20 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { buf, off, ".translateFrameV", 17, &ott->translate_frame_v)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_V); } - key_val_free(&sub_local_key_val); } off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".uid_name", 10, &o->uid_name); } - key_val_free(&lkv); } len = 6; memcpy(buf, "objhrc", 6); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "objhrc", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("objhrc", &lkv)) { std::vector& voh = a->object_hrc; voh.resize(count); @@ -1234,7 +1216,7 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &oh->name); len2 = 5; @@ -1243,8 +1225,8 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { buf[off] = 0; key_val sub_local_key_val; - if (key_val_read_int32_t(&lkv, buf, off, ".length", 8, &count1) - && key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { std::vector& vohn = oh->node; vohn.resize(count1); @@ -1254,38 +1236,36 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); off = len + len1 + len2 + len3; - if (key_val_read_vec3(&sub_local_key_val, + if (sub_local_key_val.read_vec3( buf, off, ".joint_orient", 14, &ohn->joint_orient)) enum_or(ohn->flags, A3DA_OBJECT_NODE_JOINT_ORIENT); key_val_read_a3da_model_transform(&sub_local_key_val, buf, off, "", 1, &ohn->model_transform); - key_val_read_string(&sub_local_key_val, + sub_local_key_val.read_string( buf, off, ".name", 6, &ohn->name); - key_val_read_int32_t(&sub_local_key_val, + sub_local_key_val.read_int32_t( buf, off, ".parent", 8, &ohn->parent); } - key_val_free(&sub_local_key_val); } off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".parent_name", 13, &oh->parent_name); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".parent_node", 13, &oh->parent_node); - key_val_read_bool(&lkv, + lkv.read_bool( buf, off, ".shadow", 8, &oh->shadow); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".uid_name", 10, &oh->uid_name); } - key_val_free(&lkv); } len = 11; memcpy(buf, "objhrc_list", 11); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "objhrc_list", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("objhrc_list", &lkv)) { std::vector& vohl = a->object_hrc_list; vohl.resize(count); @@ -1294,18 +1274,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, "", 1, ohl); } - key_val_free(&lkv); } len = 11; memcpy(buf, "object_list", 11); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "object_list", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("object_list", &lkv)) { std::vector& vol = a->object_list; vol.resize(count); @@ -1314,18 +1293,17 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, "", 1, ol); } - key_val_free(&lkv); } len = 5; memcpy(buf, "point", 5); off = len; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "point", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("point", &lkv)) { std::vector& vp = a->point; vp.resize(count); @@ -1336,13 +1314,10 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { key_val_read_a3da_model_transform(&lkv, buf, off, "", 1, &p->model_transform); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".name", 6, &p->name); } - key_val_free(&lkv); } - - key_val_free(&kv); } static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { @@ -1359,7 +1334,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { a3da_get_time_stamp(a3da_timestamp, 0x100); stream s; - io_mopen(&s, 0, 0); + io_open(&s); if (a3dc) { if (a->_compress_f16 != A3DA_COMPRESS_F32F32F32F32) @@ -1375,13 +1350,11 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { off = len; if (a3dc && a->format > A3DA_FORMAT_AFT) - key_val_write_int32_t(&s, buf, off, ".compress_f16", 14, a->_compress_f16); - key_val_write_string(&s, buf, off, ".converter.version", 19, &a->_converter_version); - key_val_write_string(&s, buf, off, ".file_name", 11, &a->_file_name); - key_val_write_string(&s, buf, off, ".property.version", 18, &a->_property_version); + key_val::write_int32_t(&s, buf, off, ".compress_f16", 14, a->_compress_f16); + key_val::write_string(&s, buf, off, ".converter.version", 19, &a->_converter_version); + key_val::write_string(&s, buf, off, ".file_name", 11, &a->_file_name); + key_val::write_string(&s, buf, off, ".property.version", 18, &a->_property_version); - vector_old_int32_t sort_index = vector_old_empty(int32_t); - vector_old_int32_t sort_index1 = vector_old_empty(int32_t); if (a->ambient.size() && a->format == A3DA_FORMAT_MGF) { len = 7; memcpy(buf, "ambient", 7); @@ -1389,24 +1362,25 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& va = a->ambient; count = (int32_t)va.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_ambient* a = &va[sort_index.begin[i]]; + a3da_ambient* a = &va[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; if (a->flags & A3DA_AMBIENT_LIGHT_DIFFUSE) key_val_write_a3da_rgba(&s, buf, off, ".light.Diffuse", 15, &a->light_diffuse); - key_val_write_string(&s, buf, off, ".name", 6, &a->name); + key_val::write_string(&s, buf, off, ".name", 6, &a->name); if (a->flags & A3DA_AMBIENT_RIM_LIGHT_DIFFUSE) key_val_write_a3da_rgba(&s, buf, off, ".rimlight.Diffuse", 18, &a->rim_light_diffuse); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->auth_2d.size()) { @@ -1416,18 +1390,19 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& va2 = a->auth_2d; count = (int32_t)va2.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string* a2 = &va2[sort_index.begin[i]]; + std::string* a2 = &va2[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, buf, off, ".name", 6, a2); + key_val::write_string(&s, buf, off, ".name", 6, a2); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->camera_auxiliary.flags) { @@ -1463,11 +1438,12 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vcr = a->camera_root; count = (int32_t)vcr.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_camera_root* cr = &vcr[sort_index.begin[i]]; + a3da_camera_root* cr = &vcr[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; key_val_write_a3da_model_transform(&s, @@ -1481,18 +1457,18 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { memcpy(buf + len + len1, ".view_point", 11); off = len + len1 + len2; - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".aspect", 8, vp->aspect); if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_FOV) { key_val_write_a3da_key(&s, buf, off, ".fov", 5, &vp->fov); - key_val_write_bool(&s, + key_val::write_bool(&s, buf, off, ".fov_is_horizontal", 19, vp->fov_is_horizontal); } else { - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".camera_aperture_h", 19, vp->camera_aperture_h); - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".camera_aperture_w", 19, vp->camera_aperture_w); key_val_write_a3da_key(&s, buf, off, ".focal_length", 14, &vp->focal_length); @@ -1511,7 +1487,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->chara.size() > 0) { @@ -1521,20 +1497,21 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vc = a->chara; count = (int32_t)vc.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_chara* c = &vc[sort_index.begin[i]]; + a3da_chara* c = &vc[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, buf, off, ".name", 6, &c->name); + key_val::write_string(&s, buf, off, ".name", 6, &c->name); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &c->model_transform, 0x1F); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->curve.size() > 0) { @@ -1544,19 +1521,20 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vc = a->curve; count = (int32_t)vc.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_curve* c = &vc[sort_index.begin[i]]; + a3da_curve* c = &vc[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; key_val_write_a3da_key(&s, buf, off, ".cv", 4, &c->curve); - key_val_write_string(&s, buf, off, ".name", 6, &c->name); + key_val::write_string(&s, buf, off, ".name", 6, &c->name); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->dof.has_dof && a->format == A3DA_FORMAT_AFT) { @@ -1566,7 +1544,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { a3da_dof* d = &a->dof; - key_val_write_string(&s, buf, off, ".name", 6, "DOF"); + key_val::write_string(&s, buf, off, ".name", 6, "DOF"); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &d->model_transform, 0x1F); } @@ -1578,26 +1556,27 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& ve = a->event; count = (int32_t)ve.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_event* e = &ve[sort_index.begin[i]]; + a3da_event* e = &ve[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_float_t(&s, buf, off, ".begin", 7, e->begin); - key_val_write_float_t(&s, buf, off, ".clip_begin", 12, e->clip_begin); - key_val_write_float_t(&s, buf, off, ".clip_en", 9, e->clip_end); - key_val_write_float_t(&s, buf, off, ".end", 5, e->end); - key_val_write_string(&s, buf, off, ".name", 6, &e->name); - key_val_write_string(&s, buf, off, ".param1", 8, &e->param_1); - key_val_write_string(&s, buf, off, ".ref", 5, &e->ref); - key_val_write_float_t(&s, buf, off, ".time_ref_scale", 16, e->time_ref_scale); - key_val_write_int32_t(&s, buf, off, ".type", 6, e->type); + key_val::write_float_t(&s, buf, off, ".begin", 7, e->begin); + key_val::write_float_t(&s, buf, off, ".clip_begin", 12, e->clip_begin); + key_val::write_float_t(&s, buf, off, ".clip_en", 9, e->clip_end); + key_val::write_float_t(&s, buf, off, ".end", 5, e->end); + key_val::write_string(&s, buf, off, ".name", 6, &e->name); + key_val::write_string(&s, buf, off, ".param1", 8, &e->param_1); + key_val::write_string(&s, buf, off, ".ref", 5, &e->ref); + key_val::write_float_t(&s, buf, off, ".time_ref_scale", 16, e->time_ref_scale); + key_val::write_int32_t(&s, buf, off, ".type", 6, e->type); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->fog.size() > 0) { @@ -1607,11 +1586,12 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vf = a->fog; count = (int32_t)vf.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_fog* f = &vf[sort_index.begin[i]]; + a3da_fog* f = &vf[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; if (f->flags & A3DA_FOG_COLOR) @@ -1620,13 +1600,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_a3da_key(&s, buf, off, ".density", 4, &f->density); if (f->flags & A3DA_FOG_END) key_val_write_a3da_key(&s, buf, off, ".end", 5, &f->end); - key_val_write_int32_t(&s, buf, off, ".id", 4, f->id); + key_val::write_int32_t(&s, buf, off, ".id", 4, f->id); if (f->flags & A3DA_FOG_START) key_val_write_a3da_key(&s, buf, off, ".start", 7, &f->start); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->light.size() > 0) { @@ -1638,11 +1618,12 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vl = a->light; count = (int32_t)vl.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_light* l = &vl[sort_index.begin[i]]; + a3da_light* l = &vl[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; if (l->flags & A3DA_LIGHT_AMBIENT) @@ -1678,7 +1659,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { if (l->flags & A3DA_LIGHT_SPECULAR) key_val_write_a3da_rgba(&s, buf, off, ".Specular", 10, &l->specular); - key_val_write_int32_t(&s, + key_val::write_int32_t(&s, buf, off, ".id", 4, l->id); const char* name = "none"; switch (l->id) { @@ -1701,7 +1682,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { name = "ToneCurve"; break; } - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, name); if (l->flags & A3DA_LIGHT_POSITION) key_val_write_a3da_model_transform(&s, @@ -1709,12 +1690,12 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { if (l->flags & A3DA_LIGHT_SPOT_DIRECTION) key_val_write_a3da_model_transform(&s, buf, off, ".spot_direction", 9, &l->spot_direction, 0x1F); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".type", 6, &l->type); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->m_object_hrc.size() > 0) { @@ -1724,11 +1705,12 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vmoh = a->m_object_hrc; count = (int32_t)vmoh.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_m_object_hrc* moh = &vmoh[sort_index.begin[i]]; + a3da_m_object_hrc* moh = &vmoh[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; len2 = 9; @@ -1737,37 +1719,38 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& voi = moh->instance; count1 = (int32_t)voi.size(); - key_val_get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count; j++) { - a3da_object_instance* oi = &voi[sort_index1.begin[i]]; + std::vector sort_index1; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + a3da_object_instance* oi = &voi[sort_index1[j]]; len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index.begin[j]); + A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); off = len + len1 + len2 + len3; key_val_write_a3da_model_transform(&s, buf, off, "", 1, &oi->model_transform, 0x10); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &oi->name); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &oi->model_transform, 0x0C); - key_val_write_bool(&s, + key_val::write_bool(&s, buf, off, ".shadow", 6, &oi->shadow); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &oi->model_transform, 0x02); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".uid_name", 10, &oi->uid_name); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &oi->model_transform, 0x01); } off = len + len1 + len2; - key_val_write_int32_t(&s, buf, off, ".length", 8, count1); + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); off = len + len1; key_val_write_a3da_model_transform(&s, buf, off, "", 1, &moh->model_transform, 0x10); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &moh->name); len2 = 5; @@ -1776,29 +1759,29 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vmohn = moh->node; count1 = (int32_t)vmohn.size(); - key_val_get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count; j++) { - a3da_object_node* mohn = &vmohn[sort_index1.begin[i]]; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + a3da_object_node* mohn = &vmohn[sort_index1[j]]; len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index.begin[j]); + A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); off = len + len1 + len2 + len3; key_val_write_a3da_model_transform(&s, buf, off, "", 1, &mohn->model_transform, 0x10); if (mohn->flags & A3DA_OBJECT_NODE_JOINT_ORIENT) - key_val_write_vec3(&s, + key_val::write_vec3(&s, buf, off, ".joint_orient", 14, &mohn->joint_orient); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &mohn->name); - key_val_write_int32_t(&s, + key_val::write_int32_t(&s, buf, off, ".parent", 8, mohn->parent); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &mohn->model_transform, 0x0F); } off = len + len1 + len2; - key_val_write_int32_t(&s, buf, off, ".length", 8, count1); + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); off = len + len1; key_val_write_a3da_model_transform(&s, @@ -1806,7 +1789,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->m_object_hrc_list.size() > 0) { @@ -1816,18 +1799,19 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vmohl = a->m_object_hrc_list; count = (int32_t)vmohl.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string* mohl = &vmohl[sort_index.begin[i]]; + std::string* mohl = &vmohl[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, buf, off, "", 1, mohl); + key_val::write_string(&s, buf, off, "", 1, mohl); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->material_list.size() > 0 && (a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD)) { @@ -1837,25 +1821,26 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vml = a->material_list; count = (int32_t)vml.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_material_list* ml = &vml[sort_index.begin[i]]; + a3da_material_list* ml = &vml[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) key_val_write_a3da_rgba(&s, buf, off, ".blend_color", 13, &ml->blend_color); if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) key_val_write_a3da_key(&s, buf, off, ".glow_intensity", 16, &ml->glow_intensity); - key_val_write_uint32_t(&s, buf, off, ".hash_name", 11, hash_string_murmurhash(&ml->name, 0, false)); + key_val::write_uint32_t(&s, buf, off, ".hash_name", 11, hash_string_murmurhash(&ml->name, 0, false)); if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) key_val_write_a3da_rgba(&s, buf, off, ".incandescence", 15, &ml->incandescence); - key_val_write_string(&s, buf, off, ".name", 6, &ml->name); + key_val::write_string(&s, buf, off, ".name", 6, &ml->name); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->motion.size() > 0) { @@ -1865,18 +1850,19 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vm = a->motion; count = (int32_t)vm.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string* m = &vm[sort_index.begin[i]]; + std::string* m = &vm[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, buf, off, "", 1, m); + key_val::write_string(&s, buf, off, "", 1, m); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->object.size() > 0) { @@ -1886,31 +1872,32 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vo = a->object; count = (int32_t)vo.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_object* o = &vo[sort_index.begin[i]]; + a3da_object* o = &vo[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; key_val_write_a3da_model_transform(&s, buf, off, "", 1, &o->model_transform, 0x10); if (o->morph.size()) { - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".morph", 7, &o->morph); - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".morph_offset", 14, o->morph_offset); } - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &o->name); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".parent_name", 13, &o->parent_name); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".parent_node", 13, &o->parent_node); if (o->pattern.size()) { - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".pat", 5, &o->pattern); - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".pat_offset", 12, o->pattern_offset); } key_val_write_a3da_model_transform(&s, @@ -1922,26 +1909,27 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& votp = o->texture_pattern; count1 = (int32_t)votp.size(); - key_val_get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count; j++) { - a3da_object_texture_pattern* otp = &votp[sort_index1.begin[i]]; + std::vector sort_index1; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + a3da_object_texture_pattern* otp = &votp[sort_index1[j]]; len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index.begin[j]); + A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); off = len + len1 + len2 + len3; - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &otp->name); if (otp->pattern.size()) { - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".pat", 5, &otp->pattern); - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".pat_offset", 12, otp->pattern_offset); } } off = len + len1 + len2; - key_val_write_int32_t(&s, buf, off, ".length", 8, count1); + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); len2 = 14; memcpy(buf + len + len1, ".tex_transform", 14); @@ -1949,12 +1937,12 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vott = o->texture_transform; count1 = (int32_t)vott.size(); - key_val_get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count; j++) { - a3da_object_texture_transform* ott = &vott[sort_index1.begin[i]]; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + a3da_object_texture_transform* ott = &vott[sort_index1[j]]; len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index.begin[j]); + A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); off = len + len1 + len2 + len3; if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_U) @@ -1963,7 +1951,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_V) key_val_write_a3da_key(&s, buf, off, ".coverageV", 11, &ott->coverage_v); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &ott->name); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_U) key_val_write_a3da_key(&s, @@ -1992,19 +1980,19 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { } off = len + len1 + len2; - key_val_write_int32_t(&s, buf, off, ".length", 8, count1); + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); off = len + len1; key_val_write_a3da_model_transform(&s, buf, off, "", 1, &o->model_transform, 0x02); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".uid_name", 10, &o->uid_name); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &o->model_transform, 0x01); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->object_list.size() > 0) { @@ -2014,18 +2002,19 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vol = a->object_list; count = (int32_t)vol.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string* ol = &vol[sort_index.begin[i]]; + std::string* ol = &vol[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, buf, off, "", 1, ol); + key_val::write_string(&s, buf, off, "", 1, ol); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->object_hrc.size() > 0) { @@ -2035,14 +2024,15 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& voh = a->object_hrc; count = (int32_t)voh.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - a3da_object_hrc* oh = &voh[sort_index.begin[i]]; + a3da_object_hrc* oh = &voh[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &oh->name); len2 = 5; @@ -2051,43 +2041,44 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vohn = oh->node; count1 = (int32_t)vohn.size(); - key_val_get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count; j++) { - a3da_object_node* ohn = &vohn[sort_index1.begin[i]]; + std::vector sort_index1; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + a3da_object_node* ohn = &vohn[sort_index1[j]]; len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index.begin[j]); + A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); off = len + len1 + len2 + len3; key_val_write_a3da_model_transform(&s, buf, off, "", 1, &ohn->model_transform, 0x10); if (ohn->flags & A3DA_OBJECT_NODE_JOINT_ORIENT) - key_val_write_vec3(&s, + key_val::write_vec3(&s, buf, off, ".joint_orient", 14, &ohn->joint_orient); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".name", 6, &ohn->name); - key_val_write_int32_t(&s, + key_val::write_int32_t(&s, buf, off, ".parent", 8, ohn->parent); key_val_write_a3da_model_transform(&s, buf, off, "", 1, &ohn->model_transform, 0x0F); } off = len + len1 + len2; - key_val_write_int32_t(&s, buf, off, ".length", 8, count1); + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); off = len + len1; - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".parent_name", 13, &oh->parent_name); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".parent_node", 13, &oh->parent_node); - key_val_write_bool(&s, + key_val::write_bool(&s, buf, off, ".shadow", 6, &oh->shadow); - key_val_write_string(&s, + key_val::write_string(&s, buf, off, ".uid_name", 10, &oh->uid_name); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (a->object_hrc_list.size() > 0) { @@ -2097,18 +2088,19 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vohl = a->object_hrc_list; count = (int32_t)vohl.size(); - key_val_get_lexicographic_order(&sort_index, count); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string* ohl = &vohl[sort_index.begin[i]]; + std::string* ohl = &vohl[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); off = len + len1; - key_val_write_string(&s, buf, off, "", 1, ohl); + key_val::write_string(&s, buf, off, "", 1, ohl); } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } { @@ -2118,26 +2110,26 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { memcpy(buf, "play_control", 12); off = len; - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".begin", 6, pc->begin); if (pc->flags & A3DA_PLAY_CONTROL_DIV && a->format > A3DA_FORMAT_AFT) - key_val_write_int32_t(&s, + key_val::write_int32_t(&s, buf, off, ".div", 5, pc->div); - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".fps", 5, pc->fps); if (pc->flags & A3DA_PLAY_CONTROL_OFFSET) { if (a->format > A3DA_FORMAT_AFT) { - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".offset", 8, pc->offset); - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".size", 6, pc->size); } else - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".size", 6, pc->size + pc->offset); } else - key_val_write_float_t(&s, + key_val::write_float_t(&s, buf, off, ".size", 6, pc->size); } @@ -2168,27 +2160,24 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { std::vector& vp = a->point; count = (int32_t)vp.size(); - key_val_get_lexicographic_order(&sort_index, count); - if (sort_index.begin) - for (int32_t i = 0; i < count; i++) { - a3da_point* p = &vp[sort_index.begin[i]]; + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); + for (int32_t i = 0; i < count; i++) { + a3da_point* p = &vp[sort_index[i]]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); - off = len + len1; + len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); + off = len + len1; - key_val_write_string(&s, buf, off, ".name", 6, &p->name); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, &p->model_transform, 0x1F); - } + key_val::write_string(&s, buf, off, ".name", 6, &p->name); + key_val_write_a3da_model_transform(&s, + buf, off, "", 1, &p->model_transform, 0x1F); + } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } - vector_old_int32_t_free(&sort_index1, 0); - vector_old_int32_t_free(&sort_index, 0); - - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } @@ -2361,7 +2350,7 @@ static void a3da_write_data(a3da* a, void** data, size_t* length) { a3da_compress_f16& _compress_f16 = a->_compress_f16; stream s; - io_mopen(&s, 0, 0); + io_open(&s); for (a3da_camera_root& i : a->camera_root) { a3dc_write_a3da_model_transform_offset(&s, &i.model_transform); @@ -2612,7 +2601,7 @@ static void a3da_write_data(a3da* a, void** data, size_t* length) { a3dc_write_a3da_model_transform_offset_data(&s, &i.model_transform); io_align_write(&s, 0x10); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } @@ -2641,51 +2630,40 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, offset += str_add_len - 1; key_val lkv; - if (!key_val_get_local_key_val(kv, buf, &lkv)) + if (!kv->get_local_key_val(buf, &lkv)) return false; - else if (key_val_read_int32_t(&lkv, buf, offset, ".bin_offset", 12, &value->bin_offset)) { + else if (lkv.read_int32_t(buf, offset, ".bin_offset", 12, &value->bin_offset)) { value->flags = A3DA_KEY_BIN_OFFSET; - key_val_free(&lkv); return true; } - else if (!key_val_read_int32_t(&lkv, buf, offset, ".type", 6, (int32_t*)&value->type)) { - key_val_free(&lkv); + else if (!lkv.read_int32_t(buf, offset, ".type", 6, (int32_t*)&value->type)) return false; - } - if (value->type == A3DA_KEY_NONE) { - key_val_free(&lkv); + if (value->type == A3DA_KEY_NONE) return true; - } else if (value->type == A3DA_KEY_STATIC) { - key_val_read_float_t(&lkv, buf, offset, ".value", 7, &value->value); - key_val_free(&lkv); + lkv.read_float_t(buf, offset, ".value", 7, &value->value); return true; } - key_val_read_int32_t(&lkv, buf, offset, + lkv.read_int32_t(buf, offset, ".ep_type_post", 14, (int32_t*)&value->ep_type_post); - key_val_read_int32_t(&lkv, buf, offset, + lkv.read_int32_t(buf, offset, ".ep_type_pre", 13, (int32_t*)&value->ep_type_pre); - key_val_read_float_t(&lkv, buf, offset, ".max", 5, &value->max_frame); + lkv.read_float_t(buf, offset, ".max", 5, &value->max_frame); - if (key_val_read_a3da_key_raw_data(&lkv, buf, offset, value)) { - key_val_free(&lkv); + if (key_val_read_a3da_key_raw_data(&lkv, buf, offset, value)) return true; - } memcpy(buf + offset, ".key", 5); offset += 4; key_val sub_local_key_val; - if (!key_val_get_local_key_val(&lkv, buf, &sub_local_key_val)) { - key_val_free(&lkv); + if (!lkv.get_local_key_val(buf, &sub_local_key_val)) return false; - } - key_val_free(&lkv); int32_t length = 0; - key_val_read_int32_t(&sub_local_key_val, buf, offset, ".length", 8, &length); + sub_local_key_val.read_int32_t(buf, offset, ".length", 8, &length); value->keys.reserve(length); kft3 k = { 0.0f, 0.0f, 0.0f, 0.0f }; @@ -2696,8 +2674,8 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, char* data; int32_t type = 0; - key_val_read_string(&sub_local_key_val, buf, offset, ".data", 6, &data); - key_val_read_int32_t(&sub_local_key_val, buf, offset, ".type", 6, &type); + sub_local_key_val.read_string(buf, offset, ".data", 6, &data); + sub_local_key_val.read_int32_t(buf, offset, ".type", 6, &type); switch (type) { case 0: { @@ -2744,7 +2722,6 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, } break; } } - key_val_free(&sub_local_key_val); return true; } @@ -2754,27 +2731,27 @@ static void key_val_write_a3da_key(stream* s, char* buf, offset += str_add_len - 1; if (value->flags & A3DA_KEY_BIN_OFFSET) { - key_val_write_int32_t(s, buf, offset, ".bin_offset", 12, value->bin_offset); + key_val::write_int32_t(s, buf, offset, ".bin_offset", 12, value->bin_offset); value->flags, ~A3DA_KEY_BIN_OFFSET; value->bin_offset = 0; return; } if (value->type == A3DA_KEY_NONE) { - key_val_write_int32_t(s, buf, offset, ".type", 6, 0);; + key_val::write_int32_t(s, buf, offset, ".type", 6, 0);; return; } else if (value->type == A3DA_KEY_STATIC) { - key_val_write_int32_t(s, buf, offset, ".type", 6, 1); - key_val_write_float_t(s, buf, offset, ".value", 7, value->value); + key_val::write_int32_t(s, buf, offset, ".type", 6, 1); + key_val::write_float_t(s, buf, offset, ".value", 7, value->value); return; } if (value->ep_type_post != A3DA_EP_NONE) - key_val_write_int32_t(s, buf, offset, + key_val::write_int32_t(s, buf, offset, ".ep_type_post", 14, value->ep_type_post); if (value->ep_type_pre != A3DA_EP_NONE) - key_val_write_int32_t(s, buf, offset, + key_val::write_int32_t(s, buf, offset, ".ep_type_pre", 13, value->ep_type_pre); if (value->raw_data) { @@ -2787,67 +2764,65 @@ static void key_val_write_a3da_key(stream* s, char* buf, int32_t length = (int32_t)value->keys.size(); - vector_old_int32_t sort_index = vector_old_empty(int32_t); - key_val_get_lexicographic_order(&sort_index, length); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, length); size_t len = offset; - if (sort_index.begin) - for (int32_t i = 0; i < length; i++) { - size_t len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); - offset = len + len1; + for (int32_t i = 0; i < length; i++) { + size_t len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); + offset = len + len1; - kft3 k = value->keys[sort_index.begin[i]]; - kf_type kt = KEY_FRAME_TYPE_3; - kft_check(&k, kt, &k, &kt); + kft3 k = value->keys[sort_index[i]]; + kf_type kt = KEY_FRAME_TYPE_3; + kft_check(&k, kt, &k, &kt); - char data_buf[0x200]; - switch (kt) { - case KEY_FRAME_TYPE_0: - sprintf_s(data_buf, sizeof(data_buf), "%g", - k.frame); - break; - case KEY_FRAME_TYPE_1: - sprintf_s(data_buf, sizeof(data_buf), "(%g,%g)", - k.frame, k.value); - break; - case KEY_FRAME_TYPE_2: - sprintf_s(data_buf, sizeof(data_buf), "(%g,%g,%g)", - k.frame, k.value, k.tangent1); - break; - case KEY_FRAME_TYPE_3: - sprintf_s(data_buf, sizeof(data_buf), "(%g,%g,%g,%g)", - k.frame, k.value, k.tangent1, k.tangent2); - break; - } - - key_val_write_string(s, buf, offset, ".data", 6, data_buf); - key_val_write_int32_t(s, buf, offset, ".type", 6, kt); + char data_buf[0x200]; + switch (kt) { + case KEY_FRAME_TYPE_0: + sprintf_s(data_buf, sizeof(data_buf), "%g", + k.frame); + break; + case KEY_FRAME_TYPE_1: + sprintf_s(data_buf, sizeof(data_buf), "(%g,%g)", + k.frame, k.value); + break; + case KEY_FRAME_TYPE_2: + sprintf_s(data_buf, sizeof(data_buf), "(%g,%g,%g)", + k.frame, k.value, k.tangent1); + break; + case KEY_FRAME_TYPE_3: + sprintf_s(data_buf, sizeof(data_buf), "(%g,%g,%g,%g)", + k.frame, k.value, k.tangent1, k.tangent2); + break; } - vector_old_int32_t_free(&sort_index, 0); + + key_val::write_string(s, buf, offset, ".data", 6, data_buf); + key_val::write_int32_t(s, buf, offset, ".type", 6, kt); + } offset = len; - key_val_write_int32_t(s, buf, offset, ".length", 8, length); + key_val::write_int32_t(s, buf, offset, ".length", 8, length); offset -= 4; - key_val_write_float_t(s, buf, offset, ".max", 5, value->max_frame); - key_val_write_int32_t(s, buf, offset, ".type", 6, value->type); + key_val::write_float_t(s, buf, offset, ".max", 5, value->max_frame); + key_val::write_int32_t(s, buf, offset, ".type", 6, value->type); } static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, size_t offset, a3da_key* value) { int32_t key_type = 0; - if (!key_val_read_int32_t(kv, buf, offset, ".raw_data_key_type", 19, &key_type)) + if (!kv->read_int32_t(buf, offset, ".raw_data_key_type", 19, &key_type)) return false; char* value_type; - key_val_read_string(kv, buf, offset, ".raw_data.value_type", 21, &value_type); + kv->read_string(buf, offset, ".raw_data.value_type", 21, &value_type); if (str_utils_compare(value_type, "float")) return false; int32_t value_list_size = 0; - key_val_read_int32_t(kv, buf, offset, ".raw_data.value_list_size", 26, &value_list_size); + kv->read_int32_t(buf, offset, ".raw_data.value_list_size", 26, &value_list_size); int32_t value_list_offset = 0; - if (key_val_read_int32_t(kv, buf, offset, ".raw_data.value_list_offset", 28, &value_list_offset)) { + if (kv->read_int32_t( buf, offset, ".raw_data.value_list_offset", 28, &value_list_offset)) { if (key_type != 3) return false; @@ -2859,7 +2834,7 @@ static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, } char* value_list; - key_val_read_string(kv, buf, offset, ".raw_data.value_list", 21, &value_list); + kv->read_string( buf, offset, ".raw_data.value_list", 21, &value_list); char* s = value_list; size_t c = 1; @@ -2939,17 +2914,17 @@ static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, static void key_val_write_a3da_key_raw_data(stream* s, char* buf, size_t offset, a3da_key* value) { - key_val_write_float_t(s, buf, offset, ".max", 5, value->max_frame); + key_val::write_float_t(s, buf, offset, ".max", 5, value->max_frame); int32_t length = (int32_t)value->keys.size(); if (value->raw_data_binary) { - key_val_write_int32_t(s, buf, offset, ".raw_data.value_list_offset", 6, + key_val::write_int32_t(s, buf, offset, ".raw_data.value_list_offset", 6, value->raw_data_value_list_offset); - key_val_write_int32_t(s, buf, offset, ".raw_data.value_list_size", 26, + key_val::write_int32_t(s, buf, offset, ".raw_data.value_list_size", 26, value->raw_data_value_list_size); - key_val_write_string(s, buf, offset, ".raw_data.value_type", 21, "float"); - key_val_write_int32_t(s, buf, offset, ".raw_data_key_type", 19, 3); - key_val_write_int32_t(s, buf, offset, ".type", 6, value->type); + key_val::write_string(s, buf, offset, ".raw_data.value_type", 21, "float"); + key_val::write_int32_t(s, buf, offset, ".raw_data_key_type", 19, 3); + key_val::write_int32_t(s, buf, offset, ".type", 6, value->type); return; } @@ -3012,11 +2987,11 @@ static void key_val_write_a3da_key_raw_data(stream* s, char* buf, } io_write_char(s, '\n'); - key_val_write_int32_t(s, buf, offset, ".raw_data.value_list_size", 26, + key_val::write_int32_t(s, buf, offset, ".raw_data.value_list_size", 26, (int32_t)(length * ((size_t)key_type + 1))); - key_val_write_string(s, buf, offset, ".raw_data.value_type", 21, "float"); - key_val_write_int32_t(s, buf, offset, ".raw_data_key_type", 19, key_type); - key_val_write_int32_t(s, buf, offset, ".type", 6, value->type); + key_val::write_string(s, buf, offset, ".raw_data.value_type", 21, "float"); + key_val::write_int32_t(s, buf, offset, ".raw_data_key_type", 19, key_type); + key_val::write_int32_t(s, buf, offset, ".type", 6, value->type); } static bool key_val_read_a3da_model_transform(key_val* kv, char* buf, @@ -3026,12 +3001,11 @@ static bool key_val_read_a3da_model_transform(key_val* kv, char* buf, offset += str_add_len - 1; key_val lkv; - if (!key_val_get_local_key_val(kv, buf, &lkv)) + if (!kv->get_local_key_val(buf, &lkv)) return false; - else if (key_val_read_int32_t(&lkv, buf, offset, + else if (lkv.read_int32_t(buf, offset, ".model_transform.bin_offset", 28, &value->bin_offset)) { value->flags = A3DA_MODEL_TRANSFORM_BIN_OFFSET; - key_val_free(&lkv); return true; } @@ -3039,7 +3013,6 @@ static bool key_val_read_a3da_model_transform(key_val* kv, char* buf, key_val_read_a3da_vec3(&lkv, buf, offset, ".scale", 7, &value->scale); key_val_read_a3da_vec3(&lkv, buf, offset, ".trans", 7, &value->translation); key_val_read_a3da_key(&lkv, buf, offset,".visibility", 12, &value->visibility); - key_val_free(&lkv); return true; } @@ -3050,7 +3023,7 @@ static void key_val_write_a3da_model_transform(stream* s, char* buf, if (value->flags & A3DA_MODEL_TRANSFORM_BIN_OFFSET) { if (write_mask & 0x10) { - key_val_write_int32_t(s, buf, offset, + key_val::write_int32_t(s, buf, offset, ".model_transform.bin_offset", 28, value->bin_offset); } if (write_mask & 0x01) @@ -3077,7 +3050,7 @@ static bool key_val_read_a3da_rgba(key_val* kv, char* buf, offset += str_add_len - 1; key_val lkv; - if (!key_val_get_local_key_val(kv, buf, &lkv)) + if (!kv->get_local_key_val(buf, &lkv)) return false; if (key_val_read_a3da_key(&lkv, buf, offset, ".r", 3, &value->r)) @@ -3088,7 +3061,6 @@ static bool key_val_read_a3da_rgba(key_val* kv, char* buf, enum_or(value->flags, A3DA_RGBA_B); if (key_val_read_a3da_key(&lkv, buf, offset, ".a", 3, &value->a)) enum_or(value->flags, A3DA_RGBA_A); - key_val_free(&lkv); return true; } @@ -3116,13 +3088,12 @@ static bool key_val_read_a3da_vec3(key_val* kv, char* buf, offset += str_add_len - 1; key_val lkv; - if (!key_val_get_local_key_val(kv, buf, &lkv)) + if (!kv->get_local_key_val(buf, &lkv)) return false; key_val_read_a3da_key(&lkv, buf, offset, ".x", 3, &value->x); key_val_read_a3da_key(&lkv, buf, offset, ".y", 3, &value->y); key_val_read_a3da_key(&lkv, buf, offset, ".z", 3, &value->z); - key_val_free(&lkv); return true; } @@ -3279,7 +3250,8 @@ static void a3dc_write_a3da_key_f16(stream* s, a3da_key* value, a3da_compress_f1 uint32_t len = (uint32_t)value->keys.size(); - a3dc_key_header head = {}; + a3dc_key_header head; + memset(&head, 0, sizeof(a3dc_key_header)); head.type = value->type; head.ep_type_pre = value->ep_type_pre; head.ep_type_post = value->ep_type_post; diff --git a/src/KKdLib/a3da.h b/src/KKdLib/a3da.h index 3bb64b99..0610a3e2 100644 --- a/src/KKdLib/a3da.h +++ b/src/KKdLib/a3da.h @@ -538,12 +538,12 @@ public: a3da(); ~a3da(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); void write(void** data, size_t* length); - static bool load_file(void* data, char* path, char* file, uint32_t hash); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/database/auth_3d.c b/src/KKdLib/database/auth_3d.c index a97e643f..414e9340 100644 --- a/src/KKdLib/database/auth_3d.c +++ b/src/KKdLib/database/auth_3d.c @@ -30,7 +30,7 @@ auth_3d_database_file::~auth_3d_database_file() { } -void auth_3d_database_file::read(char* path) { +void auth_3d_database_file::read(const char* path) { if (!path) return; @@ -45,14 +45,14 @@ void auth_3d_database_file::read(char* path) { free(path_bin); } -void auth_3d_database_file::read(wchar_t* path) { +void auth_3d_database_file::read(const wchar_t* path) { if (!path) return; wchar_t* path_bin = str_utils_wadd(path, L".bin"); - if (path_wcheck_file_exists(path_bin)) { + if (path_check_file_exists(path_bin)) { stream s; - io_wopen(&s, path_bin, L"rb"); + io_open(&s, path_bin, L"rb"); if (s.io.stream) auth_3d_database_file_read_inner(this, &s); io_free(&s); @@ -60,17 +60,17 @@ void auth_3d_database_file::read(wchar_t* path) { free(path_bin); } -void auth_3d_database_file::read(void* data, size_t length) { +void auth_3d_database_file::read(const void* data, size_t length) { if (!data || !length) return; stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); auth_3d_database_file_read_inner(this, &s); io_free(&s); } -void auth_3d_database_file::write(char* path) { +void auth_3d_database_file::write(const char* path) { if (!path || !ready) return; @@ -83,13 +83,13 @@ void auth_3d_database_file::write(char* path) { free(path_bin); } -void auth_3d_database_file::write(wchar_t* path) { +void auth_3d_database_file::write(const wchar_t* path) { if (!path || !ready) return; wchar_t* path_bin = str_utils_wadd(path, L".bin"); stream s; - io_wopen(&s, path_bin, L"wb"); + io_open(&s, path_bin, L"wb"); if (s.io.stream) auth_3d_database_file_write_inner(this, &s); io_free(&s); @@ -101,16 +101,16 @@ void auth_3d_database_file::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); auth_3d_database_file_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -bool auth_3d_database_file::load_file(void* data, char* path, char* file, uint32_t hash) { +bool auth_3d_database_file::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -314,16 +314,16 @@ static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_fi size_t off; key_val kv; - key_val_init(&kv, (uint8_t*)data, length); + kv.parse((uint8_t*)data, length); key_val lkv; len = 8; memcpy(buf, "category", 8); off = len; - auth_3d_db_file->category = vector_old_empty(string); - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "category", &lkv)) { + auth_3d_db_file->category.clear(); + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("category", &lkv)) { std::vector& vc = auth_3d_db_file->category; vc.resize(count); @@ -332,22 +332,21 @@ static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_fi len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".value", 7, c); } - key_val_free(&lkv); } len = 3; memcpy(buf, "uid", 3); off = len; - auth_3d_db_file->uid = vector_old_empty(auth_3d_database_uid_file); - if (!key_val_read_int32_t(&kv, buf, off, ".max", 5, &auth_3d_db_file->uid_max)) + auth_3d_db_file->uid.clear(); + if (!kv.read_int32_t(buf, off, ".max", 5, &auth_3d_db_file->uid_max)) auth_3d_db_file->uid_max = -1; - if (key_val_read_int32_t(&kv, buf, off, ".length", 8, &count) - && key_val_get_local_key_val(&kv, "uid", &lkv)) { + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("uid", &lkv)) { std::vector& vu = auth_3d_db_file->uid; vu.resize(count); @@ -356,21 +355,18 @@ static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_fi len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", i); off = len + len1; - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".category", 10, &u->category); - if (key_val_read_int32_t(&lkv, + if (lkv.read_int32_t( buf, off, ".org_uid", 9, &u->org_uid)) enum_or(u->flags, AUTH_3D_DATABASE_UID_ORG_UID); - if (key_val_read_float_t(&lkv, + if (lkv.read_float_t( buf, off, ".size", 6, &u->size)) enum_or(u->flags, AUTH_3D_DATABASE_UID_SIZE); - key_val_read_string(&lkv, + lkv.read_string( buf, off, ".value", 7, &u->value); } - key_val_free(&lkv); } - - key_val_free(&kv); } static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* length) { @@ -381,12 +377,11 @@ static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_f size_t off; stream s; - io_mopen(&s, 0, 0); + io_open(&s); io_write(&s, "#A3DA__________\n", 16); io_write(&s, "# date time was eliminated.\n", 28); - vector_old_int32_t sort_index = vector_old_empty(int32_t); if (auth_3d_db_file->category.size() > 0) { len = 8; memcpy(buf, "category", 8); @@ -394,19 +389,19 @@ static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_f std::vector& vc = auth_3d_db_file->category; count = (int32_t)vc.size(); - key_val_get_lexicographic_order(&sort_index, count); - if (sort_index.begin) - for (int32_t i = 0; i < count; i++) { - std::string* c = &vc[sort_index.begin[i]]; + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); + for (int32_t i = 0; i < count; i++) { + std::string* c = &vc[sort_index[i]]; - len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); - off = len + len1; + len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); + off = len + len1; - key_val_write_string(&s, buf, off, ".value", 7, c); - } + key_val::write_string(&s, buf, off, ".value", 7, c); + } off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); } if (auth_3d_db_file->uid.size() > 0) { @@ -417,35 +412,33 @@ static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_f int32_t uid_max = -1; std::vector& vu = auth_3d_db_file->uid; count = (int32_t)vu.size(); - key_val_get_lexicographic_order(&sort_index, count); - if (sort_index.begin) - for (int32_t i = 0; i < count; i++) { - auth_3d_database_uid_file* u = &vu[sort_index.begin[i]]; + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); + for (int32_t i = 0; i < count; i++) { + auth_3d_database_uid_file* u = &vu[sort_index[i]]; - len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", sort_index.begin[i]); - off = len + len1; + len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); + off = len + len1; - key_val_write_string(&s, buf, off, ".category", 10, &u->category); - if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_ORG_UID)) - key_val_write_int32_t(&s, buf, off, ".org_uid", 9, u->org_uid); - if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_SIZE)) - key_val_write_float_t(&s, buf, off, ".size", 6, u->size); - key_val_write_string(&s, buf, off, ".value", 7, &u->value); + key_val::write_string(&s, buf, off, ".category", 10, &u->category); + if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_ORG_UID)) + key_val::write_int32_t(&s, buf, off, ".org_uid", 9, u->org_uid); + if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_SIZE)) + key_val::write_float_t(&s, buf, off, ".size", 6, u->size); + key_val::write_string(&s, buf, off, ".value", 7, &u->value); - if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_ORG_UID) && u->org_uid > uid_max) - uid_max = u->org_uid; - } + if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_ORG_UID) && u->org_uid > uid_max) + uid_max = u->org_uid; + } if (uid_max == 0) uid_max = count; off = len; - key_val_write_int32_t(&s, buf, off, ".length", 8, count); - key_val_write_int32_t(&s, buf, off, ".max", 5, uid_max); + key_val::write_int32_t(&s, buf, off, ".length", 8, count); + key_val::write_int32_t(&s, buf, off, ".max", 5, uid_max); } - vector_old_int32_t_free(&sort_index, 0); - - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } diff --git a/src/KKdLib/database/auth_3d.h b/src/KKdLib/database/auth_3d.h index 11c35a33..93fa194d 100644 --- a/src/KKdLib/database/auth_3d.h +++ b/src/KKdLib/database/auth_3d.h @@ -58,14 +58,14 @@ public: auth_3d_database_file(); ~auth_3d_database_file(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); void write(void** data, size_t* length); - static bool load_file(void* data, char* path, char* file, uint32_t hash); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; class auth_3d_database { diff --git a/src/KKdLib/database/bone.c b/src/KKdLib/database/bone.c index 1c1abd08..ccf38b48 100644 --- a/src/KKdLib/database/bone.c +++ b/src/KKdLib/database/bone.c @@ -19,26 +19,24 @@ typedef struct bone_database_skeleton_header { ssize_t parent_indices_offset; } bone_database_skeleton_header; -vector_old_func(bone_database_bone) -vector_old_func(bone_database_skeleton) - static void bone_database_classic_read_inner(bone_database* bone_data, stream* s); static void bone_database_classic_write_inner(bone_database* bone_data, stream* s); static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, uint32_t header_length); static void bone_database_modern_write_inner(bone_database* bone_data, stream* s); -static ssize_t bone_database_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, char* str); -static ssize_t bone_database_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, const char* str); -static bool bone_database_strings_push_back_check(vector_old_string* vec, char* str); -static bool bone_database_strings_push_back_check(vector_old_string* vec, const char* str); +static ssize_t bone_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, const char* str); +static bool bone_database_strings_push_back_check(std::vector& vec, const char* str); + +bone_database::bone_database() : ready(), modern(), is_x() { -void bone_database_init(bone_database* bone_data) { - memset(bone_data, 0, sizeof(bone_database)); } -void bone_database_read(bone_database* bone_data, char* path, bool modern) { - if (!bone_data || !path) +bone_database::~bone_database() { + +} + +void bone_database::read(const char* path, bool modern) { + if (!path) return; if (!modern) { @@ -50,8 +48,8 @@ void bone_database_read(bone_database* bone_data, char* path, bool modern) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); - bone_database_classic_read_inner(bone_data, &s_bin); + io_open(&s_bin, data, s.length); + bone_database_classic_read_inner(this, &s_bin); io_free(&s_bin); free(data); } @@ -66,9 +64,9 @@ void bone_database_read(bone_database* bone_data, char* path, bool modern) { f2_struct_read(&st, path_bon); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; - io_mopen(&s_bone, st.data, st.length); + io_open(&s_bone, st.data, st.length); s_bone.is_big_endian = st.header.use_big_endian; - bone_database_modern_read_inner(bone_data, &s_bone, st.header.length); + bone_database_modern_read_inner(this, &s_bone, st.header.length); io_free(&s_bone); } f2_struct_free(&st); @@ -77,21 +75,21 @@ void bone_database_read(bone_database* bone_data, char* path, bool modern) { } } -void bone_database_wread(bone_database* bone_data, wchar_t* path, bool modern) { - if (!bone_data || !path) +void bone_database::read(const wchar_t* path, bool modern) { + if (!path) return; if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); - if (path_wcheck_file_exists(path_bin)) { + if (path_check_file_exists(path_bin)) { stream s; - io_wopen(&s, path_bin, L"rb"); + io_open(&s, path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); - bone_database_classic_read_inner(bone_data, &s_bin); + io_open(&s_bin, data, s.length); + bone_database_classic_read_inner(this, &s_bin); io_free(&s_bin); free(data); } @@ -101,14 +99,14 @@ void bone_database_wread(bone_database* bone_data, wchar_t* path, bool modern) { } else { wchar_t* path_bon = str_utils_wadd(path, L".bon"); - if (path_wcheck_file_exists(path_bon)) { + if (path_check_file_exists(path_bon)) { f2_struct st; - f2_struct_wread(&st, path_bon); + f2_struct_read(&st, path_bon); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; - io_mopen(&s_bone, st.data, st.length); + io_open(&s_bone, st.data, st.length); s_bone.is_big_endian = st.header.use_big_endian; - bone_database_modern_read_inner(bone_data, &s_bone, st.header.length); + bone_database_modern_read_inner(this, &s_bone, st.header.length); io_free(&s_bone); } f2_struct_free(&st); @@ -117,40 +115,40 @@ void bone_database_wread(bone_database* bone_data, wchar_t* path, bool modern) { } } -void bone_database_mread(bone_database* bone_data, void* data, size_t length, bool modern) { - if (!bone_data || !data || !length) +void bone_database::read(const void* data, size_t length, bool modern) { + if (!data || !length) return; if (!modern) { stream s; - io_mopen(&s, data, length); - bone_database_classic_read_inner(bone_data, &s); + io_open(&s, data, length); + bone_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - f2_struct_mread(&st, data, length); + f2_struct_read(&st, data, length); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; - io_mopen(&s_bone, st.data, st.length); + io_open(&s_bone, st.data, st.length); s_bone.is_big_endian = st.header.use_big_endian; - bone_database_modern_read_inner(bone_data, &s_bone, st.header.length); + bone_database_modern_read_inner(this, &s_bone, st.header.length); io_free(&s_bone); } f2_struct_free(&st); } } -void bone_database_write(bone_database* bone_data, char* path) { - if (!bone_data || !path || !bone_data->ready) +void bone_database::write(const char* path) { + if (!path || !ready) return; - if (!bone_data->modern) { + if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; io_open(&s, path_bin, "wb"); if (s.io.stream) - bone_database_classic_write_inner(bone_data, &s); + bone_database_classic_write_inner(this, &s); io_free(&s); free(path_bin); } @@ -159,55 +157,209 @@ void bone_database_write(bone_database* bone_data, char* path) { stream s; io_open(&s, path_bon, "wb"); if (s.io.stream) - bone_database_modern_write_inner(bone_data, &s); + bone_database_modern_write_inner(this, &s); io_free(&s); free(path_bon); } } -void bone_database_wwrite(bone_database* bone_data, wchar_t* path) { - if (!bone_data || !path || !bone_data->ready) +void bone_database::write(const wchar_t* path) { + if (!path || !ready) return; - if (!bone_data->modern) { + if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); stream s; - io_wopen(&s, path_bin, L"wb"); + io_open(&s, path_bin, L"wb"); if (s.io.stream) - bone_database_classic_write_inner(bone_data, &s); + bone_database_classic_write_inner(this, &s); io_free(&s); free(path_bin); } else { wchar_t* path_bon = str_utils_wadd(path, L".bon"); stream s; - io_wopen(&s, path_bon, L"wb"); + io_open(&s, path_bon, L"wb"); if (s.io.stream) - bone_database_modern_write_inner(bone_data, &s); + bone_database_modern_write_inner(this, &s); io_free(&s); free(path_bon); } } -void bone_database_mwrite(bone_database* bone_data, void** data, size_t* length) { - if (!bone_data || !data || !bone_data->ready) +void bone_database::write(void** data, size_t* length) { + if (!data || !ready) return; stream s; - io_mopen(&s, 0, 0); - if (!bone_data->modern) - bone_database_classic_write_inner(bone_data, &s); + io_open(&s); + if (!modern) + bone_database_classic_write_inner(this, &s); else - bone_database_modern_write_inner(bone_data, &s); + bone_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -bool bone_database_load_file(void* data, char* path, char* file, uint32_t hash) { +bool bone_database::get_skeleton(const char* name, bone_database_skeleton** skeleton) { + if (!skeleton) + return false; + + *skeleton = 0; + if ( !name) + return false; + + for (bone_database_skeleton& i : this->skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *skeleton = &i; + return true; + } + return false; +} + +int32_t bone_database::get_skeleton_bone_index(const char* name, const char* bone_name) { + if (!name || !bone_name) + return -1; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + for (bone_database_bone& j : i.bone) + if (!str_utils_compare(j.name.c_str(), bone_name)) + return (int32_t)(&j - i.bone.data()); + return -1; + } + return -1; +} + +bool bone_database::get_skeleton_bones(const char* name, std::vector** bone) { + if (!bone) + return false; + + *bone = 0; + if (!name) + return false; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *bone = &i.bone; + return true; + } + return false; +} + +bool bone_database::get_skeleton_positions(const char* name, std::vector** positions) { + if (!positions) + return false; + + *positions = 0; + if (!name) + return false; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *positions = &i.position; + return true; + } + return false; +} + +int32_t bone_database::get_skeleton_object_bone_index(const char* name, char* bone_name) { + if (!name || !bone_name) + return -1; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + for (std::string& j : i.object_bone) + if (!str_utils_compare(j.c_str(), bone_name)) + return (int32_t)(&j - i.object_bone.data()); + return -1; + } + return -1; +} + +bool bone_database::get_skeleton_object_bones(const char* name, std::vector** object_bones) { + if (!object_bones) + return false; + + *object_bones = 0; + if (!name) + return false; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *object_bones = &i.object_bone; + return true; + } + return false; +} + +int32_t bone_database::get_skeleton_motion_bone_index(const char* name, char* bone_name) { + if (!name || !bone_name) + return -1; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + for (std::string& j : i.motion_bone) + if (!str_utils_compare(j.c_str(), bone_name)) + return (int32_t)(&j - i.motion_bone.data()); + return -1; + } + return -1; +} + +bool bone_database::get_skeleton_motion_bones(const char* name, std::vector** motion_bones) { + if (!motion_bones) + return false; + + *motion_bones = 0; + if (!name) + return false; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *motion_bones = &i.motion_bone; + return true; + } + return false; +} + +bool bone_database::get_skeleton_parent_indices(const char* name, std::vector** parent_indices) { + if (!parent_indices) + return false; + + *parent_indices = 0; + if (!name) + return false; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *parent_indices = &i.parent_index; + return true; + } + return false; +} + +bool bone_database::get_skeleton_heel_height(const char* name, float_t** unknown_value) { + if (!unknown_value) + return false; + + *unknown_value = 0; + if (!name) + return false; + + for (bone_database_skeleton& i : skeleton) + if (!str_utils_compare(i.name.c_str(), name)) { + *unknown_value = &i.heel_height; + return true; + } + return false; +} + +bool bone_database::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -216,21 +368,21 @@ bool bone_database_load_file(void* data, char* path, char* file, uint32_t hash) string_add_length(&s, file, file_len); bone_database* bone_data = (bone_database*)data; - bone_database_read(bone_data, string_data(&s), bone_data->modern); + bone_data->read(string_data(&s), bone_data->modern); string_free(&s); return bone_data->ready; } -void bone_database_bones_calculate_count(vector_old_bone_database_bone* bones, size_t* object_bone_count, +void bone_database_bones_calculate_count(std::vector* bones, size_t* object_bone_count, size_t* motion_bone_count, size_t* total_bone_count, size_t* ik_bone_count, size_t* chain_pos) { size_t _object_bone_count = 0; size_t _motion_bone_count = 0; size_t _total_bone_count = 0; size_t _ik_bone_count = 0; size_t _chain_pos = 0; - for (bone_database_bone* i = bones->begin; i != bones->end; i++) - switch (i->type) { + for (bone_database_bone& i : *bones) + switch (i.type) { case BONE_DATABASE_BONE_ROTATION: case BONE_DATABASE_BONE_TYPE_1: case BONE_DATABASE_BONE_POSITION: @@ -269,189 +421,6 @@ void bone_database_bones_calculate_count(vector_old_bone_database_bone* bones, s *chain_pos = _chain_pos; } -bool bone_database_get_skeleton(bone_database* bone_data, - char* name, bone_database_skeleton** skeleton) { - if (!skeleton) - return false; - - *skeleton = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *skeleton = i; - return true; - } - return false; -} - -int32_t bone_database_get_skeleton_bone_index(bone_database* bone_data, const char* name, char* bone_name) { - if (!bone_data || !name || !bone_name) - return -1; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - for (bone_database_bone* j = i->bone.begin; j != i->bone.end; j++) - if (!str_utils_compare(string_data(&j->name), bone_name)) - return (int32_t)(j - i->bone.begin); - return -1; - } - return -1; -} - -int32_t bone_database_get_skeleton_bone_index(bone_database* bone_data, const char* name, const char* bone_name) { - if (!bone_data || !name || !bone_name) - return -1; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - for (bone_database_bone* j = i->bone.begin; j != i->bone.end; j++) - if (!str_utils_compare(string_data(&j->name), bone_name)) - return (int32_t)(j - i->bone.begin); - return -1; - } - return -1; -} - -bool bone_database_get_skeleton_bones(bone_database* bone_data, - char* name, vector_old_bone_database_bone** bone) { - if (!bone) - return false; - - *bone = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *bone = &i->bone; - return true; - } - return false; -} - -bool bone_database_get_skeleton_positions(bone_database* bone_data, - char* name, vector_old_vec3** positions) { - if (!positions) - return false; - - *positions = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *positions = &i->position; - return true; - } - return false; -} - -int32_t bone_database_get_skeleton_object_bone_index(bone_database* bone_data, - char* name, char* bone_name) { - if (!bone_data || !name || !bone_name) - return -1; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - vector_old_string* object_bones = &i->object_bone; - for (string* j = object_bones->begin; j != object_bones->end; j++) - if (!str_utils_compare(string_data(j), bone_name)) - return (int32_t)(j - object_bones->begin); - return -1; - } - return -1; -} - -bool bone_database_get_skeleton_object_bones(bone_database* bone_data, - char* name, vector_old_string** object_bones) { - if (!object_bones) - return false; - - *object_bones = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *object_bones = &i->object_bone; - return true; - } - return false; -} - -int32_t bone_database_get_skeleton_motion_bone_index(bone_database* bone_data, - char* name, char* bone_name) { - if (!bone_data || !name || !bone_name) - return -1; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - vector_old_string* motion_bones = &i->motion_bone; - for (string* j = motion_bones->begin; j != motion_bones->end; j++) - if (!str_utils_compare(string_data(j), bone_name)) - return (int32_t)(j - motion_bones->begin); - return -1; - } - return -1; -} - -bool bone_database_get_skeleton_motion_bones(bone_database* bone_data, - char* name, vector_old_string** motion_bones) { - if (!motion_bones) - return false; - - *motion_bones = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *motion_bones = &i->motion_bone; - return true; - } - return false; -} - -bool bone_database_get_skeleton_parent_indices(bone_database* bone_data, - char* name, vector_old_uint16_t** parent_indices) { - if (!parent_indices) - return false; - - *parent_indices = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *parent_indices = &i->parent_index; - return true; - } - return false; -} - -bool bone_database_get_skeleton_heel_height(bone_database* bone_data, - char* name, float_t** unknown_value) { - if (!unknown_value) - return false; - - *unknown_value = 0; - if (!bone_data || !name) - return false; - - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - if (!str_utils_compare(string_data(&i->name), name)) { - *unknown_value = &i->heel_height; - return true; - } - return false; -} - -void bone_database_free(bone_database* bone_data) { - vector_old_bone_database_skeleton_free(&bone_data->skeleton, bone_database_skeleton_free); -} - const char* bone_database_skeleton_type_to_string(bone_database_skeleton_type type) { switch (type) { case BONE_DATABASE_SKELETON_COMMON: @@ -481,17 +450,21 @@ const char* bone_database_skeleton_type_to_string(bone_database_skeleton_type ty } } -void bone_database_bone_free(bone_database_bone* bone) { - string_free(&bone->name); +bone_database_bone::bone_database_bone() : type(), +has_parent(), parent(), pole_target(), mirror(), flags() { + } -void bone_database_skeleton_free(bone_database_skeleton* skel) { - vector_old_bone_database_bone_free(&skel->bone, bone_database_bone_free); - vector_old_vec3_free(&skel->position, 0);; - vector_old_string_free(&skel->object_bone, string_free); - vector_old_string_free(&skel->motion_bone, string_free); - vector_old_uint16_t_free(&skel->parent_index, 0); - string_free(&skel->name); +bone_database_bone::~bone_database_bone() { + +} + +bone_database_skeleton::bone_database_skeleton() : heel_height() { + +} + +bone_database_skeleton::~bone_database_skeleton() { + } static void bone_database_classic_read_inner(bone_database* bone_data, stream* s) { @@ -504,12 +477,11 @@ static void bone_database_classic_read_inner(bone_database* bone_data, stream* s uint32_t skeleton_name_offsets_offset = io_read_uint32_t(s); io_read(s, 0x14); - vector_old_bone_database_skeleton_reserve(&bone_data->skeleton, skeleton_count); - bone_data->skeleton.end += skeleton_count; + bone_data->skeleton.resize(skeleton_count); io_position_push(s, skeleton_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; uint32_t skeleton_offset = io_read_uint32_t(s); io_position_push(s, skeleton_offset, SEEK_SET); @@ -535,12 +507,11 @@ static void bone_database_classic_read_inner(bone_database* bone_data, stream* s } io_position_pop(s); - vector_old_bone_database_bone_reserve(&skel->bone, bone_count); - skel->bone.end += bone_count; + skel->bone.resize(bone_count); io_position_push(s, bones_offset, SEEK_SET); for (uint32_t j = 0; j < bone_count; j++) { - bone_database_bone* bone = &skel->bone.begin[j]; + bone_database_bone* bone = &skel->bone[j]; bone->type = (bone_database_bone_type)io_read_uint8_t(s); bone->has_parent = io_read_uint8_t(s) ? true : false; bone->parent = io_read_uint8_t(s); @@ -552,12 +523,11 @@ static void bone_database_classic_read_inner(bone_database* bone_data, stream* s } io_position_pop(s); - vector_old_vec3_reserve(&skel->position, position_count); - skel->position.end += position_count; + skel->position.resize(position_count); io_position_push(s, positions_offset, SEEK_SET); for (uint32_t j = 0; j < position_count; j++) { - vec3* position = &skel->position.begin[j]; + vec3* position = &skel->position[j]; position->x = io_read_float_t(s); position->y = io_read_float_t(s); position->z = io_read_float_t(s); @@ -568,31 +538,28 @@ static void bone_database_classic_read_inner(bone_database* bone_data, stream* s skel->heel_height = io_read_float_t(s); io_position_pop(s); - vector_old_string_reserve(&skel->object_bone, object_bone_count); - skel->object_bone.end += object_bone_count; + skel->object_bone.resize(object_bone_count); io_position_push(s, object_bone_names_offset, SEEK_SET); for (uint32_t j = 0; j < object_bone_count; j++) { - string* object_bone_name = &skel->object_bone.begin[j]; + std::string* object_bone_name = &skel->object_bone[j]; io_read_string_null_terminated_offset(s, io_read_uint32_t(s), object_bone_name); } io_position_pop(s); - vector_old_string_reserve(&skel->motion_bone, motion_bone_count); - skel->motion_bone.end += motion_bone_count; + skel->motion_bone.resize(motion_bone_count); io_position_push(s, motion_bone_names_offset, SEEK_SET); for (uint32_t j = 0; j < motion_bone_count; j++) { - string* motion_bone_name = &skel->motion_bone.begin[j]; + std::string* motion_bone_name = &skel->motion_bone[j]; io_read_string_null_terminated_offset(s, io_read_uint32_t(s), motion_bone_name); } io_position_pop(s); - vector_old_uint16_t_reserve(&skel->parent_index, motion_bone_count); - skel->parent_index.end += motion_bone_count; + skel->parent_index.resize(motion_bone_count); io_position_push(s, parent_indices_offset, SEEK_SET); - io_read(s, skel->parent_index.begin, motion_bone_count * sizeof(uint16_t)); + io_read(s, skel->parent_index.data(), motion_bone_count * sizeof(uint16_t)); io_position_pop(s); io_position_pop(s); } @@ -600,7 +567,7 @@ static void bone_database_classic_read_inner(bone_database* bone_data, stream* s io_position_push(s, skeleton_name_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skeleton = &bone_data->skeleton[i]; io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &skeleton->name); } io_position_pop(s); @@ -621,101 +588,101 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* io_write_int32_t(s, 0); io_write_int32_t(s, 0); - uint32_t skeleton_count = (uint32_t)vector_old_length(bone_data->skeleton); + uint32_t skeleton_count = (uint32_t)bone_data->skeleton.size(); ssize_t skeleton_offsets_offset = io_get_position(s); io_write(s, skeleton_count * 0x04ULL); ssize_t skeleton_name_offset = io_get_position(s); - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - io_write_string_null_terminated(s, &i->name); + for (bone_database_skeleton& i : bone_data->skeleton) + io_write_string_null_terminated(s, &i.name); ssize_t skeleton_name_offsets_offset = io_get_position(s); - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) { + for (bone_database_skeleton& i : bone_data->skeleton) { io_write_uint32_t(s, (uint32_t)skeleton_name_offset); - skeleton_name_offset += i->name.length + 1; + skeleton_name_offset += i.name.size() + 1; } - vector_old_string strings = vector_old_empty(string); - vector_old_ssize_t string_offsets = vector_old_empty(ssize_t); + std::vector strings; + std::vector string_offsets; ssize_t* skeleton_offsets = force_malloc_s(ssize_t, skeleton_count); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t bone_count = (uint32_t)vector_old_length(skel->bone); - uint32_t position_count = (uint32_t)vector_old_length(skel->position); - uint32_t object_bone_count = (uint32_t)vector_old_length(skel->object_bone); - uint32_t motion_bone_count = (uint32_t)vector_old_length(skel->motion_bone); + uint32_t bone_count = (uint32_t)skel->bone.size(); + uint32_t position_count = (uint32_t)skel->position.size(); + uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); + uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); - vector_old_string_reserve(&strings, bone_count); - vector_old_ssize_t_reserve(&string_offsets, bone_count); + strings.reserve(bone_count); + string_offsets.reserve(bone_count); - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) - if (bone_database_strings_push_back_check(&strings, string_data(&j->name))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, &j->name); + for (bone_database_bone& j : skel->bone) + if (bone_database_strings_push_back_check(strings, j.name.c_str())) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &j.name); } - if (bone_database_strings_push_back_check(&strings, "End")) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); + if (bone_database_strings_push_back_check(strings, "End")) { + string_offsets.push_back(io_get_position(s)); io_write_utf8_string_null_terminated(s, "End"); } io_align_write(s, 0x04); ssize_t bones_offset = io_get_position(s); - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) { - io_write_uint8_t(s, (uint8_t)j->type); - io_write_uint8_t(s, j->has_parent ? 1 : 0); - io_write_uint8_t(s, j->parent); - io_write_uint8_t(s, j->pole_target); - io_write_uint8_t(s, j->mirror); - io_write_uint8_t(s, j->flags); + for (bone_database_bone& j : skel->bone) { + io_write_uint8_t(s, (uint8_t)j.type); + io_write_uint8_t(s, j.has_parent ? 1 : 0); + io_write_uint8_t(s, j.parent); + io_write_uint8_t(s, j.pole_target); + io_write_uint8_t(s, j.mirror); + io_write_uint8_t(s, j.flags); io_write(s, 0x02); - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&j->name))); + io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + string_offsets, j.name.c_str())); } io_write_uint32_t(s, 0xFF); io_write_uint32_t(s, 0xFF); - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(&strings, - &string_offsets, "End")); + io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + string_offsets, "End")); ssize_t positions_offset = io_get_position(s); - io_write(s, skel->position.begin, sizeof(vec3) * position_count); + io_write(s, skel->position.data(), sizeof(vec3) * position_count); ssize_t unknown_value_offset = io_get_position(s); io_write_float_t(s, skel->heel_height); - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) - if (bone_database_strings_push_back_check(&strings, string_data(j))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, j); + for (std::string& j : skel->object_bone) + if (bone_database_strings_push_back_check(strings, j.c_str())) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &j); } io_align_write(s, 0x04); ssize_t object_bone_names_offset = io_get_position(s); - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(j))); + for (std::string& j : skel->object_bone) + io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + string_offsets, j.c_str())); - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) - if (bone_database_strings_push_back_check(&strings, string_data(j))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, j); + for (std::string& j : skel->motion_bone) + if (bone_database_strings_push_back_check(strings, j.c_str())) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &j); } io_align_write(s, 0x04); ssize_t motion_bone_names_offset = io_get_position(s); - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(j))); + for (std::string& j : skel->motion_bone) + io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + string_offsets, j.c_str())); ssize_t parent_indices_offset = io_get_position(s); - io_write(s, skel->parent_index.begin, sizeof(uint16_t) * motion_bone_count); + io_write(s, skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); io_align_write(s, 0x04); - skeleton_offsets[skel - bone_data->skeleton.begin] = io_get_position(s); + skeleton_offsets[skel - bone_data->skeleton.data()] = io_get_position(s); io_write_uint32_t(s, (uint32_t)bones_offset); io_write_uint32_t(s, position_count); io_write_uint32_t(s, (uint32_t)positions_offset); @@ -727,8 +694,8 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* io_write_uint32_t(s, (uint32_t)parent_indices_offset); io_write(s, 0x14); - vector_old_string_clear(&strings, string_free); - vector_old_ssize_t_clear(&string_offsets, 0); + strings.clear(); + string_offsets.clear(); } io_position_push(s, 0x00, SEEK_SET); @@ -743,9 +710,6 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* for (uint32_t i = 0; i < skeleton_count; i++) io_write_uint32_t(s, (uint32_t)skeleton_offsets[i]); io_position_pop(s); - - vector_old_string_free(&strings, string_free); - vector_old_ssize_t_free(&string_offsets, 0); free(skeleton_offsets); } @@ -765,12 +729,11 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, ssize_t skeleton_offsets_offset = io_read_offset(s, header_length, is_x); ssize_t skeleton_name_offsets_offset = io_read_offset(s, header_length, is_x); - vector_old_bone_database_skeleton_reserve(&bone_data->skeleton, skeleton_count); - bone_data->skeleton.end += skeleton_count; + bone_data->skeleton.resize(skeleton_count); io_position_push(s, skeleton_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skeleton = &bone_data->skeleton[i]; ssize_t skeleton_offset = io_read_offset(s, header_length, is_x); io_position_push(s, skeleton_offset, SEEK_SET); @@ -828,13 +791,12 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, } io_position_pop(s); - vector_old_bone_database_bone_reserve(&skeleton->bone, bone_count); - skeleton->bone.end += bone_count; + skeleton->bone.resize(bone_count); io_position_push(s, bones_offset, SEEK_SET); if (!is_x) for (uint32_t j = 0; j < bone_count; j++) { - bone_database_bone* bone = &skeleton->bone.begin[j]; + bone_database_bone* bone = &skeleton->bone[j]; bone->type = (bone_database_bone_type)io_read_uint8_t(s); bone->has_parent = io_read_uint8_t(s) ? true : false; bone->parent = io_read_uint8_t(s); @@ -846,7 +808,7 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, } else for (uint32_t j = 0; j < bone_count; j++) { - bone_database_bone* bone = &skeleton->bone.begin[j]; + bone_database_bone* bone = &skeleton->bone[j]; bone->type = (bone_database_bone_type)io_read_uint8_t(s); bone->has_parent = io_read_uint8_t(s) ? true : false; bone->parent = io_read_uint8_t(s); @@ -858,12 +820,11 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, } io_position_pop(s); - vector_old_vec3_reserve(&skeleton->position, position_count); - skeleton->position.end += position_count; + skeleton->position.resize(position_count); io_position_push(s, positions_offset, SEEK_SET); for (uint32_t j = 0; j < position_count; j++) { - vec3* position = &skeleton->position.begin[j]; + vec3* position = &skeleton->position[j]; position->x = io_read_float_t_stream_reverse_endianness(s); position->y = io_read_float_t_stream_reverse_endianness(s); position->z = io_read_float_t_stream_reverse_endianness(s); @@ -874,45 +835,42 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, skeleton->heel_height = io_read_float_t_stream_reverse_endianness(s); io_position_pop(s); - vector_old_string_reserve(&skeleton->object_bone, object_bone_count); - skeleton->object_bone.end += object_bone_count; + skeleton->object_bone.resize(object_bone_count); io_position_push(s, object_bone_names_offset, SEEK_SET); if (!is_x) for (uint32_t j = 0; j < object_bone_count; j++) { - string* object_bone_name = &skeleton->object_bone.begin[j]; + std::string* object_bone_name = &skeleton->object_bone[j]; io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), object_bone_name); } else for (uint32_t j = 0; j < object_bone_count; j++) { - string* object_bone_name = &skeleton->object_bone.begin[j]; + std::string* object_bone_name = &skeleton->object_bone[j]; io_read_string_null_terminated_offset(s, io_read_offset_x(s), object_bone_name); } io_position_pop(s); - vector_old_string_reserve(&skeleton->motion_bone, motion_bone_count); - skeleton->motion_bone.end += motion_bone_count; + skeleton->motion_bone.resize(motion_bone_count); io_position_push(s, motion_bone_names_offset, SEEK_SET); if (!is_x) for (uint32_t j = 0; j < motion_bone_count; j++) { - string* motion_bone_name = &skeleton->motion_bone.begin[j]; + std::string* motion_bone_name = &skeleton->motion_bone[j]; io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), motion_bone_name); } else for (uint32_t j = 0; j < motion_bone_count; j++) { - string* motion_bone_name = &skeleton->motion_bone.begin[j]; + std::string* motion_bone_name = &skeleton->motion_bone[j]; io_read_string_null_terminated_offset(s, io_read_offset_x(s), motion_bone_name); } io_position_pop(s); - vector_old_uint16_t_reserve(&skeleton->parent_index, motion_bone_count); - skeleton->parent_index.end += motion_bone_count; + skeleton->parent_index.resize(motion_bone_count); io_position_push(s, parent_indices_offset, SEEK_SET); - io_read(s, skeleton->parent_index.begin, motion_bone_count * sizeof(uint16_t)); + io_read(s, skeleton->parent_index.data(), motion_bone_count * sizeof(uint16_t)); if (s->is_big_endian) { - uint16_t* parent_indices = skeleton->parent_index.begin; + uint16_t* parent_indices = skeleton->parent_index.data(); for (uint32_t j = 0; j < motion_bone_count; j++) parent_indices[j] = reverse_endianness_uint16_t(parent_indices[j]); } @@ -924,12 +882,12 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, io_position_push(s, skeleton_name_offsets_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skeleton = &bone_data->skeleton[i]; io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &skeleton->name); } else for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skeleton = &bone_data->skeleton[i]; io_read_string_null_terminated_offset(s, io_read_offset_x(s), &skeleton->name); } io_position_pop(s); @@ -941,7 +899,7 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, static void bone_database_modern_write_inner(bone_database* bone_data, stream* s) { stream s_bone; - io_mopen(&s_bone, 0, 0); + io_open(&s_bone); uint32_t off; vector_old_enrs_entry e = vector_old_empty(enrs_entry); enrs_entry ee; @@ -949,7 +907,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s bool is_x = bone_data->is_x; - uint32_t skeleton_count = (uint32_t)vector_old_length(bone_data->skeleton); + uint32_t skeleton_count = (uint32_t)bone_data->skeleton.size(); if (!is_x) { uint32_t pos; @@ -966,12 +924,12 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s skeleton_count /= 2; for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t bone_count = (uint32_t)vector_old_length(skel->bone); - uint32_t position_count = (uint32_t)vector_old_length(skel->position); - uint32_t object_bone_count = (uint32_t)vector_old_length(skel->object_bone); - uint32_t motion_bone_count = (uint32_t)vector_old_length(skel->motion_bone); + uint32_t bone_count = (uint32_t)skel->bone.size(); + uint32_t position_count = (uint32_t)skel->position.size(); + uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); + uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); ee = { off, 1, 56, 1, vector_old_empty(enrs_sub_entry) }; vector_old_enrs_sub_entry_append(&ee.sub, 0, 14, ENRS_DWORD); @@ -1059,12 +1017,12 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s off = align_val(off, 0x10); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t bone_count = (uint32_t)vector_old_length(skel->bone); - uint32_t position_count = (uint32_t)vector_old_length(skel->position); - uint32_t object_bone_count = (uint32_t)vector_old_length(skel->object_bone); - uint32_t motion_bone_count = (uint32_t)vector_old_length(skel->motion_bone); + uint32_t bone_count = (uint32_t)skel->bone.size(); + uint32_t position_count = (uint32_t)skel->position.size(); + uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); + uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); bone_count++; off += 8; @@ -1133,20 +1091,20 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s ssize_t skeleton_offsets_offset = io_get_position(&s_bone); if (!is_x) - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) + for (bone_database_skeleton& i : bone_data->skeleton) io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); else { - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) + for (bone_database_skeleton& i : bone_data->skeleton) io_write_offset_x_pof_add(&s_bone, 0, &pof); io_align_write(&s_bone, 0x10); } ssize_t skeleton_name_offsets_offset = io_get_position(&s_bone); if (!is_x) - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) + for (bone_database_skeleton& i : bone_data->skeleton) io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); else { - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) + for (bone_database_skeleton& i : bone_data->skeleton) io_write_offset_x_pof_add(&s_bone, 0, &pof); io_align_write(&s_bone, 0x10); } @@ -1155,12 +1113,12 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s if (!is_x) for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t bone_count = (uint32_t)vector_old_length(skel->bone); - uint32_t position_count = (uint32_t)vector_old_length(skel->position); - uint32_t object_bone_count = (uint32_t)vector_old_length(skel->object_bone); - uint32_t motion_bone_count = (uint32_t)vector_old_length(skel->motion_bone); + uint32_t bone_count = (uint32_t)skel->bone.size(); + uint32_t position_count = (uint32_t)skel->position.size(); + uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); + uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); skh[i].offset = io_get_position(&s_bone); io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); @@ -1175,7 +1133,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_write(&s_bone, 0x14); skh[i].bones_offset = io_get_position(&s_bone); - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) { + for (bone_database_bone& j : skel->bone) { io_write(&s_bone, 0x08); io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); } @@ -1192,11 +1150,11 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_write_float_t(&s_bone, 0.0f); skh[i].object_bone_names_offset = io_get_position(&s_bone); - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) + for (std::string& j : skel->object_bone) io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); skh[i].motion_bone_names_offset = io_get_position(&s_bone); - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) + for (std::string& j : skel->motion_bone) io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); skh[i].parent_indices_offset = io_get_position(&s_bone); @@ -1220,16 +1178,16 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t bone_count = (uint32_t)vector_old_length(skel->bone); - uint32_t position_count = (uint32_t)vector_old_length(skel->position); - uint32_t object_bone_count = (uint32_t)vector_old_length(skel->object_bone); - uint32_t motion_bone_count = (uint32_t)vector_old_length(skel->motion_bone); + uint32_t bone_count = (uint32_t)skel->bone.size(); + uint32_t position_count = (uint32_t)skel->position.size(); + uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); + uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); skh[i].bones_offset = io_get_position(&s_bone); - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) { + for (bone_database_bone& j : skel->bone) { io_write(&s_bone, 0x08); io_write_offset_x_pof_add(&s_bone, 0, &pof); } @@ -1247,12 +1205,12 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_align_write(&s_bone, 0x10); skh[i].object_bone_names_offset = io_get_position(&s_bone); - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) + for (std::string& j : skel->object_bone) io_write_offset_x_pof_add(&s_bone, 0, &pof); io_align_write(&s_bone, 0x10); skh[i].motion_bone_names_offset = io_get_position(&s_bone); - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) + for (std::string& j : skel->motion_bone) io_write_offset_x_pof_add(&s_bone, 0, &pof); io_align_write(&s_bone, 0x10); @@ -1262,64 +1220,64 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } } - vector_old_string strings = vector_old_empty(string); - vector_old_ssize_t string_offsets = vector_old_empty(ssize_t); + std::vector strings; + std::vector string_offsets; if (is_x) for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - if (bone_database_strings_push_back_check(&strings, string_data(&skel->name))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_bone); - io_write_utf8_string_null_terminated(&s_bone, string_data(&skel->name)); + if (bone_database_strings_push_back_check(strings, skel->name.c_str())) { + string_offsets.push_back(io_get_position(&s_bone)); + io_write_utf8_string_null_terminated(&s_bone, skel->name.c_str()); } } for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) - if (bone_database_strings_push_back_check(&strings, string_data(&j->name))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_bone); - io_write_string_null_terminated(&s_bone, &j->name); + for (bone_database_bone& j : skel->bone) + if (bone_database_strings_push_back_check(strings, j.name.c_str())) { + string_offsets.push_back(io_get_position(&s_bone)); + io_write_string_null_terminated(&s_bone, &j.name); } - if (bone_database_strings_push_back_check(&strings, "End")) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_bone); + if (bone_database_strings_push_back_check(strings, "End")) { + string_offsets.push_back(io_get_position(&s_bone)); io_write_utf8_string_null_terminated(&s_bone, "End"); } - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) - if (bone_database_strings_push_back_check(&strings, string_data(j))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_bone); - io_write_string_null_terminated(&s_bone, j); + for (std::string& j : skel->object_bone) + if (bone_database_strings_push_back_check(strings, j.c_str())) { + string_offsets.push_back(io_get_position(&s_bone)); + io_write_string_null_terminated(&s_bone, &j); } - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) - if (bone_database_strings_push_back_check(&strings, string_data(j))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_bone); - io_write_string_null_terminated(&s_bone, j); + for (std::string& j : skel->motion_bone) + if (bone_database_strings_push_back_check(strings, j.c_str())) { + string_offsets.push_back(io_get_position(&s_bone)); + io_write_string_null_terminated(&s_bone, &j); } } if (!is_x) for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - if (bone_database_strings_push_back_check(&strings, string_data(&skel->name))) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_bone); - io_write_utf8_string_null_terminated(&s_bone, string_data(&skel->name)); + if (bone_database_strings_push_back_check(strings, skel->name.c_str())) { + string_offsets.push_back(io_get_position(&s_bone)); + io_write_utf8_string_null_terminated(&s_bone, skel->name.c_str()); } } io_align_write(&s_bone, 0x10); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; + bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t bone_count = (uint32_t)vector_old_length(skel->bone); - uint32_t position_count = (uint32_t)vector_old_length(skel->position); - uint32_t object_bone_count = (uint32_t)vector_old_length(skel->object_bone); - uint32_t motion_bone_count = (uint32_t)vector_old_length(skel->motion_bone); + uint32_t bone_count = (uint32_t)skel->bone.size(); + uint32_t position_count = (uint32_t)skel->position.size(); + uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); + uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); io_position_push(&s_bone, skh[i].offset, SEEK_SET); if (!is_x) { @@ -1350,47 +1308,47 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_position_push(&s_bone, skh[i].bones_offset, SEEK_SET); if (!is_x) - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) { - io_write_uint8_t(&s_bone, (uint8_t)j->type); - io_write_uint8_t(&s_bone, j->has_parent ? 1 : 0); - io_write_uint8_t(&s_bone, j->parent); - io_write_uint8_t(&s_bone, j->pole_target); - io_write_uint8_t(&s_bone, j->mirror); - io_write_uint8_t(&s_bone, j->flags); + for (bone_database_bone& j : skel->bone) { + io_write_uint8_t(&s_bone, (uint8_t)j.type); + io_write_uint8_t(&s_bone, j.has_parent ? 1 : 0); + io_write_uint8_t(&s_bone, j.parent); + io_write_uint8_t(&s_bone, j.pole_target); + io_write_uint8_t(&s_bone, j.mirror); + io_write_uint8_t(&s_bone, j.flags); io_write(&s_bone, 0x02); - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&j->name)), 0x40); + io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, j.name.c_str()), 0x40); } else - for (bone_database_bone* j = skel->bone.begin; j != skel->bone.end; j++) { - io_write_uint8_t(&s_bone, (uint8_t)j->type); - io_write_uint8_t(&s_bone, j->has_parent ? 1 : 0); - io_write_uint8_t(&s_bone, j->parent); - io_write_uint8_t(&s_bone, j->pole_target); - io_write_uint8_t(&s_bone, j->mirror); - io_write_uint8_t(&s_bone, j->flags); + for (bone_database_bone& j : skel->bone) { + io_write_uint8_t(&s_bone, (uint8_t)j.type); + io_write_uint8_t(&s_bone, j.has_parent ? 1 : 0); + io_write_uint8_t(&s_bone, j.parent); + io_write_uint8_t(&s_bone, j.pole_target); + io_write_uint8_t(&s_bone, j.mirror); + io_write_uint8_t(&s_bone, j.flags); io_write(&s_bone, 0x02); - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&j->name))); + io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, j.name.c_str())); } if (!is_x) { io_write_uint32_t(&s_bone, 0xFF); io_write_uint32_t(&s_bone, 0xFF); - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, "End"), 0x40); + io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, "End"), 0x40); } else { io_write_uint32_t(&s_bone, 0xFF); io_write_uint32_t(&s_bone, 0xFF); - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, "End")); + io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, "End")); } io_position_pop(&s_bone); io_position_push(&s_bone, skh[i].positions_offset, SEEK_SET); - io_write(&s_bone, skel->position.begin, sizeof(vec3)* position_count); + io_write(&s_bone, skel->position.data(), sizeof(vec3)* position_count); io_position_pop(&s_bone); io_position_push(&s_bone, skh[i].unknown_value_offset, SEEK_SET); @@ -1399,27 +1357,27 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_position_push(&s_bone, skh[i].object_bone_names_offset, SEEK_SET); if (!is_x) - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(j)), 0x40); + for (std::string& j : skel->object_bone) + io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, j.c_str()), 0x40); else - for (string* j = skel->object_bone.begin; j != skel->object_bone.end; j++) - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(j))); + for (std::string& j : skel->object_bone) + io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, j.c_str())); io_position_push(&s_bone, skh[i].motion_bone_names_offset, SEEK_SET); if (!is_x) - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(j)), 0x40); + for (std::string& j : skel->motion_bone) + io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, j.c_str()), 0x40); else - for (string* j = skel->motion_bone.begin; j != skel->motion_bone.end; j++) - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(j))); + for (std::string& j : skel->motion_bone) + io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, j.c_str())); io_position_pop(&s_bone); io_position_push(&s_bone, skh[i].parent_indices_offset, SEEK_SET); - io_write(&s_bone, skel->parent_index.begin, sizeof(uint16_t) * motion_bone_count); + io_write(&s_bone, skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); io_position_pop(&s_bone); } @@ -1441,26 +1399,21 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_position_push(&s_bone, skeleton_name_offsets_offset, SEEK_SET); if (!is_x) - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->name)), 0x40); + for (bone_database_skeleton& i : bone_data->skeleton) + io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, i.name.c_str()), 0x40); else - for (bone_database_skeleton* i = bone_data->skeleton.begin; i != bone_data->skeleton.end; i++) - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->name))); + for (bone_database_skeleton& i : bone_data->skeleton) + io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + string_offsets, i.name.c_str())); io_position_pop(&s_bone); - vector_old_string_free(&strings, string_free); - vector_old_ssize_t_free(&string_offsets, 0); free(skh); - vector_old_string_free(&strings, string_free); - vector_old_ssize_t_free(&string_offsets, 0); - f2_struct st; memset(&st, 0, sizeof(f2_struct)); io_align_write(&s_bone, 0x10); - io_mcopy(&s_bone, &st.data, &st.length); + io_copy(&s_bone, &st.data, &st.length); io_free(&s_bone); st.enrs = e; @@ -1471,46 +1424,25 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s st.header.use_big_endian = false; st.header.use_section_size = true; - f2_struct_swrite(&st, s, true, is_x); + f2_struct_write(&st, s, true, is_x); f2_struct_free(&st); } -inline static ssize_t bone_database_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return vec_off->begin[i - vec->begin]; +inline static ssize_t bone_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, const char* str) { + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) + return vec_off[&i - vec.data()]; return 0; } -inline static ssize_t bone_database_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, const char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return vec_off->begin[i - vec->begin]; - return 0; -} - -inline static bool bone_database_strings_push_back_check(vector_old_string* vec, char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) +inline static bool bone_database_strings_push_back_check(std::vector& vec, const char* str) { + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) return false; - string* s = vector_old_string_reserve_back(vec); - string_init_length(s, str, len); - return true; -} - -inline static bool bone_database_strings_push_back_check(vector_old_string* vec, const char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return false; - - string* s = vector_old_string_reserve_back(vec); - string_init_length(s, str, len); + vec.push_back(std::string(str, len)); return true; } diff --git a/src/KKdLib/database/bone.h b/src/KKdLib/database/bone.h index 423e9066..90bc48e1 100644 --- a/src/KKdLib/database/bone.h +++ b/src/KKdLib/database/bone.h @@ -5,10 +5,10 @@ #pragma once +#include +#include #include "../default.h" -#include "../string.h" #include "../vec.h" -#include "../vector.h" typedef enum bone_database_bone_type { BONE_DATABASE_BONE_ROTATION = 0x00, @@ -35,72 +35,68 @@ typedef enum bone_database_skeleton_type { BONE_DATABASE_SKELETON_NONE = -1, } bone_database_skeleton_type; -typedef struct bone_database_bone { +class bone_database_bone { +public: bone_database_bone_type type; bool has_parent; uint8_t parent; uint8_t pole_target; uint8_t mirror; uint8_t flags; - string name; -} bone_database_bone; + std::string name; -vector_old(bone_database_bone) + bone_database_bone(); + ~bone_database_bone(); +}; -typedef struct bone_database_skeleton { - vector_old_bone_database_bone bone; - vector_old_vec3 position; +class bone_database_skeleton { +public: + std::vector bone; + std::vector position; float_t heel_height; - vector_old_string object_bone; - vector_old_string motion_bone; - vector_old_uint16_t parent_index; - string name; -} bone_database_skeleton; + std::vector object_bone; + std::vector motion_bone; + std::vector parent_index; + std::string name; -vector_old(bone_database_skeleton) + bone_database_skeleton(); + ~bone_database_skeleton(); +}; -typedef struct bone_database { +class bone_database { +public: bool ready; bool modern; bool is_x; - vector_old_bone_database_skeleton skeleton; -} bone_database; + std::vector skeleton; -extern void bone_database_init(bone_database* bone_data); -extern void bone_database_read(bone_database* bone_data, char* path, bool modern); -extern void bone_database_wread(bone_database* bone_data, wchar_t* path, bool modern); -extern void bone_database_mread(bone_database* bone_data, void* data, size_t length, bool modern); -extern void bone_database_write(bone_database* bone_data, char* path); -extern void bone_database_wwrite(bone_database* bone_data, wchar_t* path); -extern void bone_database_mwrite(bone_database* bone_data, void** data, size_t* length); -extern bool bone_database_load_file(void* data, char* path, char* file, uint32_t hash); -extern void bone_database_bones_calculate_count(vector_old_bone_database_bone* bones, size_t* object_bone_count, + bone_database(); + ~bone_database(); + + void read(const char* path, bool modern); + void read(const wchar_t* path, bool modern); + void read(const void* data, size_t length, bool modern); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); + + + bool get_skeleton(const char* name, bone_database_skeleton** skeleton); + int32_t get_skeleton_bone_index(const char* name, const char* bone_name); + bool get_skeleton_bones(const char* name, std::vector** bone); + bool get_skeleton_positions(const char* name, std::vector** positions); + int32_t get_skeleton_object_bone_index(const char* name, char* bone_name); + bool get_skeleton_object_bones(const char* name, std::vector** object_bones); + int32_t get_skeleton_motion_bone_index(const char* name, char* bone_name); + bool get_skeleton_motion_bones(const char* name, std::vector** motion_bones); + bool get_skeleton_parent_indices(const char* name, std::vector** parent_indices); + bool get_skeleton_heel_height(const char* name, float_t** unknown_value); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; + +extern void bone_database_bones_calculate_count(std::vector* bones, size_t* object_bone_count, size_t* motion_bone_count, size_t* total_bone_count, size_t* ik_bone_count, size_t* chain_pos); -extern bool bone_database_get_skeleton(bone_database* bone_data, - char* name, bone_database_skeleton** skeleton); -extern int32_t bone_database_get_skeleton_bone_index(bone_database* bone_data, - const char* name, char* bone_name); -extern int32_t bone_database_get_skeleton_bone_index(bone_database* bone_data, - const char* name, const char* bone_name); -extern bool bone_database_get_skeleton_bones(bone_database* bone_data, - char* name, vector_old_bone_database_bone** bone); -extern bool bone_database_get_skeleton_positions(bone_database* bone_data, - char* name, vector_old_vec3** positions); -extern int32_t bone_database_get_skeleton_object_bone_index(bone_database* bone_data, - char* name, char* bone_name); -extern bool bone_database_get_skeleton_object_bones(bone_database* bone_data, - char* name, vector_old_string** object_bones); -extern int32_t bone_database_get_skeleton_motion_bone_index(bone_database* bone_data, - char* name, char* bone_name); -extern bool bone_database_get_skeleton_motion_bones(bone_database* bone_data, - char* name, vector_old_string** motion_bones); -extern bool bone_database_get_skeleton_parent_indices(bone_database* bone_data, - char* name, vector_old_uint16_t** parent_indices); -extern bool bone_database_get_skeleton_heel_height(bone_database* bone_data, - char* name, float_t** unknown_value); -extern void bone_database_free(bone_database* bone_data); extern const char* bone_database_skeleton_type_to_string(bone_database_skeleton_type type); -extern void bone_database_bone_free(bone_database_bone* bone); -extern void bone_database_skeleton_free(bone_database_skeleton* skel); diff --git a/src/KKdLib/database/item_table.c b/src/KKdLib/database/item_table.c new file mode 100644 index 00000000..c80d8ffa --- /dev/null +++ b/src/KKdLib/database/item_table.c @@ -0,0 +1,376 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "item_table.h" +#include "../io/path.h" +#include "../io/stream.h" +#include "../key_val.h" +#include "../sort.h" +#include "../str_utils.h" + +#define ITEM_TABLE_TEXT_BUF_SIZE 0x400 + +static void itm_table_read_inner(itm_table* itm_tbl, stream* s); +static void itm_table_write_inner(itm_table* itm_tbl, stream* s); +static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t length); +static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* length); + +itm_table::itm_table() : ready() { + +} + +itm_table::~itm_table() { + +} + +void itm_table::read(const char* path) { + if (!path) + return; + + char* path_bin = str_utils_add(path, ".txt"); + if (path_check_file_exists(path_bin)) { + stream s; + io_open(&s, path_bin, "rb"); + if (s.io.stream) + itm_table_read_inner(this, &s); + io_free(&s); + } + free(path_bin); +} + +void itm_table::read(const wchar_t* path) { + if (!path) + return; + + wchar_t* path_bin = str_utils_wadd(path, L".txt"); + if (path_check_file_exists(path_bin)) { + stream s; + io_open(&s, path_bin, L"rb"); + if (s.io.stream) + itm_table_read_inner(this, &s); + io_free(&s); + } + free(path_bin); +} + +void itm_table::read(const void* data, size_t length) { + if (!data || !length) + return; + + stream s; + io_open(&s, data, length); + itm_table_read_inner(this, &s); + io_free(&s); +} + +void itm_table::write(const char* path) { + if (!path || !ready) + return; + + char* path_bin = str_utils_add(path, ".txt"); + stream s; + io_open(&s, path_bin, "wb"); + if (s.io.stream) + itm_table_write_inner(this, &s); + io_free(&s); + free(path_bin); +} + +void itm_table::write(const wchar_t* path) { + if (!path || !ready) + return; + + wchar_t* path_bin = str_utils_wadd(path, L".txt"); + stream s; + io_open(&s, path_bin, L"wb"); + if (s.io.stream) + itm_table_write_inner(this, &s); + io_free(&s); + free(path_bin); +} + +void itm_table::write(void** data, size_t* length) { + if (!data || !length || !ready) + return; + + stream s; + io_open(&s); + itm_table_write_inner(this, &s); + io_copy(&s, data, length); + io_free(&s); +} + +bool itm_table::load_file(void* data, const char* path, const char* file, uint32_t hash) { + size_t file_len = utf8_length(file); + + const char* t = strrchr(file, '.'); + if (t) + file_len = t - file; + + string s; + string_init(&s, path); + string_add_length(&s, file, file_len); + + itm_table* itm_tbl = (itm_table*)data; + itm_tbl->read(string_data(&s)); + + string_free(&s); + return itm_tbl->ready; +} + +itm_table_itm_data::itm_table_itm_data() { + +} + +itm_table_itm_data::~itm_table_itm_data() { + +} + +itm_table_item::itm_table_item() : flag(), type(), attr(), des_id(), +sub_id(), exclusion_point(), field_AC(), org_itm(), npr_flag(), face_depth() { + +} + +itm_table_item::~itm_table_item() { + +} + +itm_table_cos::itm_table_cos() : id() { + +} + +itm_table_cos::~itm_table_cos() { + +} + +itm_table_dbgset::itm_table_dbgset() { + +} + +itm_table_dbgset::~itm_table_dbgset() { + +} + +static void itm_table_read_inner(itm_table* itm_tbl, stream* s) { + void* itm_tbl_data = force_malloc(s->length); + io_read(s, itm_tbl_data, s->length); + itm_table_read_text(itm_tbl, itm_tbl_data, s->length); + free(itm_tbl_data); + + itm_tbl->ready = true; +} + +static void itm_table_write_inner(itm_table* itm_tbl, stream* s) { + void* itm_tbl_data = 0; + size_t itm_tbl_data_length = 0; + itm_table_write_text(itm_tbl, &itm_tbl_data, &itm_tbl_data_length); + io_write(s, itm_tbl_data, itm_tbl_data_length); + free(itm_tbl_data); +} + +static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t length) { + char buf[ITEM_TABLE_TEXT_BUF_SIZE]; + int32_t count; + int32_t count1; + size_t len; + size_t len1; + size_t len2; + size_t len3; + size_t off; + + key_val kv; + kv.parse((uint8_t*)data, length); + key_val lkv; + + len = 3; + memcpy(buf, "cos", 3); + off = len; + + itm_tbl->item.clear(); + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("cos", &lkv)) { + std::vector& vc = itm_tbl->cos; + + vc.resize(count); + for (int32_t i = 0; i < count; i++) { + itm_table_cos* c = &vc[i]; + + len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", i); + off = len + len1; + + lkv.read_int32_t( + buf, off, ".id", 4, &c->id); + + len2 = 5; + memcpy(buf + len + len1, ".item", 5); + off = len + len1 + len2; + + if (off >= 0 && off < ITEM_TABLE_TEXT_BUF_SIZE) + buf[off] = 0; + key_val sub_local_key_val; + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { + std::vector& vci = c->item; + + vci.resize(count1); + for (int32_t j = 0; j < count1; j++) { + len3 = sprintf_s(buf + len + len1 + len2, + ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); + off = len + len1 + len2 + len3; + + sub_local_key_val.read_int32_t( + buf, off, "", 1, &vci[j]); + } + } + } + } + + len = 6; + memcpy(buf, "dbgset", 6); + off = len; + + itm_tbl->item.clear(); + if (kv.read_int32_t(buf, off, ".length", 8, &count) + && kv.get_local_key_val("dbgset", &lkv)) { + std::vector& vd = itm_tbl->dbgset; + + vd.resize(count); + for (int32_t i = 0; i < count; i++) { + itm_table_dbgset* d = &vd[i]; + + len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", i); + off = len + len1; + + len2 = 5; + memcpy(buf + len + len1, ".item", 5); + off = len + len1 + len2; + + if (off >= 0 && off < ITEM_TABLE_TEXT_BUF_SIZE) + buf[off] = 0; + key_val sub_local_key_val; + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sub_local_key_val)) { + std::vector& vdi = d->item; + + vdi.resize(count1); + for (int32_t j = 0; j < count1; j++) { + len3 = sprintf_s(buf + len + len1 + len2, + ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); + off = len + len1 + len2 + len3; + + sub_local_key_val.read_int32_t( + buf, off, "", 1, &vdi[j]); + } + } + + off = len + len1; + lkv.read_string( + buf, off, ".name", 6, &d->name); + + } + } +} + +static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* length) { + char buf[ITEM_TABLE_TEXT_BUF_SIZE]; + int32_t count; + int32_t count1; + size_t len; + size_t len1; + size_t len2; + size_t len3; + size_t off; + + stream s; + io_open(&s); + + if (itm_tbl->cos.size() > 0) { + len = 3; + memcpy(buf, "cos", 3); + off = len; + + std::vector& vc = itm_tbl->cos; + count = (int32_t)vc.size(); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); + for (int32_t i = 0; i < count; i++) { + itm_table_cos* c = &vc[sort_index[i]]; + + len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); + off = len + len1; + + key_val::write_int32_t(&s, buf, off, ".id", 4, c->id); + + len2 = 5; + memcpy(buf + len + len1, ".item", 5); + off = len + len1 + len2; + + std::vector& vci = c->item; + count1 = (int32_t)vci.size(); + std::vector sort_index1; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + len3 = sprintf_s(buf + len + len1 + len2, + ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index1[j]); + off = len + len1 + len2 + len3; + + key_val::write_int32_t(&s, + buf, off, "", 1, vci[sort_index1[j]]); + } + + off = len + len1 + len2; + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + } + + off = len; + key_val::write_int32_t(&s, buf, off, ".length", 8, count); + } + + if (itm_tbl->dbgset.size() > 0) { + len = 6; + memcpy(buf, "dbgset", 6); + off = len; + + std::vector& vc = itm_tbl->dbgset; + count = (int32_t)vc.size(); + std::vector sort_index; + key_val::get_lexicographic_order(&sort_index, count); + for (int32_t i = 0; i < count; i++) { + itm_table_dbgset* d = &vc[sort_index[i]]; + + len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); + off = len + len1; + + len2 = 5; + memcpy(buf + len + len1, ".item", 5); + off = len + len1 + len2; + + std::vector& vdi = d->item; + count1 = (int32_t)vdi.size(); + std::vector sort_index1; + key_val::get_lexicographic_order(&sort_index1, count1); + for (int32_t j = 0; j < count1; j++) { + len3 = sprintf_s(buf + len + len1 + len2, + ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index1[j]); + off = len + len1 + len2 + len3; + + key_val::write_int32_t(&s, + buf, off, "", 1, vdi[sort_index1[j]]); + } + + off = len + len1 + len2; + key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + + off = len + len1; + key_val::write_string(&s, buf, off, ".name", 6, &d->name); + } + + off = len; + key_val::write_int32_t(&s, buf, off, ".length", 8, count); + } + + io_copy(&s, data, length); + io_free(&s); +} \ No newline at end of file diff --git a/src/KKdLib/database/item_table.h b/src/KKdLib/database/item_table.h new file mode 100644 index 00000000..07971179 --- /dev/null +++ b/src/KKdLib/database/item_table.h @@ -0,0 +1,183 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include +#include +#include "../default.h" +#include "../vec.h" + +typedef enum itm_id { + ITM_NONE = -1, + ITM_BODY = 0x00, + ITM_ATAMA = 0x01, + ITM_KATA_R = 0x02, + ITM_MUNE = 0x03, + ITM_KATA_L = 0x04, + ITM_UDE_R = 0x05, + ITM_SENAKA = 0x06, + ITM_UDE_L = 0x07, + ITM_HARA = 0x08, + ITM_KOSI = 0x09, + ITM_TE_R = 0x0A, + ITM_TE_L = 0x0B, + ITM_MOMO = 0x0C, + ITM_SUNE = 0x0D, + ITM_ASI = 0x0E, + ITM_KAMI = 0x0F, + ITM_OUTER = 0x10, + ITM_PANTS = 0x11, + ITM_ZUJO = 0x12, + ITM_MEGANE = 0x13, + ITM_KUBI = 0x14, + ITM_JOHA_USHIRO = 0x15, + ITM_KUCHI = 0x16, + ITM_ITEM09 = 0x17, + ITM_ITEM10 = 0x18, + ITM_ITEM11 = 0x19, + ITM_ITEM12 = 0x1A, + ITM_ITEM13 = 0x1B, + ITM_ITEM14 = 0x1C, + ITM_ITEM15 = 0x1D, + ITM_ITEM16 = 0x1E, + ITM_MAX = 0x1F, +} itm_id; + +typedef enum itm_sub_id { + ITM_SUB_NONE = -1, + ITM_SUB_ZUJO = 0x00, + ITM_SUB_KAMI = 0x01, + ITM_SUB_HITAI = 0x02, + ITM_SUB_ME = 0x03, + ITM_SUB_MEGANE = 0x04, + ITM_SUB_MIMI = 0x05, + ITM_SUB_KUCHI = 0x06, + ITM_SUB_MAKI = 0x07, + ITM_SUB_KUBI = 0x08, + ITM_SUB_INNER = 0x09, + ITM_SUB_OUTER = 0x0A, + ITM_SUB_JOHA_MAE = 0x0B, + ITM_SUB_JOHA_USHIRO = 0x0C, + ITM_SUB_HADA = 0x0D, + ITM_SUB_KATA = 0x0E, + ITM_SUB_U_UDE = 0x0F, + ITM_SUB_L_UDE = 0x10, + ITM_SUB_TE = 0x11, + ITM_SUB_BELT = 0x12, + ITM_SUB_COSI = 0x13, + ITM_SUB_PANTS = 0x14, + ITM_SUB_ASI = 0x15, + ITM_SUB_SUNE = 0x16, + ITM_SUB_KUTSU = 0x17, + ITM_SUB_HEAD = 0x18, + ITM_SUB_MAX = 0x19, +} itm_sub_id; + +typedef struct itm_table_itm_data_obj { + std::string uid; + itm_id rpk; +} itm_table_itm_data_obj; + +typedef struct itm_table_itm_data_ofs { + itm_sub_id sub_id; + int32_t no; + vec3 position; + vec3 rotation; + vec3 scale; +} itm_table_itm_data_ofs; + +typedef struct itm_table_itm_data_tex { + std::string org; + std::string chg; +} itm_table_itm_data_tex; + +typedef struct itm_table_itm_data_col_data { + vec3 blend; + vec3 offset; + float_t hue; + float_t saturation; + float_t value; + float_t constrast; + bool inverse; +} itm_table_itm_data_col_data; + +typedef struct itm_table_itm_data_col { + std::string tex; + int32_t flag; + itm_table_itm_data_col_data data; +} itm_table_itm_data_col; + +class itm_table_itm_data { +public: + std::vector obj; + std::vector ofs; + std::vector tex; + std::vector col; + + itm_table_itm_data(); + ~itm_table_itm_data(); +}; + +class itm_table_item { +public: + int32_t flag; + std::string name; + std::vector objset; + int32_t type; + int32_t attr; + int32_t des_id; + itm_sub_id sub_id; + itm_table_itm_data data; + int32_t exclusion_point; + int32_t field_AC; + int32_t org_itm; + bool npr_flag; + float_t face_depth; + + itm_table_item(); + ~itm_table_item(); +}; + +class itm_table_cos { +public: + int32_t id; + std::vector item; + + itm_table_cos(); + ~itm_table_cos(); +}; + +class itm_table_dbgset { +public: + std::string name; + std::vector item; + + itm_table_dbgset(); + ~itm_table_dbgset(); +}; + +class itm_table { +public: + bool ready; + + std::vector> item; + std::vector cos; + std::vector dbgset; + + itm_table(); + ~itm_table(); + + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/database/motion.c b/src/KKdLib/database/motion.c index 84e6aa2b..45c4bc6d 100644 --- a/src/KKdLib/database/motion.c +++ b/src/KKdLib/database/motion.c @@ -21,7 +21,7 @@ motion_database::~motion_database() { } -void motion_database::read(char* path) { +void motion_database::read(const char* path) { if (!path) return; @@ -33,7 +33,7 @@ void motion_database::read(char* path) { farc_file* ff = f.read_file("mot_db.bin"); if (ff) { stream s; - io_mopen(&s, ff->data, ff->size); + io_open(&s, ff->data, ff->size); motion_database_read_inner(this, &s); io_free(&s); } @@ -41,19 +41,19 @@ void motion_database::read(char* path) { free(path_farc); } -void motion_database::read(wchar_t* path) { +void motion_database::read(const wchar_t* path) { if (!path) return; wchar_t* path_farc = str_utils_wadd(path, L".farc"); - if (path_wcheck_file_exists(path_farc)) { + if (path_check_file_exists(path_farc)) { farc f; f.read(path_farc, true, false); farc_file* ff = f.read_file("mot_db.bin"); if (ff) { stream s; - io_mopen(&s, ff->data, ff->size); + io_open(&s, ff->data, ff->size); motion_database_read_inner(this, &s); io_free(&s); } @@ -61,17 +61,17 @@ void motion_database::read(wchar_t* path) { free(path_farc); } -void motion_database::read(void* data, size_t length) { +void motion_database::read(const void* data, size_t length) { if (!data || !length) return; stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); motion_database_read_inner(this, &s); io_free(&s); } -void motion_database::write(char* path) { +void motion_database::write(const char* path) { if (!path || !ready) return; @@ -81,9 +81,9 @@ void motion_database::write(char* path) { ff.name = std::string("mot_db.bin", 10); stream s; - io_mopen(&s, 0, 0); + io_open(&s); motion_database_write_inner(this, &s); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); f.files.push_back(ff); @@ -91,7 +91,7 @@ void motion_database::write(char* path) { f.write(path, FARC_COMPRESS_FArC, false); } -void motion_database::write(wchar_t* path) { +void motion_database::write(const wchar_t* path) { if (!path || !this->ready) return; @@ -100,9 +100,9 @@ void motion_database::write(wchar_t* path) { farc_file ff; ff.name = std::string("mot_db.bin", 10); stream s; - io_mopen(&s, 0, 0); + io_open(&s); motion_database_write_inner(this, &s); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); f.files.push_back(ff); @@ -115,9 +115,9 @@ void motion_database::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); motion_database_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } @@ -202,18 +202,6 @@ motion_set_info* motion_database::get_motion_set_by_id(uint32_t id) { return 0; } -motion_set_info* motion_database::get_motion_set_by_name(char* name) { - if (!name) - return 0; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (motion_set_info& i : motion_set) - if (name_hash == i.name_hash) - return &i; - return 0; -} - motion_set_info* motion_database::get_motion_set_by_name(const char* name) { if (!name) return 0; @@ -226,18 +214,6 @@ motion_set_info* motion_database::get_motion_set_by_name(const char* name) { return 0; } -uint32_t motion_database::get_motion_set_id(char* name) { - if (!name) - return -1; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (motion_set_info& i : motion_set) - if (name_hash == i.name_hash) - return i.id; - return -1; -} - uint32_t motion_database::get_motion_set_id(const char* name) { if (!name) return -1; @@ -271,19 +247,6 @@ motion_info* motion_database::get_motion_by_id(uint32_t id) { return 0; } -motion_info* motion_database::get_motion_by_name(char* name) { - if (!name) - return 0; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (motion_set_info& i : motion_set) - for (motion_info& j : i.motion) - if (name_hash == j.name_hash) - return &j; - return 0; -} - motion_info* motion_database::get_motion_by_name(const char* name) { if (!name) return 0; @@ -297,19 +260,6 @@ motion_info* motion_database::get_motion_by_name(const char* name) { return 0; } -uint32_t motion_database::get_motion_id(char* name) { - if (!name) - return -1; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (motion_set_info& i : motion_set) - for (motion_info& j : i.motion) - if (name_hash == j.name_hash) - return j.id; - return -1; -} - uint32_t motion_database::get_motion_id(const char* name) { if (!name) return -1; @@ -334,10 +284,10 @@ const char* motion_database::get_motion_name(uint32_t id) { return 0; } -bool motion_database::load_file(void* data, char* path, char* file, uint32_t hash) { +bool motion_database::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; diff --git a/src/KKdLib/database/motion.h b/src/KKdLib/database/motion.h index fcc6fe90..db5fc9a0 100644 --- a/src/KKdLib/database/motion.h +++ b/src/KKdLib/database/motion.h @@ -40,28 +40,24 @@ public: motion_database(); ~motion_database(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); void write(void** data, size_t* length); void merge_mdata(motion_database* base_mot_db, motion_database* mdata_mot_db); void split_mdata(motion_database* base_mot_db, motion_database* mdata_mot_db); motion_set_info* get_motion_set_by_id(uint32_t id); - motion_set_info* get_motion_set_by_name(char* name); motion_set_info* get_motion_set_by_name(const char* name); - uint32_t get_motion_set_id(char* name); uint32_t get_motion_set_id(const char* name); const char* get_motion_set_name(uint32_t id); motion_info* get_motion_by_id(uint32_t id); - motion_info* get_motion_by_name(char* name); motion_info* get_motion_by_name(const char* name); - uint32_t get_motion_id(char* name); uint32_t get_motion_id(const char* name); const char* get_motion_name(uint32_t id); - static bool load_file(void* data, char* path, char* file, uint32_t hash); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/database/object.c b/src/KKdLib/database/object.c index 1e9061b2..e9424f10 100644 --- a/src/KKdLib/database/object.c +++ b/src/KKdLib/database/object.c @@ -11,26 +11,34 @@ #include "../sort.h" #include "../str_utils.h" -vector_old_func(object_info) -vector_old_func(object_info_data) -vector_old_func(object_set_info) - static void object_database_classic_read_inner(object_database* obj_db, stream* s); static void object_database_classic_write_inner(object_database* obj_db, stream* s); static void object_database_modern_read_inner(object_database* obj_db, stream* s, uint32_t header_length); static void object_database_modern_write_inner(object_database* obj_db, stream* s); -static ssize_t object_database_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, char* str); -static void object_database_strings_push_back_check(vector_old_string* vec, char* str); +static ssize_t object_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, std::string& str); +static void object_database_strings_push_back_check(std::vector& vec, std::string& str); -const object_info object_info_null = { (uint32_t)-1, (uint32_t)-1 }; - -void object_database_init(object_database* obj_db) { - memset(obj_db, 0, sizeof(object_database)); +object_info::object_info() { + this->id = (uint32_t)-1; + this->set_id = (uint32_t)-1; } -void object_database_read(object_database* obj_db, char* path, bool modern) { - if (!obj_db || !path) +object_info::object_info(uint32_t id, uint32_t set_id) { + this->id = id; + this->set_id = set_id; +} + +object_database::object_database() : ready(), modern(), is_x() { + +} + +object_database::~object_database() { + +} + +void object_database::read(const char* path, bool modern) { + if (!path) return; if (!modern) { @@ -42,8 +50,8 @@ void object_database_read(object_database* obj_db, char* path, bool modern) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); - object_database_classic_read_inner(obj_db, &s_bin); + io_open(&s_bin, data, s.length); + object_database_classic_read_inner(this, &s_bin); io_free(&s_bin); free(data); } @@ -58,9 +66,9 @@ void object_database_read(object_database* obj_db, char* path, bool modern) { f2_struct_read(&st, path_osi); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; - io_mopen(&s_mosi, st.data, st.length); + io_open(&s_mosi, st.data, st.length); s_mosi.is_big_endian = st.header.use_big_endian; - object_database_modern_read_inner(obj_db, &s_mosi, st.header.length); + object_database_modern_read_inner(this, &s_mosi, st.header.length); io_free(&s_mosi); } f2_struct_free(&st); @@ -69,21 +77,21 @@ void object_database_read(object_database* obj_db, char* path, bool modern) { } } -void object_database_wread(object_database* obj_db, wchar_t* path, bool modern) { - if (!obj_db || !path) +void object_database::read(const wchar_t* path, bool modern) { + if (!path) return; if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); - if (path_wcheck_file_exists(path_bin)) { + if (path_check_file_exists(path_bin)) { stream s; - io_wopen(&s, path_bin, L"rb"); + io_open(&s, path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); - object_database_classic_read_inner(obj_db, &s_bin); + io_open(&s_bin, data, s.length); + object_database_classic_read_inner(this, &s_bin); io_free(&s_bin); free(data); } @@ -93,14 +101,14 @@ void object_database_wread(object_database* obj_db, wchar_t* path, bool modern) } else { wchar_t* path_osi = str_utils_wadd(path, L".osi"); - if (path_wcheck_file_exists(path_osi)) { + if (path_check_file_exists(path_osi)) { f2_struct st; - f2_struct_wread(&st, path_osi); + f2_struct_read(&st, path_osi); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; - io_mopen(&s_mosi, st.data, st.length); + io_open(&s_mosi, st.data, st.length); s_mosi.is_big_endian = st.header.use_big_endian; - object_database_modern_read_inner(obj_db, &s_mosi, st.header.length); + object_database_modern_read_inner(this, &s_mosi, st.header.length); io_free(&s_mosi); } f2_struct_free(&st); @@ -109,40 +117,40 @@ void object_database_wread(object_database* obj_db, wchar_t* path, bool modern) } } -void object_database_mread(object_database* obj_db, void* data, size_t length, bool modern) { - if (!obj_db || !data || !length) +void object_database::read(const void* data, size_t length, bool modern) { + if (!data || !length) return; if (!modern) { stream s; - io_mopen(&s, data, length); - object_database_classic_read_inner(obj_db, &s); + io_open(&s, data, length); + object_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - f2_struct_mread(&st, data, length); + f2_struct_read(&st, data, length); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; - io_mopen(&s_mosi, st.data, st.length); + io_open(&s_mosi, st.data, st.length); s_mosi.is_big_endian = st.header.use_big_endian; - object_database_modern_read_inner(obj_db, &s_mosi, st.header.length); + object_database_modern_read_inner(this, &s_mosi, st.header.length); io_free(&s_mosi); } f2_struct_free(&st); } } -void object_database_write(object_database* obj_db, char* path) { - if (!obj_db || !path || !obj_db->ready) +void object_database::write(const char* path) { + if (!path || !ready) return; - if (!obj_db->modern) { + if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; io_open(&s, path_bin, "wb"); if (s.io.stream) - object_database_classic_write_inner(obj_db, &s); + object_database_classic_write_inner(this, &s); io_free(&s); free(path_bin); } @@ -151,55 +159,283 @@ void object_database_write(object_database* obj_db, char* path) { stream s; io_open(&s, path_osi, "wb"); if (s.io.stream) - object_database_modern_write_inner(obj_db, &s); + object_database_modern_write_inner(this, &s); io_free(&s); free(path_osi); } } -void object_database_wwrite(object_database* obj_db, wchar_t* path) { - if (!obj_db || !path || !obj_db->ready) +void object_database::write(const wchar_t* path) { + if (!path || !ready) return; - if (!obj_db->modern) { + if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); stream s; - io_wopen(&s, path_bin, L"wb"); + io_open(&s, path_bin, L"wb"); if (s.io.stream) - object_database_classic_write_inner(obj_db, &s); + object_database_classic_write_inner(this, &s); io_free(&s); free(path_bin); } else { wchar_t* path_osi = str_utils_wadd(path, L".osi"); stream s; - io_wopen(&s, path_osi, L"wb"); + io_open(&s, path_osi, L"wb"); if (s.io.stream) - object_database_modern_write_inner(obj_db, &s); + object_database_modern_write_inner(this, &s); io_free(&s); free(path_osi); } } -void object_database_mwrite(object_database* obj_db, void** data, size_t* length) { - if (!obj_db || !data || !obj_db->ready) +void object_database::write(void** data, size_t* length) { + if (!data || !ready) return; stream s; - io_mopen(&s, 0, 0); - if (!obj_db->modern) - object_database_classic_write_inner(obj_db, &s); + io_open(&s); + if (!modern) + object_database_classic_write_inner(this, &s); else - object_database_modern_write_inner(obj_db, &s); + object_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -bool object_database_load_file(void* data, char* path, char* file, uint32_t hash) { +void object_database::merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db) { + if (!base_obj_db || !mdata_obj_db || !base_obj_db->ready || !mdata_obj_db->ready) + return; + + bone_name.reserve(base_obj_db->bone_name.size()); + + for (std::string& i : base_obj_db->bone_name) + bone_name.push_back(i); + + std::vector& base_object_set = base_obj_db->object_set; + std::vector& mdata_object_set = mdata_obj_db->object_set; + + int32_t count = (int32_t)base_object_set.size(); + object_set.resize(count); + + for (int32_t i = 0; i < count; i++) { + object_set_info* b_set_info = &base_object_set[i]; + object_set_info* set_info = &object_set[i]; + + set_info->name = b_set_info->name; + set_info->name_hash = hash_string_fnv1a64m(&set_info->name, false); + set_info->id = b_set_info->id; + set_info->object_file_name = b_set_info->object_file_name; + set_info->texture_file_name = b_set_info->texture_file_name; + set_info->archive_file_name = b_set_info->archive_file_name; + + int32_t info_count = (int32_t)b_set_info->object.size(); + set_info->object.resize(info_count); + + for (int32_t j = 0; j < info_count; j++) { + object_info_data* b_info = &b_set_info->object[j]; + object_info_data* info = &set_info->object[j]; + + info->id = b_info->id; + info->name = b_info->name; + info->name_hash_fnv1a64m = hash_string_fnv1a64m(&info->name, false); + info->name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info->name, true); + info->name_hash_murmurhash = hash_string_murmurhash(&info->name, 0, false); + } + } + + int32_t mdata_count = (int32_t)mdata_object_set.size(); + for (int32_t i = 0; i < mdata_count; i++) { + object_set_info* m_set_info = &mdata_object_set[i]; + + uint64_t name_hash = m_set_info->name_hash; + size_t name_len = m_set_info->name.size(); + + object_set_info* info_ptr = 0; + for (object_set_info& j : object_set) + if (name_hash == j.name_hash) { + info_ptr = &j; + break; + } + + object_set_info set_info; + set_info.name = m_set_info->name; + set_info.name_hash = hash_string_fnv1a64m(&set_info.name, false); + set_info.id = m_set_info->id; + set_info.object_file_name = m_set_info->object_file_name; + set_info.texture_file_name = m_set_info->texture_file_name; + set_info.archive_file_name = m_set_info->archive_file_name; + + int32_t info_count = (int32_t)m_set_info->object.size(); + set_info.object.resize(info_count); + + for (int32_t j = 0; j < info_count; j++) { + object_info_data* m_info = &m_set_info->object[j]; + object_info_data* info = &set_info.object[j]; + + info->id = m_info->id; + info->name = m_info->name; + info->name_hash_fnv1a64m = hash_string_fnv1a64m(&info->name, false); + info->name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info->name, true); + info->name_hash_murmurhash = hash_string_murmurhash(&info->name, 0, false); + } + + if (info_ptr) + *info_ptr = set_info; + else + object_set.push_back(set_info); + } + + ready = true; +} + +void object_database::split_mdata(object_database* base_obj_db, object_database* mdata_obj_db) { + if (!base_obj_db || !mdata_obj_db || !ready || !base_obj_db->ready) + return; +} + +bool object_database::get_object_set_info(const char* name, object_set_info** set_info) { + if (!set_info) + return false; + *set_info = 0; + + if (!name) + return false; + + uint64_t name_hash = hash_utf8_fnv1a64m(name, false); + + for (object_set_info& i : object_set) + if (name_hash == i.name_hash) { + *set_info = &i; + return true; + } + return false; +} + +bool object_database::get_object_set_info_by_set_id(uint32_t set_id, object_set_info** set_info) { + if (!set_info) + return false; + *set_info = 0; + + if (set_id == -1) + return false; + + for (object_set_info& i : object_set) + if (set_id == i.id) { + *set_info = &i; + return true; + } + return false; +} + +bool object_database::get_object_info_data(const char* name, object_info_data** info) { + if (!info) + return false; + *info = 0; + + if (!name) + return false; + + uint64_t name_hash = hash_utf8_fnv1a64m(name, false); + + for (object_set_info& i : object_set) + for (object_info_data& j : i.object) + if (name_hash == j.name_hash_fnv1a64m) { + *info = &j; + return true; + } + return false; +} + +bool object_database::get_object_info_data_by_fnv1a64m_hash(uint64_t hash, object_info_data** info) { + if (!info) + return false; + *info = 0; + + if (hash == hash_fnv1a64m_empty) + return false; + + for (object_set_info& i : object_set) + for (object_info_data& j : i.object) + if (hash == j.name_hash_fnv1a64m) { + *info = &j; + return true; + } + return false; +} + +bool object_database::get_object_info_data_by_fnv1a64m_hash_upper(uint64_t hash, object_info_data** info) { + if (!info) + return false; + *info = 0; + + if (hash == hash_fnv1a64m_empty) + return false; + + for (object_set_info& i : object_set) + for (object_info_data& j : i.object) + if (hash == j.name_hash_fnv1a64m_upper) { + *info = &j; + return true; + } + return false; +} + +bool object_database::get_object_info_data_by_murmurhash(uint32_t hash, object_info_data** info) { + if (!info) + return false; + *info = 0; + + if (hash == hash_murmurhash_empty) + return false; + + for (object_set_info& i : object_set) + for (object_info_data& j : i.object) + if (hash == j.name_hash_murmurhash) { + *info = &j; + return true; + } + return false; +} + +object_info object_database::get_object_info(const char* name) { + if (!name) + return object_info(); + + size_t name_len = utf8_length(name); + if (!str_utils_compare_length(name, name_len, "NULL", 5)) + return object_info(); + + uint64_t name_hash = hash_utf8_fnv1a64m(name, false); + if (name_hash == hash_murmurhash_empty) + return object_info(); + + for (object_set_info& i : object_set) + for (object_info_data& j : i.object) + if (name_hash == j.name_hash_fnv1a64m) + return { j.id, i.id }; + + return object_info(); +} + +const char* object_database::get_object_name(object_info obj_info) { + if (obj_info.is_null()) + return 0; + + for (object_set_info& i : object_set) + if (obj_info.set_id == i.id) + for (object_info_data& j : i.object) + if (obj_info.id == j.id) + return j.name.c_str(); + + return 0; +} + +bool object_database::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -208,321 +444,26 @@ bool object_database_load_file(void* data, char* path, char* file, uint32_t hash string_add_length(&s, file, file_len); object_database* obj_db = (object_database*)data; - object_database_read(obj_db, string_data(&s), obj_db->modern); + obj_db->read(string_data(&s), obj_db->modern); string_free(&s); return obj_db->ready; } -void object_database_merge_mdata(object_database* obj_db, - object_database* base_obj_db, object_database* mdata_obj_db) { - if (!obj_db || !base_obj_db || !mdata_obj_db - || !base_obj_db->ready || !mdata_obj_db->ready) - return; +object_set_info::object_set_info() : name_hash(), id() { - vector_old_string* bone_name = &obj_db->bone_name; - vector_old_string* base_bone_name = &base_obj_db->bone_name; - - int32_t bone_count = (int32_t)vector_old_length(*base_bone_name); - vector_old_string_reserve(bone_name, bone_count); - bone_name->end += bone_count; - - for (int32_t i = 0; i < bone_count; i++) - string_copy(&base_bone_name->begin[i], &bone_name->begin[i]); - - vector_old_object_set_info* object_set = &obj_db->object_set; - vector_old_object_set_info* base_object_set = &base_obj_db->object_set; - vector_old_object_set_info* mdata_object_set = &mdata_obj_db->object_set; - - int32_t count = (int32_t)vector_old_length(*base_object_set); - vector_old_object_set_info_reserve(object_set, count); - object_set->end += count; - - for (int32_t i = 0; i < count; i++) { - object_set_info* b_set_info = &base_object_set->begin[i]; - object_set_info* set_info = &object_set->begin[i]; - - string_copy(&b_set_info->name, &set_info->name); - set_info->name_hash = hash_string_fnv1a64m(&set_info->name, false); - set_info->id = b_set_info->id; - string_copy(&b_set_info->object_file_name, &set_info->object_file_name); - string_copy(&b_set_info->texture_file_name, &set_info->texture_file_name); - string_copy(&b_set_info->archive_file_name, &set_info->archive_file_name); - - int32_t info_count = (int32_t)vector_old_length(b_set_info->object); - vector_old_object_info_data_reserve(&set_info->object, info_count); - set_info->object.end += info_count; - - for (int32_t j = 0; j < info_count; j++) { - object_info_data* b_info = &b_set_info->object.begin[j]; - object_info_data* info = &set_info->object.begin[j]; - - info->id = b_info->id; - string_copy(&b_info->name, &info->name); - info->name_hash_fnv1a64m = hash_string_fnv1a64m(&info->name, false); - info->name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info->name, true); - info->name_hash_murmurhash = hash_string_murmurhash(&info->name, 0, false); - } - } - - int32_t mdata_count = (int32_t)vector_old_length(*mdata_object_set); - for (int32_t i = 0; i < mdata_count; i++) { - object_set_info* m_set_info = &mdata_object_set->begin[i]; - - uint64_t name_hash = m_set_info->name_hash; - size_t name_len = m_set_info->name.length; - - object_set_info* set_info = 0; - for (set_info = object_set->begin; set_info != object_set->end; set_info++) - if (name_hash == set_info->name_hash) - break; - - if (set_info == object_set->end) - set_info = vector_old_object_set_info_reserve_back(object_set); - - string_replace(&m_set_info->name, &set_info->name); - set_info->name_hash = hash_string_fnv1a64m(&set_info->name, false); - set_info->id = m_set_info->id; - string_replace(&m_set_info->object_file_name, &set_info->object_file_name); - string_replace(&m_set_info->texture_file_name, &set_info->texture_file_name); - string_replace(&m_set_info->archive_file_name, &set_info->archive_file_name); - - vector_old_object_info_data_clear(&set_info->object, object_info_data_free); - int32_t info_count = (int32_t)vector_old_length(m_set_info->object); - vector_old_object_info_data_reserve(&set_info->object, info_count); - set_info->object.end += info_count; - - for (int32_t j = 0; j < info_count; j++) { - object_info_data* m_info = &m_set_info->object.begin[j]; - object_info_data* info = &set_info->object.begin[j]; - - info->id = m_info->id; - string_copy(&m_info->name, &info->name); - info->name_hash_fnv1a64m = hash_string_fnv1a64m(&info->name, false); - info->name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info->name, true); - info->name_hash_murmurhash = hash_string_murmurhash(&info->name, 0, false); - } - } - - obj_db->ready = true; } -void object_database_split_mdata(object_database* obj_db, - object_database* base_obj_db, object_database* mdata_obj_db) { - if (!obj_db || !base_obj_db || !mdata_obj_db - || !obj_db->ready || !base_obj_db->ready) - return; +object_set_info::~object_set_info() { + } -bool object_database_get_object_set_info(object_database* obj_db, - char* name, object_set_info** set_info) { - if (!set_info) - return false; - *set_info = 0; - - if (!obj_db || !name) - return false; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - if (name_hash == i->name_hash) { - *set_info = i; - return true; - } - return false; +object_info_data::object_info_data() : id(), name_hash_fnv1a64m(), +name_hash_fnv1a64m_upper(), name_hash_murmurhash() { } -bool object_database_get_object_set_info(object_database* obj_db, - const char* name, object_set_info** set_info) { - if (!set_info) - return false; - *set_info = 0; +object_info_data::~object_info_data() { - if (!obj_db || !name) - return false; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - if (name_hash == i->name_hash) { - *set_info = i; - return true; - } - return false; -} - -bool object_database_get_object_set_info_by_set_id(object_database* obj_db, - uint32_t set_id, object_set_info** set_info) { - if (!set_info) - return false; - *set_info = 0; - - if (!obj_db || set_id == -1) - return false; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - if (set_id == i->id) { - *set_info = i; - return true; - } - return false; -} - -bool object_database_get_object_info_data(object_database* obj_db, - char* name, object_info_data** info) { - if (!info) - return false; - *info = 0; - - if (!obj_db || !name) - return false; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (name_hash == j->name_hash_fnv1a64m) { - *info = j; - return true; - } - return false; -} - -bool object_database_get_object_info_data(object_database* obj_db, - const char* name, object_info_data** info) { - if (!info) - return false; - *info = 0; - - if (!obj_db || !name) - return false; - - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (name_hash == j->name_hash_fnv1a64m) { - *info = j; - return true; - } - return false; -} - -bool object_database_get_object_info_data_by_fnv1a64m_hash(object_database* obj_db, - uint64_t hash, object_info_data** info) { - if (!info) - return false; - *info = 0; - - if (!obj_db) - return false; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (hash == j->name_hash_fnv1a64m) { - *info = j; - return true; - } - return false; -} - -bool object_database_get_object_info_data_by_fnv1a64m_hash_upper(object_database* obj_db, - uint64_t hash, object_info_data** info) { - if (!info) - return false; - *info = 0; - - if (!obj_db) - return false; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (hash == j->name_hash_fnv1a64m_upper) { - *info = j; - return true; - } - return false; -} - -bool object_database_get_object_info_data_by_murmurhash(object_database* obj_db, - uint32_t hash, object_info_data** info) { - if (!info) - return false; - *info = 0; - - if (!obj_db) - return false; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (hash == j->name_hash_murmurhash) { - *info = j; - return true; - } - return false; -} -object_info object_database_get_object_info(object_database* obj_db, char* name) { - if (!obj_db || !name) - return object_info_null; - - size_t name_len = utf8_length(name); - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - if (!str_utils_compare_length(name, name_len, "NULL", 5)) - return object_info_null; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (name_hash == j->name_hash_fnv1a64m) - return { j->id, i->id }; - - return object_info_null; -} - -object_info object_database_get_object_info(object_database* obj_db, const char* name) { - if (!obj_db || !name) - return object_info_null; - - size_t name_len = utf8_length(name); - uint64_t name_hash = hash_utf8_fnv1a64m(name, false); - if (!str_utils_compare_length(name, name_len, "NULL", 5)) - return object_info_null; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (name_hash == j->name_hash_fnv1a64m) - return { j->id, i->id }; - - return object_info_null; -} - -char* object_database_get_object_name(object_database* obj_db, object_info obj_info) { - if (!obj_db || obj_info.is_null()) - return 0; - - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - if (obj_info.set_id == i->id) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - if (obj_info.id == j->id) - return string_data(&j->name); - - return 0; -} - -void object_database_free(object_database* obj_db) { - vector_old_object_set_info_free(&obj_db->object_set, object_set_info_free); -} - -void object_info_data_free(object_info_data* info) { - string_free(&info->name); -} - -void object_set_info_free(object_set_info* set_info) { - string_free(&set_info->name); - vector_old_object_info_data_free(&set_info->object, object_info_data_free); - string_free(&set_info->object_file_name); - string_free(&set_info->texture_file_name); - string_free(&set_info->archive_file_name); } static void object_database_classic_read_inner(object_database* obj_db, stream* s) { @@ -532,12 +473,11 @@ static void object_database_classic_read_inner(object_database* obj_db, stream* uint32_t object_count = io_read_uint32_t(s); uint32_t objects_offset = io_read_uint32_t(s); - vector_old_object_set_info_reserve(&obj_db->object_set, object_set_count); - obj_db->object_set.end += object_set_count; + obj_db->object_set.resize(object_set_count); io_position_push(s, object_sets_offset, SEEK_SET); for (uint32_t i = 0; i < object_set_count; i++) { - object_set_info* set_info = &obj_db->object_set.begin[i]; + object_set_info* set_info = &obj_db->object_set[i]; io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &set_info->name); set_info->id = io_read_uint32_t(s); @@ -563,19 +503,11 @@ static void object_database_classic_read_inner(object_database* obj_db, stream* if (set_id == 0xFFFF) set_id = -1; - bool found = false; - for (uint32_t i = 0; i < object_set_count; i++) { - object_set_info* set_info = &obj_db->object_set.begin[i]; - if (set_id != set_info->id) - continue; - - vector_old_object_info_data_push_back(&set_info->object, &info); - found = true; - break; - } - - if (!found) - string_free(&info.name); + for (uint32_t i = 0; i < object_set_count; i++) + if (set_id == obj_db->object_set[i].id) { + obj_db->object_set[i].object.push_back(info); + break; + } } io_position_pop(s); @@ -595,67 +527,65 @@ static void object_database_classic_write_inner(object_database* obj_db, stream* io_write_uint32_t(s, 0x90669066); io_align_write(s, 0x20); - uint32_t object_set_count = (uint32_t)vector_old_length(obj_db->object_set); + uint32_t object_set_count = (uint32_t)obj_db->object_set.size(); - vector_old_ssize_t string_offsets = vector_old_empty(ssize_t); - vector_old_ssize_t_reserve(&string_offsets, object_set_count * 4ULL); + std::vector string_offsets; + string_offsets.reserve(object_set_count * 4ULL); uint32_t max_object_set_id = 0; uint32_t object_count = 0; ssize_t object_sets_offset = 0; size_t off_idx = 0; ssize_t objects_offset = 0; - if (string_offsets.begin) { - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, &i->name); - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, &i->object_file_name); - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, &i->texture_file_name); - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, &i->archive_file_name); + if (string_offsets.size()) { + for (object_set_info& i : obj_db->object_set) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &i.name); + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &i.object_file_name); + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &i.texture_file_name); + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &i.archive_file_name); } io_align_write(s, 0x20); object_sets_offset = io_get_position(s); - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - io_write_uint32_t(s, (uint32_t)string_offsets.begin[off_idx++]); - io_write_uint32_t(s, i->id); - io_write_uint32_t(s, (uint32_t)string_offsets.begin[off_idx++]); - io_write_uint32_t(s, (uint32_t)string_offsets.begin[off_idx++]); - io_write_uint32_t(s, (uint32_t)string_offsets.begin[off_idx++]); + for (object_set_info& i : obj_db->object_set) { + io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); + io_write_uint32_t(s, i.id); + io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); + io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); + io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); io_write(s, 0x10); - if (max_object_set_id < i->id) - max_object_set_id = i->id; - object_count += (uint32_t)vector_old_length(i->object); + if (max_object_set_id < i.id) + max_object_set_id = i.id; + object_count += (uint32_t)i.object.size(); } - vector_old_ssize_t_clear(&string_offsets, 0); - vector_old_ssize_t_reserve(&string_offsets, object_count); + string_offsets.clear(); + string_offsets.reserve(object_count); - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - for (object_info_data* j = i->object.begin; j != i->object.end; j++) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, &j->name); + for (object_set_info& i : obj_db->object_set) + for (object_info_data& j : i.object) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &j.name); } io_align_write(s, 0x20); objects_offset = io_get_position(s); off_idx = 0; - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - uint16_t set_id = (uint16_t)i->id; - for (object_info_data* j = i->object.begin; j != i->object.end; j++) { - io_write_uint16_t(s, (uint16_t)j->id); + for (object_set_info& i : obj_db->object_set) { + uint16_t set_id = (uint16_t)i.id; + for (object_info_data& j : i.object) { + io_write_uint16_t(s, (uint16_t)j.id); io_write_uint16_t(s, set_id); - io_write_uint32_t(s, (uint32_t)string_offsets.begin[off_idx++]); + io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); } } io_align_write(s, 0x20); } - vector_old_ssize_t_free(&string_offsets, 0); - io_position_push(s, 0x00, SEEK_SET); io_write_uint32_t(s, object_set_count); io_write_uint32_t(s, max_object_set_id); @@ -683,13 +613,12 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s uint32_t object_count = io_read_uint32_t_stream_reverse_endianness(s); ssize_t objects_offset = io_read_offset(s, header_length, is_x); - vector_old_object_set_info_reserve(&obj_db->object_set, object_set_count); - obj_db->object_set.end += object_set_count; + obj_db->object_set.resize(object_set_count); io_position_push(s, object_sets_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < object_set_count; i++) { - object_set_info* set_info = &obj_db->object_set.begin[i]; + object_set_info* set_info = &obj_db->object_set[i]; io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &set_info->name); set_info->id = io_read_uint32_t_stream_reverse_endianness(s); @@ -703,7 +632,7 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s } else for (uint32_t i = 0; i < object_set_count; i++) { - object_set_info* set_info = &obj_db->object_set.begin[i]; + object_set_info* set_info = &obj_db->object_set[i]; io_read_string_null_terminated_offset(s, io_read_offset_x(s), &set_info->name); set_info->id = io_read_uint32_t_stream_reverse_endianness(s); @@ -725,19 +654,11 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s uint32_t set_id = io_read_uint32_t_stream_reverse_endianness(s); io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &info.name); - bool found = false; - for (uint32_t i = 0; i < object_set_count; i++) { - object_set_info* set_info = &obj_db->object_set.begin[i]; - if (set_id != set_info->id) - continue; - - vector_old_object_info_data_push_back(&set_info->object, &info); - found = true; - break; - } - - if (!found) - string_free(&info.name); + for (uint32_t i = 0; i < object_set_count; i++) + if (set_id != obj_db->object_set[i].id) { + obj_db->object_set[i].object.push_back(info); + break; + } } else for (uint32_t i = 0; i < object_count; i++) { @@ -746,19 +667,11 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s uint32_t set_id = io_read_uint32_t_stream_reverse_endianness(s); io_read_string_null_terminated_offset(s, io_read_offset_x(s), &info.name); - bool found = false; - for (uint32_t i = 0; i < object_set_count; i++) { - object_set_info* set_info = &obj_db->object_set.begin[i]; - if (set_id != set_info->id) - continue; - - vector_old_object_info_data_push_back(&set_info->object, &info); - found = true; - break; - } - - if (!found) - string_free(&info.name); + for (uint32_t i = 0; i < object_set_count; i++) + if (set_id != obj_db->object_set[i].id) { + obj_db->object_set[i].object.push_back(info); + break; + } } io_position_pop(s); @@ -769,7 +682,7 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s static void object_database_modern_write_inner(object_database* obj_db, stream* s) { stream s_mosi; - io_mopen(&s_mosi, 0, 0); + io_open(&s_mosi); uint32_t off; vector_old_enrs_entry e = vector_old_empty(enrs_entry); enrs_entry ee; @@ -777,11 +690,11 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* bool is_x = obj_db->is_x; - uint32_t object_set_count = (uint32_t)vector_old_length(obj_db->object_set); + uint32_t object_set_count = (uint32_t)obj_db->object_set.size(); uint32_t object_count = 0; - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) - object_count += (uint32_t)vector_old_length(i->object); + for (object_set_info& i : obj_db->object_set) + object_count += (uint32_t)i.object.size(); if (!is_x) { ee = { 0, 1, 1, 1, vector_old_empty(enrs_sub_entry) }; @@ -842,26 +755,25 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* io_write(&s_mosi, object_count * (is_x ? 0x10ULL : 0x0CULL)); io_align_write(&s_mosi, 0x10); - vector_old_string strings = vector_old_empty(string); - vector_old_ssize_t string_offsets = vector_old_empty(ssize_t); + std::vector strings; + std::vector string_offsets; - vector_old_string_reserve(&strings, (ssize_t)object_set_count + object_count); + strings.reserve((ssize_t)object_set_count + object_count); - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - object_database_strings_push_back_check(&strings, string_data(&i->name)); - object_database_strings_push_back_check(&strings, string_data(&i->object_file_name)); - object_database_strings_push_back_check(&strings, string_data(&i->texture_file_name)); - object_database_strings_push_back_check(&strings, string_data(&i->archive_file_name)); - for (object_info_data* j = i->object.begin; j != i->object.end; j++) - object_database_strings_push_back_check(&strings, string_data(&j->name)); + for (object_set_info& i : obj_db->object_set) { + object_database_strings_push_back_check(strings, i.name); + object_database_strings_push_back_check(strings, i.object_file_name); + object_database_strings_push_back_check(strings, i.texture_file_name); + object_database_strings_push_back_check(strings, i.archive_file_name); + for (object_info_data& j : i.object) + object_database_strings_push_back_check(strings, j.name); } - quicksort_string(strings.begin, vector_old_length(strings)); - vector_old_ssize_t_reserve(&string_offsets, vector_old_length(strings)); - for (string* i = strings.begin; i != strings.end; i++) { - ssize_t off = io_get_position(&s_mosi); - io_write_string_null_terminated(&s_mosi, i); - vector_old_ssize_t_push_back(&string_offsets, &off); + quicksort_string(strings.data(), strings.size()); + string_offsets.reserve(strings.size()); + for (std::string& i : strings) { + string_offsets.push_back(io_get_position(&s_mosi)); + io_write_string_null_terminated(&s_mosi, &i); } io_align_write(&s_mosi, 0x10); @@ -876,62 +788,59 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* io_align_write(&s_mosi, 0x10); if (!is_x) - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->name)), 0x20, &pof); - io_write_uint32_t(&s_mosi, i->id); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->object_file_name)), 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->texture_file_name)), 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->archive_file_name)), 0x20, &pof); + for (object_set_info& i : obj_db->object_set) { + io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.name), 0x20, &pof); + io_write_uint32_t(&s_mosi, i.id); + io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.object_file_name), 0x20, &pof); + io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.texture_file_name), 0x20, &pof); + io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.archive_file_name), 0x20, &pof); io_write(&s_mosi, 0x10); } else - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->name)), &pof); - io_write_uint32_t(&s_mosi, i->id); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->object_file_name)), &pof); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->texture_file_name)), &pof); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&i->archive_file_name)), &pof); + for (object_set_info& i : obj_db->object_set) { + io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.name), &pof); + io_write_uint32_t(&s_mosi, i.id); + io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.object_file_name), &pof); + io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.texture_file_name), &pof); + io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, i.archive_file_name), &pof); io_write(&s_mosi, 0x10); } io_align_write(&s_mosi, 0x10); if (!is_x) - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - uint32_t set_id = i->id; - for (object_info_data* j = i->object.begin; j != i->object.end; j++) { - io_write_uint32_t(&s_mosi, j->id); + for (object_set_info& i : obj_db->object_set) { + uint32_t set_id = i.id; + for (object_info_data& j : i.object) { + io_write_uint32_t(&s_mosi, j.id); io_write_uint32_t(&s_mosi, set_id); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&j->name)), 0x20, &pof); + io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, j.name), 0x20, &pof); } } else - for (object_set_info* i = obj_db->object_set.begin; i != obj_db->object_set.end; i++) { - uint32_t set_id = i->id; - for (object_info_data* j = i->object.begin; j != i->object.end; j++) { - io_write_uint32_t(&s_mosi, j->id); + for (object_set_info& i : obj_db->object_set) { + uint32_t set_id = i.id; + for (object_info_data& j : i.object) { + io_write_uint32_t(&s_mosi, j.id); io_write_uint32_t(&s_mosi, set_id); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(&strings, - &string_offsets, string_data(&j->name)), &pof); + io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + string_offsets, j.name), &pof); } } io_position_pop(&s_mosi); - vector_old_string_free(&strings, string_free); - vector_old_ssize_t_free(&string_offsets, 0); - f2_struct st; memset(&st, 0, sizeof(f2_struct)); io_align_write(&s_mosi, 0x10); - io_mcopy(&s_mosi, &st.data, &st.length); + io_copy(&s_mosi, &st.data, &st.length); io_free(&s_mosi); st.enrs = e; @@ -942,25 +851,22 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* st.header.use_big_endian = false; st.header.use_section_size = true; - f2_struct_swrite(&st, s, true, is_x); + f2_struct_write(&st, s, true, is_x); f2_struct_free(&st); } -inline static ssize_t object_database_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return vec_off->begin[i - vec->begin]; +inline static ssize_t object_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, std::string& str) { + for (std::string& i : vec) + if (str == i) + return vec_off[&i - vec.data()]; return 0; } -inline static void object_database_strings_push_back_check(vector_old_string* vec, char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) +inline static void object_database_strings_push_back_check(std::vector& vec, std::string& str) { + for (std::string& i : vec) + if (str == i) return; - string* s = vector_old_string_reserve_back(vec); - string_init_length(s, str, len); + vec.push_back(str); } diff --git a/src/KKdLib/database/object.h b/src/KKdLib/database/object.h index 56a00cdb..d77be27a 100644 --- a/src/KKdLib/database/object.h +++ b/src/KKdLib/database/object.h @@ -5,87 +5,78 @@ #pragma once +#include +#include #include "../default.h" -#include "../string.h" -#include "../vector.h" typedef struct object_info { uint32_t id; uint32_t set_id; + object_info(); + object_info(uint32_t id, uint32_t set_id); inline bool is_null() { return id == (uint32_t)-1 && set_id == (uint32_t)-1; } inline bool not_null() { return id != (uint32_t)-1 || set_id != (uint32_t)-1; } inline bool operator ==(object_info& right) { return id == right.id && set_id == right.set_id; } inline bool operator !=(object_info& right) { return id != right.id || set_id != right.set_id; } } object_info; -vector_old(object_info) - -typedef struct object_info_data { +class object_info_data { +public: uint32_t id; - string name; + std::string name; uint64_t name_hash_fnv1a64m; uint64_t name_hash_fnv1a64m_upper; uint32_t name_hash_murmurhash; -} object_info_data; -vector_old(object_info_data) + object_info_data(); + ~object_info_data(); +}; -typedef struct object_set_info { - string name; +class object_set_info { +public: + std::string name; uint64_t name_hash; uint32_t id; - string object_file_name; - string texture_file_name; - string archive_file_name; - vector_old_object_info_data object; -} object_set_info; + std::string object_file_name; + std::string texture_file_name; + std::string archive_file_name; + std::vector object; -vector_old(object_set_info) + object_set_info(); + ~object_set_info(); +}; -typedef struct object_database { +class object_database { +public: bool ready; bool modern; bool is_x; - vector_old_string bone_name; - vector_old_object_set_info object_set; -} object_database; + std::vector bone_name; + std::vector object_set; -extern const object_info object_info_null; + object_database(); + ~object_database(); -extern void object_database_init(object_database* obj_db); -extern void object_database_read(object_database* obj_db, char* path, bool modern); -extern void object_database_wread(object_database* obj_db, wchar_t* path, bool modern); -extern void object_database_mread(object_database* obj_db, void* data, size_t length, bool modern); -extern void object_database_write(object_database* obj_db, char* path); -extern void object_database_wwrite(object_database* obj_db, wchar_t* path); -extern void object_database_mwrite(object_database* obj_db, void** data, size_t* length); -extern bool object_database_load_file(void* data, char* path, char* file, uint32_t hash); -extern void object_database_merge_mdata(object_database* obj_db, - object_database* base_obj_db, object_database* mdata_obj_db); -extern void object_database_split_mdata(object_database* obj_db, - object_database* base_obj_db, object_database* mdata_obj_db); -extern bool object_database_get_object_set_info(object_database* obj_db, - char* name, object_set_info** set_info); -extern bool object_database_get_object_set_info(object_database* obj_db, - const char* name, object_set_info** set_info); -extern bool object_database_get_object_set_info_by_set_id(object_database* obj_db, - uint32_t set_id, object_set_info** set_info); -extern bool object_database_get_object_info_data(object_database* obj_db, - char* name, object_info_data** info); -extern bool object_database_get_object_info_data(object_database* obj_db, - const char* name, object_info_data** info); -extern bool object_database_get_object_info_data_by_fnv1a64m_hash(object_database* obj_db, - uint64_t hash, object_info_data** info); -extern bool object_database_get_object_info_data_by_fnv1a64m_hash_upper(object_database* obj_db, - uint64_t hash, object_info_data** info); -extern bool object_database_get_object_info_data_by_murmurhash(object_database* obj_db, - uint32_t hash, object_info_data** info); -extern object_info object_database_get_object_info(object_database* obj_db, char* name); -extern object_info object_database_get_object_info(object_database* obj_db, const char* name); -extern char* object_database_get_object_name(object_database* obj_db, object_info obj_info); -extern void object_database_free(object_database* obj_db); + void read(const char* path, bool modern); + void read(const wchar_t* path, bool modern); + void read(const void* data, size_t length, bool modern); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); -extern void object_info_data_free(object_info_data* info); -extern void object_set_info_free(object_set_info* set_info); + void merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db); + void split_mdata(object_database* base_obj_db, object_database* mdata_obj_db); + + bool get_object_set_info(const char* name, object_set_info** set_info); + bool get_object_set_info_by_set_id(uint32_t set_id, object_set_info** set_info); + bool get_object_info_data(const char* name, object_info_data** info); + bool get_object_info_data_by_fnv1a64m_hash(uint64_t hash, object_info_data** info); + bool get_object_info_data_by_fnv1a64m_hash_upper(uint64_t hash, object_info_data** info); + bool get_object_info_data_by_murmurhash(uint32_t hash, object_info_data** info); + object_info get_object_info(const char* name); + const char* get_object_name(object_info obj_info); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/database/stage.c b/src/KKdLib/database/stage.c index a82467ac..4dc9cbee 100644 --- a/src/KKdLib/database/stage.c +++ b/src/KKdLib/database/stage.c @@ -21,7 +21,7 @@ void stage_database_init(stage_database* stage_data) { memset(stage_data, 0, sizeof(stage_database)); } -void stage_database_read(stage_database* stage_data, char* path, bool modern) { +void stage_database_read(stage_database* stage_data, const char* path, bool modern) { if (!stage_data || !path) return; @@ -34,7 +34,7 @@ void stage_database_read(stage_database* stage_data, char* path, bool modern) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); + io_open(&s_bin, data, s.length); stage_database_classic_read_inner(stage_data, &s_bin); io_free(&s_bin); free(data); @@ -50,7 +50,7 @@ void stage_database_read(stage_database* stage_data, char* path, bool modern) { f2_struct_read(&st, path_stg); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; - io_mopen(&s_stgc, st.data, st.length); + io_open(&s_stgc, st.data, st.length); s_stgc.is_big_endian = st.header.use_big_endian; stage_database_modern_read_inner(stage_data, &s_stgc, st.header.length); io_free(&s_stgc); @@ -61,20 +61,20 @@ void stage_database_read(stage_database* stage_data, char* path, bool modern) { } } -void stage_database_wread(stage_database* stage_data, wchar_t* path, bool modern) { +void stage_database_read(stage_database* stage_data, const wchar_t* path, bool modern) { if (!stage_data || !path) return; if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); - if (path_wcheck_file_exists(path_bin)) { + if (path_check_file_exists(path_bin)) { stream s; - io_wopen(&s, path_bin, L"rb"); + io_open(&s, path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); + io_open(&s_bin, data, s.length); stage_database_classic_read_inner(stage_data, &s_bin); io_free(&s_bin); free(data); @@ -85,12 +85,12 @@ void stage_database_wread(stage_database* stage_data, wchar_t* path, bool modern } else { wchar_t* path_stg = str_utils_wadd(path, L".stg"); - if (path_wcheck_file_exists(path_stg)) { + if (path_check_file_exists(path_stg)) { f2_struct st; - f2_struct_wread(&st, path_stg); + f2_struct_read(&st, path_stg); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; - io_mopen(&s_stgc, st.data, st.length); + io_open(&s_stgc, st.data, st.length); s_stgc.is_big_endian = st.header.use_big_endian; stage_database_modern_read_inner(stage_data, &s_stgc, st.header.length); io_free(&s_stgc); @@ -101,22 +101,22 @@ void stage_database_wread(stage_database* stage_data, wchar_t* path, bool modern } } -void stage_database_mread(stage_database* stage_data, void* data, size_t length, bool modern) { +void stage_database_read(stage_database* stage_data, const void* data, size_t length, bool modern) { if (!stage_data || !data || !length) return; if (!modern) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); stage_database_classic_read_inner(stage_data, &s); io_free(&s); } else { f2_struct st; - f2_struct_mread(&st, data, length); + f2_struct_read(&st, data, length); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; - io_mopen(&s_stgc, st.data, st.length); + io_open(&s_stgc, st.data, st.length); s_stgc.is_big_endian = st.header.use_big_endian; stage_database_modern_read_inner(stage_data, &s_stgc, st.header.length); io_free(&s_stgc); @@ -125,7 +125,7 @@ void stage_database_mread(stage_database* stage_data, void* data, size_t length, } } -void stage_database_write(stage_database* stage_data, char* path) { +void stage_database_write(stage_database* stage_data, const char* path) { if (!stage_data || !path || !stage_data->ready) return; @@ -149,14 +149,14 @@ void stage_database_write(stage_database* stage_data, char* path) { } } -void stage_database_wwrite(stage_database* stage_data, wchar_t* path) { +void stage_database_write(stage_database* stage_data, const wchar_t* path) { if (!stage_data || !path || !stage_data->ready) return; if (!stage_data->modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); stream s; - io_wopen(&s, path_bin, L"wb"); + io_open(&s, path_bin, L"wb"); if (s.io.stream) stage_database_classic_write_inner(stage_data, &s); io_free(&s); @@ -165,7 +165,7 @@ void stage_database_wwrite(stage_database* stage_data, wchar_t* path) { else { wchar_t* path_stg = str_utils_wadd(path, L".stg"); stream s; - io_wopen(&s, path_stg, L"wb"); + io_open(&s, path_stg, L"wb"); if (s.io.stream) stage_database_modern_write_inner(stage_data, &s); io_free(&s); @@ -173,25 +173,25 @@ void stage_database_wwrite(stage_database* stage_data, wchar_t* path) { } } -void stage_database_mwrite(stage_database* stage_data, void** data, size_t* length) { +void stage_database_write(stage_database* stage_data, void** data, size_t* length) { if (!stage_data || !data || !stage_data->ready) return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); if (!stage_data->modern) stage_database_classic_write_inner(stage_data, &s); else stage_database_modern_write_inner(stage_data, &s); io_align_write(&s, 0x10); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -bool stage_database_load_file(void* data, char* path, char* file, uint32_t hash) { +bool stage_database_load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -230,8 +230,8 @@ void stage_database_merge_mdata(stage_database* stage_data, string_copy(&b_info->collision_file_path, &info->collision_file_path); if (b_info->auth_3d_count) { info->auth_3d_count = b_info->auth_3d_count; - info->auth_3d_ids = force_malloc_s(uint32_t, b_info->auth_3d_count); - memcpy(info->auth_3d_ids, b_info->auth_3d_ids, sizeof(uint32_t) * b_info->auth_3d_count); + info->auth_3d_ids = force_malloc_s(int32_t, b_info->auth_3d_count); + memcpy(info->auth_3d_ids, b_info->auth_3d_ids, sizeof(int32_t) * b_info->auth_3d_count); } else { info->auth_3d_count = 0; @@ -266,8 +266,8 @@ void stage_database_merge_mdata(stage_database* stage_data, string_copy(&m_info->collision_file_path, &info->collision_file_path); if (m_info->auth_3d_count) { info->auth_3d_count = m_info->auth_3d_count; - info->auth_3d_ids = force_malloc_s(uint32_t, m_info->auth_3d_count); - memcpy(info->auth_3d_ids, m_info->auth_3d_ids, sizeof(uint32_t) * m_info->auth_3d_count); + info->auth_3d_ids = force_malloc_s(int32_t, m_info->auth_3d_count); + memcpy(info->auth_3d_ids, m_info->auth_3d_ids, sizeof(int32_t) * m_info->auth_3d_count); } else { info->auth_3d_count = 0; @@ -363,24 +363,24 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream int32_t reflect_offset = io_read_uint32_t(s); if (reflect_offset) { io_position_push(s, reflect_offset, SEEK_SET); - stage->reflect_data = true; - stage->reflect.mode = (stage_data_reflect_resolution_mode)io_read_uint32_t(s); - stage->reflect.blur_num = io_read_uint32_t(s); - stage->reflect.blur_filter = (stage_data_blur_filter_mode)io_read_uint32_t(s); + stage->reflect = true; + stage->reflect_data.mode = (stage_data_reflect_resolution_mode)io_read_uint32_t(s); + stage->reflect_data.blur_num = io_read_uint32_t(s); + stage->reflect_data.blur_filter = (stage_data_blur_filter_mode)io_read_uint32_t(s); io_position_pop(s); } else - stage->reflect_data = false; + stage->reflect = false; int32_t refract_offset = io_read_uint32_t(s); if (refract_offset) { io_position_push(s, refract_offset, SEEK_SET); - stage->refract_data = true; - stage->refract.mode = (stage_data_refract_resolution_mode)io_read_uint32_t(s); + stage->refract = true; + stage->refract_data.mode = (stage_data_refract_resolution_mode)io_read_uint32_t(s); io_position_pop(s); } else - stage->refract_data = false; + stage->refract = false; if (stage_data->format > STAGE_DATA_F) stage->flags = (stage_data_flags)io_read_uint32_t(s); @@ -441,7 +441,7 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream for (int32_t i = 0; i < count; i++) { ::stage_data* stage = &stage_data->stage_data.begin[i]; - stage->auth_3d_count = io_read_uint32_t(s); + stage->auth_3d_count = io_read_int32_t(s); } io_position_pop(s); @@ -457,19 +457,18 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream } io_position_push(s, offset, SEEK_SET); - for (uint32_t j = 0; j < stage->auth_3d_count; j++) { - if (io_read_uint32_t(s) == -1) { + for (int32_t j = 0; j < stage->auth_3d_count; j++) + if (io_read_int32_t(s) == -1) { stage->auth_3d_count = j; break; } - } io_position_pop(s); if (stage->auth_3d_count) { io_position_push(s, offset, SEEK_SET); - stage->auth_3d_ids = force_malloc_s(uint32_t, stage->auth_3d_count); - for (uint32_t j = 0; j < stage->auth_3d_count; j++) - stage->auth_3d_ids[j] = io_read_uint32_t(s); + stage->auth_3d_ids = force_malloc_s(int32_t, stage->auth_3d_count); + for (int32_t j = 0; j < stage->auth_3d_count; j++) + stage->auth_3d_ids[j] = io_read_int32_t(s); io_position_pop(s); } diff --git a/src/KKdLib/database/stage.h b/src/KKdLib/database/stage.h index 7e124c6f..cd967334 100644 --- a/src/KKdLib/database/stage.h +++ b/src/KKdLib/database/stage.h @@ -85,10 +85,10 @@ typedef struct stage_data { string collision_file_path; stage_data_reflect_type reflect_type; bool refract_enable; - bool reflect_data; - stage_data_reflect reflect; - bool refract_data; - stage_data_refract refract; + bool reflect; + stage_data_reflect reflect_data; + bool refract; + stage_data_refract refract_data; stage_data_flags flags; float_t ring_rectangle_x; float_t ring_rectangle_y; @@ -97,8 +97,8 @@ typedef struct stage_data { float_t ring_height; float_t ring_out_height; stage_effects effects; - uint32_t auth_3d_count; - uint32_t* auth_3d_ids; + int32_t auth_3d_count; + int32_t* auth_3d_ids; } stage_data; typedef struct stage_data_modern { @@ -137,8 +137,8 @@ typedef struct stage_data_modern { float_t ring_out_height; uint32_t field_13; stage_effects effects; - uint32_t auth_3d_count; - uint32_t* auth_3d_ids; + int32_t auth_3d_count; + int32_t* auth_3d_ids; } stage_data_modern; vector_old(stage_data) @@ -159,13 +159,13 @@ typedef struct stage_database { } stage_database; extern void stage_database_init(stage_database* stage_data); -extern void stage_database_read(stage_database* stage_data, char* path, bool modern); -extern void stage_database_wread(stage_database* stage_data, wchar_t* path, bool modern); -extern void stage_database_mread(stage_database* stage_data, void* data, size_t length, bool modern); -extern void stage_database_write(stage_database* stage_data, char* path); -extern void stage_database_wwrite(stage_database* stage_data, wchar_t* path); -extern void stage_database_mwrite(stage_database* stage_data, void** data, size_t* length); -extern bool stage_database_load_file(void* data, char* path, char* file, uint32_t hash); +extern void stage_database_read(stage_database* stage_data, const char* path, bool modern); +extern void stage_database_read(stage_database* stage_data, const wchar_t* path, bool modern); +extern void stage_database_read(stage_database* stage_data, const void* data, size_t length, bool modern); +extern void stage_database_write(stage_database* stage_data, const char* path); +extern void stage_database_write(stage_database* stage_data, const wchar_t* path); +extern void stage_database_write(stage_database* stage_data, void** data, size_t* length); +extern bool stage_database_load_file(void* data, const char* path, const char* file, uint32_t hash); extern void stage_database_merge_mdata(stage_database* stage_data, stage_database* base_stage_data, stage_database* mdata_stage_data); extern void stage_database_split_mdata(stage_database* stage_data, diff --git a/src/KKdLib/database/texture.c b/src/KKdLib/database/texture.c index d3f9c29a..79e603db 100644 --- a/src/KKdLib/database/texture.c +++ b/src/KKdLib/database/texture.c @@ -27,7 +27,7 @@ texture_database::~texture_database() { } -void texture_database::read(char* path, bool modern) { +void texture_database::read(const char* path, bool modern) { if (!path) return; @@ -40,7 +40,7 @@ void texture_database::read(char* path, bool modern) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); + io_open(&s_bin, data, s.length); texture_database_classic_read_inner(this, &s_bin); io_free(&s_bin); free(data); @@ -56,7 +56,7 @@ void texture_database::read(char* path, bool modern) { f2_struct_read(&st, path_txi); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; - io_mopen(&s_mtxi, st.data, st.length); + io_open(&s_mtxi, st.data, st.length); s_mtxi.is_big_endian = st.header.use_big_endian; texture_database_modern_read_inner(this, &s_mtxi, st.header.length); io_free(&s_mtxi); @@ -67,20 +67,20 @@ void texture_database::read(char* path, bool modern) { } } -void texture_database::read(wchar_t* path, bool modern) { +void texture_database::read(const wchar_t* path, bool modern) { if (!path) return; if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); - if (path_wcheck_file_exists(path_bin)) { + if (path_check_file_exists(path_bin)) { stream s; - io_wopen(&s, path_bin, L"rb"); + io_open(&s, path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); io_read(&s, data, s.length); stream s_bin; - io_mopen(&s_bin, data, s.length); + io_open(&s_bin, data, s.length); texture_database_classic_read_inner(this, &s_bin); io_free(&s_bin); free(data); @@ -91,12 +91,12 @@ void texture_database::read(wchar_t* path, bool modern) { } else { wchar_t* path_txi = str_utils_wadd(path, L".txi"); - if (path_wcheck_file_exists(path_txi)) { + if (path_check_file_exists(path_txi)) { f2_struct st; - f2_struct_wread(&st, path_txi); + f2_struct_read(&st, path_txi); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; - io_mopen(&s_mtxi, st.data, st.length); + io_open(&s_mtxi, st.data, st.length); s_mtxi.is_big_endian = st.header.use_big_endian; texture_database_modern_read_inner(this, &s_mtxi, st.header.length); io_free(&s_mtxi); @@ -107,22 +107,22 @@ void texture_database::read(wchar_t* path, bool modern) { } } -void texture_database::read(void* data, size_t length, bool modern) { +void texture_database::read(const void* data, size_t length, bool modern) { if (!data || !length) return; if (!modern) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); texture_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - f2_struct_mread(&st, data, length); + f2_struct_read(&st, data, length); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; - io_mopen(&s_mtxi, st.data, st.length); + io_open(&s_mtxi, st.data, st.length); s_mtxi.is_big_endian = st.header.use_big_endian; texture_database_modern_read_inner(this, &s_mtxi, st.header.length); io_free(&s_mtxi); @@ -131,7 +131,7 @@ void texture_database::read(void* data, size_t length, bool modern) { } } -void texture_database::write(char* path) { +void texture_database::write(const char* path) { if (!path || !ready) return; @@ -155,14 +155,14 @@ void texture_database::write(char* path) { } } -void texture_database::write(wchar_t* path) { +void texture_database::write(const wchar_t* path) { if (!path || !ready) return; if (!modern) { wchar_t* path_bin = str_utils_wadd(path, L".bin"); stream s; - io_wopen(&s, path_bin, L"wb"); + io_open(&s, path_bin, L"wb"); if (s.io.stream) texture_database_classic_write_inner(this, &s); io_free(&s); @@ -171,7 +171,7 @@ void texture_database::write(wchar_t* path) { else { wchar_t* path_txi = str_utils_wadd(path, L".txi"); stream s; - io_wopen(&s, path_txi, L"wb"); + io_open(&s, path_txi, L"wb"); if (s.io.stream) texture_database_modern_write_inner(this, &s); io_free(&s); @@ -184,13 +184,13 @@ void texture_database::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); if (!modern) texture_database_classic_write_inner(this, &s); else texture_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } @@ -276,10 +276,10 @@ const char* texture_database::get_texture_name(uint32_t id) { return 0; } -bool texture_database::load_file(void* data, char* path, char* file, uint32_t hash) { +bool texture_database::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -398,7 +398,7 @@ static void texture_database_modern_read_inner(texture_database* tex_db, stream* static void texture_database_modern_write_inner(texture_database* tex_db, stream* s) { stream s_mtxi; - io_mopen(&s_mtxi, 0, 0); + io_open(&s_mtxi); uint32_t off; vector_old_enrs_entry e = vector_old_empty(enrs_entry); enrs_entry ee; @@ -478,7 +478,7 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream f2_struct st; memset(&st, 0, sizeof(f2_struct)); io_align_write(&s_mtxi, 0x10); - io_mcopy(&s_mtxi, &st.data, &st.length); + io_copy(&s_mtxi, &st.data, &st.length); io_free(&s_mtxi); st.enrs = e; @@ -489,7 +489,7 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream st.header.use_big_endian = false; st.header.use_section_size = true; - f2_struct_swrite(&st, s, true, tex_db->is_x); + f2_struct_write(&st, s, true, tex_db->is_x); f2_struct_free(&st); } diff --git a/src/KKdLib/database/texture.h b/src/KKdLib/database/texture.h index 042f2c32..8c830d83 100644 --- a/src/KKdLib/database/texture.h +++ b/src/KKdLib/database/texture.h @@ -30,11 +30,11 @@ public: texture_database(); ~texture_database(); - void read(char* path, bool modern); - void read(wchar_t* path, bool modern); - void read(void* data, size_t length, bool modern); - void write(char* path); - void write(wchar_t* path); + void read(const char* path, bool modern); + void read(const wchar_t* path, bool modern); + void read(const void* data, size_t length, bool modern); + void write(const char* path); + void write(const wchar_t* path); void write(void** data, size_t* length); void merge_mdata(texture_database* base_tex_db, @@ -46,5 +46,5 @@ public: uint32_t get_texture_id(const char* name); const char* get_texture_name(uint32_t id); - static bool load_file(void* data, char* path, char* file, uint32_t hash); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); } texture_database; diff --git a/src/KKdLib/dds.c b/src/KKdLib/dds.c index 0d0b79c8..08562cea 100644 --- a/src/KKdLib/dds.c +++ b/src/KKdLib/dds.c @@ -170,7 +170,7 @@ void dds_wread(dds* d, wchar_t* path) { memset(d, 0, sizeof(dds)); wchar_t* path_dds = str_utils_wadd(path, L".dds"); stream s; - io_wopen(&s, path_dds, L"rb"); + io_open(&s, path_dds, L"rb"); if (s.io.stream) { if (io_read_uint32_t_reverse_endianness(&s, true) != DDS_MAGIC) goto End; @@ -259,7 +259,7 @@ void dds_wread(dds* d, wchar_t* path) { for (uint32_t i = 0; i < d->mipmaps_count; i++) { uint32_t width = max(d->width >> i, 1); uint32_t height = max(d->height >> i, 1); - uint32_t size = txp_get_size(d->format, + uint32_t size = txp::get_size(d->format, max(d->width >> i, 1), max(d->height >> i, 1)); void* data = force_malloc(size); io_read(&s, data, size); @@ -291,7 +291,7 @@ void dds_wwrite(dds* d, wchar_t* path) { wchar_t* path_dds = str_utils_wadd(path, L".dds"); stream s; - io_wopen(&s, path_dds, L"wb"); + io_open(&s, path_dds, L"wb"); if (s.io.stream) { DDS_HEADER dds_h; memset(&dds_h, 0, sizeof(DDS_HEADER)); @@ -301,7 +301,7 @@ void dds_wwrite(dds* d, wchar_t* path) { dds_h.flags |= DDSD_MIPMAPCOUNT; dds_h.height = d->height; dds_h.width = d->width; - dds_h.pitchOrLinearSize = txp_get_size(d->format, d->width, d->height); + dds_h.pitchOrLinearSize = txp::get_size(d->format, d->width, d->height); dds_h.mipMapCount = d->mipmaps_count; dds_h.caps |= DDS_SURFACE_FLAGS_TEXTURE; if (d->has_cube_map) @@ -362,7 +362,7 @@ void dds_wwrite(dds* d, wchar_t* path) { uint32_t index = 0; do for (uint32_t i = 0; i < d->mipmaps_count; i++) { - uint32_t size = txp_get_size(d->format, + uint32_t size = txp::get_size(d->format, max(d->width >> i, 1), max(d->height >> i, 1)); void* data = force_malloc(size); memcpy(data, d->data.begin[index], size); diff --git a/src/KKdLib/default.c b/src/KKdLib/default.c index 65634bad..3e4ff0e5 100644 --- a/src/KKdLib/default.c +++ b/src/KKdLib/default.c @@ -16,44 +16,44 @@ void* force_malloc(size_t size) { return buf; } -inline int16_t load_reverse_endianness_int16_t(void* ptr) { +inline int16_t load_reverse_endianness_int16_t(const void* ptr) { return (int16_t)_byteswap_ushort(*(uint16_t*)ptr); } -inline uint16_t load_reverse_endianness_uint16_t(void* ptr) { +inline uint16_t load_reverse_endianness_uint16_t(const void* ptr) { return (uint16_t)_byteswap_ushort(*(uint16_t*)ptr); } -inline int32_t load_reverse_endianness_int32_t(void* ptr) { +inline int32_t load_reverse_endianness_int32_t(const void* ptr) { return (int32_t)_byteswap_ulong(*(uint32_t*)ptr); } -inline uint32_t load_reverse_endianness_uint32_t(void* ptr) { +inline uint32_t load_reverse_endianness_uint32_t(const void* ptr) { return (uint32_t)_byteswap_ulong(*(uint32_t*)ptr); } -inline int64_t load_reverse_endianness_int64_t(void* ptr) { +inline int64_t load_reverse_endianness_int64_t(const void* ptr) { return (int64_t)_byteswap_uint64(*(uint64_t*)ptr); } -inline uint64_t load_reverse_endianness_uint64_t(void* ptr) { +inline uint64_t load_reverse_endianness_uint64_t(const void* ptr) { return (uint64_t)_byteswap_uint64(*(uint64_t*)ptr); } -inline ssize_t load_reverse_endianness_ssize_t(void* ptr) { +inline ssize_t load_reverse_endianness_ssize_t(const void* ptr) { return (ssize_t)_byteswap_uint64(*(uint64_t*)ptr); } -inline size_t load_reverse_endianness_size_t(void* ptr) { +inline size_t load_reverse_endianness_size_t(const void* ptr) { return (size_t)_byteswap_uint64(*(uint64_t*)ptr); } -inline float_t load_reverse_endianness_float_t(void* ptr) { +inline float_t load_reverse_endianness_float_t(const void* ptr) { uint32_t v = (uint32_t)_byteswap_ulong(*(uint32_t*)ptr); return *(float_t*)&v; } -inline double_t load_reverse_endianness_double_t(void* ptr) { +inline double_t load_reverse_endianness_double_t(const void* ptr) { uint64_t v = (uint64_t)_byteswap_uint64(*(uint64_t*)ptr); return *(double_t*)&v; } diff --git a/src/KKdLib/default.h b/src/KKdLib/default.h index bb6b7965..bd22ceb5 100644 --- a/src/KKdLib/default.h +++ b/src/KKdLib/default.h @@ -106,16 +106,16 @@ extern void* force_malloc(size_t size); #define enum_not(s0, s1) \ (s0) = (decltype(s0))(~(int32_t)(s0)) -extern int16_t load_reverse_endianness_int16_t(void* ptr); -extern uint16_t load_reverse_endianness_uint16_t(void* ptr); -extern int32_t load_reverse_endianness_int32_t(void* ptr); -extern uint32_t load_reverse_endianness_uint32_t(void* ptr); -extern int64_t load_reverse_endianness_int64_t(void* ptr); -extern uint64_t load_reverse_endianness_uint64_t(void* ptr); -extern ssize_t load_reverse_endianness_ssize_t(void* ptr); -extern size_t load_reverse_endianness_size_t(void* ptr); -extern float_t load_reverse_endianness_float_t(void* ptr); -extern double_t load_reverse_endianness_double_t(void* ptr); +extern int16_t load_reverse_endianness_int16_t(const void* ptr); +extern uint16_t load_reverse_endianness_uint16_t(const void* ptr); +extern int32_t load_reverse_endianness_int32_t(const void* ptr); +extern uint32_t load_reverse_endianness_uint32_t(const void* ptr); +extern int64_t load_reverse_endianness_int64_t(const void* ptr); +extern uint64_t load_reverse_endianness_uint64_t(const void* ptr); +extern ssize_t load_reverse_endianness_ssize_t(const void* ptr); +extern size_t load_reverse_endianness_size_t(const void* ptr); +extern float_t load_reverse_endianness_float_t(const void* ptr); +extern double_t load_reverse_endianness_double_t(const void* ptr); extern void store_reverse_endianness_int16_t(int16_t value, void* ptr); extern void store_reverse_endianness_int16_t(uint16_t value, void* ptr); extern void store_reverse_endianness_uint16_t(int16_t value, void* ptr); diff --git a/src/KKdLib/divafile.c b/src/KKdLib/divafile.c index 8e6d96a2..33ecfbe3 100644 --- a/src/KKdLib/divafile.c +++ b/src/KKdLib/divafile.c @@ -25,7 +25,7 @@ inline void divafile_decrypt(const char* path) { void divafile_wdecrypt(wchar_t* path) { wchar_t* file_temp = str_utils_wadd(path, L"_dec"); stream s_enc; - io_wopen(&s_enc, path, L"rb"); + io_open(&s_enc, path, L"rb"); if (s_enc.io.stream) { uint64_t signature = io_read_uint64_t(&s_enc); if (signature == 0x454C494641564944) { @@ -39,7 +39,7 @@ void divafile_wdecrypt(wchar_t* path) { aes_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); stream s_dec; - io_wopen(&s_dec, file_temp, L"wb"); + io_open(&s_dec, file_temp, L"wb"); io_write(&s_dec, data, min(file_length, stream_length)); io_free(&s_dec); free(data); @@ -100,7 +100,7 @@ void divafile_sdecrypt(stream* s) { aes_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); io_free(s); - io_mopen(s, data, file_length); + io_open(s, data, file_length); free(data); } @@ -117,7 +117,7 @@ inline void divafile_encrypt(const char* path) { void divafile_wencrypt(wchar_t* path) { wchar_t* file_temp = str_utils_wadd(path, L"_enc"); stream s_dec; - io_wopen(&s_dec, path, L"rb"); + io_open(&s_dec, path, L"rb"); if (s_dec.io.stream) { size_t len = s_dec.length; size_t len_align = align_val(len, 0x10); @@ -130,7 +130,7 @@ void divafile_wencrypt(wchar_t* path) { aes_ecb_encrypt_buffer(&ctx, (uint8_t*)data, len_align); stream s_enc; - io_wopen(&s_enc, file_temp, L"wb"); + io_open(&s_enc, file_temp, L"wb"); io_write_uint64_t(&s_enc, 0x454C494641564944); io_write_uint32_t(&s_enc, (uint32_t)len_align); io_write_uint32_t(&s_enc, (uint32_t)len); diff --git a/src/KKdLib/dsc.c b/src/KKdLib/dsc.c index e85223c8..f17c415c 100644 --- a/src/KKdLib/dsc.c +++ b/src/KKdLib/dsc.c @@ -1898,7 +1898,7 @@ bool dsc_parse(dsc* d, void* data, size_t length, dsc_type type) { case DSC_MGF: case DSC_X: case DSC_VRFL: - f2_struct_mread(&st, data, length); + f2_struct_read(&st, data, length); data_dsc = (uint32_t*)st.data; if (st.header.use_big_endian) for (size_t i = length / 4; i; i--, data_dsc++) @@ -2040,7 +2040,7 @@ void dsc_unparse(dsc* d, void** data, size_t* length) { st.header.length = 0x40; st.header.use_section_size = true; st.header.inner_signature = 0x13120420; - f2_struct_mwrite(&st, data, length, true, false); + f2_struct_write(&st, data, length, true, false); f2_struct_free(&st); } else { @@ -2049,7 +2049,7 @@ void dsc_unparse(dsc* d, void** data, size_t* length) { } } -bool dsc_load_file(void* data, char* path, char* file, uint32_t hash) { +bool dsc_load_file(void* data, const char* path, const char* file, uint32_t hash) { string s; string_init(&s, path); string_add(&s, file); diff --git a/src/KKdLib/dsc.h b/src/KKdLib/dsc.h index 559c4fa4..d415156f 100644 --- a/src/KKdLib/dsc.h +++ b/src/KKdLib/dsc.h @@ -431,7 +431,7 @@ extern uint32_t* dsc_data_get_func_data(dsc* d, dsc_data* data); extern void dsc_merge(dsc* d, int32_t count, ...); extern bool dsc_parse(dsc* d, void* data, size_t length, dsc_type type); extern void dsc_unparse(dsc* d, void** data, size_t* length); -extern bool dsc_load_file(void* data, char* path, char* file, uint32_t hash); +extern bool dsc_load_file(void* data, const char* path, const char* file, uint32_t hash); extern void dsc_free(dsc* d); extern void dsc_replace_init(dsc_replace* dr, dsc_type src_type, diff --git a/src/KKdLib/f2/struct.c b/src/KKdLib/f2/struct.c index 35c8e925..b0220b7d 100644 --- a/src/KKdLib/f2/struct.c +++ b/src/KKdLib/f2/struct.c @@ -16,7 +16,7 @@ static void f2_struct_get_length(f2_struct* s, bool shift_x); static void f2_struct_write_pof(stream* s, vector_old_size_t* pof, uint32_t depth, bool shift_x); static void f2_struct_write_enrs(stream* s, vector_old_enrs_entry* enrs, uint32_t depth); -void f2_struct_read(f2_struct* st, char* path) { +void f2_struct_read(f2_struct* st, const char* path) { memset(st, 0, sizeof(f2_struct)); stream s; @@ -31,11 +31,11 @@ void f2_struct_read(f2_struct* st, char* path) { io_free(&s); } -void f2_struct_wread(f2_struct* st, wchar_t* path) { +void f2_struct_read(f2_struct* st, const wchar_t* path) { memset(st, 0, sizeof(f2_struct)); stream s; - io_wopen(&s, path, L"rb"); + io_open(&s, path, L"rb"); if (&s.io.stream) { divafile_sdecrypt(&s); @@ -46,11 +46,11 @@ void f2_struct_wread(f2_struct* st, wchar_t* path) { io_free(&s); } -void f2_struct_mread(f2_struct* st, void* data, size_t length) { +void f2_struct_read(f2_struct* st, const void* data, size_t length) { memset(st, 0, sizeof(f2_struct)); stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); if (&s.io.data.data) { divafile_sdecrypt(&s); @@ -61,7 +61,7 @@ void f2_struct_mread(f2_struct* st, void* data, size_t length) { io_free(&s); } -void f2_struct_sread(f2_struct* st, stream* s) { +void f2_struct_read(f2_struct* st, stream* s) { memset(st, 0, sizeof(f2_struct)); if (s->io.stream || s->io.data.data) { @@ -73,7 +73,7 @@ void f2_struct_sread(f2_struct* st, stream* s) { } } -void f2_struct_write(f2_struct* st, char* path, bool use_depth, bool shift_x) { +void f2_struct_write(f2_struct* st, const char* path, bool use_depth, bool shift_x) { stream s; io_open(&s, path, "wb"); if (s.io.stream) { @@ -83,9 +83,9 @@ void f2_struct_write(f2_struct* st, char* path, bool use_depth, bool shift_x) { io_free(&s); } -void f2_struct_wwrite(f2_struct* st, wchar_t* path, bool use_depth, bool shift_x) { +void f2_struct_write(f2_struct* st, const wchar_t* path, bool use_depth, bool shift_x) { stream s; - io_wopen(&s, path, L"wb"); + io_open(&s, path, L"wb"); if (s.io.stream) { f2_struct_get_length(st, shift_x); f2_struct_write_inner(&s, st, 0, use_depth, shift_x); @@ -93,20 +93,20 @@ void f2_struct_wwrite(f2_struct* st, wchar_t* path, bool use_depth, bool shift_x io_free(&s); } -void f2_struct_mwrite(f2_struct* st, void** data, size_t* length, bool use_depth, bool shift_x) { +void f2_struct_write(f2_struct* st, void** data, size_t* length, bool use_depth, bool shift_x) { if (!st || !data) return; f2_struct_get_length(st, shift_x); stream s; - io_mopen(&s, 0, st->header.data_size + 0x40ULL); + io_open(&s, 0, st->header.data_size + 0x40ULL); f2_struct_write_inner(&s, st, 0, use_depth, shift_x); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -void f2_struct_swrite(f2_struct* st, stream* s, bool use_depth, bool shift_x) { +void f2_struct_write(f2_struct* st, stream* s, bool use_depth, bool shift_x) { if (s->io.stream || s->type == STREAM_MEMORY) { f2_struct_get_length(st, shift_x); f2_struct_write_inner(s, st, 0, use_depth, shift_x); diff --git a/src/KKdLib/f2/struct.h b/src/KKdLib/f2/struct.h index 3825311c..757129f7 100644 --- a/src/KKdLib/f2/struct.h +++ b/src/KKdLib/f2/struct.h @@ -25,12 +25,12 @@ struct f2_struct { vector_old_size_t pof; }; -extern void f2_struct_read(f2_struct* st, char* path); -extern void f2_struct_wread(f2_struct* st, wchar_t* path); -extern void f2_struct_mread(f2_struct* st, void* data, size_t length); -extern void f2_struct_sread(f2_struct* st, stream* s); -extern void f2_struct_write(f2_struct* st, char* path, bool use_depth, bool shift_x); -extern void f2_struct_wwrite(f2_struct* st, wchar_t* path, bool use_depth, bool shift_x); -extern void f2_struct_mwrite(f2_struct* st, void** data, size_t* length, bool use_depth, bool shift_x); -extern void f2_struct_swrite(f2_struct* st, stream* s, bool use_depth, bool shift_x); +extern void f2_struct_read(f2_struct* st, const char* path); +extern void f2_struct_read(f2_struct* st, const wchar_t* path); +extern void f2_struct_read(f2_struct* st, const void* data, size_t length); +extern void f2_struct_read(f2_struct* st, stream* s); +extern void f2_struct_write(f2_struct* st, const char* path, bool use_depth, bool shift_x); +extern void f2_struct_write(f2_struct* st, const wchar_t* path, bool use_depth, bool shift_x); +extern void f2_struct_write(f2_struct* st, void** data, size_t* length, bool use_depth, bool shift_x); +extern void f2_struct_write(f2_struct* st, stream* s, bool use_depth, bool shift_x); extern void f2_struct_free(f2_struct* st); diff --git a/src/KKdLib/farc.c b/src/KKdLib/farc.c index cb2fdd8a..1b427056 100644 --- a/src/KKdLib/farc.c +++ b/src/KKdLib/farc.c @@ -40,10 +40,11 @@ data(), data_compressed(), flags(), data_changed() { } farc_file::~farc_file() { - + delete data; + delete data_compressed; } -size_t farc::get_file_size(char* name) { +size_t farc::get_file_size(const char* name) { if (!name) return 0; @@ -53,11 +54,7 @@ size_t farc::get_file_size(char* name) { return 0; } -size_t farc::get_file_size(const char* name) { - return get_file_size((char*)name); -} - -size_t farc::get_file_size(wchar_t* name) { +size_t farc::get_file_size(const wchar_t* name) { if (!name) return 0; @@ -71,19 +68,6 @@ size_t farc::get_file_size(wchar_t* name) { return 0; } -size_t farc::get_file_size(const wchar_t* name) { - return get_file_size((wchar_t*)name); -} - -void farc::read(char* path, bool unpack, bool save) { - if (!path) - return; - - wchar_t* path_buf = utf8_to_utf16(path); - read(path_buf, unpack, save); - free(path_buf); -} - void farc::read(const char* path, bool unpack, bool save) { if (!path) return; @@ -93,55 +77,56 @@ void farc::read(const char* path, bool unpack, bool save) { free(path_buf); } -void farc::read(wchar_t* path, bool unpack, bool save) { +void farc::read(const wchar_t* path, bool unpack, bool save) { if (!path) return; - files = {}; + files.clear(); + files.shrink_to_fit(); wchar_t full_path_buf[MAX_PATH]; wchar_t* full_path = _wfullpath(full_path_buf, path, MAX_PATH); if (!full_path) return; - else if (!path_wcheck_file_exists(full_path_buf)) + else if (!path_check_file_exists(full_path_buf)) return; - size_t full_path_buf_len = utf16_length(full_path_buf); - file_path = std::wstring(full_path_buf, full_path_buf_len); - directory_path = std::wstring(full_path_buf, full_path_buf_len); - const wchar_t* dot = wcsrchr(directory_path.c_str(), L'.'); + char* dir_temp = utf16_to_utf8(full_path_buf); + size_t dir_temp_len = utf8_length(dir_temp); + file_path = std::string(dir_temp, dir_temp_len); + directory_path = std::string(dir_temp, dir_temp_len); + free(dir_temp); + + const char* dot = strrchr(directory_path.c_str(), '.'); if (dot) - directory_path = std::wstring(directory_path.c_str(), dot - directory_path.c_str()); + directory_path = std::string(directory_path.c_str(), dot - directory_path.c_str()); stream s; - io_wopen(&s, file_path.c_str(), L"rb"); + io_open(&s, file_path.c_str(), "rb"); if (s.io.stream && !farc_read_header(this, &s) && unpack) farc_unpack_files(this, &s, save); io_free(&s); } -void farc::read(const wchar_t* path, bool unpack, bool save) { - read((wchar_t*)path, unpack, save); -} - -void farc::read(void* data, size_t length, bool unpack) { +void farc::read(const void* data, size_t length, bool unpack) { if (!data || !length) return; - files = {}; + files.clear(); + files.shrink_to_fit(); - file_path = std::wstring(L"", 0); - directory_path = std::wstring(L"", 0); + file_path = std::string("", 0); + directory_path = std::string("", 0); stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); if (!farc_read_header(this, &s) && unpack) farc_unpack_files(this, &s, false); io_free(&s); } -farc_file* farc::read_file(char* name) { +farc_file* farc::read_file(const char* name) { if (!name) return 0; @@ -154,7 +139,7 @@ farc_file* farc::read_file(char* name) { &i.data, &i.size, DEFLATE_MODE_GZIP); else if (!i.data) { stream s; - io_wopen(&s, file_path.c_str(), L"rb"); + io_open(&s, file_path.c_str(), "rb"); if (s.io.stream) farc_unpack_file(this, &s, &i); io_free(&s); @@ -164,11 +149,7 @@ farc_file* farc::read_file(char* name) { return 0; } -farc_file* farc::read_file(const char* name) { - return read_file((char*)name); -} - -farc_file* farc::read_file(wchar_t* name) { +farc_file* farc::read_file(const wchar_t* name) { if (!name) return 0; @@ -179,7 +160,7 @@ farc_file* farc::read_file(wchar_t* name) { if (!i.data) { stream s; - io_wopen(&s, file_path.c_str(), L"rb"); + io_open(&s, file_path.c_str(), "rb"); if (s.io.stream) farc_unpack_file(this, &s, &i); io_free(&s); @@ -191,11 +172,7 @@ farc_file* farc::read_file(wchar_t* name) { return 0; } -farc_file* farc::read_file(const wchar_t* name) { - return read_file((wchar_t*)name); -} - -void farc::write(char* path, farc_compress_mode mode, bool get_files) { +void farc::write(const char* path, farc_compress_mode mode, bool get_files) { if (!path) return; @@ -204,49 +181,53 @@ void farc::write(char* path, farc_compress_mode mode, bool get_files) { free(path_buf); } -void farc::write(wchar_t* path, farc_compress_mode mode, bool get_files) { +void farc::write(const wchar_t* path, farc_compress_mode mode, bool get_files) { if (!path) return; - if (get_files) - files = {}; + if (get_files) { + files.clear(); + files.shrink_to_fit(); + } wchar_t full_path_buf[MAX_PATH]; wchar_t* full_path = _wfullpath(full_path_buf, path, MAX_PATH); if (!full_path) return; - else if (get_files && !path_wcheck_directory_exists(full_path_buf)) + else if (get_files && !path_check_directory_exists(full_path_buf)) return; - size_t full_path_buf_len = utf16_length(full_path_buf); - directory_path = std::wstring(full_path_buf, full_path_buf_len); - file_path = std::wstring(full_path_buf, full_path_buf_len); - file_path += L".farc", 6; + char* dir_temp = utf16_to_utf8(full_path_buf); + size_t dir_temp_len = utf8_length(dir_temp); + directory_path = std::string(dir_temp, dir_temp_len); + file_path = std::string(dir_temp, dir_temp_len); + file_path += ".farc", 6; + free(dir_temp); if (!get_files || (get_files && !farc_get_files(this))) { stream s; - io_wopen(&s, file_path.c_str(), L"wb"); + io_open(&s, file_path.c_str(), "wb"); if (s.io.stream) farc_pack_files(this, &s, mode, get_files); io_free(&s); } } -void farc::write( void** data, size_t* length, farc_compress_mode mode) { +void farc::write(void** data, size_t* length, farc_compress_mode mode) { if (!data || !length) return; - directory_path = std::wstring(L"", 0); - file_path = std::wstring(L"", 0); + directory_path = std::string("", 0); + file_path = std::string("", 0); stream s; - io_mopen(&s, 0, 0); + io_open(&s); farc_pack_files(this, &s, mode, false); io_free(&s); } -bool farc::load_file(void* data, char* path, char* file, uint32_t hash) { +bool farc::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); if (file_len >= 5 && memcmp(&file[file_len - 5], ".farc", 6)) return false; @@ -267,25 +248,17 @@ bool farc::load_file(void* data, char* path, char* file, uint32_t hash) { } static errno_t farc_get_files(farc* f) { - f->files = {}; + f->files.clear(); + f->files.shrink_to_fit(); - vector_old_wstring files = vector_old_empty(wstring); - path_wget_files(&files, f->directory_path.c_str()); - if (vector_old_length(files) < 1) { - vector_old_wstring_free(&files, wstring_free); + std::vector files; + path_get_files(&files, f->directory_path.c_str()); + if (files.size() < 1) return -1; - } - f->files = std::vector(vector_old_length(files)); - if (files.begin) - for (farc_file& i : f->files) { - wstring* str = &files.begin[&i - f->files.data()]; - char* temp = utf16_to_utf8(wstring_data(str)); - i.name = std::string(temp); - free(temp) - } - - vector_old_wstring_free(&files, wstring_free); + f->files = std::vector(files.size()); + for (farc_file& i : f->files) + i.name = files[&i - f->files.data()]; return 0; } @@ -371,7 +344,7 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge i.offset = io_get_position(s); stream s_t; - io_wopen(&s_t, temp, L"rb"); + io_open(&s_t, temp, L"rb"); if (!s_t.io.stream) { io_free(&s_t); continue; @@ -579,7 +552,8 @@ static errno_t farc_read_header(farc* f, stream* s) { header_length -= 0x0C; } - f->files = {}; + f->files.clear(); + f->files.shrink_to_fit(); uint8_t* d_t; uint8_t* dt; @@ -676,10 +650,12 @@ static void farc_unpack_files(farc* f, stream* s, bool save) { max_path_len = path_len; } - CreateDirectoryW(f->directory_path.c_str(), 0); + wchar_t* dir_temp = utf8_to_utf16(f->directory_path.c_str()); + CreateDirectoryW(dir_temp, 0); wchar_t* temp_path = force_malloc_s(wchar_t, max_path_len + 1); - memcpy(temp_path, f->directory_path.c_str(), sizeof(wchar_t) * dir_len); + memcpy(temp_path, dir_temp, sizeof(wchar_t) * dir_len); temp_path[dir_len] = L'\\'; + free(dir_temp); for (farc_file& i : f->files) { wchar_t* name_buf = utf8_to_utf16(i.name.c_str()); @@ -692,7 +668,7 @@ static void farc_unpack_files(farc* f, stream* s, bool save) { if (i.data) { stream temp_s; - io_wopen(&temp_s, temp_path, L"wb"); + io_open(&temp_s, temp_path, L"wb"); if (temp_s.io.stream) io_write(&temp_s, i.data, i.size); io_free(&temp_s); diff --git a/src/KKdLib/farc.h b/src/KKdLib/farc.h index c6e6b8b9..bb4af375 100644 --- a/src/KKdLib/farc.h +++ b/src/KKdLib/farc.h @@ -47,8 +47,8 @@ public: class farc { public: - std::wstring file_path; - std::wstring directory_path; + std::string file_path; + std::string directory_path; std::vector files; farc_signature signature; farc_flags flags; @@ -58,22 +58,16 @@ public: farc(); ~farc(); - size_t get_file_size(char* name); size_t get_file_size(const char* name); - size_t get_file_size(wchar_t* name); size_t get_file_size(const wchar_t* name); - void read(char* path, bool unpack, bool save); void read(const char* path, bool unpack, bool save); - void read(wchar_t* path, bool unpack, bool save); void read(const wchar_t* path, bool unpack, bool save); - void read(void* data, size_t length, bool unpack); - farc_file* read_file(char* name); + void read(const void* data, size_t length, bool unpack); farc_file* read_file(const char* name); - farc_file* read_file(wchar_t* name); farc_file* read_file(const wchar_t* name); - void write(char* path, farc_compress_mode mode, bool get_files); - void write(wchar_t* path, farc_compress_mode mode, bool get_files); + void write(const char* path, farc_compress_mode mode, bool get_files); + void write(const wchar_t* path, farc_compress_mode mode, bool get_files); void write(void** data, size_t* length, farc_compress_mode mode); - static bool load_file(void* data, char* path, char* file, uint32_t hash); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/hash.c b/src/KKdLib/hash.c index aaef51c2..36f6ad87 100644 --- a/src/KKdLib/hash.c +++ b/src/KKdLib/hash.c @@ -46,8 +46,8 @@ const uint32_t hash_crc16_ccitt_empty = 0xFFFF; // FNV 1a 64-bit Modified // 0x1403B04D0 in SBZV_7.10 -inline uint64_t hash_fnv1a64m(void* data, size_t length, bool make_upper) { - uint8_t* d = (uint8_t*)data; +inline uint64_t hash_fnv1a64m(const void* data, size_t length, bool make_upper) { + const uint8_t* d = (const uint8_t*)data; uint64_t hash = 0xCBF29CE484222325; if (data) @@ -67,27 +67,11 @@ inline uint64_t hash_fnv1a64m(void* data, size_t length, bool make_upper) { return (hash >> 32) ^ hash; // Actual Modification } -inline uint64_t hash_fnv1a64m(const void* data, size_t length, bool make_upper) { - return hash_fnv1a64m((void*)data, length, make_upper); -} - -inline uint64_t hash_utf8_fnv1a64m(char* data, bool make_upper) { - uint64_t hash = hash_fnv1a64m(data, utf8_length(data), make_upper); - return hash; -} - inline uint64_t hash_utf8_fnv1a64m(const char* data, bool make_upper) { uint64_t hash = hash_fnv1a64m(data, utf8_length(data), make_upper); return hash; } -inline uint64_t hash_utf16_fnv1a64m(wchar_t* data, bool make_upper) { - char* temp = utf16_to_utf8(data); - uint64_t hash = hash_fnv1a64m(temp, utf8_length(temp), make_upper); - free(temp); - return hash; -} - inline uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper) { char* temp = utf16_to_utf8(data); uint64_t hash = hash_fnv1a64m(temp, utf8_length(temp), make_upper); @@ -95,14 +79,10 @@ inline uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper) { return hash; } -inline uint64_t hash_string_fnv1a64m(string* data, bool make_upper) { +inline uint64_t hash_string_fnv1a64m(const string* data, bool make_upper) { return hash_fnv1a64m(string_data(data), data->length, make_upper); } -inline uint64_t hash_string_fnv1a64m(std::string* data, bool make_upper) { - return hash_fnv1a64m(data->c_str(), data->size(), make_upper); -} - inline uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper) { return hash_fnv1a64m(data->c_str(), data->size(), make_upper); } @@ -111,9 +91,9 @@ inline uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper) { // 0x814D7A9C in PCSB00554 // 0x8134C304 in PCSB01007 // 0x0069CEA4 in NPEB02013 -uint32_t hash_murmurhash(void* data, size_t length, +uint32_t hash_murmurhash(const void* data, size_t length, uint32_t seed, bool upper, bool big_endian) { - uint8_t* d = (uint8_t*)data; + const uint8_t* d = (const uint8_t*)data; uint32_t a, b, hash; size_t i; @@ -240,27 +220,11 @@ uint32_t hash_murmurhash(void* data, size_t length, return hash; } -inline uint32_t hash_murmurhash(const void* data, size_t length, uint32_t seed, bool upper, bool big_endian) { - return hash_murmurhash((void*)data, length, seed, upper, big_endian); -} - -inline uint32_t hash_utf8_murmurhash(char* data, uint32_t seed, bool upper) { - uint32_t hash = hash_murmurhash(data, utf8_length(data), seed, upper, false); - return hash; -} - inline uint32_t hash_utf8_murmurhash(const char* data, uint32_t seed, bool upper) { uint32_t hash = hash_murmurhash(data, utf8_length(data), seed, upper, false); return hash; } -inline uint32_t hash_utf16_murmurhash(wchar_t* data, uint32_t seed, bool upper) { - char* temp = utf16_to_utf8(data); - uint32_t hash = hash_murmurhash(temp, utf8_length(temp), seed, upper, false); - free(temp); - return hash; -} - inline uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed, bool upper) { char* temp = utf16_to_utf8(data); uint32_t hash = hash_murmurhash(temp, utf8_length(temp), seed, upper, false); @@ -268,22 +232,18 @@ inline uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed, bool u return hash; } -inline uint32_t hash_string_murmurhash(string* data, uint32_t seed, bool upper) { +inline uint32_t hash_string_murmurhash(const string* data, uint32_t seed, bool upper) { return hash_murmurhash(string_data(data), data->length, seed, upper, false); } -inline uint32_t hash_string_murmurhash(std::string* data, uint32_t seed, bool upper) { - return hash_murmurhash(data->c_str(), data->size(), seed, upper, false); -} - inline uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed, bool upper) { return hash_murmurhash(data->c_str(), data->size(), seed, upper, false); } // CRC16-CCITT // 0x140011A90 in SBZV_7.10 -inline uint16_t hash_crc16_ccitt(void* data, size_t length, bool make_upper) { - uint8_t* d = (uint8_t*)data; +inline uint16_t hash_crc16_ccitt(const void* data, size_t length, bool make_upper) { + const uint8_t* d = (const uint8_t*)data; uint16_t hash = 0xFFFF; if (make_upper) // Modification for only uppercase latin text @@ -299,27 +259,11 @@ inline uint16_t hash_crc16_ccitt(void* data, size_t length, bool make_upper) { return hash; } -inline uint16_t hash_crc16_ccitt(const void* data, size_t length, bool make_upper) { - return hash_crc16_ccitt((void*)data, length, make_upper); -} - -inline uint16_t hash_utf8_crc16_ccitt(char* data, bool make_upper) { - uint32_t hash = hash_crc16_ccitt(data, utf8_length(data), make_upper); - return hash; -} - inline uint16_t hash_utf8_crc16_ccitt(const char* data, bool make_upper) { uint32_t hash = hash_crc16_ccitt(data, utf8_length(data), make_upper); return hash; } -inline uint16_t hash_utf16_crc16_ccitt(wchar_t* data, bool make_upper) { - char* temp = utf16_to_utf8(data); - uint32_t hash = hash_crc16_ccitt(temp, utf8_length(temp), make_upper); - free(temp); - return hash; -} - inline uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper) { char* temp = utf16_to_utf8(data); uint32_t hash = hash_crc16_ccitt(temp, utf8_length(temp), make_upper); @@ -327,14 +271,10 @@ inline uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper) { return hash; } -inline uint16_t hash_string_crc16_ccitt(string* data, bool make_upper) { +inline uint16_t hash_string_crc16_ccitt(const string* data, bool make_upper) { return hash_crc16_ccitt(string_data(data), data->length, make_upper); } -inline uint16_t hash_string_crc16_ccitt(std::string* data, bool make_upper) { - return hash_crc16_ccitt(data->c_str(), data->size(), make_upper); -} - inline uint16_t hash_string_crc16_ccitt(const std::string* data, bool make_upper) { return hash_crc16_ccitt(data->c_str(), data->size(), make_upper); } diff --git a/src/KKdLib/hash.h b/src/KKdLib/hash.h index 955c6658..1c764e32 100644 --- a/src/KKdLib/hash.h +++ b/src/KKdLib/hash.h @@ -13,30 +13,18 @@ extern const uint64_t hash_fnv1a64m_empty; extern const uint32_t hash_murmurhash_empty; extern const uint32_t hash_crc16_ccitt_empty; -extern uint64_t hash_fnv1a64m(void* data, size_t length, bool make_upper); -inline uint64_t hash_fnv1a64m(const void* data, size_t length, bool make_upper); -extern uint64_t hash_utf8_fnv1a64m(char* data, bool make_upper); +extern uint64_t hash_fnv1a64m(const void* data, size_t length, bool make_upper); extern uint64_t hash_utf8_fnv1a64m(const char* data, bool make_upper); -extern uint64_t hash_utf16_fnv1a64m(wchar_t* data, bool make_upper); extern uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper); -extern uint64_t hash_string_fnv1a64m(string* data, bool make_upper); -extern uint64_t hash_string_fnv1a64m(std::string* data, bool make_upper); +extern uint64_t hash_string_fnv1a64m(const string* data, bool make_upper); extern uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper); -extern uint32_t hash_murmurhash(void* data, size_t length, uint32_t seed, bool upper, bool big_endian); extern uint32_t hash_murmurhash(const void* data, size_t length, uint32_t seed, bool upper, bool big_endian); -extern uint32_t hash_utf8_murmurhash(char* data, uint32_t seed, bool upper); extern uint32_t hash_utf8_murmurhash(const char* data, uint32_t seed, bool upper); -extern uint32_t hash_utf16_murmurhash(wchar_t* data, uint32_t seed, bool upper); extern uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed, bool upper); -extern uint32_t hash_string_murmurhash(string* data, uint32_t seed, bool upper); -extern uint32_t hash_string_murmurhash(std::string* data, uint32_t seed, bool upper); +extern uint32_t hash_string_murmurhash(const string* data, uint32_t seed, bool upper); extern uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed, bool upper); -extern uint16_t hash_crc16_ccitt(void* data, size_t length, bool make_upper); extern uint16_t hash_crc16_ccitt(const void* data, size_t length, bool make_upper); -extern uint16_t hash_utf8_crc16_ccitt(char* data, bool make_upper); extern uint16_t hash_utf8_crc16_ccitt(const char* data, bool make_upper); -extern uint16_t hash_utf16_crc16_ccitt(wchar_t* data, bool make_upper); extern uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper); -extern uint16_t hash_string_crc16_ccitt(string* data, bool make_upper); -extern uint16_t hash_string_crc16_ccitt(std::string* data, bool make_upper); +extern uint16_t hash_string_crc16_ccitt(const string* data, bool make_upper); extern uint16_t hash_string_crc16_ccitt(const std::string* data, bool make_upper); diff --git a/src/KKdLib/io/path.c b/src/KKdLib/io/path.c index 5198597f..c7ad7f1c 100644 --- a/src/KKdLib/io/path.c +++ b/src/KKdLib/io/path.c @@ -20,7 +20,7 @@ inline bool path_check_path_exists(const char* path) { return path_check_path_exists((char*)path); } -bool path_wcheck_path_exists(wchar_t* path) { +bool path_check_path_exists(wchar_t* path) { DWORD ftyp = GetFileAttributesW(path); if (ftyp == INVALID_FILE_ATTRIBUTES) return false; @@ -28,8 +28,8 @@ bool path_wcheck_path_exists(wchar_t* path) { return true; } -inline bool path_wcheck_path_exists(const wchar_t* path) { - return path_wcheck_path_exists((wchar_t*)path); +inline bool path_check_path_exists(const wchar_t* path) { + return path_check_path_exists((wchar_t*)path); } @@ -47,7 +47,7 @@ inline bool path_check_file_exists(const char* path) { return path_check_file_exists((char*)path); } -bool path_wcheck_file_exists(wchar_t* path) { +bool path_check_file_exists(wchar_t* path) { DWORD ftyp = GetFileAttributesW(path); if (ftyp == INVALID_FILE_ATTRIBUTES) return false; @@ -55,8 +55,8 @@ bool path_wcheck_file_exists(wchar_t* path) { return ftyp & FILE_ATTRIBUTE_DIRECTORY ? false : true; } -inline bool path_wcheck_file_exists(const wchar_t* path) { - return path_wcheck_file_exists((wchar_t*)path); +inline bool path_check_file_exists(const wchar_t* path) { + return path_check_file_exists((wchar_t*)path); } bool path_check_directory_exists(char* path) { @@ -73,7 +73,7 @@ inline bool path_check_directory_exists(const char* path) { return path_check_directory_exists((char*)path); } -bool path_wcheck_directory_exists(wchar_t* path) { +bool path_check_directory_exists(wchar_t* path) { DWORD ftyp = GetFileAttributesW(path); if (ftyp == INVALID_FILE_ATTRIBUTES) return false; @@ -81,12 +81,13 @@ bool path_wcheck_directory_exists(wchar_t* path) { return ftyp & FILE_ATTRIBUTE_DIRECTORY ? true : false; } -inline bool path_wcheck_directory_exists(const wchar_t* path) { - return path_wcheck_directory_exists((wchar_t*)path); +inline bool path_check_directory_exists(const wchar_t* path) { + return path_check_directory_exists((wchar_t*)path); } -void path_get_files(vector_old_string* files, char* path) { - vector_old_string_free(files, string_free); +void path_get_files(std::vector* files, char* path) { + files->clear(); + files->shrink_to_fit(); wchar_t* dir_temp = utf8_to_utf16(path); size_t dir_len = utf16_length(dir_temp); @@ -122,20 +123,21 @@ void path_get_files(vector_old_string* files, char* path) { continue; char* file_temp = utf16_to_utf8(fdata.cFileName); - string* file = vector_old_string_reserve_back(files); - string_init(file, file_temp); + std::string file = std::string(file_temp); + files->push_back(file); free(file_temp); } while (FindNextFileW(h, &fdata)); FindClose(h); free(dir); } -inline void path_get_files(vector_old_string* files, const char* path) { +inline void path_get_files(std::vector* files, const char* path) { path_get_files(files, (char*)path); } -void path_wget_files(vector_old_wstring* files, wchar_t* path) { - vector_old_wstring_free(files, wstring_free); +void path_get_files(std::vector* files, wchar_t* path) { + files->clear(); + files->shrink_to_fit(); size_t dir_len = utf16_length(path); @@ -166,20 +168,21 @@ void path_wget_files(vector_old_wstring* files, wchar_t* path) { if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; - wstring* file = vector_old_wstring_reserve_back(files); - wstring_init(file, fdata.cFileName); + std::wstring file = std::wstring(fdata.cFileName); + files->push_back(file); } while (FindNextFileW(h, &fdata)); FindClose(h); free(dir); } -inline void path_wget_files(vector_old_wstring* files, const wchar_t* path) { - path_wget_files(files, (wchar_t*)path); +inline void path_get_files(std::vector* files, const wchar_t* path) { + path_get_files(files, (wchar_t*)path); } -void path_get_directories(vector_old_string* directories, char* path, +void path_get_directories(std::vector* directories, char* path, char** exclude_list, size_t exclude_count) { - vector_old_string_free(directories, string_free); + directories->clear(); + directories->shrink_to_fit(); wchar_t* dir_temp = utf8_to_utf16(path); size_t dir_len = utf16_length(dir_temp); @@ -247,8 +250,8 @@ void path_get_directories(vector_old_string* directories, char* path, char* directory_temp = utf16_to_utf8(fdata.cFileName); - string* directory = vector_old_string_reserve_back(directories); - string_init(directory, directory_temp); + std::string directory = std::string(directory_temp); + directories->push_back(directory); free(directory_temp); } while (FindNextFileW(h, &fdata)); FindClose(h); @@ -256,14 +259,15 @@ void path_get_directories(vector_old_string* directories, char* path, free(dir); } -inline void path_get_directories(vector_old_string* directories, const char* path, +inline void path_get_directories(std::vector* directories, const char* path, char** exclude_list, size_t exclude_count) { path_get_directories(directories, (char*)path, exclude_list, exclude_count); } -void path_wget_directories(vector_old_wstring* directories, wchar_t* path, +void path_get_directories(std::vector* directories, wchar_t* path, wchar_t** exclude_list, size_t exclude_count) { - vector_old_wstring_free(directories, wstring_free); + directories->clear(); + directories->shrink_to_fit(); size_t dir_len = utf16_length(path); @@ -323,22 +327,23 @@ void path_wget_directories(vector_old_wstring* directories, wchar_t* path, continue; } - wstring* directory = vector_old_wstring_reserve_back(directories); - wstring_init(directory, fdata.cFileName); + std::wstring directory = std::wstring(fdata.cFileName); + directories->push_back(directory); } while (FindNextFileW(h, &fdata)); FindClose(h); free(temp); free(dir); } -inline void path_wget_directories(vector_old_wstring* directories, const wchar_t* path, +inline void path_get_directories(std::vector* directories, const wchar_t* path, wchar_t** exclude_list, size_t exclude_count) { - path_wget_directories(directories, (wchar_t*)path, exclude_list, exclude_count); + path_get_directories(directories, (wchar_t*)path, exclude_list, exclude_count); } -void path_get_directories_recursive(vector_old_string* directories, char* path, +void path_get_directories_recursive(std::vector* directories, char* path, char** exclude_list, size_t exclude_count) { - vector_old_string_free(directories, string_free); + directories->clear(); + directories->shrink_to_fit(); wchar_t* dir_temp = utf8_to_utf16(path); size_t dir_len = utf16_length(dir_temp); @@ -379,7 +384,7 @@ void path_get_directories_recursive(vector_old_string* directories, char* path, return; } - vector_old_string temp_vec = vector_old_empty(string); + std::vector temp_vec; do { if (~fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; @@ -406,8 +411,8 @@ void path_get_directories_recursive(vector_old_string* directories, char* path, } char* directory_temp = utf16_to_utf8(fdata.cFileName); - string* directory = vector_old_string_reserve_back(&temp_vec); - string_init(directory, directory_temp); + std::string directory = std::string(directory_temp); + temp_vec.push_back(directory); free(directory_temp); } while (FindNextFileW(h, &fdata)); FindClose(h); @@ -415,8 +420,8 @@ void path_get_directories_recursive(vector_old_string* directories, char* path, free(dir); size_t max_len = 0; - for (string* i = temp_vec.begin; i != temp_vec.end; i++) { - size_t len = i->length; + for (std::string& i : temp_vec) { + size_t len = i.size(); if (max_len < len) max_len = len; } @@ -425,54 +430,50 @@ void path_get_directories_recursive(vector_old_string* directories, char* path, char* path_temp = force_malloc_s(char, path_length + max_len + 2); memcpy(path_temp, path, path_length); path_temp[path_length] = '\\'; - for (string* i = temp_vec.begin; i != temp_vec.end; i++) { - memcpy(&path_temp[path_length + 1], string_data(i), i->length + 1); + for (std::string& i : temp_vec) { + memcpy(&path_temp[path_length + 1], i.c_str(), i.size() + 1); - vector_old_string temp = vector_old_empty(string); + std::vector temp; path_get_directories_recursive(&temp, path_temp, exclude_list, exclude_count); - vector_old_string_push_back(directories, i); + directories->push_back(i); - if (vector_old_length(temp) < 1) { - vector_old_string_free(&temp, string_free); + if (temp.size() < 1) continue; - } max_len = 0; - for (string* j = temp.begin; j != temp.end; j++) { - size_t len = j->length; + for (std::string& j : temp) { + size_t len = j.size(); if (max_len < len) max_len = len; } - size_t sub_path_length = i->length; + size_t sub_path_length = i.size(); char* sub_path_temp = force_malloc_s(char, sub_path_length + max_len + 1); if (sub_path_temp) { - memcpy(sub_path_temp, string_data(i), sub_path_length); + memcpy(sub_path_temp, i.c_str(), sub_path_length); sub_path_temp[sub_path_length] = '\\'; - for (string* j = temp.begin; j != temp.end; j++) { - memcpy(&sub_path_temp[sub_path_length + 1], string_data(j), j->length); + for (std::string& j : temp) { + memcpy(&sub_path_temp[sub_path_length + 1], j.c_str(), j.size()); - string* directory = vector_old_string_reserve_back(&temp_vec); - string_init_length(directory, sub_path_temp, sub_path_length + 1 + j->length); + std::string directory = std::string(sub_path_temp, sub_path_length + 1 + j.size()); + temp_vec.push_back(directory); } } free(sub_path_temp); - - vector_old_string_free(&temp, string_free); } free(path_temp); - vector_old_string_free(&temp_vec, 0); } -inline void path_get_directories_recursive(vector_old_string* directories, const char* path, +inline void path_get_directories_recursive(std::vector* directories, const char* path, char** exclude_list, size_t exclude_count) { path_get_directories_recursive(directories, (char*)path, exclude_list, exclude_count); } -void path_wget_directories_recursive(vector_old_wstring* directories, wchar_t* path, +void path_get_directories_recursive(std::vector* directories, wchar_t* path, wchar_t** exclude_list, size_t exclude_count) { - vector_old_wstring_free(directories, wstring_free); + directories->clear(); + directories->shrink_to_fit(); size_t dir_len = utf16_length(path); @@ -509,7 +510,7 @@ void path_wget_directories_recursive(vector_old_wstring* directories, wchar_t* p return; } - vector_old_wstring temp_vec = vector_old_empty(wstring); + std::vector temp_vec; do { if (~fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; @@ -533,16 +534,16 @@ void path_wget_directories_recursive(vector_old_wstring* directories, wchar_t* p continue; } - wstring* directory = vector_old_wstring_reserve_back(&temp_vec); - wstring_init(directory, fdata.cFileName); + std::wstring directory = std::wstring(fdata.cFileName); + temp_vec.push_back(directory); } while (FindNextFileW(h, &fdata)); FindClose(h); free(temp); free(dir); size_t max_len = 0; - for (wstring* i = temp_vec.begin; i != temp_vec.end; i++) { - size_t len = i->length; + for (std::wstring& i : temp_vec) { + size_t len = i.size(); if (max_len < len) max_len = len; } @@ -551,47 +552,42 @@ void path_wget_directories_recursive(vector_old_wstring* directories, wchar_t* p wchar_t* path_temp = force_malloc_s(wchar_t, path_length + max_len + 2); memcpy(path_temp, path, path_length); path_temp[path_length] = '\\'; - for (wstring* i = temp_vec.begin; i != temp_vec.end; i++) { - memcpy(&path_temp[path_length + 1], wstring_data(i), sizeof(wchar_t) * (i->length + 1)); + for (std::wstring& i : temp_vec) { + memcpy(&path_temp[path_length + 1], i.c_str(), sizeof(wchar_t) * (i.size() + 1)); - vector_old_wstring temp = vector_old_empty(wstring); - path_wget_directories_recursive(&temp, path_temp, exclude_list, exclude_count); + std::vector temp; + path_get_directories_recursive(&temp, path_temp, exclude_list, exclude_count); - vector_old_wstring_push_back(directories, i); + directories->push_back(i); - if (vector_old_length(temp) < 1) { - vector_old_wstring_free(&temp, wstring_free); + if (temp.size() < 1) continue; - } max_len = 0; - for (wstring* j = temp.begin; j != temp.end; j++) { - size_t len = j->length; + for (std::wstring& j : temp) { + size_t len = j.size(); if (max_len < len) max_len = len; } - size_t sub_path_length = i->length; + size_t sub_path_length = i.size(); wchar_t* sub_path_temp = force_malloc_s(wchar_t, sub_path_length + max_len + 1); if (sub_path_temp) { - memcpy(sub_path_temp, wstring_data(i), sub_path_length); + memcpy(sub_path_temp, i.c_str(), sub_path_length); sub_path_temp[sub_path_length] = '\\'; - for (wstring* j = temp.begin; j != temp.end; j++) { - memcpy(&sub_path_temp[sub_path_length + 1], wstring_data(j), sizeof(wchar_t) * j->length); + for (std::wstring& j : temp) { + memcpy(&sub_path_temp[sub_path_length + 1], j.c_str(), sizeof(wchar_t) * j.size()); - wstring* directory = vector_old_wstring_reserve_back(directories); - wstring_init_length(directory, sub_path_temp, sub_path_length + 1 + j->length); + std::wstring directory = std::wstring(sub_path_temp, sub_path_length + 1 + j.size()); + directories->push_back(directory); } } free(sub_path_temp); - - vector_old_wstring_free(&temp, wstring_free); } free(path_temp); - vector_old_wstring_free(&temp_vec, 0); } -inline void path_wget_directories_recursive(vector_old_wstring* directories, const wchar_t* path, +inline void path_get_directories_recursive(std::vector* directories, const wchar_t* path, wchar_t** exclude_list, size_t exclude_count) { - path_wget_directories_recursive(directories, (wchar_t*)path, exclude_list, exclude_count); + path_get_directories_recursive(directories, (wchar_t*)path, exclude_list, exclude_count); } diff --git a/src/KKdLib/io/path.h b/src/KKdLib/io/path.h index 6190d5ad..613c5b8b 100644 --- a/src/KKdLib/io/path.h +++ b/src/KKdLib/io/path.h @@ -5,39 +5,39 @@ #pragma once +#include +#include #include "../default.h" -#include "../string.h" -#include "../vector.h" extern bool path_check_path_exists(char* path); extern bool path_check_path_exists(const char* path); -extern bool path_wcheck_path_exists(wchar_t* path); -extern bool path_wcheck_path_exists(const wchar_t* path); +extern bool path_check_path_exists(wchar_t* path); +extern bool path_check_path_exists(const wchar_t* path); extern bool path_check_file_exists(char* path); extern bool path_check_file_exists(const char* path); -extern bool path_wcheck_file_exists(wchar_t* path); -extern bool path_wcheck_file_exists(const wchar_t* path); +extern bool path_check_file_exists(wchar_t* path); +extern bool path_check_file_exists(const wchar_t* path); extern bool path_check_directory_exists(char* path); extern bool path_check_directory_exists(const char* path); -extern bool path_wcheck_directory_exists(wchar_t* path); -extern bool path_wcheck_directory_exists(const wchar_t* path); -extern void path_get_files(vector_old_string* files, char* path); -extern void path_get_files(vector_old_string* files, char* path); -extern void path_wget_files(vector_old_wstring* files, wchar_t* path); -extern void path_wget_files(vector_old_wstring* files, const wchar_t* path); -extern void path_get_directories(vector_old_string* directories, char* path, +extern bool path_check_directory_exists(wchar_t* path); +extern bool path_check_directory_exists(const wchar_t* path); +extern void path_get_files(std::vector* files, char* path); +extern void path_get_files(std::vector* files, const char* path); +extern void path_get_files(std::vector* files, wchar_t* path); +extern void path_get_files(std::vector* files, const wchar_t* path); +extern void path_get_directories(std::vector* directories, char* path, char** exclude_list, size_t exclude_count); -extern void path_get_directories(vector_old_string* directories, const char* path, +extern void path_get_directories(std::vector* directories, const char* path, char** exclude_list, size_t exclude_count); -extern void path_wget_directories(vector_old_wstring* directories, wchar_t* path, +extern void path_get_directories(std::vector* directories, wchar_t* path, wchar_t** exclude_list, size_t exclude_count); -extern void path_wget_directories(vector_old_wstring* directories, const wchar_t* path, +extern void path_get_directories(std::vector* directories, const wchar_t* path, wchar_t** exclude_list, size_t exclude_count); -extern void path_get_directories_recursive(vector_old_string* directories, char* path, +extern void path_get_directories_recursive(std::vector* directories, char* path, char** exclude_list, size_t exclude_count); -extern void path_get_directories_recursive(vector_old_string* directories, const char* path, +extern void path_get_directories_recursive(std::vector* directories, const char* path, char** exclude_list, size_t exclude_count); -extern void path_wget_directories_recursive(vector_old_wstring* directories, wchar_t* path, +extern void path_get_directories_recursive(std::vector* directories, wchar_t* path, wchar_t** exclude_list, size_t exclude_count); -extern void path_wget_directories_recursive(vector_old_wstring* directories, const wchar_t* path, +extern void path_get_directories_recursive(std::vector* directories, const wchar_t* path, wchar_t** exclude_list, size_t exclude_count); \ No newline at end of file diff --git a/src/KKdLib/io/stream.c b/src/KKdLib/io/stream.c index 89eccf34..ed4a1b99 100644 --- a/src/KKdLib/io/stream.c +++ b/src/KKdLib/io/stream.c @@ -6,7 +6,13 @@ #include "stream.h" #include -void io_open(stream* s, char* path, const char* mode) { +void io_open(stream* s) { + memset(s, 0, sizeof(stream)); + s->type = STREAM_MEMORY; + s->length = 0; +} + +void io_open(stream* s, const char* path, const char* mode) { memset(s, 0, sizeof(stream)); if (!path || !mode) return; @@ -21,11 +27,7 @@ void io_open(stream* s, char* path, const char* mode) { free(temp_mode); } -inline void io_open(stream* s, const char* path, const char* mode) { - io_open(s, (char*)path, mode); -} - -void io_wopen(stream* s, wchar_t* path, const wchar_t* mode) { +void io_open(stream* s, const wchar_t* path, const wchar_t* mode) { memset(s, 0, sizeof(stream)); if (!path || !mode) return; @@ -36,11 +38,7 @@ void io_wopen(stream* s, wchar_t* path, const wchar_t* mode) { io_get_length(s); } -inline void io_wopen(stream* s, const wchar_t* path, const wchar_t* mode) { - io_wopen(s, (wchar_t*)path, mode); -} - -void io_mopen(stream* s, void* data, size_t length) { +void io_open(stream* s, const void* data, size_t length) { memset(s, 0, sizeof(stream)); if (!data || !length) { s->type = STREAM_MEMORY; @@ -59,7 +57,7 @@ void io_mopen(stream* s, void* data, size_t length) { s->length = length; } -void io_mcopy(stream* s, void** data, size_t* length) { +void io_copy(stream* s, void** data, size_t* length) { if (!s || !data || !length || s->type != STREAM_MEMORY) return; @@ -475,7 +473,7 @@ inline void io_read_string_null_terminated_offset(stream* s, free(temp); } else - *str = {}; + *str = std::string(); } inline void io_read_wstring_null_terminated_offset(stream* s, @@ -499,7 +497,7 @@ inline void io_read_wstring_null_terminated_offset(stream* s, free(temp); } else - *str = {}; + *str = std::wstring(); } inline char* io_read_utf8_string_null_terminated(stream* s) { diff --git a/src/KKdLib/io/stream.h b/src/KKdLib/io/stream.h index ed5445df..6d7c862b 100644 --- a/src/KKdLib/io/stream.h +++ b/src/KKdLib/io/stream.h @@ -32,12 +32,11 @@ typedef struct stream { vector_old_ssize_t position_stack; } stream; -extern void io_open(stream* s, char* path, const char* mode); +extern void io_open(stream* s); extern void io_open(stream* s, const char* path, const char* mode); -extern void io_wopen(stream* s, wchar_t* path, const wchar_t* mode); -extern void io_wopen(stream* s, const wchar_t* path, const wchar_t* mode); -extern void io_mopen(stream* s, void* data, size_t length); -extern void io_mcopy(stream* s, void** data, size_t* length); +extern void io_open(stream* s, const wchar_t* path, const wchar_t* mode); +extern void io_open(stream* s, const void* data, size_t length); +extern void io_copy(stream* s, void** data, size_t* length); extern void io_align_read(stream* s, ssize_t align); extern void io_align_write(stream* s, ssize_t align); extern int io_flush(stream* s); diff --git a/src/KKdLib/key_val.c b/src/KKdLib/key_val.c index 221d3c10..37f44ee5 100644 --- a/src/KKdLib/key_val.c +++ b/src/KKdLib/key_val.c @@ -11,27 +11,112 @@ static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length); static void key_val_sort(key_val* kv); -void key_val_init(key_val* kv, uint8_t* data, size_t length) { - kv->buf = 0; - kv->key = vector_old_ptr_empty(char); - kv->key_len = vector_old_empty(size_t); - kv->val = vector_old_ptr_empty(char); - kv->val_len = vector_old_empty(size_t); - kv->key_hash = vector_old_empty(uint64_t); - kv->key_index = vector_old_empty(size_t); +key_val::key_val() : buf() { +} + +key_val::~key_val() { + free(buf); +} + +void key_val::file_read(char* path) { + if (!path || !path_check_file_exists(path)) + return; + + stream s; + io_open(&s, path, "rb"); + if (s.io.stream) { + char* d = force_malloc_s(char, s.length); + io_read(&s, d, s.length); + parse((uint8_t*)d, s.length); + free(d); + } + io_free(&s); +} + +void key_val::file_read(wchar_t* path) { + if (!path || !path_check_file_exists(path)) + return; + + stream s; + io_open(&s, path, L"rb"); + if (s.io.stream) { + char* d = force_malloc_s(char, s.length); + io_read(&s, d, s.length); + parse((uint8_t*)d, s.length); + free(d); + } + io_free(&s); +} + +bool key_val::get_local_key_val(const char* str, key_val* lkv) { + lkv->buf = 0; + lkv->key.clear(); + lkv->key_len.clear(); + lkv->val.clear(); + lkv->key_hash.clear(); + lkv->key_index.clear(); + + if (!str) + return false; + + char** first = 0; + char** last = 0; + size_t str_length = utf8_length(str); + + char** i = key.data(); + size_t* i_len = key_len.data(); + size_t j = key.size(); + for (; j; i++, i_len++, j--) + if (str_length <= *i_len && !memcmp(str, (char*)*i, str_length)) { + if (!first) + first = i; + last = i + 1; + } + else if (first) + break; + + if (!first) + return false; + + size_t index = first - key.data(); + size_t count = last - first; + lkv->key = std::vector(key.begin() + index, key.begin() + index + count); + lkv->key_len = std::vector(key_len.begin() + index, key_len.begin() + index + count); + lkv->val = std::vector(val.begin() + index, val.begin() + index + count); + lkv->val_len = std::vector(val_len.begin() + index, val_len.begin() + index + count); + + key_val_sort(lkv); + return true; +} + +bool key_val::has_key(char* str) { + size_t str_length = utf8_length(str); + + char** i = key.data(); + size_t* i_len = key_len.data(); + size_t j = key.size(); + for (; j; i++, i_len++, j--) { + size_t len = min(str_length, *i_len); + if (len && str_length <= *i_len && !memcmp(str, *i, len)) + return true; + } + return false; +} + +void key_val::parse(uint8_t* data, size_t length) { if (!data || !length) return; char** lines; size_t count; - if (!str_utils_text_file_parse(data, length, &kv->buf, &lines, &count)) + if (!str_utils_text_file_parse(data, length, &buf, &lines, &count)) return; - vector_old_ptr_char_reserve(&kv->key, count); - vector_old_size_t_reserve(&kv->key_len, count); - vector_old_ptr_char_reserve(&kv->val, count); - vector_old_size_t_reserve(&kv->val_len, count); + key.reserve(count); + key_len.reserve(count); + val.reserve(count); + val_len.reserve(count); for (size_t i = 0, j = 0; i < count; i++) { char* s = lines[i]; @@ -53,384 +138,150 @@ void key_val_init(key_val* kv, uint8_t* data, size_t length) { uint64_t key_hash = hash_fnv1a64m((uint8_t*)key_str_data, key_length, false); - vector_old_ptr_char_push_back(&kv->key, &key_str_data); - vector_old_size_t_push_back(&kv->key_len, &key_length); - vector_old_ptr_char_push_back(&kv->val, &val_str_data); - vector_old_size_t_push_back(&kv->val_len, &val_length); + key.push_back(key_str_data); + key_len.push_back(key_length); + val.push_back(val_str_data); + val_len.push_back(val_length); j++; } - key_val_sort(kv); + key_val_sort(this); free(lines) } -void key_val_file_read(key_val* kv, char* path) { - if (!kv) - return; - - if (!path || !path_check_file_exists(path)) { - key_val_init(kv, 0, 0); - return; - } - - stream s; - io_open(&s, path, "rb"); - if (s.io.stream) { - char* d = force_malloc_s(char, s.length); - io_read(&s, d, s.length); - key_val_init(kv, (uint8_t*)d, s.length); - free(d); - } - io_free(&s); -} - -void key_val_wfile_read(key_val* kv, wchar_t* path) { - if (!kv) - return; - - if (!path || !path_wcheck_file_exists(path)) { - key_val_init(kv, 0, 0); - return; - } - - stream s; - io_wopen(&s, path, L"rb"); - if (s.io.stream) { - char* d = force_malloc_s(char, s.length); - io_read(&s, d, s.length); - key_val_init(kv, (uint8_t*)d, s.length); - free(d); - } - io_free(&s); -} - -bool key_val_get_local_key_val(key_val* kv, char* str, key_val* lkv) { - lkv->buf = 0; - lkv->key = vector_old_ptr_empty(char); - lkv->key_len = vector_old_empty(size_t); - lkv->val = vector_old_ptr_empty(char); - lkv->key_hash = vector_old_empty(uint64_t); - lkv->key_index = vector_old_empty(size_t); - - if (!str) - return false; - - char** first = 0; - char** last = 0; - size_t str_length = utf8_length(str); - - char** i = kv->key.begin; - size_t* i_len = kv->key_len.begin; - size_t j = vector_old_length(kv->key); - for (; j; i++, i_len++, j--) - if (str_length <= *i_len && !memcmp(str, (char*)*i, str_length)) { - if (!first) - first = i; - last = i + 1; - } - else if (first) - break; - - if (!first) - return false; - - size_t index = first - kv->key.begin; - size_t count = last - first; - lkv->key.begin = &kv->key.begin[index]; - lkv->key.end = &kv->key.begin[index + count]; - lkv->key_len.begin = &kv->key_len.begin[index]; - lkv->val.begin = &kv->val.begin[index]; - lkv->val_len.begin = &kv->val_len.begin[index]; - - key_val_sort(lkv); - return true; -} - -inline bool key_val_get_local_key_val(key_val* kv, const char* str, key_val* lkv) { - return key_val_get_local_key_val(kv, (char*)str, lkv); -} - -bool key_val_has_key(key_val* kv, char* str) { - size_t str_length = utf8_length(str); - - char** i = kv->key.begin; - size_t* i_len = kv->key_len.begin; - size_t j = vector_old_length(kv->key); - for (; j; i++, i_len++, j--) { - size_t len = min(str_length, *i_len); - if (len && str_length <= *i_len && !memcmp(str, *i, len)) - return true; - } - return false; -} - -bool key_val_read_bool(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, bool* value) { +bool key_val::read_bool(char* buf, size_t offset, + const char* str_add, size_t str_add_len, bool* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = false; return false; } - *value = atoi(kv->val.begin[index]) ? true : false; + *value = atoi(val[index]) ? true : false; return true; } -void key_val_write_bool(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, bool value) { - if (!value) - return; - +bool key_val::read_float_t(char* buf, size_t offset, + const char* str_add, size_t str_add_len, float_t* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - io_write_utf8_string(s, buf); - io_write(s, "=1\n", 3); -} - -bool key_val_read_float_t(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, float_t* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0.0f; return false; } - *value = (float_t)atof(kv->val.begin[index]); + *value = (float_t)atof(val[index]); return true; } -void key_val_write_float_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, float_t value) { +bool key_val::read_int32_t(char* buf, size_t offset, + const char* str_add, size_t str_add_len, int32_t* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - char val_buf[0x100]; - sprintf_s(val_buf, 0x100, "%g", value); - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, val_buf); - io_write_char(s, '\n'); -} - -bool key_val_read_int32_t(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, int32_t* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0; return false; } - *value = atoi(kv->val.begin[index]); + *value = atoi(val[index]); return true; } -void key_val_write_int32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, int32_t value) { +bool key_val::read_uint32_t(char* buf, size_t offset, + const char* str_add, size_t str_add_len, uint32_t* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - char val_buf[0x100]; - sprintf_s(val_buf, 0x100, "%d", value); - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, val_buf); - io_write_char(s, '\n'); -} - -bool key_val_read_uint32_t(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, uint32_t* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0; return false; } - *value = atoi(kv->val.begin[index]); + *value = atoi(val[index]); return true; } -void key_val_write_uint32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, uint32_t value) { +bool key_val::read_string(char* buf, size_t offset, + const char* str_add, size_t str_add_len, string* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - char val_buf[0x100]; - sprintf_s(val_buf, 0x100, "%u", value); - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, val_buf); - io_write_char(s, '\n'); -} - -bool key_val_read_string(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, string* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = string_empty; return false; } - string_init_length(value, kv->val.begin[index], kv->val_len.begin[index]); + string_init_length(value, val[index], val_len[index]); return true; } -bool key_val_read_string(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, std::string* value) { +bool key_val::read_string(char* buf, size_t offset, + const char* str_add, size_t str_add_len, std::string* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = std::string(); return false; } - *value = std::string(kv->val.begin[index], kv->val_len.begin[index]); + *value = std::string(val[index], val_len[index]); return true; } -bool key_val_read_string(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, char** value) { +bool key_val::read_string(char* buf, size_t offset, + const char* str_add, size_t str_add_len, char** value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(kv, buf, offset); + ssize_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0; return false; } - *value = kv->val.begin[index]; + *value = val[index]; return true; } -void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, string* value) { - if (!string_data(value)) - return; - - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write(s, string_data(value), value->length); - io_write_char(s, '\n'); -} - -void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, std::string* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write(s, value->c_str(), value->size()); - io_write_char(s, '\n'); -} - -void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, char* value) { - if (!value) - return; - - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, value); - io_write_char(s, '\n'); -} - -void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, const char* value) { - if (!value) - return; - - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, value); - io_write_char(s, '\n'); -} - -bool key_val_read_vec3(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, vec3* value) { +bool key_val::read_vec3(char* buf, size_t offset, + const char* str_add, size_t str_add_len, vec3* value) { memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; key_val lkv; - if (!key_val_get_local_key_val(kv, buf, &lkv)) { + if (!get_local_key_val(buf, &lkv)) { memset(value, 0, sizeof(vec3)); return false; } - key_val_read_float_t(&lkv, buf, offset, ".x", 3, &value->x); - key_val_read_float_t(&lkv, buf, offset, ".y", 3, &value->y); - key_val_read_float_t(&lkv, buf, offset, ".z", 3, &value->z); - key_val_free(&lkv); + lkv.read_float_t(buf, offset, ".x", 3, &value->x); + lkv.read_float_t(buf, offset, ".y", 3, &value->y); + lkv.read_float_t(buf, offset, ".z", 3, &value->z); return true; } -void key_val_write_vec3(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, vec3* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - key_val_write_float_t(s, buf, offset, ".x", 3, value->x); - key_val_write_float_t(s, buf, offset, ".y", 3, value->y); - key_val_write_float_t(s, buf, offset, ".z", 3, value->z); -} - -void key_val_free(key_val* kv) { - if (kv->buf) { - size_t count = vector_old_length(kv->key); - memset(kv->key.begin, 0, sizeof(char*) * count); - memset(kv->val.begin, 0, sizeof(char*) * count); - - vector_old_ptr_char_free(&kv->key, 0); - vector_old_size_t_free(&kv->key_len, 0); - vector_old_ptr_char_free(&kv->val, 0); - vector_old_size_t_free(&kv->val_len, 0); - } - vector_old_uint64_t_free(&kv->key_hash, 0); - vector_old_size_t_free(&kv->key_index, 0); - free(kv->buf); -} - -void key_val_get_lexicographic_order(vector_old_int32_t* vec, int32_t length) { - vector_old_int32_t_clear(vec, 0); +void key_val::get_lexicographic_order(std::vector* vec, int32_t length) { + vec->clear(); int32_t i, j, m; if (length < 1) return; - vector_old_int32_t_reserve(vec, length); + vec->reserve(length); j = 0; - vector_old_int32_t_push_back(vec, &j); + vec->push_back(j); i = 1; j = 1; @@ -440,7 +291,7 @@ void key_val_get_lexicographic_order(vector_old_int32_t* vec, int32_t length) { while (i < length) { if (j * 10 < m) { - vector_old_int32_t_push_back(vec, &j); + vec->push_back(j); i++; j *= 10; } @@ -452,7 +303,7 @@ void key_val_get_lexicographic_order(vector_old_int32_t* vec, int32_t length) { j++; } else if (j % 10 != 9) { - vector_old_int32_t_push_back(vec, &j); + vec->push_back(j); i++; j++; } @@ -466,7 +317,7 @@ void key_val_get_lexicographic_order(vector_old_int32_t* vec, int32_t length) { j++; } else if (j < length && j % 10 == 9) { - vector_old_int32_t_push_back(vec, &j); + vec->push_back(j); i++; while (j % 10 == 9) j /= 10; @@ -475,14 +326,131 @@ void key_val_get_lexicographic_order(vector_old_int32_t* vec, int32_t length) { } } +void key_val::write_bool(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, bool value) { + if (!value) + return; + + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + io_write_utf8_string(s, buf); + io_write(s, "=1\n", 3); +} + +void key_val::write_float_t(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, float_t value) { + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%g", value); + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write_utf8_string(s, val_buf); + io_write_char(s, '\n'); +} + +void key_val::write_int32_t(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, int32_t value) { + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%d", value); + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write_utf8_string(s, val_buf); + io_write_char(s, '\n'); +} + +void key_val::write_uint32_t(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, uint32_t value) { + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%u", value); + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write_utf8_string(s, val_buf); + io_write_char(s, '\n'); +} + +void key_val::write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, string* value) { + if (!string_data(value)) + return; + + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write(s, string_data(value), value->length); + io_write_char(s, '\n'); +} + +void key_val::write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, std::string* value) { + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write(s, value->c_str(), value->size()); + io_write_char(s, '\n'); +} + +void key_val::write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, char* value) { + if (!value) + return; + + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write_utf8_string(s, value); + io_write_char(s, '\n'); +} + +void key_val::write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, const char* value) { + if (!value) + return; + + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + io_write_utf8_string(s, buf); + io_write_char(s, '='); + io_write_utf8_string(s, value); + io_write_char(s, '\n'); +} + +void key_val::write_vec3(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, vec3* value) { + memcpy(buf + offset, str_add, str_add_len); + offset += str_add_len - 1; + + write_float_t(s, buf, offset, ".x", 3, value->x); + write_float_t(s, buf, offset, ".y", 3, value->y); + write_float_t(s, buf, offset, ".z", 3, value->z); +} + static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length) { - if (vector_old_length(kv->key_hash) < 1) + if (kv->key_hash.size() < 1) return -1; uint64_t hash = hash_fnv1a64m((uint8_t*)str, length, false); - uint64_t* key = kv->key_hash.begin; - size_t len = vector_old_length(kv->key); + std::vector::iterator key = kv->key_hash.begin(); + size_t len = kv->key.size(); size_t temp; while (len > 0) { if (hash < key[temp = len / 2]) @@ -493,17 +461,17 @@ static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length) { } } - if (key - kv->key_hash.begin == 0) + if (key - kv->key_hash.begin() == 0) if (key[0] == hash) - return kv->key_index.begin[key - kv->key_hash.begin]; + return kv->key_index[key - kv->key_hash.begin()]; else return -1; else if (key[-1] == hash) - return kv->key_index.begin[key - kv->key_hash.begin - 1]; - else if (key == kv->key_hash.end) + return kv->key_index[key - kv->key_hash.begin() - 1]; + else if (key == kv->key_hash.end()) return -1; else if (key[0] == hash) - return kv->key_index.begin[key - kv->key_hash.begin]; + return kv->key_index[key - kv->key_hash.begin()]; return -1; } @@ -511,19 +479,15 @@ static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length) { #define RADIX (1 << RADIX_BASE) static void key_val_sort(key_val* kv) { - size_t count = vector_old_length(kv->key); + size_t count = kv->key.size(); - kv->key_hash = vector_old_empty(uint64_t); - kv->key_index = vector_old_empty(size_t); - vector_old_uint64_t_reserve(&kv->key_hash, count); - vector_old_size_t_reserve(&kv->key_index, count); - kv->key_hash.end += count; - kv->key_index.end += count; + kv->key_hash.resize(count); + kv->key_index.resize(count); - char** key = kv->key.begin; - size_t* key_len = kv->key_len.begin; - uint64_t* key_hash = kv->key_hash.begin; - size_t* key_index = kv->key_index.begin; + char** key = kv->key.data(); + size_t* key_len = kv->key_len.data(); + uint64_t* key_hash = kv->key_hash.data(); + size_t* key_index = kv->key_index.data(); for (size_t i = 0; i < count; i++) { *key_index++ = i; *key_hash++ = hash_fnv1a64m((uint8_t*)*key++, *key_len++, false); @@ -535,8 +499,8 @@ static void key_val_sort(key_val* kv) { uint64_t* o_key_hash = (uint64_t*)force_malloc_s(uint64_t, count); size_t* o_key_index = (size_t*)force_malloc_s(size_t, count); size_t* c = (size_t*)force_malloc_s(size_t, (1 << 8)); - uint64_t* arr_key_hash = kv->key_hash.begin; - size_t* arr_key_index = kv->key_index.begin; + uint64_t* arr_key_hash = kv->key_hash.data(); + size_t* arr_key_index = kv->key_index.data(); uint64_t* org_arr = arr_key_hash; for (size_t shift = 0, s = 0; shift < sizeof(uint64_t) * 8 / RADIX_BASE; shift++, s += RADIX_BASE) { diff --git a/src/KKdLib/key_val.h b/src/KKdLib/key_val.h index a2b5c227..d93593e2 100644 --- a/src/KKdLib/key_val.h +++ b/src/KKdLib/key_val.h @@ -6,61 +6,56 @@ #pragma once #include +#include #include "default.h" #include "io/stream.h" #include "vec.h" #include "vector.h" -typedef struct key_val { - vector_old_ptr_char key; - vector_old_size_t key_len; - vector_old_ptr_char val; - vector_old_size_t val_len; +class key_val { +public: + std::vector key; + std::vector key_len; + std::vector val; + std::vector val_len; char* buf; - vector_old_uint64_t key_hash; - vector_old_size_t key_index; -} key_val; + std::vector key_hash; + std::vector key_index; -extern void key_val_init(key_val* kv, uint8_t* data, size_t length); -extern void key_val_file_read(key_val* kv, char* path); -extern void key_val_wfile_read(key_val* kv, wchar_t* path); -extern bool key_val_get_local_key_val(key_val* kv, char* str, key_val* lkv); -extern bool key_val_get_local_key_val(key_val* kv, const char* str, key_val* lkv); -extern bool key_val_has_key(key_val* kv, char* str); -extern bool key_val_read_bool(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, bool* value); -extern void key_val_write_bool(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, bool value); -extern bool key_val_read_float_t(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, float_t* value); -extern void key_val_write_float_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, float_t value); -extern bool key_val_read_int32_t(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, int32_t* value); -extern void key_val_write_int32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, int32_t value); -extern bool key_val_read_uint32_t(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, uint32_t* value); -extern void key_val_write_uint32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, uint32_t value); -extern bool key_val_read_string(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, string* value); -extern bool key_val_read_string(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, std::string* value); -extern bool key_val_read_string(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, char** value); -extern void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, string* value); -extern void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, std::string* value); -extern void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, char* value); -extern void key_val_write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, const char* value); -extern bool key_val_read_vec3(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, vec3* value); -extern void key_val_write_vec3(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, vec3* value); -extern void key_val_free(key_val* kv); + key_val(); + ~key_val(); -extern void key_val_get_lexicographic_order(vector_old_int32_t* vec, int32_t length); + void file_read(char* path); + void file_read(wchar_t* path); + bool get_local_key_val(const char* str, key_val* lkv); + bool has_key(char* str); + bool read_bool(char* buf, size_t offset, const char* str_add, size_t str_add_len, bool* value); + bool read_float_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, float_t* value); + bool read_int32_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, int32_t* value); + bool read_uint32_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, uint32_t* value); + bool read_string(char* buf, size_t offset, const char* str_add, size_t str_add_len, string* value); + bool read_string(char* buf, size_t offset, const char* str_add, size_t str_add_len, std::string* value); + bool read_string(char* buf, size_t offset, const char* str_add, size_t str_add_len, char** value); + bool read_vec3(char* buf, size_t offset, const char* str_add, size_t str_add_len, vec3* value); + void parse(uint8_t* data, size_t length); + + static void get_lexicographic_order(std::vector* vec, int32_t length); + static void write_bool(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, bool value); + static void write_float_t(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, float_t value); + static void write_int32_t(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, int32_t value); + static void write_uint32_t(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, uint32_t value); + static void write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, string* value); + static void write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, std::string* value); + static void write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, char* value); + static void write_string(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, const char* value); + static void write_vec3(stream* s, char* buf, + size_t offset, const char* str_add, size_t str_add_len, vec3* value); +}; diff --git a/src/KKdLib/light_param/face.c b/src/KKdLib/light_param/face.c index 68b92dc5..a761ac37 100644 --- a/src/KKdLib/light_param/face.c +++ b/src/KKdLib/light_param/face.c @@ -18,7 +18,7 @@ light_param_face::light_param_face() : ready(), offset(), scale(), position(), d } -void light_param_face::read(char* path) { +void light_param_face::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; @@ -30,11 +30,11 @@ void light_param_face::read(char* path) { free(path_txt); } -void light_param_face::read(wchar_t* path) { +void light_param_face::read(const wchar_t* path) { wchar_t* path_txt = str_utils_wadd(path, L".txt"); - if (path_wcheck_file_exists(path_txt)) { + if (path_check_file_exists(path_txt)) { stream s; - io_wopen(&s, path_txt, L"rb"); + io_open(&s, path_txt, L"rb"); if (s.io.stream) light_param_face_read_inner(this, &s); io_free(&s); @@ -42,14 +42,14 @@ void light_param_face::read(wchar_t* path) { free(path_txt); } -void light_param_face::read(void* data, size_t length) { +void light_param_face::read(const void* data, size_t length) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); light_param_face_read_inner(this, &s); io_free(&s); } -void light_param_face::write(char* path) { +void light_param_face::write(const char* path) { if (!path || !ready) return; @@ -62,13 +62,13 @@ void light_param_face::write(char* path) { free(path_txt); } -void light_param_face::write(wchar_t* path) { +void light_param_face::write(const wchar_t* path) { if (!path || !ready) return; wchar_t* path_txt = str_utils_wadd(path, L".txt"); stream s; - io_wopen(&s, path_txt, L"wb"); + io_open(&s, path_txt, L"wb"); if (s.io.stream) light_param_face_write_inner(this, &s); io_free(&s); @@ -80,9 +80,9 @@ void light_param_face::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); light_param_face_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } @@ -90,10 +90,10 @@ light_param_face::~light_param_face() { } -bool light_param_face_load_file(void* data, char* path, char* file, uint32_t hash) { +bool light_param_face::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; diff --git a/src/KKdLib/light_param/face.h b/src/KKdLib/light_param/face.h index 7187c4f9..a8fbb545 100644 --- a/src/KKdLib/light_param/face.h +++ b/src/KKdLib/light_param/face.h @@ -18,13 +18,13 @@ public: vec3 direction; light_param_face(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); void write(void** data, size_t* length); ~light_param_face(); -}; -extern bool light_param_face_load_file(void* data, char* path, char* file, uint32_t hash); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/light_param/fog.c b/src/KKdLib/light_param/fog.c index 9dd1ff64..0621bdfc 100644 --- a/src/KKdLib/light_param/fog.c +++ b/src/KKdLib/light_param/fog.c @@ -18,7 +18,11 @@ light_param_fog::light_param_fog() : ready() { } -void light_param_fog::read(char* path) { +light_param_fog::~light_param_fog() { + +} + +void light_param_fog::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; @@ -30,11 +34,11 @@ void light_param_fog::read(char* path) { free(path_txt); } -void light_param_fog::read(wchar_t* path) { +void light_param_fog::read(const wchar_t* path) { wchar_t* path_txt = str_utils_wadd(path, L".txt"); - if (path_wcheck_file_exists(path_txt)) { + if (path_check_file_exists(path_txt)) { stream s; - io_wopen(&s, path_txt, L"rb"); + io_open(&s, path_txt, L"rb"); if (s.io.stream) light_param_fog_read_inner(this, &s); io_free(&s); @@ -42,14 +46,14 @@ void light_param_fog::read(wchar_t* path) { free(path_txt); } -void light_param_fog::read(void* data, size_t length) { +void light_param_fog::read(const void* data, size_t length) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); light_param_fog_read_inner(this, &s); io_free(&s); } -void light_param_fog::write(char* path) { +void light_param_fog::write(const char* path) { if (!path || !ready) return; @@ -62,13 +66,13 @@ void light_param_fog::write(char* path) { free(path_txt); } -void light_param_fog::write(wchar_t* path) { +void light_param_fog::write(const wchar_t* path) { if (!path || !ready) return; wchar_t* path_txt = str_utils_wadd(path, L".txt"); stream s; - io_wopen(&s, path_txt, L"wb"); + io_open(&s, path_txt, L"wb"); if (s.io.stream) light_param_fog_write_inner(this, &s); io_free(&s); @@ -80,20 +84,16 @@ void light_param_fog::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); light_param_fog_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -light_param_fog::~light_param_fog() { - -} - -bool light_param_fog_load_file(void* data, char* path, char* file, uint32_t hash) { +bool light_param_fog::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; diff --git a/src/KKdLib/light_param/fog.h b/src/KKdLib/light_param/fog.h index 21549f50..eab38428 100644 --- a/src/KKdLib/light_param/fog.h +++ b/src/KKdLib/light_param/fog.h @@ -45,12 +45,14 @@ public: light_param_fog_group group[FOG_MAX]; light_param_fog(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); - void write(void** data, size_t* length); ~light_param_fog(); + + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; -extern bool light_param_fog_load_file(void* data, char* path, char* file, uint32_t hash); diff --git a/src/KKdLib/light_param/glow.c b/src/KKdLib/light_param/glow.c index f22acedc..1402ce24 100644 --- a/src/KKdLib/light_param/glow.c +++ b/src/KKdLib/light_param/glow.c @@ -22,7 +22,11 @@ has_tone_transform(), tone_transform_start(), tone_transform_end() { } -void light_param_glow::read(char* path) { +light_param_glow::~light_param_glow() { + +} + +void light_param_glow::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; @@ -34,11 +38,11 @@ void light_param_glow::read(char* path) { free(path_txt); } -void light_param_glow::read(wchar_t* path) { +void light_param_glow::read(const wchar_t* path) { wchar_t* path_txt = str_utils_wadd(path, L".txt"); - if (path_wcheck_file_exists(path_txt)) { + if (path_check_file_exists(path_txt)) { stream s; - io_wopen(&s, path_txt, L"rb"); + io_open(&s, path_txt, L"rb"); if (s.io.stream) light_param_glow_read_inner(this, &s); io_free(&s); @@ -46,14 +50,14 @@ void light_param_glow::read(wchar_t* path) { free(path_txt); } -void light_param_glow::read(void* data, size_t length) { +void light_param_glow::read(const void* data, size_t length) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); light_param_glow_read_inner(this, &s); io_free(&s); } -void light_param_glow::write(char* path) { +void light_param_glow::write(const char* path) { if (!path || !ready) return; @@ -66,13 +70,13 @@ void light_param_glow::write(char* path) { free(path_txt); } -void light_param_glow::write(wchar_t* path) { +void light_param_glow::write(const wchar_t* path) { if (!path || !ready) return; wchar_t* path_txt = str_utils_wadd(path, L".txt"); stream s; - io_wopen(&s, path_txt, L"wb"); + io_open(&s, path_txt, L"wb"); if (s.io.stream) light_param_glow_write_inner(this, &s); io_free(&s); @@ -84,20 +88,16 @@ void light_param_glow::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); light_param_glow_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -light_param_glow::~light_param_glow() { - -} - -bool light_param_glow_load_file(void* data, char* path, char* file, uint32_t hash) { +bool light_param_glow::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; diff --git a/src/KKdLib/light_param/glow.h b/src/KKdLib/light_param/glow.h index 44450382..bb9d7a06 100644 --- a/src/KKdLib/light_param/glow.h +++ b/src/KKdLib/light_param/glow.h @@ -44,13 +44,14 @@ public: vec3 tone_transform_end; light_param_glow(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); - void write(void** data, size_t* length); ~light_param_glow(); -}; -extern bool light_param_glow_load_file(void* data, char* path, char* file, uint32_t hash); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/light_param/ibl.c b/src/KKdLib/light_param/ibl.c index acd208ac..3af3ad78 100644 --- a/src/KKdLib/light_param/ibl.c +++ b/src/KKdLib/light_param/ibl.c @@ -17,7 +17,11 @@ light_param_ibl::light_param_ibl() : ready(), lit_col(), lit_dir(), diff_coef() } -void light_param_ibl::read(char* path) { +light_param_ibl::~light_param_ibl() { + +} + +void light_param_ibl::read(const char* path) { char* path_ibl = str_utils_add(path, ".ibl"); if (path_check_file_exists(path_ibl)) { stream s; @@ -29,11 +33,11 @@ void light_param_ibl::read(char* path) { free(path_ibl); } -void light_param_ibl::read(wchar_t* path) { +void light_param_ibl::read(const wchar_t* path) { wchar_t* path_ibl = str_utils_wadd(path, L".ibl"); - if (path_wcheck_file_exists(path_ibl)) { + if (path_check_file_exists(path_ibl)) { stream s; - io_wopen(&s, path_ibl, L"rb"); + io_open(&s, path_ibl, L"rb"); if (s.io.stream) light_param_ibl_read_inner(this, &s); io_free(&s); @@ -41,21 +45,17 @@ void light_param_ibl::read(wchar_t* path) { free(path_ibl); } -void light_param_ibl::read(void* data, size_t length) { +void light_param_ibl::read(const void* data, size_t length) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); light_param_ibl_read_inner(this, &s); io_free(&s); } -light_param_ibl::~light_param_ibl() { - -} - -bool light_param_ibl_load_file(void* data, char* path, char* file, uint32_t hash) { +bool light_param_ibl::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -285,7 +285,7 @@ static void light_param_ibl_specular_generate_mipmaps(light_param_ibl_specular* data_f32[0] = data_f32[1]; data_f32[1] = temp; - std::vector& data = specular->data[i + 1]; + std::vector& data = specular->data[i + 1ULL]; temp = data_f32[0]; for (size_t j = 0; j < data_size_2; j++) data[j] = float_to_half(temp[j]); diff --git a/src/KKdLib/light_param/ibl.h b/src/KKdLib/light_param/ibl.h index b0268cb4..ed28de35 100644 --- a/src/KKdLib/light_param/ibl.h +++ b/src/KKdLib/light_param/ibl.h @@ -40,10 +40,11 @@ typedef struct light_param_ibl { light_param_ibl_specular specular[4]; light_param_ibl(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); ~light_param_ibl(); -} light_param_ibl; -extern bool light_param_ibl_load_file(void* data, char* path, char* file, uint32_t hash); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +} light_param_ibl; diff --git a/src/KKdLib/light_param/light.c b/src/KKdLib/light_param/light.c index 4b365426..3e4f0a34 100644 --- a/src/KKdLib/light_param/light.c +++ b/src/KKdLib/light_param/light.c @@ -18,7 +18,11 @@ light_param_light::light_param_light() : ready() { } -void light_param_light::read(char* path) { +light_param_light::~light_param_light() { + +} + +void light_param_light::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; @@ -30,11 +34,11 @@ void light_param_light::read(char* path) { free(path_txt); } -void light_param_light::read(wchar_t* path) { +void light_param_light::read(const wchar_t* path) { wchar_t* path_txt = str_utils_wadd(path, L".txt"); - if (path_wcheck_file_exists(path_txt)) { + if (path_check_file_exists(path_txt)) { stream s; - io_wopen(&s, path_txt, L"rb"); + io_open(&s, path_txt, L"rb"); if (s.io.stream) light_param_light_read_inner(this, &s); io_free(&s); @@ -42,14 +46,14 @@ void light_param_light::read(wchar_t* path) { free(path_txt); } -void light_param_light::read(void* data, size_t length) { +void light_param_light::read(const void* data, size_t length) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); light_param_light_read_inner(this, &s); io_free(&s); } -void light_param_light::write(char* path) { +void light_param_light::write(const char* path) { if (!path || !ready) return; @@ -62,13 +66,13 @@ void light_param_light::write(char* path) { free(path_txt); } -void light_param_light::write(wchar_t* path) { +void light_param_light::write(const wchar_t* path) { if (!path || !ready) return; wchar_t* path_txt = str_utils_wadd(path, L".txt"); stream s; - io_wopen(&s, path_txt, L"wb"); + io_open(&s, path_txt, L"wb"); if (s.io.stream) light_param_light_write_inner(this, &s); io_free(&s); @@ -80,20 +84,16 @@ void light_param_light::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); light_param_light_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -light_param_light::~light_param_light() { - -} - -bool light_param_light_load_file(void* data, char* path, char* file, uint32_t hash) { +bool light_param_light::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; diff --git a/src/KKdLib/light_param/light.h b/src/KKdLib/light_param/light.h index d3dcdc28..72f398bb 100644 --- a/src/KKdLib/light_param/light.h +++ b/src/KKdLib/light_param/light.h @@ -76,13 +76,14 @@ public: light_param_light_group group[LIGHT_SET_MAX]; light_param_light(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); - void write(void** data, size_t* length); ~light_param_light(); -}; -extern bool light_param_light_load_file(void* data, char* path, char* file, uint32_t hash); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/light_param/wind.c b/src/KKdLib/light_param/wind.c index 3d2e66bb..548a4429 100644 --- a/src/KKdLib/light_param/wind.c +++ b/src/KKdLib/light_param/wind.c @@ -19,7 +19,11 @@ cycle(), has_rot(), rot_y(), rot_z(), has_bias(), bias(), has_spc(), spc() { } -void light_param_wind::read(char* path) { +light_param_wind::~light_param_wind() { + +} + +void light_param_wind::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; @@ -31,11 +35,11 @@ void light_param_wind::read(char* path) { free(path_txt); } -void light_param_wind::read(wchar_t* path) { +void light_param_wind::read(const wchar_t* path) { wchar_t* path_txt = str_utils_wadd(path, L".txt"); - if (path_wcheck_file_exists(path_txt)) { + if (path_check_file_exists(path_txt)) { stream s; - io_wopen(&s, path_txt, L"rb"); + io_open(&s, path_txt, L"rb"); if (s.io.stream) light_param_wind_read_inner(this, &s); io_free(&s); @@ -43,14 +47,14 @@ void light_param_wind::read(wchar_t* path) { free(path_txt); } -void light_param_wind::read(void* data, size_t length) { +void light_param_wind::read(const void* data, size_t length) { stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); light_param_wind_read_inner(this, &s); io_free(&s); } -void light_param_wind::write(char* path) { +void light_param_wind::write(const char* path) { if (!path || !ready) return; @@ -63,13 +67,13 @@ void light_param_wind::write(char* path) { free(path_txt); } -void light_param_wind::write(wchar_t* path) { +void light_param_wind::write(const wchar_t* path) { if (!path || !ready) return; wchar_t* path_txt = str_utils_wadd(path, L".txt"); stream s; - io_wopen(&s, path_txt, L"wb"); + io_open(&s, path_txt, L"wb"); if (s.io.stream) light_param_wind_write_inner(this, &s); io_free(&s); @@ -81,20 +85,16 @@ void light_param_wind::write(void** data, size_t* length) { return; stream s; - io_mopen(&s, 0, 0); + io_open(&s); light_param_wind_write_inner(this, &s); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); } -light_param_wind::~light_param_wind() { - -} - -bool light_param_wind_load_file(void* data, char* path, char* file, uint32_t hash) { +bool light_param_wind::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; diff --git a/src/KKdLib/light_param/wind.h b/src/KKdLib/light_param/wind.h index 414c1185..8d78905a 100644 --- a/src/KKdLib/light_param/wind.h +++ b/src/KKdLib/light_param/wind.h @@ -34,13 +34,14 @@ public: light_param_wind_spc spc[16]; light_param_wind(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - void write(char* path); - void write(wchar_t* path); - void write(void** data, size_t* length); ~light_param_wind(); -}; -extern bool light_param_wind_load_file(void* data, char* path, char* file, uint32_t hash); + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + void write(const char* path); + void write(const wchar_t* path); + void write(void** data, size_t* length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/mat.c b/src/KKdLib/mat.c index bfc38e21..5523bfa5 100644 --- a/src/KKdLib/mat.c +++ b/src/KKdLib/mat.c @@ -661,6 +661,46 @@ inline void mat4_mult(mat4* x, mat4* y, mat4* z) { z->row3.data = _mm_add_ps(_mm_add_ps(t0, t1), _mm_add_ps(t2, t3)); } +inline void mat4_mult(mat4u* x, mat4u* y, mat4u* z) { + __m128 t0; + __m128 t1; + __m128 t2; + __m128 t3; + __m128 xt; + __m128 y0; + __m128 y1; + __m128 y2; + __m128 y3; + y0 = _mm_loadu_ps((float_t*)&y->row0); + y1 = _mm_loadu_ps((float_t*)&y->row1); + y2 = _mm_loadu_ps((float_t*)&y->row2); + y3 = _mm_loadu_ps((float_t*)&y->row3); + xt = _mm_loadu_ps((float_t*)&x->row0); + t0 = _mm_mul_ps(y0, _mm_shuffle_ps(xt, xt, 0x00)); + t1 = _mm_mul_ps(y1, _mm_shuffle_ps(xt, xt, 0x55)); + t2 = _mm_mul_ps(y2, _mm_shuffle_ps(xt, xt, 0xAA)); + t3 = _mm_mul_ps(y3, _mm_shuffle_ps(xt, xt, 0xFF)); + _mm_storeu_ps((float_t*)&z->row0, _mm_add_ps(_mm_add_ps(t0, t1), _mm_add_ps(t2, t3))); + xt = _mm_loadu_ps((float_t*)&x->row1); + t0 = _mm_mul_ps(y0, _mm_shuffle_ps(xt, xt, 0x00)); + t1 = _mm_mul_ps(y1, _mm_shuffle_ps(xt, xt, 0x55)); + t2 = _mm_mul_ps(y2, _mm_shuffle_ps(xt, xt, 0xAA)); + t3 = _mm_mul_ps(y3, _mm_shuffle_ps(xt, xt, 0xFF)); + _mm_storeu_ps((float_t*)&z->row1, _mm_add_ps(_mm_add_ps(t0, t1), _mm_add_ps(t2, t3))); + xt = _mm_loadu_ps((float_t*)&x->row2); + t0 = _mm_mul_ps(y0, _mm_shuffle_ps(xt, xt, 0x00)); + t1 = _mm_mul_ps(y1, _mm_shuffle_ps(xt, xt, 0x55)); + t2 = _mm_mul_ps(y2, _mm_shuffle_ps(xt, xt, 0xAA)); + t3 = _mm_mul_ps(y3, _mm_shuffle_ps(xt, xt, 0xFF)); + _mm_storeu_ps((float_t*)&z->row2, _mm_add_ps(_mm_add_ps(t0, t1), _mm_add_ps(t2, t3))); + xt = _mm_loadu_ps((float_t*)&x->row3); + t0 = _mm_mul_ps(y0, _mm_shuffle_ps(xt, xt, 0x00)); + t1 = _mm_mul_ps(y1, _mm_shuffle_ps(xt, xt, 0x55)); + t2 = _mm_mul_ps(y2, _mm_shuffle_ps(xt, xt, 0xAA)); + t3 = _mm_mul_ps(y3, _mm_shuffle_ps(xt, xt, 0xFF)); + _mm_storeu_ps((float_t*)&z->row3, _mm_add_ps(_mm_add_ps(t0, t1), _mm_add_ps(t2, t3))); +} + inline void mat4_mult_vec3(mat4* x, vec3* y, vec3* z) { __m128 yt; __m128 zt; @@ -1678,6 +1718,10 @@ inline void mat4_translate_z_add(mat4* x, float_t y, mat4* z) { } inline void mat4_from_quat(quat* quat, mat4* mat) { + mat4_from_quat(quat, (mat4u*)mat); +} + +inline void mat4_from_quat(quat* quat, mat4u* mat) { float_t y; float_t x; float_t z; @@ -1855,10 +1899,18 @@ inline void mat4_get_translation(mat4* x, vec3* z) { *z = *(vec3*)&x->row3; } +inline void mat4_get_translation(mat4u* x, vec3* z) { + *z = *(vec3*)&x->row3; +} + inline void mat4_set_translation(mat4* x, vec3* z) { *(vec3*)&x->row3 = *z; } +inline void mat4_set_translation(mat4u* x, vec3* z) { + *(vec3*)&x->row3 = *z; +} + inline void mat4_blend(mat4* x, mat4* y, mat4* z, float_t blend) { quat q1; quat q2; @@ -1882,6 +1934,29 @@ inline void mat4_blend(mat4* x, mat4* y, mat4* z, float_t blend) { mat4_set_translation(z, &t3); } +inline void mat4_blend(mat4u* x, mat4u* y, mat4u* z, float_t blend) { + quat q1; + quat q2; + quat q3; + + quat_from_mat3(x->row0.x, x->row1.x, x->row2.x, x->row0.y, + x->row1.y, x->row2.y, x->row0.z, x->row1.z, x->row2.z, &q1); + quat_from_mat3(y->row0.x, y->row1.x, y->row2.x, y->row0.y, + y->row1.y, y->row2.y, y->row0.z, y->row1.z, y->row2.z, &q1); + + vec3 t1; + vec3 t2; + vec3 t3; + mat4_get_translation(x, &t1); + mat4_get_translation(y, &t2); + + quat_slerp(&q3, &q1, &q2, blend); + vec3_lerp_scalar(t1, t2, t3, blend); + + mat4_from_quat(&q3, z); + mat4_set_translation(z, &t3); +} + inline void mat4_blend_rotation(mat4* x, mat4* y, mat4* z, float_t blend) { quat q0; quat q1; @@ -1895,6 +1970,19 @@ inline void mat4_blend_rotation(mat4* x, mat4* y, mat4* z, float_t blend) { mat4_from_quat(&q2, z); } +inline void mat4_blend_rotation(mat4u* x, mat4u* y, mat4u* z, float_t blend) { + quat q0; + quat q1; + quat q2; + + quat_from_mat3(x->row0.x, x->row1.x, x->row2.x, x->row0.y, + x->row1.y, x->row2.y, x->row0.z, x->row1.z, x->row2.z, &q1); + quat_from_mat3(y->row0.x, y->row1.x, y->row2.x, y->row0.y, + y->row1.y, y->row2.y, y->row0.z, y->row1.z, y->row2.z, &q1); + quat_slerp(&q0, &q1, &q2, blend); + mat4_from_quat(&q2, z); +} + void mat4_lerp_rotation(mat4* dst, mat4* src0, mat4* src1, float_t blend) { vec3 m0; vec3 m1; @@ -2014,6 +2102,24 @@ inline void mat4_look_at(vec3* eye, vec3* target, vec3* up, mat4* mat) { mat->row3.w = 1.0f; } +inline void mat4_look_at(vec3* eye, vec3* target, mat4* mat) { + vec3 up = { 0.0f, 1.0f, 0.0f }; + vec3 dir; + float_t length; + vec3_sub(*target, *eye, dir); + vec3_length_squared(dir, length); + if (length <= 0.000001f) { + up.x = 0.0f; + up.y = 0.0f; + if (dir.z < 0.0f) + up.z = 1.0f; + else + up.z = -1.0f; + } + + mat4_look_at(eye, target, &up, mat); +} + mat4::operator mat4u() const { mat4u m; m.row0 = row0; diff --git a/src/KKdLib/mat.h b/src/KKdLib/mat.h index 76826343..ca2166df 100644 --- a/src/KKdLib/mat.h +++ b/src/KKdLib/mat.h @@ -87,6 +87,7 @@ extern float_t mat3_get_max_scale(mat3* x); extern void mat4_add(mat4* x, mat4* y, mat4* z); extern void mat4_sub(mat4* x, mat4* y, mat4* z); extern void mat4_mult(mat4* x, mat4* y, mat4* z); +extern void mat4_mult(mat4u* x, mat4u* y, mat4u* z); extern void mat4_mult_vec3(mat4* x, vec3* y, vec3* z); extern void mat4_mult_vec3_inv(mat4* x, vec3* y, vec3* z); extern void mat4_mult_vec3_trans(mat4* x, vec3* y, vec3* z); @@ -152,6 +153,7 @@ extern void mat4_translate_x_add(mat4* x, float_t y, mat4* z); extern void mat4_translate_y_add(mat4* x, float_t y, mat4* z); extern void mat4_translate_z_add(mat4* x, float_t y, mat4* z); extern void mat4_from_quat(quat* quat, mat4* mat); +extern void mat4_from_quat(quat* quat, mat4u* mat); extern void mat4_from_axis_angle(vec3* axis, float_t angle, mat4* mat); extern void mat4_from_mat3(mat3* x, mat4* z); extern void mat4_from_mat3_inverse(mat3* x, mat4* z); @@ -160,12 +162,17 @@ extern void mat4_clear_trans(mat4* x, mat4* z); extern void mat4_get_scale(mat4* x, vec3* z); extern void mat4_get_rotation(mat4* x, vec3* z); extern void mat4_get_translation(mat4* x, vec3* z); +extern void mat4_get_translation(mat4u* x, vec3* z); extern void mat4_set_translation(mat4* x, vec3* z); +extern void mat4_set_translation(mat4u* x, vec3* z); extern void mat4_blend(mat4* x, mat4* y, mat4* z, float_t blend); +extern void mat4_blend(mat4u* x, mat4u* y, mat4u* z, float_t blend); extern void mat4_blend_rotation(mat4* x, mat4* y, mat4* z, float_t blend); +extern void mat4_blend_rotation(mat4u* x, mat4u* y, mat4u* z, float_t blend); extern void mat4_lerp_rotation(mat4* dst, mat4* src0, mat4* src1, float_t blend); extern float_t mat4_get_max_scale(mat4* x); extern void mat4_ortho(double_t left, double_t right, double_t bottom, double_t top, double_t z_near, double_t z_far, mat4* mat); extern void mat4_persp(double_t fov_y, double_t aspect, double_t z_near, double_t z_far, mat4* mat); extern void mat4_look_at(vec3* eye, vec3* target, vec3* up, mat4* mat); +extern void mat4_look_at(vec3* eye, vec3* target, mat4* mat); diff --git a/src/KKdLib/mot.c b/src/KKdLib/mot.c index 05b48802..4e9ba215 100644 --- a/src/KKdLib/mot.c +++ b/src/KKdLib/mot.c @@ -29,20 +29,21 @@ typedef struct mot_header_modern { int32_t bone_info_count; } mot_header_modern; -vector_old_func(mot_data) -vector_old_func(mot_set) - static bool mot_classic_read_inner(mot_set* ms, stream* s); static void mot_classic_write_inner(mot_set* ms, stream* s); static bool mot_modern_read_inner(mot_set* ms, stream* s); static void mot_modern_write_inner(mot_set* ms, stream* s); -void mot_init(mot_set_farc* msf) { - memset(msf, 0, sizeof(mot_set_farc)); +mot_set_farc::mot_set_farc() : ready(), modern() { + } -void mot_read(mot_set_farc* msf, char* path, bool modern) { - if (!msf || !path) +mot_set_farc::~mot_set_farc() { + +} + +void mot_set_farc::read(const char* path, bool modern) { + if (!path) return; char* path_farc = str_utils_add(path, ".farc"); @@ -50,7 +51,7 @@ void mot_read(mot_set_farc* msf, char* path, bool modern) { farc f; f.read(path_farc, true, false); - vector_old_mot_set_reserve(&msf->vec, f.files.size()); + vec.reserve(f.files.size()); if (!modern) for (farc_file& i : f.files) { if (!i.data || !i.size @@ -59,22 +60,19 @@ void mot_read(mot_set_farc* msf, char* path, bool modern) { continue; mot_set ms; - mot_set_init(&ms); stream s; - io_mopen(&s, i.data, i.size); + io_open(&s, i.data, i.size); bool ret = mot_classic_read_inner(&ms, &s); io_free(&s); - if (!ret) { - mot_set_free(&ms); + if (!ret) continue; - } - string_init_length(&ms.name, i.name.c_str(), i.name.size() - 4); - vector_old_mot_set_push_back(&msf->vec, &ms); - msf->ready = true; - msf->modern = false; + ms.name = std::string(i.name.c_str(), i.name.size() - 4); + vec.push_back(ms); + ready = true; + modern = false; } else for (farc_file& i : f.files) { @@ -83,37 +81,34 @@ void mot_read(mot_set_farc* msf, char* path, bool modern) { continue; mot_set ms; - mot_set_init(&ms); stream s; - io_mopen(&s, i.data, i.size); + io_open(&s, i.data, i.size); bool ret = mot_classic_read_inner(&ms, &s); io_free(&s); - if (!ret) { - mot_set_free(&ms); + if (!ret) continue; - } - string_init_length(&ms.name, i.name.c_str(), i.name.size() - 4); - vector_old_mot_set_push_back(&msf->vec, &ms); - msf->ready = true; - msf->modern = true; + ms.name = std::string(i.name.c_str(), i.name.size() - 4); + vec.push_back(ms); + ready = true; + modern = true; } } free(path_farc); } -void mot_wread(mot_set_farc* msf, wchar_t* path, bool modern) { - if (!msf || !path) +void mot_set_farc::read(const wchar_t* path, bool modern) { + if (!path) return; wchar_t* path_farc = str_utils_wadd(path, L".farc"); - if (path_wcheck_file_exists(path_farc)) { + if (path_check_file_exists(path_farc)) { farc f; f.read(path_farc, true, false); - vector_old_mot_set_reserve(&msf->vec, f.files.size()); + vec.reserve(f.files.size()); if (!modern) for (farc_file& i : f.files) { if (!i.data || !i.size @@ -122,22 +117,19 @@ void mot_wread(mot_set_farc* msf, wchar_t* path, bool modern) { continue; mot_set ms; - mot_set_init(&ms); stream s; - io_mopen(&s, i.data, i.size); + io_open(&s, i.data, i.size); bool ret = mot_classic_read_inner(&ms, &s); io_free(&s); - if (!ret) { - mot_set_free(&ms); + if (!ret) continue; - } - string_init_length(&ms.name, i.name.c_str(), i.name.size() - 4); - vector_old_mot_set_push_back(&msf->vec, &ms); - msf->ready = true; - msf->modern = false; + ms.name = std::string(i.name.c_str(), i.name.size() - 4); + vec.push_back(ms); + ready = true; + modern = false; } else for (farc_file& i : f.files) { @@ -146,35 +138,32 @@ void mot_wread(mot_set_farc* msf, wchar_t* path, bool modern) { continue; mot_set ms; - mot_set_init(&ms); stream s; - io_mopen(&s, i.data, i.size); + io_open(&s, i.data, i.size); bool ret = mot_classic_read_inner(&ms, &s); io_free(&s); - if (!ret) { - mot_set_free(&ms); + if (!ret) continue; - } - string_init_length(&ms.name, i.name.c_str(), i.name.size() - 4); - vector_old_mot_set_push_back(&msf->vec, &ms); - msf->ready = true; - msf->modern = true; + ms.name = std::string(i.name.c_str(), i.name.size() - 4); + vec.push_back(ms); + ready = true; + modern = true; } } free(path_farc); } -void mot_mread(mot_set_farc* msf, void* data, size_t length, bool modern) { - if (!msf || !data || !length) +void mot_set_farc::read(const void* data, size_t length, bool modern) { + if (!data || !length) return; farc f; f.read(data, length, true); - vector_old_mot_set_reserve(&msf->vec, f.files.size()); + vec.reserve(f.files.size()); if (!modern) for (farc_file& i : f.files) { if (!i.data || !i.size @@ -183,22 +172,19 @@ void mot_mread(mot_set_farc* msf, void* data, size_t length, bool modern) { continue; mot_set ms; - mot_set_init(&ms); stream s; - io_mopen(&s, i.data, i.size); + io_open(&s, i.data, i.size); bool ret = mot_classic_read_inner(&ms, &s); io_free(&s); - if (!ret) { - mot_set_free(&ms); + if (!ret) continue; - } - string_init_length(&ms.name, i.name.c_str(), i.name.size() - 4); - vector_old_mot_set_push_back(&msf->vec, &ms); - msf->ready = true; - msf->modern = false; + ms.name = std::string(i.name.c_str(), i.name.size() - 4); + vec.push_back(ms); + ready = true; + modern = false; } else for (farc_file& i : f.files) { @@ -207,62 +193,59 @@ void mot_mread(mot_set_farc* msf, void* data, size_t length, bool modern) { continue; mot_set ms; - mot_set_init(&ms); stream s; - io_mopen(&s, i.data, i.size); + io_open(&s, i.data, i.size); bool ret = mot_classic_read_inner(&ms, &s); io_free(&s); - if (!ret) { - mot_set_free(&ms); + if (!ret) continue; - } - string_init_length(&ms.name, i.name.c_str(), i.name.size() - 4); - vector_old_mot_set_push_back(&msf->vec, &ms); - msf->ready = true; - msf->modern = true; + ms.name = std::string(i.name.c_str(), i.name.size() - 4); + vec.push_back(ms); + ready = true; + modern = true; } } -void mot_write(mot_set_farc* msf, char* path, farc_compress_mode mode) { - if (!msf || !path || !msf->ready) +void mot_set_farc::write(const char* path, farc_compress_mode mode) { + if (!path || !ready) return; char* path_farc = str_utils_add(path, ".farc"); farc f; - if (!msf->modern) - for (mot_set* i = msf->vec.begin; i != msf->vec.end; i++) { + if (!modern) + for (mot_set& i : vec) { farc_file ff; memset(&ff, 0, sizeof(farc_file)); stream s; - io_mopen(&s, 0, 0); - mot_classic_write_inner(i, &s); + io_open(&s); + mot_classic_write_inner(&i, &s); io_align_write(&s, 0x10); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); - ff.name = std::string(string_data(&i->name), i->name.length); + ff.name = i.name; ff.name += ".bin"; f.files.push_back(ff); } else - for (mot_set* i = msf->vec.begin; i != msf->vec.end; i++) { + for (mot_set& i : vec) { farc_file ff; memset(&ff, 0, sizeof(farc_file)); stream s; - io_mopen(&s, 0, 0); - mot_modern_write_inner(i, &s); + io_open(&s); + mot_modern_write_inner(&i, &s); io_align_write(&s, 0x10); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); - ff.name = std::string(string_data(&i->name), i->name.length); + ff.name = i.name; ff.name += ".mot"; f.files.push_back(ff); @@ -271,41 +254,41 @@ void mot_write(mot_set_farc* msf, char* path, farc_compress_mode mode) { free(path_farc); } -void mot_wwrite(mot_set_farc* msf, wchar_t* path, farc_compress_mode mode) { - if (!msf || !path || !msf->ready) +void mot_set_farc::write(const wchar_t* path, farc_compress_mode mode) { + if (!path || !ready) return; wchar_t* path_farc = str_utils_wadd(path, L".farc"); farc f; - if (!msf->modern) - for (mot_set* i = msf->vec.begin; i != msf->vec.end; i++) { + if (!modern) + for (mot_set& i : vec) { farc_file ff; stream s; - io_mopen(&s, 0, 0); - mot_classic_write_inner(i, &s); + io_open(&s); + mot_classic_write_inner(&i, &s); io_align_write(&s, 0x10); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); - ff.name = std::string(string_data(&i->name), i->name.length); + ff.name = i.name; ff.name += ".bin"; f.files.push_back(ff); } else - for (mot_set* i = msf->vec.begin; i != msf->vec.end; i++) { + for (mot_set& i : vec) { farc_file ff; stream s; - io_mopen(&s, 0, 0); - mot_modern_write_inner(i, &s); + io_open(&s); + mot_modern_write_inner(&i, &s); io_align_write(&s, 0x10); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); - ff.name = std::string(string_data(&i->name), i->name.length); + ff.name = i.name; ff.name += ".mot"; f.files.push_back(ff); @@ -314,39 +297,39 @@ void mot_wwrite(mot_set_farc* msf, wchar_t* path, farc_compress_mode mode) { free(path_farc); } -void mot_mwrite(mot_set_farc* msf, void** data, size_t* length, farc_compress_mode mode) { - if (!msf || !data || !msf->ready) +void mot_set_farc::write(void** data, size_t* length, farc_compress_mode mode) { + if (!data || !ready) return; farc f; - if (!msf->modern) - for (mot_set* i = msf->vec.begin; i != msf->vec.end; i++) { + if (!modern) + for (mot_set& i : vec) { farc_file ff; stream s; - io_mopen(&s, 0, 0); - mot_classic_write_inner(i, &s); + io_open(&s); + mot_classic_write_inner(&i, &s); io_align_write(&s, 0x10); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); - ff.name = std::string(string_data(&i->name), i->name.length); + ff.name = i.name; ff.name += ".bin"; f.files.push_back(ff); } else - for (mot_set* i = msf->vec.begin; i != msf->vec.end; i++) { + for (mot_set& i : vec) { farc_file ff; memset(&ff, 0, sizeof(farc_file)); stream s; - io_mopen(&s, 0, 0); - mot_modern_write_inner(i, &s); + io_open(&s); + mot_modern_write_inner(&i, &s); io_align_write(&s, 0x10); - io_mcopy(&s, &ff.data, &ff.size); + io_copy(&s, &ff.data, &ff.size); io_free(&s); - ff.name = std::string(string_data(&i->name), i->name.length); + ff.name = i.name; ff.name += ".mot"; f.files.push_back(ff); @@ -354,10 +337,10 @@ void mot_mwrite(mot_set_farc* msf, void** data, size_t* length, farc_compress_mo f.write(data, length, mode); } -bool mot_load_file(void* data, char* path, char* file, uint32_t hash) { +bool mot_set_farc::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -366,44 +349,43 @@ bool mot_load_file(void* data, char* path, char* file, uint32_t hash) { string_add_length(&s, file, file_len); mot_set_farc* msf = (mot_set_farc*)data; - mot_read(msf, string_data(&s), msf->modern); + msf->read(string_data(&s), msf->modern); string_free(&s); return msf->ready; } -void mot_free(mot_set_farc* msf) { - if (!msf) - return; +mot_bone_info::mot_bone_info() : index() { - vector_old_mot_set_free(&msf->vec, mot_set_free); } -void mot_set_init(mot_set* ms) { - memset(ms, 0, sizeof(mot_set)); +mot_bone_info::~mot_bone_info() { + } -void mot_set_free(mot_set* ms) { - if (!ms) - return; +mot_key_set_data::mot_key_set_data() : type(), frames(), values(), keys_count(), data_type() { - for (mot_data* i = ms->vec.begin; i != ms->vec.end; i++) { - if (i->bone_info) - for (size_t j = 0; j < i->bone_info_count; j++) - string_free(&i->bone_info[j].name); - free(i->bone_info); +} - if (i->key_set) - for (size_t j = 0; j < i->key_set_count; j++) { - free(i->key_set[j].frames); - free(i->key_set[j].values); - } - free(i->key_set); - string_free(&i->name); - } +mot_key_set_data::~mot_key_set_data() { + +} + +mot_data::mot_data() : info(), frame_count(), bone_info_count(), +murmurhash(), div_frames(), div_count(), bone_info(), key_set() { + +} + +mot_data::~mot_data() { + +} + +mot_set::mot_set() : is_x() { + +} + +mot_set::~mot_set() { - string_free(&ms->name); - vector_old_mot_data_free(&ms->vec, 0); } static bool mot_classic_read_inner(mot_set* ms, stream* s) { @@ -419,7 +401,7 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { } io_set_position(s, 0x00, SEEK_SET); - vector_old_mot_data_reserve(&ms->vec, count); + ms->vec.resize(count); mot_header_classic* mh = force_malloc_s(mot_header_classic, count); for (size_t i = 0; i < count; i++) { mh[i].key_set_count_offset = io_read_uint32_t(s); @@ -429,7 +411,7 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { } for (size_t i = 0; i < count; i++) { - mot_data* m = vector_old_mot_data_reserve_back(&ms->vec); + mot_data* m = &ms->vec[i]; io_set_position(s, mh[i].bone_info_offset, SEEK_SET); m->bone_info_count = 0; @@ -439,7 +421,7 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { while (io_read_uint16_t(s) != 0 && io_get_position(s) < s->length); io_set_position(s, mh[i].bone_info_offset, SEEK_SET); - m->bone_info = force_malloc_s(mot_bone_info, m->bone_info_count); + m->bone_info.resize(m->bone_info_count); for (size_t j = 0; j < m->bone_info_count; j++) m->bone_info[j].index = io_read_uint16_t(s); @@ -447,7 +429,7 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { m->info = io_read_uint16_t(s); m->frame_count = io_read_uint16_t(s); - m->key_set = force_malloc_s(mot_key_set_data, m->key_set_count); + m->key_set.resize(m->key_set_count); io_set_position(s, mh[i].key_set_types_offset, SEEK_SET); for (int32_t j = 0, b = 0; j < m->key_set_count; j++) { if (j % 8 == 0) @@ -461,13 +443,13 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { mot_key_set_data* mks = &m->key_set[j]; if (mks->type == MOT_KEY_SET_NONE) { mks->keys_count = 0; - mks->frames = 0; - mks->values = 0; + mks->frames.resize(0); + mks->values.resize(0); } else if (mks->type == MOT_KEY_SET_STATIC) { mks->keys_count = 1; - mks->frames = 0; - mks->values = force_malloc_s(float_t, 1); + mks->frames.resize(0); + mks->values.resize(1); mks->values[0] = io_read_float_t(s); } else { @@ -475,15 +457,15 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { uint16_t keys_count = io_read_uint16_t(s); mks->keys_count = keys_count; - mks->frames = force_malloc_s(uint16_t, keys_count); - mks->values = force_malloc_s(float_t, has_tangents ? keys_count * 2ULL : keys_count); + mks->frames.resize(keys_count); + mks->values.resize(has_tangents ? keys_count * 2ULL : keys_count); - uint16_t* frames = mks->frames; + uint16_t* frames = mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) *frames++ = io_read_uint16_t(s); io_align_read(s, 0x04); - float_t* values = mks->values; + float_t* values = mks->values.data(); if (!has_tangents) for (int32_t k = 0; k < keys_count; k++) *values++ = io_read_float_t(s); @@ -502,11 +484,11 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { } static void mot_classic_write_inner(mot_set* ms, stream* s) { - size_t count = vector_old_length(ms->vec); + size_t count = ms->vec.size(); io_set_position(s, count * 0x10 + 0x10, SEEK_SET); mot_header_classic* mh = force_malloc_s(mot_header_classic, count); for (size_t i = 0; i < count; i++) { - mot_data* m = &ms->vec.begin[i]; + mot_data* m = &ms->vec[i]; mh[i].key_set_count_offset = (uint32_t)io_get_position(s); io_write_uint16_t(s, m->info); @@ -537,12 +519,12 @@ static void mot_classic_write_inner(mot_set* ms, stream* s) { uint16_t keys_count = mks->keys_count; io_write_uint16_t(s, keys_count); - uint16_t* frames = mks->frames; + uint16_t* frames = mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) io_write_uint16_t(s, *frames++); io_align_write(s, 0x04); - float_t* values = mks->values; + float_t* values = mks->values.data(); if (!has_tangents) for (int32_t k = 0; k < keys_count; k++) io_write_float_t(s, *values++); @@ -578,21 +560,21 @@ static void mot_classic_write_inner(mot_set* ms, stream* s) { static bool mot_modern_read_inner(mot_set* ms, stream* s) { bool ret = false; f2_struct st; - f2_struct_sread(&st, s); + f2_struct_read(&st, s); if (st.header.signature != reverse_endianness_uint32_t('MOTC') || !st.data) { f2_struct_free(&st); return false; } stream s_motc; - io_mopen(&s_motc, st.data, st.length); + io_open(&s_motc, st.data, st.length); s_motc.is_big_endian = st.header.use_big_endian; io_set_position(&s_motc, 0x0C, SEEK_SET); bool is_x = io_read_uint32_t_stream_reverse_endianness(&s_motc) == 0; io_set_position(&s_motc, 0x00, SEEK_SET); - vector_old_mot_data_reserve(&ms->vec, 1); + ms->vec.resize(1); mot_header_modern mh; memset(&mh, 0, sizeof(mot_header_modern)); if (!is_x) { @@ -616,7 +598,7 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { mh.bone_info_count = io_read_int32_t_stream_reverse_endianness(&s_motc); } - mot_data* m = vector_old_mot_data_reserve_back(&ms->vec); + mot_data* m = &ms->vec[0]; m->div_frames = io_read_uint16_t_stream_reverse_endianness(&s_motc);; m->div_count = io_read_uint8_t(&s_motc);; @@ -624,7 +606,7 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { io_set_position(&s_motc, mh.bone_info_offset, SEEK_SET); m->bone_info_count = mh.bone_info_count; - m->bone_info = force_malloc_s(mot_bone_info, m->bone_info_count); + m->bone_info.resize(m->bone_info_count); if (!is_x) for (size_t j = 0; j < mh.bone_info_count; j++) io_read_string_null_terminated_offset(&s_motc, @@ -642,7 +624,7 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { m->info = io_read_uint16_t_stream_reverse_endianness(&s_motc); m->frame_count = io_read_uint16_t_stream_reverse_endianness(&s_motc); - m->key_set = force_malloc_s(mot_key_set_data, m->key_set_count); + m->key_set.resize(m->key_set_count); io_set_position(&s_motc, mh.key_set_types_offset, SEEK_SET); for (int32_t j = 0, b = 0; j < m->key_set_count; j++) { if (j % 8 == 0) @@ -656,13 +638,13 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { mot_key_set_data* mks = &m->key_set[j]; if (mks->type == MOT_KEY_SET_NONE) { mks->keys_count = 0; - mks->frames_modern = 0; - mks->values = 0; + mks->frames.resize(0); + mks->values.resize(0); } else if (mks->type == MOT_KEY_SET_STATIC) { mks->keys_count = 1; - mks->frames_modern = 0; - mks->values = force_malloc_s(float_t, 1); + mks->frames.resize(0); + mks->values.resize(1); mks->values[0] = io_read_float_t_stream_reverse_endianness(&s_motc); } else { @@ -673,8 +655,8 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { mks->keys_count = keys_count; mks->data_type = data_type; - mks->frames_modern = force_malloc_s(int16_t, keys_count); - mks->values = force_malloc_s(float_t, has_tangents ? keys_count * 2ULL : keys_count); + mks->frames.resize(keys_count); + mks->values.resize(has_tangents ? keys_count * 2ULL : keys_count); uint8_t step = has_tangents ? 2 : 1; if (has_tangents) { @@ -683,7 +665,7 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { *values = io_read_float_t_stream_reverse_endianness(&s_motc); } - float_t* values = mks->values; + float_t* values = mks->values.data(); if (data_type == MOT_KEY_SET_DATA_F16) for (int32_t k = 0; k < keys_count; k++, values += step) *values = half_to_float(io_read_half_t_stream_reverse_endianness(&s_motc)); @@ -692,7 +674,7 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { *values = io_read_float_t_stream_reverse_endianness(&s_motc); io_align_read(&s_motc, 0x04); - int16_t* frames = mks->frames_modern; + int16_t* frames = (int16_t*)mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) *frames++ = io_read_int16_t_stream_reverse_endianness(&s_motc); io_align_read(&s_motc, 0x04); @@ -710,16 +692,16 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { static void mot_modern_write_inner(mot_set* ms, stream* s) { stream s_motc; - io_mopen(&s_motc, 0, 0); + io_open(&s_motc); uint32_t o; vector_old_enrs_entry e = vector_old_empty(enrs_entry); enrs_entry ee; vector_old_size_t pof = vector_old_empty(size_t); uint32_t murmurhash = 0; - if (vector_old_length(ms->vec) > 0) { + if (ms->vec.size() > 0) { mot_header_modern mh; memset(&mh, 0, sizeof(mot_header_modern)); - mot_data* m = ms->vec.begin; + mot_data* m = &ms->vec[0]; if (!ms->is_x) { ee = { 0, 3, 48, 1, vector_old_empty(enrs_sub_entry) }; @@ -838,7 +820,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { io_write_uint8_t(&s_motc, 0); io_align_write(&s_motc, 0x10); - mh.hash = hash_utf8_murmurhash(string_data(&m->name), 0, false); + mh.hash = hash_string_murmurhash(&m->name, 0, false); mh.key_set_count_offset = io_get_position(&s_motc); io_write_uint16_t(&s_motc, m->info); @@ -878,7 +860,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { io_write_float_t(&s_motc, *values); } - float_t* values = mks->values; + float_t* values = mks->values.data(); if (data_type == MOT_KEY_SET_DATA_F16) for (int32_t k = 0; k < keys_count; k++, values += step) io_write_half_t(&s_motc, float_to_half(*values)); @@ -887,7 +869,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { io_write_float_t(&s_motc, *values); io_align_write(&s_motc, 0x04); - int16_t* frames = mks->frames_modern; + int16_t* frames = (int16_t*)mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) io_write_int16_t(&s_motc, *frames++); io_align_write(&s_motc, 0x04); @@ -907,8 +889,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { mh.bone_hash_offset = io_get_position(&s_motc); for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_uint64_t(&s_motc, hash_utf8_murmurhash( - string_data(&m->bone_info[j].name), 0, false)); + io_write_uint64_t(&s_motc, hash_string_murmurhash(&m->bone_info[j].name, 0, false)); io_align_write(&s_motc, 0x10); mh.name_offset = io_get_position(&s_motc); @@ -968,7 +949,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { memset(&st, 0, sizeof(f2_struct)); io_align_write(&s_motc, 0x10); - io_mcopy(&s_motc, &st.data, &st.length); + io_copy(&s_motc, &st.data, &st.length); io_free(&s_motc); st.enrs = e; @@ -981,6 +962,6 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { st.header.murmurhash = murmurhash; st.header.inner_signature = 0xFF010008; - f2_struct_swrite(&st, s, true, ms->is_x); + f2_struct_write(&st, s, true, ms->is_x); f2_struct_free(&st); } diff --git a/src/KKdLib/mot.h b/src/KKdLib/mot.h index 028c16d2..5d2292d7 100644 --- a/src/KKdLib/mot.h +++ b/src/KKdLib/mot.h @@ -23,23 +23,29 @@ typedef enum mot_key_set_data_type { MOT_KEY_SET_DATA_F16 = 0x01, } mot_key_set_data_type; -typedef union mot_bone_info { - string name; +class mot_bone_info { +public: + std::string name; uint16_t index; -} mot_bone_info; -typedef struct mot_key_set_data { + mot_bone_info(); + ~mot_bone_info(); +}; + +class mot_key_set_data { +public: mot_key_set_type type; - union { - uint16_t* frames; - int16_t* frames_modern; - }; - float_t* values; + std::vector frames; + std::vector values; uint16_t keys_count : 16; mot_key_set_data_type data_type : 16; -} mot_key_set_data; -typedef struct mot_data { + mot_key_set_data(); + ~mot_key_set_data(); +}; + +class mot_data { +public: union { struct { uint16_t key_set_count : 14; @@ -54,36 +60,42 @@ typedef struct mot_data { uint32_t murmurhash; uint16_t div_frames; uint8_t div_count; - string name; - mot_bone_info* bone_info; - mot_key_set_data* key_set; -} mot_data; + std::string name; + std::vector bone_info; + std::vector key_set; -vector_old(mot_data) + mot_data(); + ~mot_data(); +}; -typedef struct mot_set { +class mot_set { +public: bool is_x; - string name; - vector_old_mot_data vec; -} mot_set; -vector_old(mot_set) + std::string name; + std::vector vec; -typedef struct mot_set_farc { + mot_set(); + ~mot_set(); +}; + +class mot_set_farc { +public: bool ready; bool modern; - vector_old_mot_set vec; -} mot_set_farc; -extern void mot_init(mot_set_farc* msf); -extern void mot_read(mot_set_farc* msf, char* path, bool modern); -extern void mot_wread(mot_set_farc* msf, wchar_t* path, bool modern); -extern void mot_mread(mot_set_farc* msf, void* data, size_t length, bool modern); -extern void mot_write(mot_set_farc* msf, char* path, farc_compress_mode mode); -extern void mot_wwrite(mot_set_farc* msf, wchar_t* path, farc_compress_mode mode); -extern void mot_mwrite(mot_set_farc* msf, void** data, size_t* length, farc_compress_mode mode); -extern bool mot_load_file(void* data, char* path, char* file, uint32_t hash); -extern void mot_free(mot_set_farc* msf); + std::vector vec; -extern void mot_set_init(mot_set* ms); -extern void mot_set_free(mot_set* ms); + mot_set_farc(); + ~mot_set_farc(); + + void read(const char* path, bool modern); + void read(const wchar_t* path, bool modern); + void read(const void* data, size_t length, bool modern); + void write(const char* path, farc_compress_mode mode); + void write(const wchar_t* path, farc_compress_mode mode); + void write(void** data, size_t* length, farc_compress_mode mode); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); + +}; diff --git a/src/KKdLib/obj.c b/src/KKdLib/obj.c index 3a9078ff..674192c8 100644 --- a/src/KKdLib/obj.c +++ b/src/KKdLib/obj.c @@ -115,8 +115,8 @@ static bool obj_material_texture_enrs_table_initialized; static void obj_material_texture_enrs_table_init(); static void obj_material_texture_enrs_table_free(void); -static void obj_classic_read_inner(obj_set* os, stream* s); -static void obj_classic_write_inner(obj_set* os, stream* s); +static void obj_set_classic_read_inner(obj_set* os, stream* s); +static void obj_set_classic_write_inner(obj_set* os, stream* s); static void obj_classic_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); static void obj_classic_write_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset); @@ -170,8 +170,8 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets ssize_t base_offset, int32_t vertex_count, obj_vertex_attrib_type attrib_type); static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, ssize_t base_offset, int32_t* vertex_count, obj_vertex_attrib_type* attrib_type, int32_t* vertex_size); -static void obj_modern_read_inner(obj_set* os, stream* s); -static void obj_modern_write_inner(obj_set* os, stream* s); +static void obj_set_modern_read_inner(obj_set* os, stream* s); +static void obj_set_modern_write_inner(obj_set* os, stream* s); static void obj_modern_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); static void obj_modern_write_index(obj* obj, stream* s, bool is_x, @@ -246,152 +246,14 @@ static void obj_skin_strings_push_back_check(vector_old_string* vec, char* str); static void obj_skin_strings_push_back_check(vector_old_string* vec, const char* str); static void obj_skin_strings_push_back_check_by_index(vector_old_string* vec, char** strings, uint32_t index); -void obj_init(obj_set* os) { - if (!os) - return; +obj_set::obj_set() : ready(), modern(), is_x(), objects(), +objects_count(), texture_ids(), texture_ids_count() { - memset(os, 0, sizeof(obj_set)); } -void obj_read(obj_set* os, char* path, bool modern) { - if (!os || !path) - return; - - if (!modern) { - char* path_bin = str_utils_add(path, ".bin"); - if (path_check_file_exists(path_bin)) { - stream s; - io_open(&s, path_bin, "rb"); - if (s.io.stream) - obj_classic_read_inner(os, &s); - io_free(&s); - } - free(path_bin); - } - else { - char* path_osd = str_utils_add(path, ".osd"); - if (path_check_file_exists(path_osd)) { - stream s; - io_open(&s, path_osd, "rb"); - if (s.io.stream) - obj_modern_read_inner(os, &s); - io_free(&s); - } - free(path_osd); - } -} - -void obj_wread(obj_set* os, wchar_t* path, bool modern) { - if (!os || !path) - return; - - if (!modern) { - wchar_t* path_bin = str_utils_wadd(path, L".bin"); - if (path_wcheck_file_exists(path_bin)) { - stream s; - io_wopen(&s, path_bin, L"rb"); - if (s.io.stream) - obj_classic_read_inner(os, &s); - io_free(&s); - } - free(path_bin); - } - else { - wchar_t* path_osd = str_utils_wadd(path, L".osd"); - if (path_wcheck_file_exists(path_osd)) { - stream s; - io_wopen(&s, path_osd, L"rb"); - if (s.io.stream) - obj_modern_read_inner(os, &s); - io_free(&s); - } - free(path_osd); - } -} - -void obj_mread(obj_set* os, void* data, size_t length, bool modern) { - if (!os || !data || !length) - return; - - stream s; - io_mopen(&s, data, length); - if (!modern) - obj_classic_read_inner(os, &s); - else - obj_modern_read_inner(os, &s); - io_free(&s); -} - -void obj_write(obj_set* os, char* path) { - if (!os || !path || !os->ready) - return; - - if (!os->modern) { - char* path_bin = str_utils_add(path, ".bin"); - stream s; - io_open(&s, path_bin, "wb"); - if (s.io.stream) - obj_classic_write_inner(os, &s); - io_free(&s); - free(path_bin); - } - else { - char* path_osd = str_utils_add(path, ".osd"); - stream s; - io_open(&s, path_osd, "wb"); - if (s.io.stream) - obj_modern_write_inner(os, &s); - io_free(&s); - free(path_osd); - } -} - -void obj_wwrite(obj_set* os, wchar_t* path) { - if (!os || !path || !os->ready) - return; - - if (!os->modern) { - wchar_t* path_bin = str_utils_wadd(path, L".bin"); - stream s; - io_wopen(&s, path_bin, L"wb"); - if (s.io.stream) - obj_classic_write_inner(os, &s); - io_free(&s); - free(path_bin); - } - else { - wchar_t* path_osd = str_utils_wadd(path, L".osd"); - stream s; - io_wopen(&s, path_osd, L"wb"); - if (s.io.stream) - obj_modern_write_inner(os, &s); - io_free(&s); - free(path_osd); - } -} - -void obj_mwrite(obj_set* os, void** data, size_t* length) { - if (!os || !data || !os->ready) - return; - - stream s; - io_mopen(&s, 0, 0); - if (!os->modern) - obj_classic_write_inner(os, &s); - else - obj_modern_write_inner(os, &s); - io_align_write(&s, 0x10); - io_mcopy(&s, data, length); - io_free(&s); -} - -void obj_free(obj_set* os) { - if (!os) - return; - - bool is_x = os->is_x; - for (int32_t i = 0; i < os->objects_count; i++) { - obj* obj = &os->objects[i]; +obj_set::~obj_set() { + for (int32_t i = 0; i < objects_count; i++) { + obj* obj = &objects[i]; for (int32_t j = 0; j < obj->skin.bones_count; j++) string_free(&obj->skin.bones[j].name); free(obj->skin.bones); @@ -479,16 +341,42 @@ void obj_free(obj_set* os) { obj->materials_count = 0; string_free(&obj->name); } - free(os->objects); - os->objects_count = 0; - free(os->texture_ids); - os->texture_ids_count = 0; + free(objects); + free(texture_ids); +} + +void obj_set::pack_file(void** data, size_t* length) { + if (!data || !ready) + return; + + stream s; + io_open(&s); + if (!modern) + obj_set_classic_write_inner(this, &s); + else + obj_set_modern_write_inner(this, &s); + io_align_write(&s, 0x10); + io_copy(&s, data, length); + io_free(&s); +} + +void obj_set::unpack_file(void* data, size_t length, bool modern) { + if (!data || !length) + return; + + stream s; + io_open(&s, data, length); + if (!modern) + obj_set_classic_read_inner(this, &s); + else + obj_set_modern_read_inner(this, &s); + io_free(&s); } static void obj_material_texture_enrs_table_init() { if (!obj_material_texture_enrs_table_initialized) { stream s; - io_mopen(&s, (void*)&obj_material_texture_enrs_table_bin, + io_open(&s, (void*)&obj_material_texture_enrs_table_bin, sizeof(obj_material_texture_enrs_table_bin)); enrs_read(&s, &obj_material_texture_enrs_table); io_free(&s); @@ -502,7 +390,7 @@ static void obj_material_texture_enrs_table_free(void) { obj_material_texture_enrs_table_initialized = false; } -static void obj_classic_read_inner(obj_set* os, stream* s) { +static void obj_set_classic_read_inner(obj_set* os, stream* s) { uint32_t signature = io_read_uint32_t(s); if (signature != 0x5062500) { os->is_x = false; @@ -584,7 +472,7 @@ static void obj_classic_read_inner(obj_set* os, stream* s) { } -static void obj_classic_write_inner(obj_set* os, stream* s) { +static void obj_set_classic_write_inner(obj_set* os, stream* s) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -1228,7 +1116,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { osis[i].name_index = io_read_uint32_t(s); osis[i].sibling_name_index = io_read_uint32_t(s); - osis[i].distance = io_read_float_t(s); + osis[i].max_distance = io_read_float_t(s); } io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); @@ -1892,7 +1780,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { obj_skin_osage_sibling_info* osage_sibling_info = &ex->osage_sibling_infos[i]; io_write_uint32_t(s, osage_sibling_info->name_index); io_write_uint32_t(s, osage_sibling_info->sibling_name_index); - io_write_float_t(s, osage_sibling_info->distance); + io_write_float_t(s, osage_sibling_info->max_distance); } io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -2571,10 +2459,11 @@ static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, b->nodes = 0; - if (!b->nodes_count || !offset) + if (!b->count || !offset) return; - b->nodes = force_malloc_s(obj_skin_osage_node, b->nodes_count); + b->nodes_count = b->count; + b->nodes = force_malloc_s(obj_skin_osage_node, b->count); io_position_push(s, offset, SEEK_SET); if (io_read_uint32_t(s)) { @@ -2959,12 +2848,12 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset } } -static void obj_modern_read_inner(obj_set* os, stream* s) { +static void obj_set_modern_read_inner(obj_set* os, stream* s) { f2_struct st; - f2_struct_sread(&st, s); + f2_struct_read(&st, s); if (st.header.signature == reverse_endianness_uint32_t('MOSD') && st.data) { stream s_mosd; - io_mopen(&s_mosd, st.data, st.length); + io_open(&s_mosd, st.data, st.length); s_mosd.is_big_endian = st.header.use_big_endian; uint32_t signature = io_read_uint32_t_stream_reverse_endianness(&s_mosd); @@ -3098,26 +2987,26 @@ static void obj_modern_read_inner(obj_set* os, stream* s) { stream* s_oidx_ptr = 0; stream* s_ovtx_ptr = 0; if (oskn) { - io_mopen(&s_oskn, oskn->data, oskn->length); + io_open(&s_oskn, oskn->data, oskn->length); s_oskn.is_big_endian = oskn->header.use_big_endian; s_oskn_ptr = &s_oskn; } if (oidx) { - io_mopen(&s_oidx, oidx->data, oidx->length); + io_open(&s_oidx, oidx->data, oidx->length); s_oidx.is_big_endian = oidx->header.use_big_endian; s_oidx_ptr = &s_oidx; } if (ovtx) { - io_mopen(&s_ovtx, ovtx->data, ovtx->length); + io_open(&s_ovtx, ovtx->data, ovtx->length); s_ovtx.is_big_endian = ovtx->header.use_big_endian; s_ovtx_ptr = &s_ovtx; } obj* obj = &os->objects[omdl_index]; stream s_omdl; - io_mopen(&s_omdl, i->data, i->length); + io_open(&s_omdl, i->data, i->length); s_omdl.is_big_endian = i->header.use_big_endian; obj_modern_read_model(obj, &s_omdl, 0, i->header.length, is_x, s_oidx_ptr, s_ovtx_ptr); io_free(&s_omdl); @@ -3143,9 +3032,9 @@ static void obj_modern_read_inner(obj_set* os, stream* s) { f2_struct_free(&st); } -static void obj_modern_write_inner(obj_set* os, stream* s) { +static void obj_set_modern_write_inner(obj_set* os, stream* s) { stream s_mosd; - io_mopen(&s_mosd, 0, 0); + io_open(&s_mosd); uint32_t off; vector_old_enrs_entry e = vector_old_empty(enrs_entry); enrs_entry ee; @@ -3332,18 +3221,18 @@ static void obj_modern_write_inner(obj_set* os, stream* s) { f2_struct* omdl = vector_old_f2_struct_reserve_back(&st.sub_structs); stream s_omdl; - io_mopen(&s_omdl, 0, 0); + io_open(&s_omdl); if (obj->skin_init) { f2_struct* oskn = vector_old_f2_struct_reserve_back(&st.sub_structs); stream s_oskn; - io_mopen(&s_oskn, 0, 0); + io_open(&s_oskn); obj_modern_write_skin(obj, &s_oskn, 0, is_x, oskn); io_align_write(&s_oskn, 0x10); - io_mcopy(&s_oskn, &oskn->data, &oskn->length); + io_copy(&s_oskn, &oskn->data, &oskn->length); io_free(&s_oskn); oskn->header.signature = reverse_endianness_uint32_t('OSKN'); @@ -3355,7 +3244,7 @@ static void obj_modern_write_inner(obj_set* os, stream* s) { obj_modern_write_model(obj, &s_omdl, 0, is_x, omdl); io_align_write(&s_omdl, 0x10); - io_mcopy(&s_omdl, &omdl->data, &omdl->length); + io_copy(&s_omdl, &omdl->data, &omdl->length); io_free(&s_omdl); omdl->header.signature = reverse_endianness_uint32_t('OMDL'); @@ -3365,7 +3254,7 @@ static void obj_modern_write_inner(obj_set* os, stream* s) { } io_align_write(&s_mosd, 0x10); - io_mcopy(&s_mosd, &st.data, &st.length); + io_copy(&s_mosd, &st.data, &st.length); io_free(&s_mosd); st.enrs = e; @@ -3376,7 +3265,7 @@ static void obj_modern_write_inner(obj_set* os, stream* s) { st.header.use_big_endian = false; st.header.use_section_size = true; - f2_struct_swrite(&st, s, true, os->is_x); + f2_struct_write(&st, s, true, os->is_x); f2_struct_free(&st); } @@ -3610,8 +3499,8 @@ static void obj_modern_write_model(obj* obj, stream* s, stream s_oidx; stream s_ovtx; - io_mopen(&s_oidx, 0, 0); - io_mopen(&s_ovtx, 0, 0); + io_open(&s_oidx); + io_open(&s_ovtx); uint32_t off; vector_old_enrs_entry e = vector_old_empty(enrs_entry); @@ -3998,7 +3887,7 @@ static void obj_modern_write_model(obj* obj, stream* s, omdl->pof = pof; io_align_write(&s_oidx, 0x10); - io_mcopy(&s_oidx, &oidx->data, &oidx->length); + io_copy(&s_oidx, &oidx->data, &oidx->length); io_free(&s_oidx); oidx->header.signature = reverse_endianness_uint32_t('OIDX'); @@ -4007,7 +3896,7 @@ static void obj_modern_write_model(obj* obj, stream* s, oidx->header.use_section_size = true; io_align_write(&s_ovtx, 0x10); - io_mcopy(&s_ovtx, &ovtx->data, &ovtx->length); + io_copy(&s_ovtx, &ovtx->data, &ovtx->length); io_free(&s_ovtx); ovtx->header.signature = reverse_endianness_uint32_t('OVTX'); @@ -4297,7 +4186,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { osis[i].name_index = io_read_uint32_t_stream_reverse_endianness(s); osis[i].sibling_name_index = io_read_uint32_t_stream_reverse_endianness(s); - osis[i].distance = io_read_float_t_stream_reverse_endianness(s); + osis[i].max_distance = io_read_float_t_stream_reverse_endianness(s); } io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); @@ -5633,7 +5522,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_osage_sibling_info* osage_sibling_info = &ex->osage_sibling_infos[i]; io_write_uint32_t(s, osage_sibling_info->name_index); io_write_uint32_t(s, osage_sibling_info->sibling_name_index); - io_write_float_t(s, osage_sibling_info->distance); + io_write_float_t(s, osage_sibling_info->max_distance); } io_write_int32_t(s, 0); io_write_int32_t(s, 0); diff --git a/src/KKdLib/obj.h b/src/KKdLib/obj.h index 24955139..eca67578 100644 --- a/src/KKdLib/obj.h +++ b/src/KKdLib/obj.h @@ -488,7 +488,7 @@ typedef struct obj_skin_block { typedef struct obj_skin_osage_sibling_info { uint32_t name_index; uint32_t sibling_name_index; - float_t distance; + float_t max_distance; } obj_skin_osage_sibling_info; typedef struct obj_skin_ex_data { @@ -530,7 +530,8 @@ typedef struct obj { uint32_t id; } obj; -typedef struct obj_set { +class obj_set { +public: bool ready; bool modern; bool is_x; @@ -539,13 +540,10 @@ typedef struct obj_set { int32_t objects_count; uint32_t* texture_ids; int32_t texture_ids_count; -} obj_set; -extern void obj_init(obj_set* os); -extern void obj_read(obj_set* os, char* path, bool modern); -extern void obj_wread(obj_set* os, wchar_t* path, bool modern); -extern void obj_mread(obj_set* os, void* data, size_t length, bool modern); -extern void obj_write(obj_set* os, char* path); -extern void obj_wwrite(obj_set* os, wchar_t* path); -extern void obj_mwrite(obj_set* os, void** data, size_t* length); -extern void obj_free(obj_set* os); + obj_set(); + ~obj_set(); + + void pack_file(void** data, size_t* length); + void unpack_file(void* data, size_t length, bool modern); +}; diff --git a/src/KKdLib/pvpp.c b/src/KKdLib/pvpp.c index d17ff115..192bb293 100644 --- a/src/KKdLib/pvpp.c +++ b/src/KKdLib/pvpp.c @@ -24,7 +24,11 @@ pvpp::pvpp() : ready() { } -void pvpp::read(char* path) { +pvpp::~pvpp() { + +} + +void pvpp::read(const char* path) { if (!path) return; @@ -39,14 +43,14 @@ void pvpp::read(char* path) { free(path_pvpp); } -void pvpp::read(wchar_t* path) { +void pvpp::read(const wchar_t* path) { if (!path) return; wchar_t* path_pvpp = str_utils_wadd(path, L".pvpp"); - if (path_wcheck_file_exists(path_pvpp)) { + if (path_check_file_exists(path_pvpp)) { stream s; - io_wopen(&s, path_pvpp, L"rb"); + io_open(&s, path_pvpp, L"rb"); if (s.io.stream) pvpp_read_inner(this, &s); io_free(&s); @@ -54,24 +58,20 @@ void pvpp::read(wchar_t* path) { free(path_pvpp); } -void pvpp::read(void* data, size_t length) { +void pvpp::read(const void* data, size_t length) { if (!data || !length) return; stream s; - io_mopen(&s, data, length); + io_open(&s, data, length); pvpp_read_inner(this, &s); io_free(&s); } -pvpp::~pvpp() { - -} - -bool pvpp_load_file(void* data, char* path, char* file, uint32_t hash) { +bool pvpp::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -298,10 +298,10 @@ static void pvpp_motion_read(pvpp_motion* mot, stream* s) { static void pvpp_read_inner(pvpp* pp, stream* s) { f2_struct st; - f2_struct_sread(&st, s); + f2_struct_read(&st, s); if (st.header.signature == reverse_endianness_uint32_t('PVPP') && st.data) { stream s_pvpp; - io_mopen(&s_pvpp, st.data, st.length); + io_open(&s_pvpp, st.data, st.length); s_pvpp.is_big_endian = st.header.use_big_endian; io_read_uint32_t_stream_reverse_endianness(&s_pvpp); diff --git a/src/KKdLib/pvpp.h b/src/KKdLib/pvpp.h index 0458a57b..2d3f0dad 100644 --- a/src/KKdLib/pvpp.h +++ b/src/KKdLib/pvpp.h @@ -118,10 +118,12 @@ public: std::vector effect; pvpp(); - void read(char* path); - void read(wchar_t* path); - void read(void* data, size_t length); - virtual ~pvpp(); + ~pvpp(); + + void read(const char* path); + void read(const wchar_t* path); + void read(const void* data, size_t length); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; -extern bool pvpp_load_file(void* data, char* path, char* file, uint32_t hash); diff --git a/src/KKdLib/pvsr.c b/src/KKdLib/pvsr.c index 9fce29e2..00f421b3 100644 --- a/src/KKdLib/pvsr.c +++ b/src/KKdLib/pvsr.c @@ -30,7 +30,7 @@ void pvsr_init(pvsr* sr) { memset(sr, 0, sizeof(pvsr)); } -void pvsr_read(pvsr* sr, char* path) { +void pvsr_read(pvsr* sr, const char* path) { if (!sr || !path) return; @@ -45,14 +45,14 @@ void pvsr_read(pvsr* sr, char* path) { free(path_pvsr); } -void pvsr_wread(pvsr* sr, wchar_t* path) { +void pvsr_wread(pvsr* sr, const wchar_t* path) { if (!sr || !path) return; wchar_t* path_pvsr = str_utils_wadd(path, L".pvsr"); - if (path_wcheck_file_exists(path_pvsr)) { + if (path_check_file_exists(path_pvsr)) { stream s; - io_wopen(&s, path_pvsr, L"rb"); + io_open(&s, path_pvsr, L"rb"); if (s.io.stream) pvsr_read_inner(sr, &s); io_free(&s); @@ -60,10 +60,10 @@ void pvsr_wread(pvsr* sr, wchar_t* path) { free(path_pvsr); } -bool pvsr_load_file(void* data, char* path, char* file, uint32_t hash) { +bool pvsr_load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); - char* t = strrchr(file, '.'); + const char* t = strrchr(file, '.'); if (t) file_len = t - file; @@ -310,10 +310,10 @@ static void pvsr_glitter_read(pvsr_glitter* glt, stream* s) { static void pvsr_read_inner(pvsr* sr, stream* s) { f2_struct st; - f2_struct_sread(&st, s); + f2_struct_read(&st, s); if (st.header.signature == reverse_endianness_uint32_t('PVSR') && st.data) { stream s_pvsr; - io_mopen(&s_pvsr, st.data, st.length); + io_open(&s_pvsr, st.data, st.length); s_pvsr.is_big_endian = st.header.use_big_endian; int32_t x00 = io_read_int32_t_stream_reverse_endianness(&s_pvsr); diff --git a/src/KKdLib/pvsr.h b/src/KKdLib/pvsr.h index b59f0b5a..6d7687b9 100644 --- a/src/KKdLib/pvsr.h +++ b/src/KKdLib/pvsr.h @@ -107,9 +107,9 @@ typedef struct pvsr { } pvsr; extern void pvsr_init(pvsr* sr); -extern void pvsr_read(pvsr* sr, char* path); -extern void pvsr_wread(pvsr* sr, wchar_t* path); -extern bool pvsr_load_file(void* data, char* path, char* file, uint32_t hash); +extern void pvsr_read(pvsr* sr, const char* path); +extern void pvsr_wread(pvsr* sr, const wchar_t* path); +extern bool pvsr_load_file(void* data, const char* path, const char* file, uint32_t hash); extern void pvsr_free(pvsr* sr); extern void pvsr_a3da_init(pvsr_a3da* a3d); diff --git a/src/KKdLib/sound/diva.c b/src/KKdLib/sound/diva.c index 4f03042b..fffdf078 100644 --- a/src/KKdLib/sound/diva.c +++ b/src/KKdLib/sound/diva.c @@ -46,7 +46,7 @@ void diva_read(diva* d, char* path) { void diva_wread(diva* d, wchar_t* path) { wchar_t* path_diva = str_utils_wadd(path, L".diva"); stream s; - io_wopen(&s, path_diva, L"rb"); + io_open(&s, path_diva, L"rb"); if (s.io.stream) { uint32_t signature = io_read_uint32_t_reverse_endianness(&s, true); if (signature != 'DIVA') @@ -109,7 +109,7 @@ void diva_wwrite(diva* d, wchar_t* path) { wchar_t* path_diva = str_utils_wadd(path, L".diva"); stream s; - io_wopen(&s, path_diva, L"wb"); + io_open(&s, path_diva, L"wb"); if (s.io.stream) { io_write_uint32_t_reverse_endianness(&s, 'DIVA', true); io_write_uint32_t(&s, 0); @@ -164,26 +164,26 @@ void diva_dispose(diva* d) { static void diva_read_wav(diva* d, wchar_t* path, float_t** data) { *data = 0; size_t samples = 0; - wchar_t* path_wav = str_utils_wadd(path, L".wav"); + wchar_t* path_av = str_utils_wadd(path, L".wav"); wav* w = wav_init(); - wav_wread(w, path_wav, data, &samples); + wav_wread(w, path_av, data, &samples); d->channels = w->channels; d->sample_rate = w->sample_rate; d->samples_count = (uint32_t)samples; wav_dispose(w); - free(path_wav); + free(path_av); } static void diva_write_wav(diva* d, wchar_t* path, float_t* data) { - wchar_t* path_wav = str_utils_wadd(path, L".wav"); + wchar_t* path_av = str_utils_wadd(path, L".wav"); wav* w = wav_init(); w->bytes = 4; w->channels = d->channels; w->format = 0x03; w->sample_rate = d->sample_rate; - wav_wwrite(w, path_wav, data, d->samples_count); + wav_wwrite(w, path_av, data, d->samples_count); wav_dispose(w); - free(path_wav); + free(path_av); } static void ima_decode(uint8_t value, int32_t* current, int32_t* current_clamp, int8_t* step_index) { diff --git a/src/KKdLib/sound/vag.c b/src/KKdLib/sound/vag.c index cc532435..601673bf 100644 --- a/src/KKdLib/sound/vag.c +++ b/src/KKdLib/sound/vag.c @@ -118,7 +118,7 @@ void vag_read(vag* v, char* path) { void vag_wread(vag* v, wchar_t* path) { wchar_t* path_vag = str_utils_wadd(path, L".vag"); stream s; - io_wopen(&s, path_vag, L"rb"); + io_open(&s, path_vag, L"rb"); if (s.io.stream) { uint32_t signature = io_read_uint32_t_reverse_endianness(&s, true); if (signature != 'VAGp') @@ -227,7 +227,7 @@ void vag_wwrite(vag* v, wchar_t* path, vag_option option) { wchar_t* temp_path = str_utils_wget_without_extension(path); wchar_t* path_vag = str_utils_wadd(temp_path, L".vag"); stream s; - io_wopen(&s, path_vag, L"wb"); + io_open(&s, path_vag, L"wb"); if (s.io.stream) { int32_t coef_index_count; switch (option) { @@ -384,13 +384,13 @@ void vag_dispose(vag* v) { static void vag_read_wav_straight(vag* v, wchar_t* path, float_t** data, size_t* samples) { *data = 0; *samples = 0; - wchar_t* path_wav = str_utils_wadd(path, L".wav"); + wchar_t* path_av = str_utils_wadd(path, L".wav"); wav* w = wav_init(); - wav_wread(w, path_wav, data, samples); + wav_wread(w, path_av, data, samples); v->channels = w->channels; v->sample_rate = w->sample_rate; wav_dispose(w); - free(path_wav); + free(path_av); } static void vag_read_wav(vag* v, wchar_t* path, float_t** data, size_t* samples, uint8_t** flags) { @@ -412,11 +412,11 @@ static void vag_read_wav(vag* v, wchar_t* path, float_t** data, size_t* samples, loop = vector_old_empty(bool); while (true) { swprintf_s(temp, MAX_PATH, L"%ls.%llu.wav", temp_path, count); - n = path_wcheck_file_exists(temp); + n = path_check_file_exists(temp); l = false; if (!n) { swprintf_s(temp, MAX_PATH, L"%ls.%llu.loop.wav", temp_path, count); - l = path_wcheck_file_exists(temp); + l = path_check_file_exists(temp); } if (!n && !l) break; @@ -546,15 +546,15 @@ static void vag_write_wav_straight(vag* v, wchar_t* path, float_t* data, size_t break; } - wchar_t* path_wav = str_utils_wadd(path, L".wav"); + wchar_t* path_av = str_utils_wadd(path, L".wav"); wav* w = wav_init(); w->bytes = 4; w->channels = v->channels; w->format = 0x03; w->sample_rate = v->sample_rate; - wav_wwrite(w, path_wav, data, i * BLOCK_SIZE); + wav_wwrite(w, path_av, data, i * BLOCK_SIZE); wav_dispose(w); - free(path_wav); + free(path_av); } static void vag_write_wav(vag* v, wchar_t* path, float_t* data, size_t num_blocks, uint8_t* flags) { diff --git a/src/KKdLib/sound/wav.c b/src/KKdLib/sound/wav.c index 6cb974af..2161a617 100644 --- a/src/KKdLib/sound/wav.c +++ b/src/KKdLib/sound/wav.c @@ -23,7 +23,7 @@ void wav_wread(wav* w, wchar_t* path, float_t** data, size_t* samples) { memset(w, 0, sizeof(wav)); stream s; - io_wopen(&s, path, L"rb"); + io_open(&s, path, L"rb"); if (s.io.stream) { wav w_t; if (io_read_uint32_t(&s) != 0x46464952) @@ -127,7 +127,7 @@ void wav_write(wav* w, char* path, float_t* data, size_t samples) { void wav_wwrite(wav* w, wchar_t* path, float_t* data, size_t samples) { stream s; - io_wopen(&s, path, L"wb"); + io_open(&s, path, L"wb"); if (s.io.stream && data) { w->size = (int32_t)(samples * w->channels * w->bytes); diff --git a/src/KKdLib/string.c b/src/KKdLib/string.c index 9ace1dbb..b6e79cd1 100644 --- a/src/KKdLib/string.c +++ b/src/KKdLib/string.c @@ -72,6 +72,10 @@ inline char* string_data(string* s) { return s->capacity > STRING_NULL_LENGTH ? s->ptr : s->data; } +inline const char* string_data(const string* s) { + return s->capacity > STRING_NULL_LENGTH ? s->ptr : s->data; +} + inline void string_add(string* s, char* str) { if (!s || !str) return; diff --git a/src/KKdLib/string.h b/src/KKdLib/string.h index accd48a5..37786ee1 100644 --- a/src/KKdLib/string.h +++ b/src/KKdLib/string.h @@ -46,6 +46,7 @@ extern void string_init_length(string* s, ssize_t length); extern void string_init_length(string* s, char* str, ssize_t length); extern void string_init_length(string* s, const char* str, ssize_t length); extern char* string_data(string* s); +extern const char* string_data(const string* s); extern void string_add(string* s, char* str); extern void string_add(string* s, const char* str); extern void string_add_length(string* s, char* str, ssize_t length); diff --git a/src/KKdLib/txp.c b/src/KKdLib/txp.c index 94523b1d..4807f095 100644 --- a/src/KKdLib/txp.c +++ b/src/KKdLib/txp.c @@ -7,40 +7,23 @@ #include "f2/struct.h" #include "io/stream.h" -vector_old_func(txp_mipmap) -vector_old_func(txp) +txp_mipmap::txp_mipmap() : width(), height(), format(), size() { -void txp_init(txp* t) { - memset(t, 0, sizeof(txp)); } -void txp_copy(txp* src, txp* dst) { - memset(dst, 0, sizeof(txp)); - dst->has_cube_map = src->has_cube_map; - dst->array_size = src->array_size; - dst->mipmaps_count = src->mipmaps_count; - dst->data = vector_old_empty(txp_mipmap); - vector_old_txp_mipmap_reserve(&dst->data, vector_old_length(src->data)); - txp_mipmap* tex_mipmap = src->data.begin; - for (size_t j = 0; j < src->array_size; j++) { - for (size_t k = 0; k < src->mipmaps_count; k++, tex_mipmap++) { - txp_mipmap t_mip; - t_mip.width = tex_mipmap->width; - t_mip.height = tex_mipmap->height; - t_mip.format = tex_mipmap->format; - t_mip.size = tex_mipmap->size; +txp_mipmap::~txp_mipmap() { - ssize_t size = txp_get_size(t_mip.format, t_mip.width, t_mip.height); - t_mip.data = force_malloc(max(size, t_mip.size)); - memcpy(t_mip.data, tex_mipmap->data, t_mip.size); - size -= t_mip.size; - if (size > 0) - memset((void*)((size_t)t_mip.data + t_mip.size), 0, size); - } - } } -uint32_t txp_get_size(txp_format format, uint32_t width, uint32_t height) { +txp::txp() : has_cube_map(), array_size(), mipmaps_count() { + +} + +txp::~txp() { + +} + +uint32_t txp::get_size(txp_format format, uint32_t width, uint32_t height) { uint32_t size = width * height; switch (format) { case TXP_A8: @@ -87,48 +70,43 @@ uint32_t txp_get_size(txp_format format, uint32_t width, uint32_t height) { return 0; } -void txp_free(txp* t) { - if (!t) - return; +txp_set::txp_set() : ready() { - for (txp_mipmap* i = t->data.begin; i != t->data.end; i++) - free(i->data); - vector_old_txp_mipmap_free(&t->data, 0); } -void txp_set_init(txp_set* ts) { - *ts = vector_old_empty(txp); +txp_set::~txp_set() { + } -bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian) { +bool txp_set::pack_file(void** data, size_t* length, bool big_endian) { size_t l; txp* tex; txp_mipmap* tex_mipmap; - if (!ts || !data) + if (!data) return false; *data = 0; *length = 0; - size_t count = vector_old_length(*ts); + size_t count = textures.size(); if (count < 1) return false; size_t* txp4_offset = force_malloc_s(size_t, count); size_t** txp2_offset = force_malloc_s(size_t*, count); - tex = ts->begin; + tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) txp2_offset[i] = force_malloc_s(size_t, (size_t)tex->mipmaps_count * tex->array_size); l = 12 + count * 4; - tex = ts->begin; + tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) { txp4_offset[i] = l; l += 12 + (size_t)tex->array_size * tex->mipmaps_count * 4; - tex_mipmap = tex->data.begin; + tex_mipmap = tex->mipmaps.data(); for (size_t j = 0; j < tex->array_size; j++) { for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { txp2_offset[i][j * tex->mipmaps_count + k] = l; @@ -139,7 +117,7 @@ bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian } stream s; - io_mopen(&s, 0, l); + io_open(&s, 0, l); s.is_big_endian = big_endian; io_write_uint32_t_stream_reverse_endianness(&s, 0x03505854); io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)count); @@ -147,7 +125,7 @@ bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian for (size_t i = 0; i < count; i++) io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)txp4_offset[i]); - tex = ts->begin; + tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) { io_set_position(&s, txp4_offset[i], SEEK_SET); io_write_uint32_t_stream_reverse_endianness(&s, tex->array_size > 1 ? 0x05505854 : 0x04505854); @@ -159,7 +137,7 @@ bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)(txp2_offset[i][j * tex->mipmaps_count + k] - txp4_offset[i])); - tex_mipmap = tex->data.begin; + tex_mipmap = tex->mipmaps.data(); for (size_t j = 0; j < tex->array_size; j++) for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { io_set_position(&s, txp2_offset[i][j * tex->mipmaps_count + k], SEEK_SET); @@ -169,14 +147,14 @@ bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->format); io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)(j * tex->mipmaps_count + k)); io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->size); - io_write(&s, tex_mipmap->data, tex_mipmap->size); + io_write(&s, tex_mipmap->data.data(), tex_mipmap->size); io_align_write(&s, 0x04); } } io_set_position(&s, 0, SEEK_END); io_align_write(&s, 0x10); - io_mcopy(&s, data, length); + io_copy(&s, data, length); io_free(&s); for (size_t i = 0; i < count; i++) @@ -186,39 +164,39 @@ bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian return true; } -bool txp_set_pack_file_modern(txp_set* ts, void** data, size_t* length, bool big_endian) { +bool txp_set::pack_file_modern(void** data, size_t* length, bool big_endian) { f2_struct st; memset(&st, 0, sizeof(f2_struct)); - if (!txp_set_pack_file(ts, &st.data, &st.length, big_endian)) { + if (!pack_file(&st.data, &st.length, big_endian)) { *data = 0; *length = 0; return false; } - txp_set_produce_enrs(ts, &st.enrs); + produce_enrs(&st.enrs); st.header.signature = reverse_endianness_uint32_t('MTXD'); st.header.length = 0x20; st.header.use_big_endian = big_endian; st.header.use_section_size = true; - f2_struct_mwrite(&st, data, length, true, false); + f2_struct_write(&st, data, length, true, false); f2_struct_free(&st); return true; } -bool txp_set_produce_enrs(txp_set* ts, vector_old_enrs_entry* enrs) { +bool txp_set::produce_enrs(vector_old_enrs_entry* enrs) { size_t l; txp* tex; txp_mipmap* tex_mipmap; - if (!ts || !enrs) + if (!enrs) return false; *enrs = vector_old_empty(enrs_entry); l = 0; - size_t count = vector_old_length(*ts); + size_t count = textures.size(); if (count < 1) return false; @@ -236,7 +214,7 @@ bool txp_set_produce_enrs(txp_set* ts, vector_old_enrs_entry* enrs) { vector_old_enrs_entry_push_back(&e, &ee); l += (size_t)(o = (uint32_t)(count * 4ULL)); - tex = ts->begin; + tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) { ee = { o, 1, 12, 1, vector_old_empty(enrs_sub_entry) }; vector_old_enrs_sub_entry_append(&ee.sub, 0, 3, ENRS_DWORD); @@ -248,7 +226,7 @@ bool txp_set_produce_enrs(txp_set* ts, vector_old_enrs_entry* enrs) { vector_old_enrs_entry_push_back(&e, &ee); l += (size_t)(o = (uint32_t)((size_t)tex->array_size * tex->mipmaps_count * 4)); - tex_mipmap = tex->data.begin; + tex_mipmap = tex->mipmaps.data(); for (size_t j = 0; j < tex->array_size; j++) { for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { ee = { o, 1, 24, 1, vector_old_empty(enrs_sub_entry) }; @@ -263,7 +241,7 @@ bool txp_set_produce_enrs(txp_set* ts, vector_old_enrs_entry* enrs) { return true; } -bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { +bool txp_set::unpack_file(void* data, bool big_endian) { uint32_t sign; uint32_t tex_count; txp* tex; @@ -274,7 +252,7 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { uint32_t sub_tex_count; uint32_t info; - if (!ts || !data) + if (!data) return false; if (big_endian) @@ -291,8 +269,7 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { else tex_count = *(uint32_t*)(set_d + 4); - *ts = vector_old_empty(txp); - vector_old_txp_reserve(ts, tex_count); + textures.resize(tex_count); for (size_t i = 0; i < tex_count; i++) { if (big_endian) { d = set_d + (size_t)load_reverse_endianness_uint32_t((uint32_t*)(set_d + 12) + i); @@ -303,8 +280,10 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { sign = *(uint32_t*)d; } - if (sign != 0x04505854 && sign != 0x05505854) + if (sign != 0x04505854 && sign != 0x05505854) { + textures.pop_back(); continue; + } if (big_endian) { sub_tex_count = load_reverse_endianness_uint32_t((void*)(d + 4)); @@ -315,7 +294,7 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { info = *(uint32_t*)(d + 8); } - tex = vector_old_txp_reserve_back(ts); + tex = &textures[i - (tex_count - textures.size())]; tex->has_cube_map = sign == 0x05505854; tex->mipmaps_count = info & 0xFF; tex->array_size = (info >> 8) & 0xFF; @@ -324,10 +303,10 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { tex->mipmaps_count = sub_tex_count & 0xFF; uint32_t mipmaps_count = tex->mipmaps_count; - tex->data = vector_old_empty(txp_mipmap); - vector_old_txp_mipmap_reserve(&tex->data, (size_t)tex->array_size * tex->mipmaps_count); + tex->mipmaps.resize((size_t)tex->array_size * tex->mipmaps_count); + tex_mipmap = tex->mipmaps.data(); for (size_t j = 0; j < tex->array_size; j++) - for (size_t k = 0; k < tex->mipmaps_count; k++) { + for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { if (big_endian) { mipmap_d = d + (size_t)load_reverse_endianness_uint32_t((uint32_t*)(d + 12) + j * mipmaps_count + k); sign = load_reverse_endianness_uint32_t((void*)mipmap_d); @@ -337,7 +316,6 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { sign = *(uint32_t*)mipmap_d; } - tex_mipmap = vector_old_txp_mipmap_reserve_back(&tex->data); if (big_endian) { tex_mipmap->width = load_reverse_endianness_uint32_t((void*)(mipmap_d + 4)); @@ -352,35 +330,23 @@ bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian) { tex_mipmap->size = *(uint32_t*)(mipmap_d + 20); } - ssize_t size = txp_get_size(tex_mipmap->format, tex_mipmap->width, tex_mipmap->height); - tex_mipmap->data = force_malloc(max(size, tex_mipmap->size)); - memcpy(tex_mipmap->data, (void*)(mipmap_d + 24), tex_mipmap->size); + ssize_t size = txp::get_size(tex_mipmap->format, tex_mipmap->width, tex_mipmap->height); + tex_mipmap->data.resize(max(size, tex_mipmap->size)); + memcpy(tex_mipmap->data.data(), (void*)(mipmap_d + 24), tex_mipmap->size); size -= tex_mipmap->size; if (size > 0) - memset((void*)((size_t)tex_mipmap->data + tex_mipmap->size), 0, size); + memset((void*)((size_t)tex_mipmap->data.data() + tex_mipmap->size), 0, size); } } return true; } -bool txp_set_unpack_file_modern(txp_set* ts, void* data, size_t length) { +bool txp_set::unpack_file_modern(void* data, size_t length) { bool ret = false; f2_struct st; - f2_struct_mread(&st, data, length); + f2_struct_read(&st, data, length); if (st.header.signature == reverse_endianness_uint32_t('MTXD')) - ret = txp_set_unpack_file(ts, st.data, st.header.use_big_endian); + ret = unpack_file(st.data, st.header.use_big_endian); f2_struct_free(&st); return ret; } - -void txp_set_free(txp_set* t) { - if (!t) - return; - - for (txp* i = t->begin; i != t->end; i++) { - for (txp_mipmap* j = i->data.begin; j != i->data.end; j++) - free(j->data); - vector_old_txp_mipmap_free(&i->data, 0); - } - vector_old_txp_free(t, 0); -} diff --git a/src/KKdLib/txp.h b/src/KKdLib/txp.h index e01631e3..bdbc03c9 100644 --- a/src/KKdLib/txp.h +++ b/src/KKdLib/txp.h @@ -5,9 +5,9 @@ #pragma once +#include #include "default.h" #include "f2/enrs.h" -#include "vector.h" typedef enum txp_format { TXP_A8 = 0, @@ -26,35 +26,43 @@ typedef enum txp_format { TXP_L8A8 = 13, } txp_format; -typedef struct txp_mipmap { +class txp_mipmap { +public: uint32_t width; uint32_t height; txp_format format; uint32_t size; - void* data; -} txp_mipmap; + std::vector data; -vector_old(txp_mipmap) + txp_mipmap(); + ~txp_mipmap(); +}; -typedef struct txp { +class txp { +public: bool has_cube_map; uint32_t array_size; uint32_t mipmaps_count; - vector_old_txp_mipmap data; -} txp; + std::vector mipmaps; -vector_old(txp) + txp(); + ~txp(); -typedef vector_old_txp txp_set; + static uint32_t get_size(txp_format format, uint32_t width, uint32_t height); +}; -extern void txp_init(txp* t); -extern void txp_copy(txp* src, txp* dst); -extern uint32_t txp_get_size(txp_format format, uint32_t width, uint32_t height); -extern void txp_free(txp* t); -extern void txp_set_init(txp_set* ts); -extern bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian); -extern bool txp_set_pack_file_modern(txp_set* ts, void** data, size_t* length, bool big_endian); -extern bool txp_set_produce_enrs(txp_set* ts, vector_old_enrs_entry* enrs); -extern bool txp_set_unpack_file(txp_set* ts, void* data, bool big_endian); -extern bool txp_set_unpack_file_modern(txp_set* ts, void* data, size_t length); -extern void txp_set_free(txp_set* ts); +class txp_set { +public: + bool ready; + + std::vector textures; + + txp_set(); + ~txp_set(); + + bool pack_file(void** data, size_t* length, bool big_endian); + bool pack_file_modern(void** data, size_t* length, bool big_endian); + bool produce_enrs(vector_old_enrs_entry* enrs); + bool unpack_file(void* data, bool big_endian); + bool unpack_file_modern(void* data, size_t length); +};