diff --git a/src/CLOUD/classes/data_test/auth_3d_test.c b/src/CLOUD/classes/data_test/auth_3d_test.c index 5ce51c9d..d375dcfc 100644 --- a/src/CLOUD/classes/data_test/auth_3d_test.c +++ b/src/CLOUD/classes/data_test/auth_3d_test.c @@ -38,6 +38,8 @@ typedef struct data_test_auth_3d_test { bool auth_3d_uid_load; bool stage_load; + vec2 a3d_stage_window_pos; + render_context* rctx; auth_3d_farc farc; @@ -77,7 +79,7 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { auth_3d_test->category = vector_empty(data_test_auth_3d_test_category); vector_data_test_auth_3d_test_category_reserve(&auth_3d_test->category, - auth_3d_db_cat->end - auth_3d_db_cat->begin); + vector_length(*auth_3d_db_cat)); for (auth_3d_database_category* i = auth_3d_db_cat->begin; i != auth_3d_db_cat->end; i++) { data_test_auth_3d_test_category* cat @@ -86,7 +88,7 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { cat->index = -1; cat->uid = vector_empty(int32_t); - vector_int32_t_reserve(&cat->uid, i->uid.end - i->uid.begin); + vector_int32_t_reserve(&cat->uid, vector_length(i->uid)); for (int32_t* j = i->uid.begin; j != i->uid.end; j++) { if (!uids[*j].enabled) continue; @@ -94,7 +96,7 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { vector_int32_t_push_back(&cat->uid, &uids[*j].org_uid); } - if (cat->uid.end - cat->uid.begin > 0) + if (vector_length(cat->uid) > 0) cat->index = 0; } @@ -121,10 +123,10 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { auth_3d_test->auth_3d_load = false; auth_3d_test->auth_3d_uid_load = false; - if (auth_3d_test->category.end - auth_3d_test->category.begin > 0) { + if (vector_length(auth_3d_test->category) > 0) { data_test_auth_3d_test_category* cat = &auth_3d_test->category.begin[0]; - if (cat->uid.end - cat->uid.begin > 0) { + if (vector_length(cat->uid) > 0) { auth_3d_test->auth_3d_load = true; auth_3d_test->auth_3d_uid_load = true; auth_3d_test->auth_3d_uid = cat->uid.begin[0]; @@ -137,11 +139,12 @@ bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { stage_database* stage_data = &rctx->data->data_ft.stage_data; auth_3d_test->stage = vector_ptr_empty(char); - vector_ptr_char_reserve(&auth_3d_test->stage, - stage_data->stage.end - stage_data->stage.begin); + vector_ptr_char_reserve(&auth_3d_test->stage, vector_length(stage_data->stage)); for (stage_info* i = stage_data->stage.begin; i != stage_data->stage.end; i++) *vector_ptr_char_reserve_back(&auth_3d_test->stage) = string_data(&i->name); + auth_3d_test->a3d_stage_window_pos = (vec2){ 200.0f, 100.0f }; + auth_3d_test->trans_x = 0.0f; auth_3d_test->trans_z = 0.0f; auth_3d_test->rot_y = 0.0f; @@ -241,7 +244,7 @@ void data_test_auth_3d_test_imgui(class_data* data) { if (auth_3d_category_index != auth_3d_test->auth_3d_category_index) { data_test_auth_3d_test_category* cat = &auth_3d_db_cat->begin[auth_3d_category_index]; - if (cat->uid.end - cat->uid.begin > 0) { + if (vector_length(cat->uid) > 0) { auth_3d_test->auth_3d_load = true; auth_3d_test->auth_3d_uid_load = true; auth_3d_test->auth_3d_uid = cat->uid.begin[cat->index]; @@ -379,8 +382,8 @@ void data_test_auth_3d_test_imgui(class_data* data) { float_t x = w; float_t y = 0.0f; - w = min((float_t)width, 200.0f); - h = min((float_t)height, 100.0f); + w = min((float_t)width, auth_3d_test->a3d_stage_window_pos.x); + h = min((float_t)height, auth_3d_test->a3d_stage_window_pos.y); igSetNextWindowPos((ImVec2) { x, y }, ImGuiCond_Appearing, ImVec2_Empty); igSetNextWindowSize((ImVec2) { w, h }, ImGuiCond_Always); @@ -547,8 +550,7 @@ End: bool data_test_auth_3d_test_dispose(class_data* data) { data_test_auth_3d_test* auth_3d_test = data->data; if (auth_3d_test) { - memset(auth_3d_test->stage.begin, 0, - sizeof(char*) * (auth_3d_test->stage.end - auth_3d_test->stage.begin)); + memset(auth_3d_test->stage.begin, 0, sizeof(char*) * vector_length(auth_3d_test->stage)); vector_data_test_auth_3d_test_category_free(&auth_3d_test->category, data_test_auth_3d_test_category_free); diff --git a/src/CLOUD/classes/data_test/glitter_test.c b/src/CLOUD/classes/data_test/glitter_test.c index 5ff0f884..b5f0628d 100644 --- a/src/CLOUD/classes/data_test/glitter_test.c +++ b/src/CLOUD/classes/data_test/glitter_test.c @@ -56,7 +56,7 @@ bool data_test_glitter_test_init(class_data* data, render_context* rctx) { data_test_glitter_test_struct* glt_test = data->data; if (glt_test) { - data_struct_get_directory_files(&data_list[DATA_AFT], "rom\\particle\\", &glt_test->files); + data_struct_get_directory_files(&data_list[DATA_AFT], "rom/particle/", &glt_test->files); for (data_struct_file* i = glt_test->files.begin; i != glt_test->files.end;) if (str_utils_check_ends_with(string_data(&i->name), ".farc")) { char* temp = str_utils_get_without_extension(string_data(&i->name)); @@ -69,9 +69,9 @@ bool data_test_glitter_test_init(class_data* data, render_context* rctx) { vector_data_struct_file_erase(&glt_test->files, i - glt_test->files.begin, data_struct_file_free); - glt_test->path = glt_test->files.end - glt_test->files.begin > 0 + glt_test->path = vector_length(glt_test->files) > 0 ? string_data(&glt_test->files.begin[0].path) : 0; - glt_test->file = glt_test->files.end - glt_test->files.begin > 0 + glt_test->file = vector_length(glt_test->files) > 0 ? string_data(&glt_test->files.begin[0].name) : 0; glt_test->stage_test = false; glt_test->rctx = rctx; @@ -122,8 +122,7 @@ void data_test_glitter_test_imgui(class_data* data) { int32_t file_index_old = file_index; imguiColumnComboBoxConfigFile("File", glt_test->files.begin, - glt_test->files.end - glt_test->files.begin, - &file_index, 0, false, &data->imgui_focus); + vector_length(glt_test->files), &file_index, 0, false, &data->imgui_focus); if (file_index != file_index_old) { glt_test->path = string_data(&glt_test->files.begin[file_index].path); @@ -252,7 +251,7 @@ void data_test_glitter_test_render(class_data* data) { glt_test->frame_counter = 0; } - uint64_t hash = hash_utf8_fnv1a64m(glt_test->file); + uint64_t hash = hash_utf8_fnv1a64m(glt_test->file, false); if (glt_test->input_auto && !glitter_particle_manager_check_scene(GPM_VAL, hash)) { if (glitter_particle_manager_check_effect_group(GPM_VAL, hash)) goto load; diff --git a/src/CLOUD/classes/data_test/stage_test.c b/src/CLOUD/classes/data_test/stage_test.c index 98d055c8..d57416f0 100644 --- a/src/CLOUD/classes/data_test/stage_test.c +++ b/src/CLOUD/classes/data_test/stage_test.c @@ -150,7 +150,7 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { *j = temp; } - if (stage_pv->end - stage_pv->begin > 0) + if (vector_length(*stage_pv) > 0) stage_test->pv_id = stage_pv->begin[0].pv_id; stage* stg = rctx->stage; @@ -161,7 +161,7 @@ bool data_test_stage_test_init(class_data* data, render_context* rctx) { } stage_info* info = stg->stage; - if (info - stg_info->begin >= 0 && info - stg_info->begin < stg_info->end - stg_info->begin) { + if (info - stg_info->begin >= 0 && info - stg_info->begin < vector_length(*stg_info)) { stage_test->stage_index = (int32_t)(info - stg_info->begin); stage_test->stage_name = string_data(&info->name); } diff --git a/src/CLOUD/classes/data_view.c b/src/CLOUD/classes/data_view.c index 283265a7..3f5b3a30 100644 --- a/src/CLOUD/classes/data_view.c +++ b/src/CLOUD/classes/data_view.c @@ -6,6 +6,8 @@ #include "data_view.h" #include "data_view/auth_3d.h" #include "data_view/draw_task.h" +#include "data_view/object.h" +#include "data_view/texture.h" classes_struct data_view_classes[] = { [DATA_VIEW_AUTH_3D] = { @@ -17,7 +19,7 @@ classes_struct data_view_classes[] = { .hide = CLASSES_STRUCT_NO_FUNC, .input = data_view_auth_3d_input, .imgui = data_view_auth_3d_imgui, - .render = data_view_auth_3d_render, + .render = CLASSES_STRUCT_NO_FUNC, .show = CLASSES_STRUCT_NO_FUNC, .sound = CLASSES_STRUCT_NO_FUNC, .dispose = data_view_auth_3d_dispose, @@ -39,7 +41,7 @@ classes_struct data_view_classes[] = { .hide = CLASSES_STRUCT_NO_FUNC, .input = data_view_draw_task_input, .imgui = data_view_draw_task_imgui, - .render = data_view_draw_task_render, + .render = CLASSES_STRUCT_NO_FUNC, .show = CLASSES_STRUCT_NO_FUNC, .sound = CLASSES_STRUCT_NO_FUNC, .dispose = data_view_draw_task_dispose, @@ -52,4 +54,48 @@ classes_struct data_view_classes[] = { .sub_classes = 0, .sub_classes_count = 0, }, + [DATA_VIEW_OBJECT] = { + .name = "Object##Data View", + .flags = CLASSES_IN_CONTEXT_MENU, + .init = data_view_object_init, + .draw = CLASSES_STRUCT_NO_FUNC, + .drop = CLASSES_STRUCT_NO_FUNC, + .hide = CLASSES_STRUCT_NO_FUNC, + .input = data_view_object_input, + .imgui = data_view_object_imgui, + .render = CLASSES_STRUCT_NO_FUNC, + .show = CLASSES_STRUCT_NO_FUNC, + .sound = CLASSES_STRUCT_NO_FUNC, + .dispose = data_view_object_dispose, + .data = { + .lock = 0, + .flags = CLASS_DISPOSED | CLASS_HIDDEN, + .imgui_focus = false, + .data = CLASS_DATA_NO_DATA, + }, + .sub_classes = 0, + .sub_classes_count = 0, + }, + [DATA_VIEW_TEXTURE] = { + .name = "Texture##Data View", + .flags = CLASSES_IN_CONTEXT_MENU, + .init = data_view_texture_init, + .draw = CLASSES_STRUCT_NO_FUNC, + .drop = CLASSES_STRUCT_NO_FUNC, + .hide = CLASSES_STRUCT_NO_FUNC, + .input = data_view_texture_input, + .imgui = data_view_texture_imgui, + .render = CLASSES_STRUCT_NO_FUNC, + .show = CLASSES_STRUCT_NO_FUNC, + .sound = CLASSES_STRUCT_NO_FUNC, + .dispose = data_view_texture_dispose, + .data = { + .lock = 0, + .flags = CLASS_DISPOSED | CLASS_HIDDEN, + .imgui_focus = false, + .data = CLASS_DATA_NO_DATA, + }, + .sub_classes = 0, + .sub_classes_count = 0, + }, }; diff --git a/src/CLOUD/classes/data_view.h b/src/CLOUD/classes/data_view.h index abf44d51..72f0e21d 100644 --- a/src/CLOUD/classes/data_view.h +++ b/src/CLOUD/classes/data_view.h @@ -10,6 +10,8 @@ typedef enum data_view_classes_enum { DATA_VIEW_AUTH_3D, DATA_VIEW_DRAW_TASK, + DATA_VIEW_OBJECT, + DATA_VIEW_TEXTURE, DATA_VIEW_MAX, } data_view_classes_enum; diff --git a/src/CLOUD/classes/data_view/auth_3d.c b/src/CLOUD/classes/data_view/auth_3d.c index c53adc5d..3d3e0cb3 100644 --- a/src/CLOUD/classes/data_view/auth_3d.c +++ b/src/CLOUD/classes/data_view/auth_3d.c @@ -115,7 +115,7 @@ void data_view_auth_3d_imgui(class_data* data) { tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; - if (auth->ambient.end - auth->ambient.begin + if (vector_length(auth->ambient) > 1 && igTreeNodeEx_Str("Ambient", tree_node_flags)) { for (auth_3d_ambient* l = auth->ambient.begin; l != auth->ambient.end; l++) @@ -123,7 +123,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->auth_2d.end - auth->auth_2d.begin + if (vector_length(auth->auth_2d) > 1 && igTreeNodeEx_Str("Auth 2D", tree_node_flags)) { for (string* l = auth->auth_2d.begin; l != auth->auth_2d.end; l++) @@ -133,17 +133,17 @@ void data_view_auth_3d_imgui(class_data* data) { data_view_auth_3d_imgui_auth_3d_camera_auxiliary(&auth->camera_auxiliary); - if (auth->camera_root.end - auth->camera_root.begin > 1 + if (vector_length(auth->camera_root) > 1 && igTreeNodeEx_Str("Camera Root", tree_node_flags)) { for (auth_3d_camera_root* l = auth->camera_root.begin; l != auth->camera_root.end; l++) data_view_auth_3d_imgui_auth_3d_camera_root(l, l - auth->camera_root.begin); igTreePop(); } - else if (auth->camera_root.end - auth->camera_root.begin == 1) + else if (vector_length(auth->camera_root) == 1) data_view_auth_3d_imgui_auth_3d_camera_root(&auth->camera_root.begin[0], -1); - if (auth->chara.end - auth->chara.begin + if (vector_length(auth->chara) > 0 && igTreeNodeEx_Str("Chara", tree_node_flags)) { for (auth_3d_chara* l = auth->chara.begin; l != auth->chara.end; l++) @@ -153,7 +153,7 @@ void data_view_auth_3d_imgui(class_data* data) { data_view_auth_3d_imgui_auth_3d_dof(&auth->dof); - if (auth->fog.end - auth->fog.begin + if (vector_length(auth->fog) > 0 && igTreeNodeEx_Str("Fog", tree_node_flags)) { for (auth_3d_fog* l = auth->fog.begin; l != auth->fog.end; l++) @@ -161,7 +161,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->light.end - auth->light.begin + if (vector_length(auth->light) > 0 && igTreeNodeEx_Str("Light", tree_node_flags)) { for (auth_3d_light* l = auth->light.begin; l != auth->light.end; l++) @@ -169,7 +169,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->m_object_hrc_list.end - auth->m_object_hrc_list.begin + if (vector_length(auth->m_object_hrc_list) > 0 && igTreeNodeEx_Str("M Object HRC", tree_node_flags)) { for (auth_3d_m_object_hrc** l = auth->m_object_hrc_list.begin; l != auth->m_object_hrc_list.end; l++) @@ -177,7 +177,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->material_list.end - auth->material_list.begin + if (vector_length(auth->material_list) > 0 && igTreeNodeEx_Str("Material List", tree_node_flags)) { for (auth_3d_material_list* l = auth->material_list.begin; l != auth->material_list.end; l++) @@ -185,7 +185,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->motion.end - auth->motion.begin + if (vector_length(auth->motion) > 0 && igTreeNodeEx_Str("Motion", tree_node_flags)) { for (string* l = auth->motion.begin; l != auth->motion.end; l++) @@ -193,7 +193,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->object_list.end - auth->object_list.begin + if (vector_length(auth->object_list) > 0 && igTreeNodeEx_Str("Object", tree_node_flags)) { for (auth_3d_object** l = auth->object_list.begin; l != auth->object_list.end; l++) @@ -201,7 +201,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->object_hrc_list.end - auth->object_hrc_list.begin + if (vector_length(auth->object_hrc_list) > 0 && igTreeNodeEx_Str("Object HRC", tree_node_flags)) { for (auth_3d_object_hrc** l = auth->object_hrc_list.begin; l != auth->object_hrc_list.end; l++) @@ -209,7 +209,7 @@ void data_view_auth_3d_imgui(class_data* data) { igTreePop(); } - if (auth->point.end - auth->point.begin + if (vector_length(auth->point) > 0 && igTreeNodeEx_Str("Point", tree_node_flags)) { for (auth_3d_point* l = auth->point.begin; l != auth->point.end; l++) @@ -233,10 +233,6 @@ void data_view_auth_3d_input(class_data* data) { input_locked |= data->imgui_focus; } -void data_view_auth_3d_render(class_data* data) { - -} - bool data_view_auth_3d_dispose(class_data* data) { return true; } @@ -613,7 +609,7 @@ static void data_view_auth_3d_imgui_auth_3d_m_object_hrc(auth_3d_m_object_hrc* m return; } - if (moh->instance.end - moh->instance.begin + if (vector_length(moh->instance) > 0 && igTreeNodeEx_Str("Instance", tree_node_flags)) { for (auth_3d_object_instance* i = moh->instance.begin; i != moh->instance.end; i++) data_view_auth_3d_imgui_auth_3d_object_instance(i); @@ -622,7 +618,7 @@ static void data_view_auth_3d_imgui_auth_3d_m_object_hrc(auth_3d_m_object_hrc* m data_view_auth_3d_imgui_auth_3d_object_model_transform(&moh->model_transform); - if (moh->node.end - moh->node.begin + if (vector_length(moh->node) > 0 && igTreeNodeEx_Str("Node", tree_node_flags)) { for (auth_3d_object_node* i = moh->node.begin; i != moh->node.end; i++) data_view_auth_3d_imgui_auth_3d_object_node(i); @@ -694,7 +690,7 @@ static void data_view_auth_3d_imgui_auth_3d_object(auth_3d_object* o) { tree_node_flags = tree_node_base_flags; - if (o->texture_pattern.end - o->texture_pattern.begin + if (vector_length(o->texture_pattern) > 0 && igTreeNodeEx_Str("Texture Pattern", tree_node_flags)) { for (auth_3d_object_texture_pattern* i = o->texture_pattern.begin; i != o->texture_pattern.end; i++) @@ -704,7 +700,7 @@ static void data_view_auth_3d_imgui_auth_3d_object(auth_3d_object* o) { tree_node_flags = tree_node_base_flags; - if (o->texture_transform.end - o->texture_transform.begin + if (vector_length(o->texture_transform) > 0 && igTreeNodeEx_Str("Texture Transform", tree_node_flags)) { for (auth_3d_object_texture_transform* i = o->texture_transform.begin; i != o->texture_transform.end; i++) @@ -716,7 +712,7 @@ static void data_view_auth_3d_imgui_auth_3d_object(auth_3d_object* o) { tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; - if (o->children_object.end - o->children_object.begin + if (vector_length(o->children_object) > 0 && igTreeNodeEx_Str("Children Object", tree_node_flags)) { for (auth_3d_object** i = o->children_object.begin; i != o->children_object.end; i++) @@ -727,7 +723,7 @@ static void data_view_auth_3d_imgui_auth_3d_object(auth_3d_object* o) { tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; - if (o->children_object_hrc.end - o->children_object_hrc.begin + if (vector_length(o->children_object_hrc) > 0 && igTreeNodeEx_Str("Children Object HRC", tree_node_flags)) { for (auth_3d_object_hrc** i = o->children_object_hrc.begin; i != o->children_object_hrc.end; i++) @@ -787,7 +783,7 @@ static void data_view_auth_3d_imgui_auth_3d_object_hrc(auth_3d_object_hrc* oh) { tree_node_flags = tree_node_base_flags; - if (oh->node.end - oh->node.begin + if (vector_length(oh->node) > 0 && igTreeNodeEx_Str("Node", tree_node_flags)) { for (auth_3d_object_node* i = oh->node.begin; i != oh->node.end; i++) data_view_auth_3d_imgui_auth_3d_object_node(i); @@ -797,7 +793,7 @@ static void data_view_auth_3d_imgui_auth_3d_object_hrc(auth_3d_object_hrc* oh) { tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; - if (oh->children_object.end - oh->children_object.begin + if (vector_length(oh->children_object) > 0 && igTreeNodeEx_Str("Children Object", tree_node_flags)) { for (auth_3d_object** i = oh->children_object.begin; i != oh->children_object.end; i++) @@ -808,7 +804,7 @@ static void data_view_auth_3d_imgui_auth_3d_object_hrc(auth_3d_object_hrc* oh) { tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; - if (oh->children_object_hrc.end - oh->children_object_hrc.begin + if (vector_length(oh->children_object_hrc) > 0 && igTreeNodeEx_Str("Children Object HRC", tree_node_flags)) { for (auth_3d_object_hrc** i = oh->children_object_hrc.begin; i != oh->children_object_hrc.end; i++) diff --git a/src/CLOUD/classes/data_view/auth_3d.h b/src/CLOUD/classes/data_view/auth_3d.h index 13088478..04dcedbb 100644 --- a/src/CLOUD/classes/data_view/auth_3d.h +++ b/src/CLOUD/classes/data_view/auth_3d.h @@ -11,5 +11,4 @@ extern bool data_view_auth_3d_init(class_data* data, render_context* rctx); extern void data_view_auth_3d_imgui(class_data* data); extern void data_view_auth_3d_input(class_data* data); -extern void data_view_auth_3d_render(class_data* data); extern bool data_view_auth_3d_dispose(class_data* data); diff --git a/src/CLOUD/classes/data_view/draw_task.c b/src/CLOUD/classes/data_view/draw_task.c index be285d09..7d25e3bd 100644 --- a/src/CLOUD/classes/data_view/draw_task.c +++ b/src/CLOUD/classes/data_view/draw_task.c @@ -118,7 +118,7 @@ void data_view_draw_task_imgui(class_data* data) { igPushID_Int(i); vector_ptr_draw_task* draw_tasks = &draw_task_array[i]; - size_t count = draw_tasks->end - draw_tasks->begin; + size_t count = vector_length(*draw_tasks); bool enable = count > 0; imguiDisableElementPush(enable); if (!igTreeNodeEx_StrStr("", tree_node_flags, @@ -225,10 +225,6 @@ void data_view_draw_task_input(class_data* data) { input_locked |= data->imgui_focus; } -void data_view_draw_task_render(class_data* data) { - -} - bool data_view_draw_task_dispose(class_data* data) { data_view_draw_task* data_view = data->data; if (data_view) { diff --git a/src/CLOUD/classes/data_view/draw_task.h b/src/CLOUD/classes/data_view/draw_task.h index 50a1eb22..c722f5a9 100644 --- a/src/CLOUD/classes/data_view/draw_task.h +++ b/src/CLOUD/classes/data_view/draw_task.h @@ -11,5 +11,4 @@ extern bool data_view_draw_task_init(class_data* data, render_context* rctx); extern void data_view_draw_task_imgui(class_data* data); extern void data_view_draw_task_input(class_data* data); -extern void data_view_draw_task_render(class_data* data); extern bool data_view_draw_task_dispose(class_data* data); diff --git a/src/CLOUD/classes/data_view/object.c b/src/CLOUD/classes/data_view/object.c new file mode 100644 index 00000000..cfdf6d6d --- /dev/null +++ b/src/CLOUD/classes/data_view/object.c @@ -0,0 +1,83 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "object.h" +#include "../../../CRE/render_context.h" +#include "../imgui_helper.h" + +typedef struct data_view_object { + render_context* rctx; +} data_view_object; + +extern int32_t width; +extern int32_t height; +extern bool input_locked; + +const char* data_view_object_window_title = "Object##Data Viewer"; + +bool data_view_object_init(class_data* data, render_context* rctx) { + data->data = force_malloc(sizeof(data_view_object)); + data_view_object* data_view = data->data; + if (data_view) { + data_view->rctx = rctx; + } + return true; +} + +void data_view_object_imgui(class_data* data) { + ImGuiIO* io = igGetIO(); + ImGuiStyle* style = igGetStyle(); + ImFont* font = igGetFont(); + + float_t w = min((float_t)width, 360.0f); + float_t h = min((float_t)height, 480.0f); + + igSetNextWindowPos(ImVec2_Empty, ImGuiCond_Appearing, ImVec2_Empty); + igSetNextWindowSize((ImVec2) { w, h }, ImGuiCond_Appearing); + + data->imgui_focus = false; + bool open = data->flags & CLASS_HIDDEN ? false : true; + bool collapsed = !igBegin(data_view_object_window_title, &open, 0); + if (!open) { + data->flags |= CLASS_HIDE; + goto End; + } + else if (collapsed) + goto End; + + data_view_object* data_view = data->data; + if (!data_view) + goto End; + + render_context* rctx = data_view->rctx; + + size_t count = object_storage_get_object_set_count(); + for (size_t i = 0; i < count; i++) { + object_set* set = object_storage_get_object_set_by_index(i); + + igPushID_Int((int32_t)i); + char buf[0x1000]; + sprintf_s(buf, sizeof(buf), "ID: 0x%08X; Name: %s", set->id, string_data(&set->name)); + igSelectable_Bool(buf, false, 0, ImVec2_Empty); + igPopID(); + } + + data->imgui_focus |= igIsWindowFocused(0); + +End: + igEnd(); +} + +void data_view_object_input(class_data* data) { + input_locked |= data->imgui_focus; +} + +bool data_view_object_dispose(class_data* data) { + data_view_object* data_view = data->data; + if (data_view) { + } + free(data->data); + return true; +} diff --git a/src/CLOUD/classes/data_view/object.h b/src/CLOUD/classes/data_view/object.h new file mode 100644 index 00000000..2102a6d1 --- /dev/null +++ b/src/CLOUD/classes/data_view/object.h @@ -0,0 +1,14 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../../KKdLib/default.h" +#include "../../classes.h" + +extern bool data_view_object_init(class_data* data, render_context* rctx); +extern void data_view_object_imgui(class_data* data); +extern void data_view_object_input(class_data* data); +extern bool data_view_object_dispose(class_data* data); diff --git a/src/CLOUD/classes/data_view/texture.c b/src/CLOUD/classes/data_view/texture.c new file mode 100644 index 00000000..ddad45a6 --- /dev/null +++ b/src/CLOUD/classes/data_view/texture.c @@ -0,0 +1,86 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "texture.h" +#include "../../../CRE/render_context.h" +#include "../imgui_helper.h" + +typedef struct data_view_texture { + render_context* rctx; +} data_view_texture; + +extern int32_t width; +extern int32_t height; +extern bool input_locked; + +const char* data_view_texture_window_title = "Texture##Data Viewer"; + +bool data_view_texture_init(class_data* data, render_context* rctx) { + data->data = force_malloc(sizeof(data_view_texture)); + data_view_texture* data_view = data->data; + if (data_view) { + data_view->rctx = rctx; + } + return true; +} + +void data_view_texture_imgui(class_data* data) { + ImGuiIO* io = igGetIO(); + ImGuiStyle* style = igGetStyle(); + ImFont* font = igGetFont(); + + float_t w = min((float_t)width, 480.0f); + float_t h = min((float_t)height, 480.0f); + + igSetNextWindowPos(ImVec2_Empty, ImGuiCond_Appearing, ImVec2_Empty); + igSetNextWindowSize((ImVec2) { w, h }, ImGuiCond_Appearing); + + data->imgui_focus = false; + bool open = data->flags & CLASS_HIDDEN ? false : true; + bool collapsed = !igBegin(data_view_texture_window_title, &open, 0); + if (!open) { + data->flags |= CLASS_HIDE; + goto End; + } + else if (collapsed) + goto End; + + data_view_texture* data_view = data->data; + if (!data_view) + goto End; + + render_context* rctx = data_view->rctx; + + size_t count = texture_storage_get_texture_count(); + for (size_t i = 0; i < count; i++) { + texture* tex = texture_storage_get_texture_by_index(i); + if (texture_get_id(tex->id)) + continue; + + igPushID_Int((int32_t)i); + char buf[0x1000]; + sprintf_s(buf, sizeof(buf), "ID: 0x%06X; Width: %5d; Height: %5d; Mipmap Count: %2d", + texture_get_index(tex->id), tex->width, tex->height, tex->max_mipmap_level + 1); + igSelectable_Bool(buf, false, 0, ImVec2_Empty); + igPopID(); + } + + data->imgui_focus |= igIsWindowFocused(0); + +End: + igEnd(); +} + +void data_view_texture_input(class_data* data) { + input_locked |= data->imgui_focus; +} + +bool data_view_texture_dispose(class_data* data) { + data_view_texture* data_view = data->data; + if (data_view) { + } + free(data->data); + return true; +} diff --git a/src/CLOUD/classes/data_view/texture.h b/src/CLOUD/classes/data_view/texture.h new file mode 100644 index 00000000..57dc6cde --- /dev/null +++ b/src/CLOUD/classes/data_view/texture.h @@ -0,0 +1,14 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../../KKdLib/default.h" +#include "../../classes.h" + +extern bool data_view_texture_init(class_data* data, render_context* rctx); +extern void data_view_texture_imgui(class_data* data); +extern void data_view_texture_input(class_data* data); +extern bool data_view_texture_dispose(class_data* data); diff --git a/src/CLOUD/classes/glitter_editor.c b/src/CLOUD/classes/glitter_editor.c index d5aa9918..40f0f295 100644 --- a/src/CLOUD/classes/glitter_editor.c +++ b/src/CLOUD/classes/glitter_editor.c @@ -470,7 +470,7 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { vector_string_erase(&files_x, i - files_x.begin); } - ssize_t c = files_x.end - files_x.begin; + ssize_t c = vector_length(files_x); glitter_file_reader* fr = 0; if (files_x.begin) { stream s; @@ -556,7 +556,7 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { vector_string_erase(&files_x, i - files_x.begin); } - ssize_t c = files_x.end - files_x.begin; + ssize_t c = vector_length(files_x); glitter_file_reader* fr = 0; if (files_x.begin) for (ssize_t i = 0; i < c; i++) { @@ -644,7 +644,7 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { hashes[i] = hash_murmurhash(lines[i], min(len, 0x7F), 0, false, false); } - ssize_t c = files_f2.end - files_f2.begin; + ssize_t c = vector_length(files_f2); glitter_file_reader* fr = 0; if (files_f2.begin && files_ft.begin) for (ssize_t i = 0; i < c; i++) { @@ -908,7 +908,7 @@ void glitter_editor_render(class_data* data) { } if (eg && glt_edt->effect_flags & GLITTER_EDITOR_ADD) { - ssize_t eff_count = eg->effects.end - eg->effects.begin; + ssize_t eff_count = vector_length(eg->effects); LARGE_INTEGER time; QueryPerformanceCounter(&time); @@ -922,7 +922,7 @@ void glitter_editor_render(class_data* data) { if (eg && has_effect) if (glt_edt->effect_flags & GLITTER_EDITOR_DUPLICATE) { - ssize_t eff_count = eg->effects.end - eg->effects.begin; + ssize_t eff_count = vector_length(eg->effects); LARGE_INTEGER time; QueryPerformanceCounter(&time); @@ -949,7 +949,7 @@ void glitter_editor_render(class_data* data) { glt_edt->selected_emitter = 0; glt_edt->selected_particle = 0; - if (eg->effects.end - eg->effects.begin < 1) + if (vector_length(eg->effects) < 1) glt_edt->close = true; else glt_edt->input_reload = true; @@ -979,7 +979,7 @@ void glitter_editor_render(class_data* data) { break; } - if (j > -1 && j < eg->effects.end - eg->effects.begin - 1) { + if (j > -1 && j < vector_length(eg->effects) - 1) { glitter_effect* temp = eg->effects.begin[j + 1]; eg->effects.begin[j + 1] = eg->effects.begin[j]; eg->effects.begin[j] = temp; @@ -1602,7 +1602,7 @@ static void glitter_editor_reload(glitter_editor_struct* glt_edt) { min(len, 0x7F), 0, false, false); else effect->data.name_hash = hash_fnv1a64m(effect->name, - min(len, 0x7F)); + min(len, 0x7F), false); for (glitter_curve** c = effect->animation.begin; c != effect->animation.end; c++) if (*c) @@ -1744,7 +1744,7 @@ static void glitter_editor_load_file(glitter_editor_struct* glt_edt, char* path, glitter_effect* e = *i; size_t len = utf8_length(e->name); - if (e->data.name_hash != hash_fnv1a64m(e->name, min(len, 0x80))) { + if (e->data.name_hash != hash_fnv1a64m(e->name, min(len, 0x80), false)) { lst_not_valid = true; break; } @@ -1908,7 +1908,7 @@ static bool glitter_editor_list_open_window(glitter_effect_group* eg) { else for (size_t i = 0; i < count; i++) { size_t len = utf8_length(lines[i]); - hashes[i] = hash_fnv1a64m(lines[i], min(len, 0x7F)); + hashes[i] = hash_fnv1a64m(lines[i], min(len, 0x7F), false); } ret = true; @@ -1966,7 +1966,7 @@ static bool glitter_editor_resource_import(glitter_editor_struct* glt_edt) { wchar_t* p = str_utils_wsplit_right_get_left(file, L'.'); dds* d = dds_init(); - uint64_t hash_ft = hash_utf16_fnv1a64m(f); + uint64_t hash_ft = hash_utf16_fnv1a64m(f, false); uint64_t hash_f2 = hash_utf16_murmurhash(f, 0, false); glitter_effect_group* eg = glt_edt->effect_group; @@ -1977,8 +1977,7 @@ static bool glitter_editor_resource_import(glitter_editor_struct* glt_edt) { goto DDSEnd; dds_wread(d, p); - if (d->width == 0 || d->height == 0 - || d->mipmaps_count == 0 || d->data.end - d->data.begin < 1) + if (d->width == 0 || d->height == 0 || d->mipmaps_count == 0 || vector_length(d->data) < 1) goto DDSEnd; txp* tex = vector_txp_reserve_back(&eg->resources_tex); @@ -2454,8 +2453,7 @@ static void glitter_editor_effects_context_menu(glitter_editor_struct* glt_edt, close = true; } - if (igMenuItem_Bool("Move Effect Down", 0, false, - i_idx < eg->effects.end - eg->effects.begin)) { + if (igMenuItem_Bool("Move Effect Down", 0, false, i_idx < vector_length(eg->effects))) { glt_edt->effect_flags |= GLITTER_EDITOR_MOVE_DOWN; glt_edt->selected_effect = effect; close = true; @@ -2860,7 +2858,7 @@ static void glitter_editor_property_effect(glitter_editor_struct* glt_edt, class memcpy(name, effect.name, name_size); if (imguiColumnInputText("Name", name, name_size, 0, 0, 0)) { effect.data.name_hash = eg->type != GLITTER_FT - ? hash_utf8_murmurhash(name, 0, false) : hash_utf8_fnv1a64m(name); + ? hash_utf8_murmurhash(name, 0, false) : hash_utf8_fnv1a64m(name, false); memcpy(effect.name, name, name_size - 1); changed = true; } @@ -3127,16 +3125,16 @@ static void glitter_editor_property_effect(glitter_editor_struct* glt_edt, class ext_anim_changed = true; } - uint64_t hash1 = hash_fnv1a64m((void*)effect.data.ext_anim, sizeof(glitter_effect_ext_anim)); - uint64_t hash2 = hash_fnv1a64m((void*)&ext_anim, sizeof(glitter_effect_ext_anim)); + uint64_t hash1 = hash_fnv1a64m((void*)effect.data.ext_anim, sizeof(glitter_effect_ext_anim), false); + uint64_t hash2 = hash_fnv1a64m((void*)&ext_anim, sizeof(glitter_effect_ext_anim), false); if (hash1 != hash2 && ext_anim_changed) { *effect.data.ext_anim = ext_anim; changed = true; } } - uint64_t hash1 = hash_fnv1a64m((void*)glt_edt->selected_effect, sizeof(glitter_effect)); - uint64_t hash2 = hash_fnv1a64m((void*)&effect, sizeof(glitter_effect)); + uint64_t hash1 = hash_fnv1a64m((void*)glt_edt->selected_effect, sizeof(glitter_effect), false); + uint64_t hash2 = hash_fnv1a64m((void*)&effect, sizeof(glitter_effect), false); if (hash1 != hash2 && changed) { for (glitter_emitter** i = effect.emitters.begin; i != effect.emitters.end; i++) { if (!*i) @@ -3510,8 +3508,8 @@ static void glitter_editor_property_emitter(glitter_editor_struct* glt_edt, clas } break; } - uint64_t hash1 = hash_fnv1a64m((void*)glt_edt->selected_emitter, sizeof(glitter_emitter)); - uint64_t hash2 = hash_fnv1a64m((void*)&emitter, sizeof(glitter_emitter)); + uint64_t hash1 = hash_fnv1a64m((void*)glt_edt->selected_emitter, sizeof(glitter_emitter), false); + uint64_t hash2 = hash_fnv1a64m((void*)&emitter, sizeof(glitter_emitter), false); if (hash1 != hash2 && changed) { glt_edt->input_reload = true; *glt_edt->selected_emitter = emitter; @@ -4212,8 +4210,8 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla changed = true;*/ } - uint64_t hash1 = hash_fnv1a64m((void*)glt_edt->selected_particle, sizeof(glitter_particle)); - uint64_t hash2 = hash_fnv1a64m((void*)&particle, sizeof(glitter_particle)); + uint64_t hash1 = hash_fnv1a64m((void*)glt_edt->selected_particle, sizeof(glitter_particle), false); + uint64_t hash2 = hash_fnv1a64m((void*)&particle, sizeof(glitter_particle), false); if (hash1 != hash2 && changed) { glt_edt->input_reload = true; *glt_edt->selected_particle = particle; @@ -5048,7 +5046,7 @@ static void glitter_editor_curve_editor(glitter_editor_struct* glt_edt) { bool exist = true; if (crv_edt->add_key && add_key) { - if (!crv_edt->list[crv_edt->type] || keys->end - keys->begin == 0) { + if (!crv_edt->list[crv_edt->type] || vector_length(*keys) == 0) { glitter_curve_key* key = vector_glitter_curve_key_reserve_back(keys); key->frame = crv_edt->curve.start_time; key->value = glitter_editor_curve_editor_get_value(glt_edt, curve->type); @@ -5170,7 +5168,7 @@ static void glitter_editor_curve_editor(glitter_editor_struct* glt_edt) { } glitter_curve* c = crv_edt->list[crv_edt->type]; - if (c && keys->end - keys->begin == 0) { + if (c && vector_length(*keys) == 0) { glitter_animation* anim = crv_edt->animation; for (glitter_curve** i = anim->begin; i != anim->end; i++) if (*i && *i == c) { @@ -6124,9 +6122,9 @@ static void glitter_editor_curve_editor_property_window(glitter_editor_struct* g bool key_edit = false; float_t value; - if (curve->keys_rev.end - curve->keys_rev.begin > 1) { + if (vector_length(curve->keys_rev) > 1) { glitter_curve_key* c = curve->keys_rev.begin; - glitter_curve_key* n = curve->keys_rev.end - c > 1 ? curve->keys_rev.begin + 1 : 0; + glitter_curve_key* n = vector_length(curve->keys_rev) > 1 ? c + 1 : 0; while (n != curve->keys_rev.end && n->frame < crv_edt->frame) { c++; n++; @@ -6147,7 +6145,7 @@ static void glitter_editor_curve_editor_property_window(glitter_editor_struct* g break; } } - else if (curve->keys_rev.end - curve->keys_rev.begin == 1) + else if (vector_length(curve->keys_rev) == 1) value = curve->keys_rev.begin->value; else if (curve->type >= GLITTER_CURVE_TRANSLATION_X && curve->type <= GLITTER_CURVE_V_SCROLL_ALPHA_2ND) value = glitter_editor_curve_editor_get_value(glt_edt, curve->type); @@ -6352,8 +6350,8 @@ static void glitter_editor_curve_editor_property_window(glitter_editor_struct* g glt_edt->input_reload = true; } - uint64_t hash1 = hash_fnv1a64m((void*)crv_edt->list[crv_edt->type], sizeof(glitter_curve)); - uint64_t hash2 = hash_fnv1a64m((void*)curve, sizeof(glitter_effect)); + uint64_t hash1 = hash_fnv1a64m((void*)crv_edt->list[crv_edt->type], sizeof(glitter_curve), false); + uint64_t hash2 = hash_fnv1a64m((void*)curve, sizeof(glitter_effect), false); if (hash1 != hash2) *crv_edt->list[crv_edt->type] = *curve; } @@ -6845,7 +6843,7 @@ static void glitter_editor_gl_draw_wireframe_draw(glitter_editor_struct* glt_edt gl_state_bind_array_buffer(0); const GLenum mode = rg->type == GLITTER_PARTICLE_LINE ? GL_LINE_STRIP : GL_TRIANGLE_STRIP; - const size_t count = rg->vec_key.end - rg->vec_key.begin; + const size_t count = vector_length(rg->vec_key); for (size_t i = 0; i < count; i++) glDrawArrays(mode, rg->vec_key.begin[i], rg->vec_val.begin[i]); diff --git a/src/CLOUD/classes/information/frame_speed.c b/src/CLOUD/classes/information/frame_speed.c index e6363ded..febdaab8 100644 --- a/src/CLOUD/classes/information/frame_speed.c +++ b/src/CLOUD/classes/information/frame_speed.c @@ -24,8 +24,8 @@ void information_frame_speed_imgui(class_data* data) { ImGuiStyle* style = igGetStyle(); ImFont* font = igGetFont(); - float_t w = min((float_t)width, 204.0f); - float_t h = min((float_t)height, 60.0f); + float_t w = min((float_t)width, 240.0f); + float_t h = min((float_t)height, 58.0f); igSetNextWindowPos(ImVec2_Empty, ImGuiCond_Appearing, ImVec2_Empty); igSetNextWindowSize((ImVec2) { w, h }, ImGuiCond_Always); diff --git a/src/CLOUD/main.c b/src/CLOUD/main.c index 24789812..f100a9ed 100644 --- a/src/CLOUD/main.c +++ b/src/CLOUD/main.c @@ -134,10 +134,8 @@ static void a3da_to_dft_dsc(char* a3da_path, int32_t pv_id) { continue; } - vec3 diff; float_t focus; - vec3_sub(cam_a3da.dof.model_transform.translation_value, cr->view_point_value, diff); - vec3_length(diff, focus); + vec3_distance(cam_a3da.dof.model_transform.translation_value, cr->view_point_value, focus); dof_data d; d.flags = 0x1F; @@ -252,13 +250,13 @@ int32_t wmain(int32_t argc, wchar_t** argv) { __cpuid(cpuid_data, 1); aes_ni = cpuid_data[2] & 0x2000000 ? true : false; + //a3da_to_dft_dsc("CAMPV269_BASE.a3da", 269); + render_init_struct ris; ris.res.x = 0; ris.res.y = 0; ris.scale = 0.0f; - //a3da_to_dft_dsc("CAMPV269_BASE.a3da", 269); - thread input, render, sound; HANDLE h[3]; h[0] = input.handle = CreateThread(0, 0, &input_main, 0, 0, &input.id); diff --git a/src/CLOUD/render.c b/src/CLOUD/render.c index 530da4aa..51ef454b 100644 --- a/src/CLOUD/render.c +++ b/src/CLOUD/render.c @@ -32,6 +32,7 @@ #include "../CRE/post_process.h" #include "../KKdLib/io/path.h" #include "../KKdLib/farc.h" +#include "../KKdLib/pvpp.h" #include"classes/imgui_helper.h" #include @@ -352,6 +353,11 @@ static render_context* render_load() { data_struct_init(); data_struct_load("CLOUD_data.txt"); + pvpp pp; + pvpp_init(&pp); + data_struct_load_file(&data_list[DATA_X], &pp, "rom/pv/", "pv824.pvpp", pvpp_load_file); + pvpp_free(&pp); + glGenBuffers(1, &common_data_ubo); gl_state_bind_uniform_buffer(common_data_ubo); @@ -439,7 +445,7 @@ static render_context* render_load() { render_resize_fb(rctx, true); - rob_chara_data_array_init(); + rob_chara_array_init(); data_struct* aft_data = &data_list[DATA_AFT]; auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; @@ -456,6 +462,10 @@ static render_context* render_load() { 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"); @@ -466,24 +476,16 @@ static render_context* render_load() { object_set_load_db_entry(&set_info, aft_data, aft_obj_db, "MIKITM681"); object_set_load_db_entry(&set_info, aft_data, aft_obj_db, "MIKITM981"); - motion_set_load_motion(216, 0, aft_mot_db); + motion_set_load_motion(2, 0, aft_mot_db); + motion_set_load_motion(946, 0, aft_mot_db); rob_chara_pv_data pv_data; rob_chara_pv_data_init(&pv_data); - item_sub_data sub_data; - memset(&sub_data, 0, sizeof(item_sub_data)); - sub_data.kami = 500; - sub_data.outer = 1; - sub_data.kata = 301; - //sub_data.kami = 681; - //sub_data.outer = 181; - //sub_data.kata = 481; - //sub_data.head = 981; - rob_chara_data_set(&rob_chara_data_array[0], 0, CHARA_MIKU, 0, &pv_data); - rob_chara_data_reset(&rob_chara_data_array[0], - &rob_chara_data_array[0].pv_data, aft_bone_data, aft_mot_db); - rob_chara_data_reload_items(&rob_chara_data_array[0], &sub_data, aft_bone_data); - rob_chara_data_load_motion(&rob_chara_data_array[0], 1294, 2, aft_bone_data, aft_mot_db); + rob_chara_set(&rob_chara_array[0], 0, CHARA_MIKU, 0, &pv_data); + rob_chara_reset_data(&rob_chara_array[0], &rob_chara_array[0].pv_data, aft_bone_data, aft_mot_db); + rob_chara_reset(&rob_chara_array[0], aft_bone_data, aft_data, aft_obj_db); + rob_chara_load_motion(&rob_chara_array[0], 9996, 2, aft_bone_data, aft_mot_db); + //rob_chara_set_frame(&rob_chara_array[0], 1000.0f); float_t* grid_verts = force_malloc(sizeof(float_t) * 3 * grid_vertex_count); @@ -528,7 +530,6 @@ static render_context* render_load() { camera* cam = rctx->camera; camera_initialize(cam, aspect, internal_3d_res.x, internal_3d_res.y); - camera_reset(cam); //camera_set_position(cam, &((vec3){ 1.35542f, 1.41634f, 1.27852f })); //camera_rotate(cam, &((vec2d){ -45.0, -32.5 })); //camera_set_position(cam, &((vec3){ -6.67555f, 4.68882f, -3.67537f })); @@ -536,17 +537,6 @@ static render_context* render_load() { camera_set_position(cam, &((vec3) { 0.0f, 1.0f, 3.45f })); camera_set_fov(cam, 70.0); - typedef struct struc_403 { - int32_t field_0; - int32_t field_4; - int32_t field_8; - } struc_403; - - typedef struct struc_404 { - int32_t field_0; - int32_t field_4; - } struc_404; - imgui_context = igCreateContext(0); lock_init(&imgui_context_lock); @@ -620,7 +610,7 @@ static void render_update(render_context* rctx) { lock_lock(&imgui_context_lock); igSetCurrentContext(imgui_context); if (global_context_menu && igIsMouseReleased(ImGuiMouseButton_Right) - && !igIsItemHovered(0) && imgui_context->OpenPopupStack.Size <= 0) + && !igIsItemHovered(0) && imgui_context->OpenPopupStack.Size < 1) igOpenPopup_Str("Classes init context menu", 0); if (igBeginPopupContextItem("Classes init context menu", 0)) { @@ -654,13 +644,13 @@ static void render_update(render_context* rctx) { } camera_update(cam); - float_t frame = rob_chara_data_get_frame(&rob_chara_data_array[0]); - float_t frame_count = rob_chara_data_get_frame_count(&rob_chara_data_array[0]); + float_t frame = rob_chara_get_frame(&rob_chara_array[0]); + float_t frame_count = rob_chara_get_frame_count(&rob_chara_array[0]); frame += get_delta_frame(); if (frame >= frame_count) frame -= frame_count; - rob_chara_data_set_frame(&rob_chara_data_array[0], frame); - rob_chara_data_array[0].item_equip->shadow_type = SHADOW_CHARA; + rob_chara_set_frame(&rob_chara_array[0], frame); + rob_chara_array[0].item_equip->shadow_type = SHADOW_CHARA; data_struct* aft_data = &data_list[DATA_AFT]; obj_db_ptr = &aft_data->data_ft.obj_db; @@ -669,8 +659,8 @@ static void render_update(render_context* rctx) { classes_process_render(classes, classes_count); wind_ptr = rctx->wind; - rob_chara_data_calc(&rob_chara_data_array[0]); - rob_chara_data_draw(&rob_chara_data_array[0], rctx); + rob_chara_calc(&rob_chara_array[0]); + rob_chara_draw(&rob_chara_array[0], rctx); stage_update(rctx->stage, rctx); @@ -779,7 +769,7 @@ static void render_dispose(render_context* rctx) { glDeleteBuffers(1, &common_data_ubo); glDeleteBuffers(1, &grid_vbo); - rob_chara_data_array_free(); + rob_chara_array_free(); auth_3d_data_free(rctx); light_param_storage_free(); @@ -904,7 +894,7 @@ static void render_imgui_context_menu(classes_struct* classes, inline static void render_shaders_load() { data_struct_load_file(&data_list[DATA_AFT], &shaders_ft, - "rom\\", "ft_shaders.farc", render_load_shaders); + "rom/", "ft_shaders.farc", render_load_shaders); } inline static void render_shaders_free() { diff --git a/src/CLOUD/shared.c b/src/CLOUD/shared.c index 9f00b96a..902cbcbe 100644 --- a/src/CLOUD/shared.c +++ b/src/CLOUD/shared.c @@ -53,7 +53,7 @@ classes_struct classes[] = { .data = CLASS_DATA_NO_DATA, }, .sub_classes = data_view_classes, - .sub_classes_count = 2, + .sub_classes_count = 4, }, { .name = "Graphics", diff --git a/src/CRE/Glitter/animation.c b/src/CRE/Glitter/animation.c index 07c0261e..9e255f85 100644 --- a/src/CRE/Glitter/animation.c +++ b/src/CRE/Glitter/animation.c @@ -32,7 +32,7 @@ void glitter_animation_copy(glitter_animation* src, glitter_animation* dst) { if (!src) return; - vector_ptr_glitter_curve_reserve(dst, src->end - src->begin); + vector_ptr_glitter_curve_reserve(dst, vector_length(*src)); for (glitter_curve** i = src->begin; i != src->end; i++) if (*i) { glitter_curve* c = glitter_curve_copy(*i); @@ -70,7 +70,7 @@ bool glitter_animation_unparse_file(GLT, f2_struct* st, glitter_animation* anim, glitter_curve_type_flags flags) { memset(st, 0, sizeof(f2_struct)); - if (anim->end - anim->begin <= 0) + if (vector_length(*anim) < 1) return false; static const glitter_curve_type order[] = { @@ -123,7 +123,7 @@ bool glitter_animation_unparse_file(GLT, f2_struct* st, } } - if (st->sub_structs.end - st->sub_structs.begin < 1) + if (vector_length(st->sub_structs) < 1) return false; st->header.signature = reverse_endianness_uint32_t('ANIM'); diff --git a/src/CRE/Glitter/curve.c b/src/CRE/Glitter/curve.c index 6d6ef3c0..14a880ac 100644 --- a/src/CRE/Glitter/curve.c +++ b/src/CRE/Glitter/curve.c @@ -56,11 +56,11 @@ glitter_curve* glitter_curve_copy(glitter_curve* c) { *cc = *c; cc->keys = vector_empty(glitter_curve_key); - vector_glitter_curve_key_reserve(&cc->keys, c->keys.end - c->keys.begin); + vector_glitter_curve_key_reserve(&cc->keys, vector_length(c->keys)); vector_glitter_curve_key_insert_range(&cc->keys, 0, c->keys.begin, c->keys.end); #if defined(CRE_DEV) cc->keys_rev = vector_empty(glitter_curve_key); - vector_glitter_curve_key_reserve(&cc->keys_rev, c->keys_rev.end - c->keys_rev.begin); + vector_glitter_curve_key_reserve(&cc->keys_rev, vector_length(c->keys_rev)); vector_glitter_curve_key_insert_range(&cc->keys_rev, 0, c->keys_rev.begin, c->keys_rev.end); #endif return cc; @@ -97,9 +97,9 @@ void glitter_curve_recalculate(GLT, glitter_curve* curve) { vector_glitter_curve_key keys_rev = curve->keys_rev; vector_glitter_curve_key* keys = &curve->keys; vector_glitter_curve_key_clear(keys, 0); - if (keys_rev.end - keys_rev.begin == 1) + if (vector_length(keys_rev) == 1) vector_glitter_curve_key_push_back(keys, &keys_rev.begin[0]); - else if (keys_rev.end - keys_rev.begin > 1) { + else if (vector_length(keys_rev) > 1) { if (~curve->flags & GLITTER_CURVE_BAKED) { vector_glitter_curve_key_insert_range(keys, 0, keys_rev.begin, keys_rev.end); return; @@ -109,7 +109,7 @@ void glitter_curve_recalculate(GLT, glitter_curve* curve) { if (GLT_VAL == GLITTER_F2 || (GLT_VAL == GLITTER_X && ~curve->flags & GLITTER_CURVE_BAKED_FULL)) curve_baked_half = true; - ssize_t keys_count = keys_rev.end - keys_rev.begin; + ssize_t keys_count = vector_length(keys_rev); size_t count = (size_t)end_time - start_time; if (curve_baked_half) count /= 2; @@ -195,11 +195,11 @@ void glitter_curve_recalculate(GLT, glitter_curve* curve) { bool glitter_curve_unparse_file(GLT, f2_struct* st, glitter_curve* c) { #if !defined(CRE_DEV) vector_glitter_curve_key keys = c->keys; - if (keys.end - keys.begin < 1) + if (vector_length(keys) < 1) return false; #else vector_glitter_curve_key keys = c->keys; - if (c->keys_rev.end - c->keys_rev.begin < 1) + if (vector_length(c->keys_rev) < 1) return false; c->keys = vector_empty(glitter_curve_key); @@ -209,7 +209,7 @@ bool glitter_curve_unparse_file(GLT, f2_struct* st, glitter_curve* c) { return false; } #endif - glitter_curve_pack_file(GLT_VAL, st, c, c->keys.end - c->keys.begin); + glitter_curve_pack_file(GLT_VAL, st, c, vector_length(c->keys)); f2_struct s; glitter_curve_key_pack_file(GLT_VAL, &s, c, &c->keys); diff --git a/src/CRE/Glitter/curve_get_value.c b/src/CRE/Glitter/curve_get_value.c index ff417277..9f699236 100644 --- a/src/CRE/Glitter/curve_get_value.c +++ b/src/CRE/Glitter/curve_get_value.c @@ -22,7 +22,7 @@ bool glitter_curve_get_value(GLT, glitter_curve* c, bool negate; float_t _value; - keys_count = c->keys.end - c->keys.begin; + keys_count = vector_length(c->keys); if (!keys_count) return false; @@ -106,7 +106,7 @@ static void glitter_curve_get_key_indexes(vector_glitter_curve_key* keys, size_t v9; size_t v10; - count = keys->end - keys->begin; + count = vector_length(*keys); if (count <= 1) { *curr = 0; *next = 0; diff --git a/src/CRE/Glitter/effect.c b/src/CRE/Glitter/effect.c index a7aea692..7d3d0d8c 100644 --- a/src/CRE/Glitter/effect.c +++ b/src/CRE/Glitter/effect.c @@ -39,7 +39,7 @@ glitter_effect* glitter_effect_copy(glitter_effect* e) { } ec->emitters = vector_ptr_empty(glitter_emitter); - vector_ptr_glitter_emitter_reserve(&ec->emitters, e->emitters.end - e->emitters.begin); + vector_ptr_glitter_emitter_reserve(&ec->emitters, vector_length(e->emitters)); for (glitter_emitter** i = e->emitters.begin; i != e->emitters.end; i++) if (*i) { glitter_emitter* e = glitter_emitter_copy(*i); @@ -186,7 +186,8 @@ static bool glitter_effect_pack_file(GLT, f2_struct* st, glitter_effect* a2) { flags |= GLITTER_EFFECT_FILE_EMISSION; *(uint64_t*)d = GLT_VAL != GLITTER_FT - ? hash_utf8_murmurhash(a2->name, 0, false) : hash_utf8_fnv1a64m(a2->name);; + ? hash_utf8_murmurhash(a2->name, 0, false) + : hash_utf8_fnv1a64m(a2->name, false);; *(int32_t*)(d + 8) = a2->data.appear_time; *(int32_t*)(d + 12) = a2->data.life_time; *(int32_t*)(d + 16) = a2->data.start_time; diff --git a/src/CRE/Glitter/effect_group.c b/src/CRE/Glitter/effect_group.c index 6385bf64..a5298ad4 100644 --- a/src/CRE/Glitter/effect_group.c +++ b/src/CRE/Glitter/effect_group.c @@ -116,7 +116,7 @@ void glitter_effect_group_load_model(glitter_effect_group* eg, void* ds) { return; vector_uint32_t* object_set_ids = &eg->object_set_ids; - if (!(object_set_ids->end - object_set_ids->begin)) + if (vector_length(*object_set_ids) < 1) return; for (uint32_t* i = object_set_ids->begin; i != object_set_ids->end; i++) { diff --git a/src/CRE/Glitter/effect_inst.c b/src/CRE/Glitter/effect_inst.c index 0040d342..f907deec 100644 --- a/src/CRE/Glitter/effect_inst.c +++ b/src/CRE/Glitter/effect_inst.c @@ -89,7 +89,7 @@ glitter_effect_inst* glitter_effect_inst_init(GPM, GLT, ei->random = glitter_random_get_value(ei->random_ptr); ei->mat = mat4_identity; - vector_ptr_glitter_emitter_inst_reserve(&ei->emitters, a1->emitters.end - a1->emitters.begin); + vector_ptr_glitter_emitter_inst_reserve(&ei->emitters, vector_length(a1->emitters)); for (i = a1->emitters.begin; i != a1->emitters.end; i++) { if (!*i) continue; @@ -226,8 +226,8 @@ static void glitter_effect_inst_get_ext_anim(glitter_effect_inst* a1) { glitter_effect_inst_ext_anim* inst_ext_anim = a1->ext_anim; if (a1->flags & GLITTER_EFFECT_INST_CHARA_ANIM) { - rob_chara_data* rob_chr_data = rob_chara_data_array_get(inst_ext_anim->chara_index); - if (!rob_chr_data) + rob_chara* rob_chr = rob_chara_array_get(inst_ext_anim->chara_index); + if (!rob_chr) return; mat4 mat = mat4_identity/*chara root mat*/; @@ -248,7 +248,7 @@ static void glitter_effect_inst_get_ext_anim(glitter_effect_inst* a1) { inst_ext_anim->mat = mat; } else { - mat4* bone_mat = rob_chara_data_get_bone_data_mat(rob_chr_data, bone_index); + mat4* bone_mat = rob_chara_get_bone_data_mat(rob_chr, bone_index); if (!bone_mat) return; @@ -306,8 +306,8 @@ static void glitter_effect_inst_get_ext_anim(glitter_effect_inst* a1) { mat4 mat = mat4_identity; int32_t chara_id = -1;// auth_3d_data_get_chara_id(inst_ext_anim->a3da_id); if (chara_id >= 0 && chara_id <= 5) { - rob_chara_data* rob_chr_data = rob_chara_data_array_get(chara_id); - if (rob_chr_data) { + rob_chara* rob_chr = rob_chara_array_get(chara_id); + if (rob_chr) { mat = mat4_identity/*chara root mat*/; vec3 scale; @@ -428,7 +428,7 @@ static void glitter_effect_inst_get_value(GLT, glitter_effect_inst* a1) { glitter_curve* curve; float_t value; - length = a1->effect->animation.end - a1->effect->animation.begin; + length = vector_length(a1->effect->animation); if (!length) return; @@ -495,7 +495,7 @@ static void glitter_effect_inst_update_init(GPM, GLT, float_t delta_frame; float_t start_time; - if (a1->data.start_time <= 0) + if (a1->data.start_time < 1) return; delta_frame = 2.0f; diff --git a/src/CRE/Glitter/emitter.c b/src/CRE/Glitter/emitter.c index e1fc816c..4ee62009 100644 --- a/src/CRE/Glitter/emitter.c +++ b/src/CRE/Glitter/emitter.c @@ -30,7 +30,7 @@ glitter_emitter* glitter_emitter_copy(glitter_emitter* e) { *ec = *e; ec->particles = vector_ptr_empty(glitter_particle); - vector_ptr_glitter_particle_reserve(&ec->particles, e->particles.end - e->particles.begin); + vector_ptr_glitter_particle_reserve(&ec->particles, vector_length(e->particles)); for (glitter_particle** i = e->particles.begin; i != e->particles.end; i++) if (*i) { glitter_particle* p = glitter_particle_copy(*i); diff --git a/src/CRE/Glitter/emitter_inst.c b/src/CRE/Glitter/emitter_inst.c index 0a753c39..b499071c 100644 --- a/src/CRE/Glitter/emitter_inst.c +++ b/src/CRE/Glitter/emitter_inst.c @@ -50,7 +50,7 @@ glitter_emitter_inst* glitter_emitter_inst_init(glitter_emitter* a1, ei->emission = GLITTER_EMITTER_EMISSION_ON_END; ei->loop = ei->data.flags & GLITTER_EMITTER_LOOP ? true : false; - vector_ptr_glitter_particle_inst_reserve(&ei->particles, a1->particles.end - a1->particles.begin); + vector_ptr_glitter_particle_inst_reserve(&ei->particles, vector_length(a1->particles)); for (i = a1->particles.begin; i != a1->particles.end; i++) { if (!*i) continue; @@ -228,7 +228,7 @@ static void glitter_emitter_inst_get_value(GLT, glitter_emitter_inst* a1) { glitter_curve* curve; float_t value; - length = a1->emitter->animation.end - a1->emitter->animation.begin; + length = vector_length(a1->emitter->animation); if (!length) return; diff --git a/src/CRE/Glitter/file_reader.c b/src/CRE/Glitter/file_reader.c index 2dfeac48..caa5dc97 100644 --- a/src/CRE/Glitter/file_reader.c +++ b/src/CRE/Glitter/file_reader.c @@ -23,7 +23,7 @@ glitter_file_reader* glitter_file_reader_init(GLT, fr->type = GLT_VAL; fr->hash = GLT_VAL != GLITTER_FT ? hash_utf8_murmurhash(fr->file, 0, false) - : hash_utf8_fnv1a64m(fr->file); + : hash_utf8_fnv1a64m(fr->file, false); return fr; } @@ -36,7 +36,7 @@ glitter_file_reader* glitter_file_reader_winit(GLT, fr->type = GLT_VAL; fr->hash = GLT_VAL != GLITTER_FT ? hash_utf8_murmurhash(fr->file, 0, false) - : hash_utf8_fnv1a64m(fr->file); + : hash_utf8_fnv1a64m(fr->file, false); return fr; } diff --git a/src/CRE/Glitter/list.c b/src/CRE/Glitter/list.c index 499777ef..a28da694 100644 --- a/src/CRE/Glitter/list.c +++ b/src/CRE/Glitter/list.c @@ -62,7 +62,7 @@ bool glitter_list_unpack_file(glitter_effect_group* a1, f2_struct* st) { else length = *(uint32_t*)d; - if (length != a1->effects.end - a1->effects.begin) { + if (length != vector_length(a1->effects)) { for (i = a1->effects.begin; i != a1->effects.end; i++) if (*i) memset((*i)->name, 0, 0x80); diff --git a/src/CRE/Glitter/locus_history.c b/src/CRE/Glitter/locus_history.c index b7e12d16..d4551e2a 100644 --- a/src/CRE/Glitter/locus_history.c +++ b/src/CRE/Glitter/locus_history.c @@ -22,7 +22,7 @@ void glitter_locus_history_append(glitter_locus_history* a1, vec3 temp1; data = a1->data.begin; - size = a1->data.end - a1->data.begin; + size = vector_length(a1->data); temp = a2->translation; if (a3->data.data.flags & GLITTER_PARTICLE_EMITTER_LOCAL && (emitter = a3->data.emitter)) { vec3 emit_trans; @@ -37,7 +37,7 @@ void glitter_locus_history_append(glitter_locus_history* a1, vector_glitter_locus_history_data_push_back(&a1->data, &locus_history); else if (size == 1) { locus_history.translation = data->translation; - if (a1->data.capacity_end - a1->data.begin > 1) + if (vector_capacity(a1->data) > 1) vector_glitter_locus_history_data_push_back(&a1->data, &locus_history); data->translation = temp; } @@ -47,7 +47,7 @@ void glitter_locus_history_append(glitter_locus_history* a1, for (i = size - 1; i > 0; i--) data[i].translation = data[i - 1].translation; - if (size < a1->data.capacity_end - a1->data.begin) { + if (size < vector_capacity(a1->data)) { locus_history.translation = temp1; vector_glitter_locus_history_data_push_back(&a1->data, &locus_history); } diff --git a/src/CRE/Glitter/render_element.c b/src/CRE/Glitter/render_element.c index a77a9484..a801157c 100644 --- a/src/CRE/Glitter/render_element.c +++ b/src/CRE/Glitter/render_element.c @@ -224,10 +224,10 @@ void glitter_render_element_update(GLT, has_translation = false; translation = vec3_null; - glitter_animation curv = particle->particle->animation; - length = curv.end - curv.begin; + glitter_animation* curv = &particle->particle->animation; + length = vector_length(*curv); for (int32_t i = 0; i < length; i++) { - curve = curv.begin[i]; + curve = curv->begin[i]; if (!glitter_curve_get_value(GLT_VAL, curve, a2->frame, &value, a2->random + i, a1->random_ptr)) continue; diff --git a/src/CRE/Glitter/render_group.c b/src/CRE/Glitter/render_group.c index 47adea6d..21f4d374 100644 --- a/src/CRE/Glitter/render_group.c +++ b/src/CRE/Glitter/render_group.c @@ -338,7 +338,7 @@ void glitter_render_group_draw(GPM, glitter_render_group* a1) { gl_state_bind_array_buffer(0); const GLenum mode = a1->type == GLITTER_PARTICLE_LINE ? GL_LINE_STRIP : GL_TRIANGLE_STRIP; - const size_t count = a1->vec_key.end - a1->vec_key.begin; + const size_t count = vector_length(a1->vec_key); for (size_t i = 0; i < count; i++) shader_draw_arrays(&shaders_ft, mode, a1->vec_key.begin[i], a1->vec_val.begin[i]); @@ -440,7 +440,7 @@ static glitter_render_element* glitter_render_group_add_render_element(glitter_r v3 = a1->count - (a2 - a1->elements); v4 = 0; - if (v3 <= 0) + if (v3 < 1) return 0; while (a2->alive) { @@ -470,7 +470,7 @@ static void glitter_render_group_calc_draw_line(glitter_render_group* a1) { glitter_locus_history_data* hist_data; size_t index; - if (!a1->elements || !a1->vbo || a1->ctrl <= 0) + if (!a1->elements || !a1->vbo || a1->ctrl < 1) return; for (count = 0, i = a1->ctrl, elem = a1->elements; i > 0; i--, elem++) { @@ -478,7 +478,7 @@ static void glitter_render_group_calc_draw_line(glitter_render_group* a1) { continue; if (elem->locus_history) { - size_t length = elem->locus_history->data.end - elem->locus_history->data.begin; + size_t length = vector_length(elem->locus_history->data); if (length > 1) count += length; } @@ -515,7 +515,7 @@ static void glitter_render_group_calc_draw_line(glitter_render_group* a1) { i--; hist = elem->locus_history; - if (!elem->draw || !hist || hist->data.end - hist->data.begin < 2) + if (!elem->draw || !hist || vector_length(hist->data) < 2) continue; if (has_scale) @@ -570,7 +570,7 @@ static void glitter_render_group_calc_draw_locus(GPM, glitter_render_group* a1) mat3 model_mat; - if (!a1->elements || !a1->vbo || a1->ctrl <= 0) + if (!a1->elements || !a1->vbo || a1->ctrl < 1) return; for (count = 0, i = a1->ctrl, elem = a1->elements; i > 0; i--, elem++) { @@ -579,7 +579,7 @@ static void glitter_render_group_calc_draw_locus(GPM, glitter_render_group* a1) if (elem->locus_history) { hist = elem->locus_history; - size_t length = elem->locus_history->data.end - elem->locus_history->data.begin; + size_t length = vector_length(elem->locus_history->data); if (length > 1) count += 2 * length; } @@ -634,17 +634,17 @@ static void glitter_render_group_calc_draw_locus(GPM, glitter_render_group* a1) i--; hist = elem->locus_history; - if (!elem->draw || !hist || hist->data.end - hist->data.begin < 2) + if (!elem->draw || !hist || vector_length(hist->data) < 2) continue; uv_u = elem->uv.x + elem->uv_scroll.x; uv_u_2nd = elem->uv.x + elem->uv_scroll.x + a1->split_uv.x; uv_v_2nd = elem->uv.y + elem->uv_scroll.y + a1->split_uv.y; - uv_v_scale = a1->split_uv.y / (float_t)(hist->data.end - hist->data.begin - 1); + uv_v_scale = a1->split_uv.y / (float_t)(vector_length(hist->data) - 1); uv_v_2nd = 1.0f - uv_v_2nd; - size_t len = elem->locus_history->data.end - elem->locus_history->data.begin; + size_t len = vector_length(elem->locus_history->data); for (j = 0, hist_data = hist->data.begin; hist_data != hist->data.end; j++, buf += 2, hist_data++) { pos = hist_data->translation; if (has_scale) { @@ -689,7 +689,7 @@ static void glitter_render_group_calc_draw_quad(GPM, glitter_render_group* a1) { mat4 view_mat; mat4 inv_view_mat; - if (!a1->elements || !a1->vbo || a1->ctrl <= 0) + if (!a1->elements || !a1->vbo || a1->ctrl < 1) return; if (a1->flags & GLITTER_PARTICLE_EMITTER_LOCAL) { diff --git a/src/CRE/Glitter/texture.c b/src/CRE/Glitter/texture.c index e4e50e32..5723ec53 100644 --- a/src/CRE/Glitter/texture.c +++ b/src/CRE/Glitter/texture.c @@ -11,8 +11,8 @@ bool glitter_texture_hashes_pack_file(glitter_effect_group* a1, f2_struct* st) { size_t d; size_t count; - if (a1->effects.end - a1->effects.begin < 1 || !a1->resources_count - || a1->resource_hashes.end - a1->resource_hashes.begin < 1) + if (vector_length(a1->effects) < 1 || !a1->resources_count + || vector_length(a1->resource_hashes) < 1) return false; count = a1->resources_count; @@ -54,7 +54,7 @@ bool glitter_texture_hashes_unpack_file(glitter_effect_group* a1, f2_struct* st) uint64_t* resource_hashes; size_t i; - if (a1->resources_count && a1->resource_hashes.end - a1->resource_hashes.begin > 0) + if (a1->resources_count && vector_length(a1->resource_hashes) > 0) return true; if (!st || !st->header.data_size) @@ -89,7 +89,7 @@ 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 (a1->resources_tex.end - a1->resources_tex.begin < 1) + if (vector_length(a1->resources_tex) < 1) return false; memset(st, 0, sizeof(f2_struct)); @@ -118,9 +118,9 @@ bool glitter_texture_load(GPM, glitter_effect_group* a1) { if (!a1->resources_count) return false; - size_t count = a1->resources_tex.end - a1->resources_tex.begin; + size_t count = vector_length(a1->resources_tex); - if (!count || !a1->resources_count || a1->resources_count != count) + if (count < 1 || a1->resources_count < 1 || a1->resources_count != count) return false; uint32_t* ids = force_malloc_s(uint32_t, count); diff --git a/src/CRE/GlitterX/curve_x_get_value.c b/src/CRE/GlitterX/curve_x_get_value.c index 2ea2fd85..38480c49 100644 --- a/src/CRE/GlitterX/curve_x_get_value.c +++ b/src/CRE/GlitterX/curve_x_get_value.c @@ -22,7 +22,7 @@ bool glitter_x_curve_get_value(glitter_curve* c, bool negate; float_t _value; - keys_count = c->keys.end - c->keys.begin; + keys_count = vector_length(c->keys); if (!keys_count) return false; @@ -106,7 +106,7 @@ static void glitter_x_curve_get_key_indexes(vector_glitter_curve_key* keys, size_t v9; size_t v10; - count = keys->end - keys->begin; + count = vector_length(*keys); if (count <= 1) { *curr = 0; *next = 0; diff --git a/src/CRE/GlitterX/effect_inst_x.c b/src/CRE/GlitterX/effect_inst_x.c index 5eb35bbe..57f0cfd1 100644 --- a/src/CRE/GlitterX/effect_inst_x.c +++ b/src/CRE/GlitterX/effect_inst_x.c @@ -103,7 +103,7 @@ glitter_effect_inst* glitter_x_effect_inst_init(GPM, glitter_effect* a1, ei->flags |= GLITTER_EFFECT_INST_FLAG_GET_EXT_ANIM_MAT; } - vector_ptr_glitter_emitter_inst_reserve(&ei->emitters, a1->emitters.end - a1->emitters.begin); + vector_ptr_glitter_emitter_inst_reserve(&ei->emitters, vector_length(a1->emitters)); for (i = a1->emitters.begin; i != a1->emitters.end; i++) { if (!*i) continue; @@ -411,7 +411,7 @@ static void glitter_x_effect_inst_get_value(glitter_effect_inst* a1) { glitter_curve* curve; float_t value; - length = a1->effect->animation.end - a1->effect->animation.begin; + length = vector_length(a1->effect->animation); if (!length) return; @@ -477,7 +477,7 @@ static void glitter_x_effect_inst_update_init(glitter_effect_inst* a1, float_t e float_t delta_frame; float_t start_time; - if (a1->data.start_time <= 0) + if (a1->data.start_time < 1) return; delta_frame = 2.0f; diff --git a/src/CRE/GlitterX/emitter_inst_x.c b/src/CRE/GlitterX/emitter_inst_x.c index 2876bdc8..a19ed46d 100644 --- a/src/CRE/GlitterX/emitter_inst_x.c +++ b/src/CRE/GlitterX/emitter_inst_x.c @@ -59,7 +59,7 @@ glitter_emitter_inst* glitter_x_emitter_inst_init(glitter_emitter* a1, ei->emission = GLITTER_EMITTER_EMISSION_ON_TIMER; ei->loop = ei->data.flags & GLITTER_EMITTER_LOOP ? true : false; - vector_ptr_glitter_particle_inst_reserve(&ei->particles, a1->particles.end - a1->particles.begin); + vector_ptr_glitter_particle_inst_reserve(&ei->particles, vector_length(a1->particles)); for (i = a1->particles.begin; i != a1->particles.end; i++) { if (!*i) continue; @@ -287,11 +287,8 @@ void glitter_x_emitter_inst_update(GPM, if (has_dist) { mat4_get_translation(&mat, &trans); - vec3 trans_diff; - vec3_sub(trans, trans_prev, trans_diff); - float_t trans_dist; - vec3_length(trans_diff, trans_dist); + vec3_distance(trans, trans_prev, trans_dist); a1->emission_timer -= trans_dist; } @@ -347,12 +344,9 @@ void glitter_x_emitter_inst_update_init(glitter_emitter_inst* a1, mat4_rot(&mat_ext_anim, rot.x, rot.y, rot.z, &a1->mat_rot); a1->mat = mat; - vec3 trans_diff; - mat4_get_translation(&mat, &trans); - vec3_sub(trans, trans_prev, trans_diff); - float_t trans_dist; - vec3_length(trans_diff, trans_dist); + mat4_get_translation(&mat, &trans); + vec3_distance(trans, trans_prev, trans_dist); a1->emission_timer -= trans_dist; } a1->flags |= GLITTER_EMITTER_INST_HAS_DISTANCE; @@ -383,7 +377,7 @@ static void glitter_x_emitter_inst_get_value(glitter_emitter_inst* a1) { glitter_curve* curve; float_t value; - length = a1->emitter->animation.end - a1->emitter->animation.begin; + length = vector_length(a1->emitter->animation); if (!length) return; diff --git a/src/CRE/GlitterX/locus_history_x.c b/src/CRE/GlitterX/locus_history_x.c index 42322cc6..61393ec2 100644 --- a/src/CRE/GlitterX/locus_history_x.c +++ b/src/CRE/GlitterX/locus_history_x.c @@ -22,7 +22,7 @@ void glitter_x_locus_history_append(glitter_locus_history* a1, vec3 temp1; data = a1->data.begin; - size = a1->data.end - a1->data.begin; + size = vector_length(a1->data); temp = a2->translation; if (a3->data.data.flags & GLITTER_PARTICLE_EMITTER_LOCAL && (emitter = a3->data.emitter)) { vec3 emit_trans; @@ -39,7 +39,7 @@ void glitter_x_locus_history_append(glitter_locus_history* a1, vector_glitter_locus_history_data_push_back(&a1->data, &locus_history); else if (size == 1) { locus_history.translation = data->translation; - if (a1->data.capacity_end - a1->data.begin > 1) + if (vector_capacity(a1->data) > 1) vector_glitter_locus_history_data_push_back(&a1->data, &locus_history); data->translation = temp; } @@ -49,7 +49,7 @@ void glitter_x_locus_history_append(glitter_locus_history* a1, for (i = size - 1; i > 0; i--) data[i].translation = data[i - 1].translation; - if (size < a1->data.capacity_end - a1->data.begin) { + if (size < vector_capacity(a1->data)) { locus_history.translation = temp1; vector_glitter_locus_history_data_push_back(&a1->data, &locus_history); } diff --git a/src/CRE/GlitterX/render_element_x.c b/src/CRE/GlitterX/render_element_x.c index a81212e3..a1892cb6 100644 --- a/src/CRE/GlitterX/render_element_x.c +++ b/src/CRE/GlitterX/render_element_x.c @@ -286,10 +286,10 @@ void glitter_x_render_element_update(glitter_render_group* a1, has_translation = false; translation = vec3_null; - glitter_animation curv = particle->particle->animation; - length = curv.end - curv.begin; + glitter_animation* curv = &particle->particle->animation; + length = vector_length(*curv); for (int32_t i = 0; i < length; i++) { - curve = curv.begin[i]; + curve = curv->begin[i]; if (!glitter_x_curve_get_value(curve, a2->frame, &value, a2->random + i, a1->random_ptr)) continue; diff --git a/src/CRE/GlitterX/render_group_x.c b/src/CRE/GlitterX/render_group_x.c index a5fc742b..5a0cdef0 100644 --- a/src/CRE/GlitterX/render_group_x.c +++ b/src/CRE/GlitterX/render_group_x.c @@ -333,7 +333,7 @@ void glitter_x_render_group_draw(GPM, glitter_render_group* a1) { gl_state_bind_array_buffer(0); const GLenum mode = a1->type == GLITTER_PARTICLE_LINE ? GL_LINE_STRIP : GL_TRIANGLE_STRIP; - const size_t count = a1->vec_key.end - a1->vec_key.begin; + const size_t count = vector_length(a1->vec_key); for (size_t i = 0; i < count; i++) shader_draw_arrays(&shaders_ft, mode, a1->vec_key.begin[i], a1->vec_val.begin[i]); @@ -463,7 +463,7 @@ static glitter_render_element* glitter_x_render_group_add_render_element(glitter v3 = a1->count - (a2 - a1->elements); v4 = 0; - if (v3 <= 0) + if (v3 < 1) return 0; while (a2->alive) { @@ -493,7 +493,7 @@ static void glitter_x_render_group_calc_draw_line(glitter_render_group* a1) { glitter_locus_history_data* hist_data; size_t index; - if (!a1->elements || !a1->vbo || a1->ctrl <= 0) + if (!a1->elements || !a1->vbo || a1->ctrl < 1) return; for (count = 0, i = a1->ctrl, elem = a1->elements; i > 0; i--, elem++) { @@ -501,7 +501,7 @@ static void glitter_x_render_group_calc_draw_line(glitter_render_group* a1) { continue; if (elem->locus_history) { - size_t length = elem->locus_history->data.end - elem->locus_history->data.begin; + size_t length = vector_length(elem->locus_history->data); if (length > 1) count += length; } @@ -537,7 +537,7 @@ static void glitter_x_render_group_calc_draw_line(glitter_render_group* a1) { i--; hist = elem->locus_history; - if (!elem->draw || !hist || hist->data.end - hist->data.begin < 2) + if (!elem->draw || !hist || vector_length(hist->data) < 2) continue; if (has_scale) @@ -592,7 +592,7 @@ static void glitter_x_render_group_calc_draw_locus(GPM, glitter_render_group* a1 mat4 mat; mat3 model_mat; - if (!a1->elements || !a1->vbo || a1->ctrl <= 0) + if (!a1->elements || !a1->vbo || a1->ctrl < 1) return; for (count = 0, i = a1->ctrl, elem = a1->elements; i > 0; i--, elem++) { @@ -600,7 +600,7 @@ static void glitter_x_render_group_calc_draw_locus(GPM, glitter_render_group* a1 continue; if (elem->locus_history) { - size_t length = elem->locus_history->data.end - elem->locus_history->data.begin; + size_t length = vector_length(elem->locus_history->data); if (length > 1) count += 2 * length; } @@ -651,13 +651,13 @@ static void glitter_x_render_group_calc_draw_locus(GPM, glitter_render_group* a1 i--; hist = elem->locus_history; - if (!elem->draw || !hist || hist->data.end - hist->data.begin < 2) + if (!elem->draw || !hist || vector_length(hist->data) < 2) continue; uv_u = elem->uv.x + elem->uv_scroll.x; uv_u_2nd = elem->uv.x + elem->uv_scroll.x + a1->split_uv.x; uv_v_2nd = elem->uv.y + elem->uv_scroll.y + a1->split_uv.y; - uv_v_scale = a1->split_uv.y / (float_t)(hist->data.end - hist->data.begin - 1); + uv_v_scale = a1->split_uv.y / (float_t)(vector_length(hist->data) - 1); uv_v_2nd = 1.0f - uv_v_2nd; @@ -910,7 +910,7 @@ static void glitter_x_render_group_calc_draw_quad(GPM, glitter_render_group* a1) mat4 view_mat; mat4 inv_view_mat; - if (!a1->elements || !a1->vbo || a1->ctrl <= 0) + if (!a1->elements || !a1->vbo || a1->ctrl < 1) return; if (a1->flags & GLITTER_PARTICLE_EMITTER_LOCAL) { diff --git a/src/CRE/auth_3d.c b/src/CRE/auth_3d.c index d5858ec8..cb870c08 100644 --- a/src/CRE/auth_3d.c +++ b/src/CRE/auth_3d.c @@ -334,127 +334,127 @@ void auth_3d_load(auth_3d* auth, a3da* auth_file, auth->last_frame = auth->play_control.size; auth->paused = false; - if (auth_file->ambient.end - auth_file->ambient.begin > 0) { + if (vector_length(auth_file->ambient) > 0) { vector_auth_3d_ambient* va = &auth->ambient; vector_a3da_ambient* vaf = &auth_file->ambient; - vector_auth_3d_ambient_reserve(va, vaf->end - vaf->begin); + vector_auth_3d_ambient_reserve(va, vector_length(*vaf)); for (auth_3d_ambient_file* i = vaf->begin; i != vaf->end; i++) auth_3d_ambient_load(auth, i); } - if (auth_file->auth_2d.end - auth_file->auth_2d.begin > 0) { + if (vector_length(auth_file->auth_2d) > 0) { vector_string* va2 = &auth->auth_2d; vector_string* va2f = &auth_file->auth_2d; - vector_string_reserve(va2, va2f->end - va2f->begin); + vector_string_reserve(va2, vector_length(*va2f)); for (string* i = va2f->begin; i != va2f->end; i++) { string* m = vector_string_reserve_back(va2f); string_copy(i, m); } } - if (auth_file->camera_root.end - auth_file->camera_root.begin > 0) { + if (vector_length(auth_file->camera_root) > 0) { vector_auth_3d_camera_root* vcr = &auth->camera_root; vector_a3da_camera_root* vcrf = &auth_file->camera_root; - vector_auth_3d_camera_root_reserve(vcr, vcrf->end - vcrf->begin); + vector_auth_3d_camera_root_reserve(vcr, vector_length(*vcrf)); for (auth_3d_camera_root_file* i = vcrf->begin; i != vcrf->end; i++) auth_3d_camera_root_load(auth, i); } - if (auth_file->chara.end - auth_file->chara.begin > 0) { + if (vector_length(auth_file->chara) > 0) { vector_auth_3d_chara* vc = &auth->chara; vector_a3da_chara* vcf = &auth_file->chara; - vector_auth_3d_chara_reserve(vc, vcf->end - vcf->begin); + vector_auth_3d_chara_reserve(vc, vector_length(*vcf)); for (auth_3d_chara_file* i = vcf->begin; i != vcf->end; i++) auth_3d_chara_load(auth, i); } - if (auth_file->curve.end - auth_file->curve.begin > 0) { + if (vector_length(auth_file->curve) > 0) { vector_auth_3d_curve* vc = &auth->curve; vector_a3da_curve* vcf = &auth_file->curve; - vector_auth_3d_curve_reserve(vc, vcf->end - vcf->begin); + vector_auth_3d_curve_reserve(vc, vector_length(*vcf)); for (auth_3d_curve_file* i = vcf->begin; i != vcf->end; i++) auth_3d_curve_load(auth, i); } - if (auth_file->event.end - auth_file->event.begin > 0) { + if (vector_length(auth_file->event) > 0) { vector_auth_3d_event* ve = &auth->event; vector_a3da_event* vef = &auth_file->event; - vector_auth_3d_event_reserve(ve, vef->end - vef->begin); + vector_auth_3d_event_reserve(ve, vector_length(*vef)); for (auth_3d_event_file* i = vef->begin; i != vef->end; i++) auth_3d_event_load(auth, i); } - if (auth_file->fog.end - auth_file->fog.begin > 0) { + if (vector_length(auth_file->fog) > 0) { vector_auth_3d_fog* vf = &auth->fog; vector_a3da_fog* vff = &auth_file->fog; - vector_auth_3d_fog_reserve(vf, vff->end - vff->begin); + vector_auth_3d_fog_reserve(vf, vector_length(*vff)); for (auth_3d_fog_file* i = vff->begin; i != vff->end; i++) auth_3d_fog_load(auth, i); } - if (auth_file->light.end - auth_file->light.begin > 0) { + if (vector_length(auth_file->light) > 0) { vector_auth_3d_light* vl = &auth->light; vector_a3da_light* vlf = &auth_file->light; - vector_auth_3d_light_reserve(vl, vlf->end - vlf->begin); + vector_auth_3d_light_reserve(vl, vector_length(*vlf)); for (auth_3d_light_file* i = vlf->begin; i != vlf->end; i++) auth_3d_light_load(auth, i); } - if (auth_file->m_object_hrc.end - auth_file->m_object_hrc.begin > 0) { + if (vector_length(auth_file->m_object_hrc) > 0) { vector_auth_3d_m_object_hrc* vmoh = &auth->m_object_hrc; vector_a3da_m_object_hrc* vmohf = &auth_file->m_object_hrc; - vector_auth_3d_m_object_hrc_reserve(vmoh, vmohf->end - vmohf->begin); + vector_auth_3d_m_object_hrc_reserve(vmoh, vector_length(*vmohf)); for (auth_3d_m_object_hrc_file* i = vmohf->begin; i != vmohf->end; i++) auth_3d_m_object_hrc_load(auth, i, obj_db); } - if (auth_file->material_list.end - auth_file->material_list.begin > 0) { + if (vector_length(auth_file->material_list) > 0) { vector_auth_3d_material_list* vml = &auth->material_list; vector_a3da_material_list* vmlf = &auth_file->material_list; - vector_auth_3d_material_list_reserve(vml, vmlf->end - vmlf->begin); + vector_auth_3d_material_list_reserve(vml, vector_length(*vmlf)); for (auth_3d_material_list_file* i = vmlf->begin; i != vmlf->end; i++) auth_3d_material_list_load(auth, i); } - if (auth_file->motion.end - auth_file->motion.begin > 0) { + if (vector_length(auth_file->motion) > 0) { vector_string* vm = &auth->motion; vector_string* vmf = &auth_file->motion; - vector_string_reserve(vm, vmf->end - vmf->begin); + vector_string_reserve(vm, vector_length(*vmf)); for (string* i = vmf->begin; i != vmf->end; i++) { string* m = vector_string_reserve_back(vm); string_copy(i, m); } } - if (auth_file->object.end - auth_file->object.begin > 0) { + if (vector_length(auth_file->object) > 0) { vector_auth_3d_object* vo = &auth->object; vector_a3da_object* vof = &auth_file->object; - vector_auth_3d_object_reserve(vo, vof->end - vof->begin); + vector_auth_3d_object_reserve(vo, vector_length(*vof)); for (auth_3d_object_file* i = vof->begin; i != vof->end; i++) auth_3d_object_load(auth, i, obj_db, tex_db); } - if (auth_file->object_hrc.end - auth_file->object_hrc.begin > 0) { + if (vector_length(auth_file->object_hrc) > 0) { vector_auth_3d_object_hrc* voh = &auth->object_hrc; vector_a3da_object_hrc* vohf = &auth_file->object_hrc; - vector_auth_3d_object_hrc_reserve(voh, vohf->end - vohf->begin); + vector_auth_3d_object_hrc_reserve(voh, vector_length(*vohf)); for (auth_3d_object_hrc_file* i = vohf->begin; i != vohf->end; i++) auth_3d_object_hrc_load(auth, i, obj_db); } - if (auth_file->point.end - auth_file->point.begin > 0) { + if (vector_length(auth_file->point) > 0) { vector_auth_3d_point* vp = &auth->point; vector_a3da_point* vpf = &auth_file->point; - vector_auth_3d_point_reserve(vp, vpf->end - vpf->begin); + vector_auth_3d_point_reserve(vp, vector_length(*vpf)); for (auth_3d_point_file* i = vpf->begin; i != vpf->end; i++) auth_3d_point_load(auth, i); } - if (auth_file->m_object_hrc_list.end - auth_file->m_object_hrc_list.begin > 0) { + if (vector_length(auth_file->m_object_hrc_list) > 0) { vector_auth_3d_m_object_hrc* vmoh = &auth->m_object_hrc; vector_ptr_auth_3d_m_object_hrc* vmohl = &auth->m_object_hrc_list; vector_string* vmohlf = &auth_file->m_object_hrc_list; - vector_ptr_auth_3d_m_object_hrc_reserve(vmohl, vmohlf->end - vmohlf->begin); + vector_ptr_auth_3d_m_object_hrc_reserve(vmohl, vector_length(*vmohlf)); for (string* i = vmohlf->begin; i != vmohlf->end; i++) for (auth_3d_m_object_hrc* j = vmoh->begin; vmoh->begin != vmoh->end; j++) if (string_compare(i, &j->name)) { @@ -463,11 +463,11 @@ void auth_3d_load(auth_3d* auth, a3da* auth_file, } } - if (auth_file->object_list.end - auth_file->object_list.begin > 0) { + if (vector_length(auth_file->object_list) > 0) { vector_auth_3d_object* vo = &auth->object; vector_ptr_auth_3d_object* vol = &auth->object_list; vector_string* volf = &auth_file->object_list; - vector_ptr_auth_3d_object_reserve(vol, volf->end - volf->begin); + vector_ptr_auth_3d_object_reserve(vol, vector_length(*volf)); for (string* i = volf->begin; i != volf->end; i++) for (auth_3d_object* j = vo->begin; vo->begin != vo->end; j++) if (string_compare(i, &j->name)) { @@ -476,11 +476,11 @@ void auth_3d_load(auth_3d* auth, a3da* auth_file, } } - if (auth_file->object_hrc_list.end - auth_file->object_hrc_list.begin > 0) { + if (vector_length(auth_file->object_hrc_list) > 0) { vector_auth_3d_object_hrc* voh = &auth->object_hrc; vector_ptr_auth_3d_object_hrc* vohl = &auth->object_hrc_list; vector_string* vohlf = &auth_file->object_hrc_list; - vector_ptr_auth_3d_object_hrc_reserve(vohl, vohlf->end - vohlf->begin); + vector_ptr_auth_3d_object_hrc_reserve(vohl, vector_length(*vohlf)); for (string* i = vohlf->begin; i != vohlf->end; i++) for (auth_3d_object_hrc* j = voh->begin; voh->begin != voh->end; j++) if (string_compare(i, &j->name)) { @@ -489,7 +489,7 @@ void auth_3d_load(auth_3d* auth, a3da* auth_file, } } - if (auth->object.end - auth->object.begin > 0) { + if (vector_length(auth->object) > 0) { vector_auth_3d_object* vo = &auth->object; vector_auth_3d_object_hrc* voh = &auth->object_hrc; for (auth_3d_object* i = vo->begin; i != vo->end; i++) { @@ -523,7 +523,7 @@ void auth_3d_load(auth_3d* auth, a3da* auth_file, } } - if (auth->object_hrc.end - auth->object_hrc.begin > 0) { + if (vector_length(auth->object_hrc) > 0) { vector_auth_3d_object* vo = &auth->object; vector_auth_3d_object_hrc* voh = &auth->object_hrc; for (auth_3d_object_hrc* i = voh->begin; i != voh->end; i++) { @@ -618,7 +618,7 @@ void auth_3d_farc_load(auth_3d_farc* f, void* data, char* name, object_database* string_init(&file, name); string_add_length(&file, ".farc", 5); data_struct_load_file(data, &f->auth_3d_farc, - "rom\\auth_3d\\", string_data(&file), farc_load_file); + "rom/auth_3d/", string_data(&file), farc_load_file); string_free(&file); bool found_base = false; @@ -1485,8 +1485,7 @@ void auth_3d_data_init() { } inline int32_t auth_3d_data_load_uid(int32_t uid, auth_3d_database* auth_3d_db) { - if (uid >= auth_3d_db->uid.end - auth_3d_db->uid.begin - || !auth_3d_db->uid.begin[uid].enabled) + if (uid >= vector_length(auth_3d_db->uid) || !auth_3d_db->uid.begin[uid].enabled) return -1; int32_t index = 0; @@ -1526,7 +1525,7 @@ mat4* auth_3d_data_struct_get_auth_3d_object_mat(int32_t id, size_t index, bool if (hrc) return auth_3d_get_auth_3d_object_hrc_bone_mats(auth, index); - if ((ssize_t)index < auth->object.end - auth->object.begin) { + if ((ssize_t)index < vector_length(auth->object)) { mat4u_to_mat4(&auth->object.begin[index].model_transform.mat, mat); return mat; } @@ -1606,14 +1605,13 @@ static kft3* auth_3d_key_find_keyframe(auth_3d_key* data, float_t frame) { kft3* key = data->keys; size_t length = data->length; size_t temp; - while (length > 0) { + while (length > 0) if (frame < key[temp = length / 2].frame) length = temp; else { key += temp + 1; length -= temp + 1; } - } return key; } @@ -1724,7 +1722,7 @@ static void auth_3d_key_load(auth_3d* auth, auth_3d_key* k, auth_3d_key_file* kf k->frame_delta = k->max_frame; k->value_delta = 0.0f; - ssize_t length = kf->keys.end - kf->keys.begin; + ssize_t length = vector_length(kf->keys); switch (kf->type) { case A3DA_KEY_NONE: k->type = AUTH_3D_KEY_NONE; @@ -1866,8 +1864,7 @@ static int32_t auth_3d_get_auth_3d_object_index_by_object_info(auth_3d* auth, ob static mat4* auth_3d_get_auth_3d_object_hrc_bone_mats(auth_3d* auth, size_t index) { vector_auth_3d_object_hrc* voh = &auth->object_hrc; - if ((ssize_t)index >= voh->end - voh->begin - || voh->begin[index].mats.begin == voh->begin[index].mats.end) + if ((ssize_t)index >= vector_length(*voh) || vector_length(voh->begin[index].mats) < 1) return 0; return voh->begin[index].mats.begin; } @@ -2118,10 +2115,8 @@ static void auth_3d_dof_data_set(auth_3d_dof* d, render_context* rctx) { vec3 view_point; camera_get_view_point(rctx->camera, &view_point); - vec3 diff; float_t focus; - vec3_sub(d->model_transform.translation_value, view_point, diff); - vec3_length(diff, focus); + vec3_distance(d->model_transform.translation_value, view_point, focus); dof_pv pv; pv.enable = fabsf(d->model_transform.rotation_value.z) > 0.000001f; @@ -2516,7 +2511,7 @@ static void auth_3d_m_object_hrc_load(auth_3d* auth, auth_3d_m_object_hrc* moh = vector_auth_3d_m_object_hrc_reserve_back(&auth->m_object_hrc); - vector_auth_3d_object_node_reserve(&moh->node, mohf->node.end - mohf->node.begin); + vector_auth_3d_object_node_reserve(&moh->node, vector_length(mohf->node)); for (auth_3d_object_node_file* i = mohf->node.begin; i != mohf->node.end; i++) auth_3d_object_node_load(auth, &moh->node, i); @@ -2571,7 +2566,7 @@ static void auth_3d_m_object_hrc_data_set(auth_3d_m_object_hrc* moh, auth_3d* au vector_vec3_push_back(&shad->field_1D0[shadow_type], &pos); } - if (i->mats.end - i->mats.begin > 0) { + if (vector_length(i->mats) > 0) { mat4 mat; mat4u_to_mat4(&i->model_transform.mat, &mat); draw_task_add_draw_object_by_object_info_object_skin(rctx, @@ -2588,7 +2583,7 @@ static void auth_3d_m_object_hrc_list_get_value(auth_3d_m_object_hrc* moh, mat4* return; auth_3d_object_node* node = moh->node.begin; - size_t instance_count = moh->instance.end - moh->instance.begin; + size_t instance_count = vector_length(moh->instance); auth_3d_m_object_hrc_nodes_mat_mult(moh); @@ -2603,7 +2598,7 @@ static void auth_3d_m_object_hrc_list_get_value(auth_3d_m_object_hrc* moh, mat4* auth_3d_object_model_transform_mat_mult(&i->model_transform, &mat); int32_t* object_bone_indices = i->object_bone_indices.begin; - size_t object_bone_indices_count = i->object_bone_indices.end - i->object_bone_indices.begin; + size_t object_bone_indices_count = vector_length(i->object_bone_indices); mat4* mats = i->mats.begin; for (size_t j = 0; j < object_bone_indices_count; j++) mat4u_to_mat4(&node[object_bone_indices[j]].model_transform.mat, &mats[j]); @@ -2668,13 +2663,13 @@ static void auth_3d_object_load(auth_3d* auth, auth_3d_object_file* of, auth_3d_object_curve_load(auth, &o->pattern, &of->pattern, of->pattern_offset); vector_auth_3d_object_texture_pattern_reserve(&o->texture_pattern, - of->texture_pattern.end - of->texture_pattern.begin); + vector_length(of->texture_pattern)); for (auth_3d_object_texture_pattern_file* i = of->texture_pattern.begin; i != of->texture_pattern.end; i++) auth_3d_object_texture_pattern_load(auth, o, i, tex_db); vector_auth_3d_object_texture_transform_reserve(&o->texture_transform, - of->texture_transform.end - of->texture_transform.begin); + vector_length(of->texture_transform)); for (auth_3d_object_texture_transform_file* i = of->texture_transform.begin; i != of->texture_transform.end; i++) auth_3d_object_texture_transform_load(auth, o, i, tex_db); @@ -2865,7 +2860,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, string_copy(&ohf->name, &oh->name); - vector_auth_3d_object_node_reserve(&oh->node, ohf->node.end - ohf->node.begin); + vector_auth_3d_object_node_reserve(&oh->node, vector_length(ohf->node)); for (auth_3d_object_node_file* i = ohf->node.begin; i != ohf->node.end; i++) auth_3d_object_node_load(auth, &oh->node, i); @@ -2938,7 +2933,7 @@ static void auth_3d_object_hrc_data_set(auth_3d_object_hrc* oh, auth_3d* auth, r vector_vec3_push_back(&shad->field_1D0[SHADOW_STAGE], &pos); } - if (oh->mats.end - oh->mats.begin > 0) { + if (vector_length(oh->mats) > 0) { mat4 mat = mat4_identity; draw_task_add_draw_object_by_object_info_object_skin(rctx, oh->object_info, 0, 0, auth->alpha, oh->mats.begin, 0, 0, &mat); @@ -2957,14 +2952,13 @@ static void auth_3d_object_hrc_data_set(auth_3d_object_hrc* oh, auth_3d* auth, r } static void auth_3d_object_hrc_list_get_value(auth_3d_object_hrc* oh, mat4* mat) { - if (!(oh->node.end - oh->node.begin) - || ! oh->node.begin[0].model_transform.visible) + if (vector_length(oh->node) < 1 || !oh->node.begin[0].model_transform.visible) return; auth_3d_object_hrc_nodes_mat_mult(oh, mat); int32_t* childer_object_parent_node = oh->childer_object_parent_node.begin; - size_t children_object_count = oh->children_object.end - oh->children_object.begin; + size_t children_object_count = vector_length(oh->children_object); for (size_t i = 0; i < children_object_count; i++) { mat4 mat; mat4u_to_mat4(&oh->node.begin[childer_object_parent_node[i]].model_transform.mat, &mat); @@ -2972,7 +2966,7 @@ static void auth_3d_object_hrc_list_get_value(auth_3d_object_hrc* oh, mat4* mat) } int32_t* childer_object_hrc_parent_node = oh->childer_object_hrc_parent_node.begin; - size_t children_object_hrc_count = oh->children_object_hrc.end - oh->children_object_hrc.begin; + size_t children_object_hrc_count = vector_length(oh->children_object_hrc); for (size_t i = 0; i < children_object_hrc_count; i++) { mat4 mat; mat4u_to_mat4(&oh->node.begin[childer_object_hrc_parent_node[i]].model_transform.mat, &mat); diff --git a/src/CRE/camera.c b/src/CRE/camera.c index 68c84d53..a266f0ee 100644 --- a/src/CRE/camera.c +++ b/src/CRE/camera.c @@ -16,7 +16,7 @@ static void camera_calculate_forward(camera* c); void camera_initialize(camera* c, double_t aspect, int32_t width, int32_t height) { c->aspect = aspect; - c->fov = 32.2673416137695; + c->fov = 0.0; c->forward = (vec3){ 0.0f, 0.0f, -1.0f }; c->rotation = (vec3){ 0.0f, 0.0f, 0.0f }; c->view_point = (vec3){ 0.0, 0.0f, 0.0f }; @@ -35,7 +35,9 @@ void camera_initialize(camera* c, double_t aspect, int32_t width, int32_t height camera_set_pitch(c, 0.0); camera_set_yaw(c, 0.0); camera_set_roll(c, 0.0); + camera_set_fov(c, 32.2673416137695); camera_calculate_forward(c); + camera_set_position(c, &((vec3){ 0.0, 0.0f, 0.0f})); camera_update(c); } diff --git a/src/CRE/data.c b/src/CRE/data.c index 05cfbe7d..2c233387 100644 --- a/src/CRE/data.c +++ b/src/CRE/data.c @@ -23,10 +23,9 @@ static void data_load_glitter_list(data_struct* ds, char* path); #endif void data_struct_init() { - for (data_type i = DATA_AFT; i < DATA_MAX; i++) { - memset(&data_list[i], 0, sizeof(data_struct)); + memset(data_list, 0, sizeof(data_struct) * DATA_MAX); + for (data_type i = DATA_AFT; i < DATA_MAX; i++) data_list[i].type = i; - } } void data_struct_load(char* path) { @@ -59,16 +58,20 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, vector_data_str vector_data_struct_file_clear(data_files, data_struct_file_free); 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; - if (dir_len != 3) { - dir += 4; - dir_len -= 4; - } - else { - dir += 3; - dir_len = 0; + dir += 3; + dir_len -= 3; + + while (*dir == '/' || *dir == '\\') { + dir++; + dir_len--; } size_t max_len = 0; @@ -77,6 +80,13 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, vector_data_str if (max_len < j->path.length) max_len = j->path.length; + char* dir_temp = force_malloc(dir_len + 1); + memcpy(dir_temp, dir, dir_len + 1); + + char* t = dir_temp; + while (t = strchr(t, '/')) + *t = '\\'; + char* temp = force_malloc(max_len + dir_len + 2); for (data_struct_path* i = ds->data_paths.begin; i != ds->data_paths.end; i++) for (data_struct_directory* j = i->data.begin; j != i->data.end; j++) { @@ -86,7 +96,7 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, vector_data_str memcpy(temp, path, path_len); memcpy(&temp[path_len], "\\", 2); if (dir_len) - memcpy(&temp[path_len + 1], dir, dir_len + 1); + memcpy(&temp[path_len + 1], dir_temp, dir_len + 1); vector_string files = vector_empty(string); path_get_files(&files, temp); @@ -112,22 +122,27 @@ void data_struct_get_directory_files(data_struct* ds, char* dir, vector_data_str vector_string_free(&files, string_free); } + free(dir_temp); free(temp); } 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)) { 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; - if (dir_len != 3) { - dir += 4; - dir_len -= 4; - } - else { - dir += 3; - dir_len = 0; + dir += 3; + dir_len -= 3; + + while (*dir == '/' || *dir == '\\') { + dir++; + dir_len--; } size_t max_len = 0; @@ -136,6 +151,13 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, if (max_len < j->path.length) max_len = j->path.length; + char* dir_temp = force_malloc(dir_len + 1); + memcpy(dir_temp, dir, dir_len + 1); + + char* t = dir_temp; + while(t = strchr(t, '/')) + *t = '\\'; + char* temp = force_malloc(max_len + dir_len + 2); for (data_struct_path* i = ds->data_paths.begin; i != ds->data_paths.end; i++) for (data_struct_directory* j = i->data.begin; j != i->data.end; j++) { @@ -145,7 +167,7 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, memcpy(temp, path, path_len); memcpy(&temp[path_len], "\\", 2); if (dir_len) - memcpy(&temp[path_len + 1], dir, dir_len + 1); + memcpy(&temp[path_len + 1], dir_temp, dir_len + 1); vector_string files = vector_empty(string); path_get_files(&files, temp); @@ -168,11 +190,13 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, vector_string_free(&files, string_free); if (ret) { + free(dir_temp); free(temp); return true; } } + free(dir_temp); free(temp); return false; } @@ -180,16 +204,20 @@ bool data_struct_load_file(data_struct* ds, void* data, char* dir, char* file, 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)) { 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; - if (dir_len != 3) { - dir += 4; - dir_len -= 4; - } - else { - dir += 3; - dir_len = 0; + dir += 3; + dir_len -= 3; + + while (*dir == '/' || *dir == '\\') { + dir++; + dir_len--; } size_t max_len = 0; @@ -198,6 +226,13 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 if (max_len < j->path.length) max_len = j->path.length; + char* dir_temp = force_malloc(dir_len + 1); + memcpy(dir_temp, dir, dir_len + 1); + + char* t = dir_temp; + while (t = strchr(t, '/')) + *t = '\\'; + char* temp = force_malloc(max_len + dir_len + 2); for (data_struct_path* i = ds->data_paths.begin; i != ds->data_paths.end; i++) for (data_struct_directory* j = i->data.begin; j != i->data.end; j++) { @@ -207,13 +242,13 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 memcpy(temp, path, path_len); memcpy(&temp[path_len], "\\", 2); if (dir_len) - memcpy(&temp[path_len + 1], dir, dir_len + 1); + memcpy(&temp[path_len + 1], dir_temp, dir_len + 1); vector_string files = vector_empty(string); path_get_files(&files, temp); vector_uint32_t files_murmurhash = vector_empty(uint32_t); - vector_uint32_t_reserve(&files_murmurhash, files.end - files.begin); + vector_uint32_t_reserve(&files_murmurhash, vector_length(files)); for (string* l = files.begin; l != files.end; l++) { char* t = strrchr(string_data(l), '.'); size_t t_len = l->length; @@ -236,11 +271,13 @@ bool data_struct_load_file_by_hash(data_struct* ds, void* data, char* dir, uint3 vector_uint32_t_free(&files_murmurhash, 0); if (ret) { + free(dir_temp); free(temp); return true; } } + free(dir_temp); free(temp); return false; } @@ -364,8 +401,7 @@ static void data_load_inner(stream* s) { for (size_t i = 0; i < count; i++) { char* s = lines[i]; - data_struct* ds - = 0; + data_struct* ds = 0; char* main_rom = "rom"; char* add_data_rom = "rom"; char* add_data = ""; @@ -535,8 +571,7 @@ static void data_load_inner(stream* s) { char* data_dir_path_temp = force_malloc(add_data_rom_path_len + max_len + add_data_rom_len + 3); if (data_dir_path_temp) { - vector_data_struct_directory_reserve(&j->data, - data_directories.end - data_directories.begin + 1); + vector_data_struct_directory_reserve(&j->data, vector_length(data_directories) + 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--) { @@ -579,12 +614,12 @@ static void data_load_inner(stream* s) { auth_3d_database_file* base_auth_3d_db = &d->base_auth_3d_db; auth_3d_database_file_init(base_auth_3d_db); - data_struct_load_file(ds, base_auth_3d_db, "rom\\auth_3d\\", + data_struct_load_file(ds, 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; auth_3d_database_file_init(&mdata_auth_3d_db); - data_struct_load_file(ds, &mdata_auth_3d_db, "rom\\auth_3d\\", + data_struct_load_file(ds, &mdata_auth_3d_db, "rom/auth_3d/", "mdata_auth_3d_db.bin", auth_3d_database_file_load_file); auth_3d_database* auth_3d_db = &d->auth_3d_db; @@ -595,17 +630,17 @@ static void data_load_inner(stream* s) { bone_database* bone_data = &d->bone_data; bone_database_init(bone_data); bone_data->modern = false; - data_struct_load_file(ds, bone_data, "rom\\", + data_struct_load_file(ds, bone_data, "rom/", "bone_data.bin", bone_database_load_file); motion_database* base_mot_db = &d->base_mot_db; motion_database_init(base_mot_db); - data_struct_load_file(ds, base_mot_db, "rom\\rob\\", + data_struct_load_file(ds, base_mot_db, "rom/rob/", "mot_db.farc", motion_database_load_file); motion_database mdata_mot_db; motion_database_init(&mdata_mot_db); - data_struct_load_file(ds, &mdata_mot_db, "rom\\rob\\", + data_struct_load_file(ds, &mdata_mot_db, "rom/rob/", "mdata_mot_db.farc", motion_database_load_file); motion_database* mot_db = &d->mot_db; @@ -616,13 +651,13 @@ 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->modern = false; - data_struct_load_file(ds, base_obj_db, "rom\\objset\\", + data_struct_load_file(ds, 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\\", + data_struct_load_file(ds, &mdata_obj_db, "rom/objset/", "mdata_obj_db.bin", object_database_load_file); object_database* obj_db = &d->obj_db; @@ -633,13 +668,13 @@ static void data_load_inner(stream* s) { 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\\", + data_struct_load_file(ds, 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\\", + data_struct_load_file(ds, &mdata_stage_data, "rom/", "mdata_stage_data.bin", stage_database_load_file); stage_database* stage_data = &d->stage_data; @@ -650,13 +685,13 @@ static void data_load_inner(stream* s) { texture_database* base_tex_db = &d->base_tex_db; texture_database_init(base_tex_db); base_tex_db->modern = false; - data_struct_load_file(ds, base_tex_db, "rom\\objset\\", + data_struct_load_file(ds, base_tex_db, "rom/objset/", "tex_db.bin", texture_database_load_file); texture_database mdata_tex_db; texture_database_init(&mdata_tex_db); mdata_tex_db.modern = false; - data_struct_load_file(ds, &mdata_tex_db, "rom\\objset\\", + data_struct_load_file(ds, &mdata_tex_db, "rom/objset/", "mdata_tex_db.bin", texture_database_load_file); texture_database* tex_db = &d->tex_db; @@ -689,7 +724,7 @@ static void data_load_inner(stream* s) { bone_database* bone_data = &d->bone_data; bone_database_init(bone_data); bone_data->modern = true; - data_struct_load_file(ds, bone_data, "rom\\", + data_struct_load_file(ds, bone_data, "rom/", "bone_data.bon", bone_database_load_file); } @@ -700,7 +735,7 @@ static void data_load_inner(stream* s) { bone_database* bone_data = &d->bone_data; bone_database_init(bone_data); bone_data->modern = true; - data_struct_load_file(ds, bone_data, "rom\\", + data_struct_load_file(ds, bone_data, "rom/", "bone_data.bon", bone_database_load_file); } @@ -711,7 +746,7 @@ static void data_load_inner(stream* s) { bone_database* bone_data = &d->bone_data; bone_database_init(bone_data); bone_data->modern = true; - data_struct_load_file(ds, bone_data, "rom\\", + data_struct_load_file(ds, bone_data, "rom/", "bone_data.bon", bone_database_load_file); } #endif @@ -763,7 +798,7 @@ static void data_load_glitter_list(data_struct* ds, char* path) { vector_uint64_t_reserve(&ds->glitter_list_fnv1a64m, count); for (size_t i = 0; i < count; i++) { size_t len = ds->glitter_list_names.begin[i].length; - uint64_t hash = hash_fnv1a64m(lines[i], len); + uint64_t hash = hash_fnv1a64m(lines[i], len, false); vector_uint64_t_push_back(&ds->glitter_list_fnv1a64m, &hash); } break; diff --git a/src/CRE/draw_object.c b/src/CRE/draw_object.c index 56d6f438..0678f9bd 100644 --- a/src/CRE/draw_object.c +++ b/src/CRE/draw_object.c @@ -311,7 +311,7 @@ inline void draw_object_model_mat_load(render_context* rctx, mat4* mat) { inline void model_mat_face_camera_position(mat4* view, mat4* src, mat4* dst) { vec3 trans; - mat4_mult_vec3_inv(view, (vec3*)&view->row3, &trans); + mat4_mult_vec3_inv_trans(view, (vec3*)&view->row3, &trans); vec3_negate(trans, trans); vec3 dir; @@ -1298,8 +1298,8 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* offset += 8; enable_vertex_attrib_array(15); - glVertexAttribPointer(15, 4, GL_UNSIGNED_BYTE, GL_FALSE, vertex_size, (void*)offset); - offset += 4; + glVertexAttribPointer(15, 4, GL_UNSIGNED_SHORT, GL_FALSE, vertex_size, (void*)offset); + offset += 8; } else { glVertexAttrib4f(1, 0.0f, 0.0f, 0.0f, 1.0f); @@ -1368,7 +1368,7 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* glVertexAttrib4f(5, 1.0f, 1.0f, 1.0f, 1.0f); if (vertex_flags & OBJECT_VERTEX_BONE_DATA) - offset += 12; + offset += 16; shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } @@ -1642,8 +1642,8 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* offset += 8; enable_vertex_attrib_array(15); - glVertexAttribPointer(15, 4, GL_UNSIGNED_BYTE, GL_FALSE, vertex_size, (void*)offset); - offset += 4; + glVertexAttribPointer(15, 4, GL_UNSIGNED_SHORT, GL_FALSE, vertex_size, (void*)offset); + offset += 8; } else { glVertexAttrib4f(1, 0.0f, 0.0f, 0.0f, 1.0f); @@ -1712,7 +1712,7 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* glVertexAttrib4f(5, 0.0f, 0.0f, 0.0f, 1.0f); if (vertex_flags & OBJECT_VERTEX_BONE_DATA) - offset += 12; + offset += 16; shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } diff --git a/src/CRE/draw_pass.c b/src/CRE/draw_pass.c index 648bea3e..dbdc7622 100644 --- a/src/CRE/draw_pass.c +++ b/src/CRE/draw_pass.c @@ -622,15 +622,12 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data_struct* a1) { v24 = v46[0]; float_t length; - vec3 dist; - vec3_sub(interest, v24, dist); - vec3_length(dist, length); + vec3_distance(interest, v24, length); if (length > 1.25) interest = v46[0]; float_t v29; - vec3_sub(view_point, interest, interest); - vec3_length(interest, v29); + vec3_distance(view_point, interest, v29); if (v29 < 0.25f) v29 = 0.25f; float_t v31 = tanf((float_t)(rctx->camera->fov_rad * 0.5)) * 5.0f; diff --git a/src/CRE/draw_task.c b/src/CRE/draw_task.c index 2fdcb268..de3e8bef 100644 --- a/src/CRE/draw_task.c +++ b/src/CRE/draw_task.c @@ -24,7 +24,7 @@ static void draw_task_translucent_sort_has_objects(render_context* rctx, bool* a void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type, int32_t a2, int32_t show_vector, bool a4, int32_t alpha) { - if (draw_task_get_count(rctx, type) <= 0) + if (draw_task_get_count(rctx, type) < 1) return; int32_t alpha_test = 0; @@ -225,11 +225,11 @@ void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type, void draw_task_draw_objects_by_type_translucent(render_context* rctx, bool opaque_enable, bool transparent_enable, bool translucent_enable, draw_object_type opaque, draw_object_type transparent, draw_object_type translucent) { - if (draw_task_get_count(rctx, opaque) <= 0) + if (draw_task_get_count(rctx, opaque) < 1) return; - else if (draw_task_get_count(rctx, transparent) <= 0) + else if (draw_task_get_count(rctx, transparent) < 1) return; - else if (draw_task_get_count(rctx, translucent) <= 0) + else if (draw_task_get_count(rctx, translucent) < 1) return; int32_t alpha_array[256]; @@ -680,7 +680,7 @@ 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 ? texture_pattern->end - texture_pattern->begin : 0; + size_t texture_pattern_count = texture_pattern ? vector_length(*texture_pattern) : 0; if (texture_pattern && texture_pattern_count) object_data_set_texture_pattern(object_data, (int32_t)texture_pattern_count, texture_pattern->begin); @@ -708,7 +708,7 @@ inline bool draw_task_add_draw_object_by_object_info_opaque(render_context* rctx void draw_task_sort(render_context* rctx, draw_object_type type, int32_t compare_func) { vector_ptr_draw_task* vec = &rctx->object_data.draw_task_array[type]; - if (vec->end - vec->begin < 1) + if (vector_length(*vec) < 1) return; mat4 mat; @@ -726,7 +726,7 @@ void draw_task_sort(render_context* rctx, draw_object_type type, int32_t compare model_mat_face_camera_position(&rctx->camera->view, &mat, &mat); else { object_sub_mesh* sub_mesh = task->data.object.sub_mesh; - if (task->data.object.mat_count <= 0 || !sub_mesh->bone_indices_count) + if (task->data.object.mat_count < 1 || !sub_mesh->bone_indices_count) mat4_mult_vec3_trans(&mat, &sub_mesh->bounding_sphere.center, ¢er); else { vec3 center_sum = vec3_null; diff --git a/src/CRE/hash.c b/src/CRE/hash.c index ce4680b1..5137bbd9 100644 --- a/src/CRE/hash.c +++ b/src/CRE/hash.c @@ -16,7 +16,7 @@ inline hash hash_utf16(wchar_t* data) { inline hash hash_data(void* data, size_t length) { hash hash; - hash.f = hash_fnv1a64m(data, length); + hash.f = hash_fnv1a64m(data, length, false); hash.m = hash_murmurhash(data, length, 0, false, false); return hash; } diff --git a/src/CRE/light_param.c b/src/CRE/light_param.c index 0251b4c4..315f0872 100644 --- a/src/CRE/light_param.c +++ b/src/CRE/light_param.c @@ -45,22 +45,22 @@ void light_param_data_load(light_param_data* light_param, data_struct* data, cha 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); + 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); + 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); + 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); + 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); + 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); + data_struct_load_file(data, &light_param->face, "rom/light_param/", buf, light_param_face_load_file); } void light_param_data_free(light_param_data* light_param) { @@ -82,7 +82,7 @@ void light_param_set_load(light_param_set* set, data_struct* data, int32_t pv_id farc f; farc_init(&f); - if (!data_struct_load_file(data, &f, "rom\\light_param\\", buf, farc_load_file)) + if (!data_struct_load_file(data, &f, "rom/light_param/", buf, farc_load_file)) return; for (farc_file* i = f.files.begin; i != f.files.end; i++) @@ -118,7 +118,7 @@ inline void light_param_storage_init() { } inline void light_param_storage_append_light_param_data(char* name) { - uint64_t hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t hash = hash_fnv1a64m(name, utf8_length(name), false); for (light_param_storage* i = light_param_storage_data.begin; i != light_param_storage_data.end; i++) if (!i->pv && i->hash == hash) { @@ -151,7 +151,7 @@ inline void light_param_storage_load_light_param_set(data_struct* data, int32_t } inline void light_param_storage_insert_light_param_data(light_param_data* data, char* name) { - uint64_t hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t hash = hash_fnv1a64m(name, utf8_length(name), false); for (light_param_storage* i = light_param_storage_data.begin; i != light_param_storage_data.end; i++) if (!i->pv && i->hash == hash) { @@ -187,7 +187,7 @@ inline void light_param_storage_insert_light_param_set(light_param_set* set, int } inline light_param_data* light_param_storage_get_light_param_data(char* name) { - uint64_t hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t hash = hash_fnv1a64m(name, utf8_length(name), false); for (light_param_storage* i = light_param_storage_data.begin; i != light_param_storage_data.end; i++) if (!i->pv && i->hash == hash) @@ -204,7 +204,7 @@ inline light_param_set* light_param_storage_get_light_param_set(int32_t pv_id) { } inline void light_param_storage_delete_light_param_data(char* name) { - uint64_t hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t hash = hash_fnv1a64m(name, utf8_length(name), false); for (light_param_storage* i = light_param_storage_data.begin; i != light_param_storage_data.end; i++) if (!i->pv && i->hash == hash) { diff --git a/src/CRE/light_param/wind.c b/src/CRE/light_param/wind.c index f1ad1b4a..9d369c46 100644 --- a/src/CRE/light_param/wind.c +++ b/src/CRE/light_param/wind.c @@ -73,7 +73,7 @@ void wind_update(wind* w) { mat4 mat = mat4_identity; mat4_rotate_y_mult(&mat, w->rot_y * DEG_TO_RAD_FLOAT, &mat); mat4_rotate_z_mult(&mat, w->rot_z * DEG_TO_RAD_FLOAT, &mat); - vec3 wind_direction = vec3_identity; + vec3 wind_direction = vec3_null; wind_direction.x = value; mat4_mult_vec3(&mat, &wind_direction, &wind_direction); vec3_mult_scalar(wind_direction, w->strength, w->wind_direction); diff --git a/src/CRE/object.c b/src/CRE/object.c index f3689717..9d77b1b2 100644 --- a/src/CRE/object.c +++ b/src/CRE/object.c @@ -357,8 +357,8 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi vec4i bone_index; vec4iu_to_vec4i(vertex_file[i].bone_index, bone_index); - vec4i_to_vec4u8(bone_index, *(vec4u8*)d); - d += 4; + vec4i_to_vec4u16(bone_index, *(vec4u16*)d); + d += 8; } } } @@ -541,6 +541,8 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi object_skin_block* block = &ex_data->blocks[j]; object_skin_block_file* block_file = &ex_data_file->blocks[j]; + object_skin_block_node_load(&block->base, &block_file->base); + switch (block_file->type) { case OBJ_SKIN_BLOCK_CLOTH: { block->type = OBJECT_SKIN_BLOCK_CLOTH; @@ -555,13 +557,21 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi object_skin_block_constraint* constraint = &block->constraint; object_skin_block_constraint_file* constraint_file = &block_file->constraint; - switch (constraint_file->type) { - case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - object_skin_block_node_load(&constraint->base, &constraint_file->base); - constraint->coupling = constraint_file->coupling; - constraint->name_index = constraint_file->name_index; - string_copy(&constraint_file->source_node_name, &constraint->source_node_name); + constraint->coupling = constraint_file->coupling; + constraint->name_index = constraint_file->name_index; + string_copy(&constraint_file->source_node_name, &constraint->source_node_name); + switch (constraint_file->type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + constraint->type = OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION; + + object_skin_block_constraint_orientation* orientation = &constraint->orientation; + object_skin_block_constraint_orientation_file* orientation_file + = &constraint_file->orientation; + + orientation->offset = orientation_file->offset; + break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: constraint->type = OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION; object_skin_block_constraint_direction* direction = &constraint->direction; @@ -573,46 +583,7 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi direction->align_axis = direction_file->align_axis; direction->target_offset = direction_file->target_offset; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - object_skin_block_node_load(&constraint->base, &constraint_file->base); - constraint->coupling = constraint_file->coupling; - constraint->name_index = constraint_file->name_index; - string_copy(&constraint_file->source_node_name, &constraint->source_node_name); - - constraint->type = OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE; - - object_skin_block_constraint_distance* distance = &constraint->distance; - object_skin_block_constraint_distance_file* distance_file - = &constraint_file->distance; - - object_skin_block_constraint_up_vector_load( - &distance->up_vector, &distance_file->up_vector); - distance->distance = distance_file->distance; - object_skin_block_constraint_attach_point_load( - &distance->constrained_object, &distance_file->constrained_object); - object_skin_block_constraint_attach_point_load( - &distance->constraining_object, &distance_file->constraining_object); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - object_skin_block_node_load(&constraint->base, &constraint_file->base); - constraint->coupling = constraint_file->coupling; - constraint->name_index = constraint_file->name_index; - string_copy(&constraint_file->source_node_name, &constraint->source_node_name); - - constraint->type = OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION; - - object_skin_block_constraint_orientation* orientation = &constraint->orientation; - object_skin_block_constraint_orientation_file* orientation_file - = &constraint_file->orientation; - - orientation->offset = orientation_file->offset; - break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - object_skin_block_node_load(&constraint->base, &constraint_file->base); - constraint->coupling = constraint_file->coupling; - constraint->name_index = constraint_file->name_index; - string_copy(&constraint_file->source_node_name, &constraint->source_node_name); - constraint->type = OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION; object_skin_block_constraint_position* position = &constraint->position; @@ -627,8 +598,20 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi object_skin_block_constraint_attach_point_load( &position->constraining_object, &position_file->constraining_object); break; - default: - memset(block, 0, sizeof(object_skin_block)); + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + constraint->type = OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE; + + object_skin_block_constraint_distance* distance = &constraint->distance; + object_skin_block_constraint_distance_file* distance_file + = &constraint_file->distance; + + object_skin_block_constraint_up_vector_load( + &distance->up_vector, &distance_file->up_vector); + distance->distance = distance_file->distance; + object_skin_block_constraint_attach_point_load( + &distance->constrained_object, &distance_file->constrained_object); + object_skin_block_constraint_attach_point_load( + &distance->constraining_object, &distance_file->constraining_object); break; } @@ -639,8 +622,6 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi object_skin_block_expression* expression = &block->expression; object_skin_block_expression_file* expression_file = &block_file->expression; - object_skin_block_node_load(&expression->base, &expression_file->base); - expression->name_index = expression_file->name_index; int32_t expressions_count = min(expression_file->expressions_count, 9); expression->expressions_count = expressions_count; @@ -657,8 +638,6 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi object_skin_block_motion* motion = &block->motion; object_skin_block_motion_file* motion_file = &block_file->motion; - object_skin_block_node_load(&motion->base, &motion_file->base); - int32_t nodes_count = motion_file->nodes_count; if (!is_x) motion->name_index = motion_file->name_index; @@ -681,7 +660,6 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi object_skin_block_osage* osage = &block->osage; object_skin_block_osage_file* osage_file = &block_file->osage; - object_skin_block_node_load(&osage->base, &osage_file->base); osage->start_index = osage_file->start_index; osage->count = osage_file->count; @@ -698,12 +676,9 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi } osage->external_name_index = osage_file->external_name_index; - osage->name_index = osage->name_index; + osage->name_index = osage_file->name_index; string_copy(&osage_file->motion_node_name, &osage->motion_node_name); } break; - default: - memset(block, 0, sizeof(object_skin_block)); - break; } } @@ -722,7 +697,7 @@ void object_set_load(object_set* set, obj_set* obj_set_file, txp_set* txp_set_fi skin->ex_data_init = true; } - int32_t textures_count = (int32_t)(txp_set_file->end - txp_set_file->begin); + int32_t textures_count = (int32_t)vector_length(*txp_set_file); 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); @@ -745,7 +720,7 @@ 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, temp, "rom\\objset\\", + return data_struct_load_file(data, temp, "rom/objset/", string_data(&(*set_info)->archive_file_name), object_set_load_file); } @@ -754,7 +729,7 @@ 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, temp, "rom\\objset\\", + return data_struct_load_file(data, temp, "rom/objset/", string_data(&set_info->archive_file_name), object_set_load_file); } @@ -766,7 +741,7 @@ 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, temp, "rom\\objset\\", + return data_struct_load_file(data, temp, "rom/objset/", string_data(&(*set_info)->archive_file_name), object_set_load_file); } @@ -775,7 +750,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, temp, "rom\\objset\\", + return data_struct_load_file_by_hash(data, temp, "rom/objset/", hash, object_set_load_file_modern); } @@ -1114,11 +1089,11 @@ inline object_set* object_storage_get_object_set(uint32_t set_id) { } inline ssize_t object_storage_get_object_set_count() { - return object_storage_data.end - object_storage_data.begin; + return vector_length(object_storage_data); } inline object_set* object_storage_get_object_set_by_index(ssize_t index) { - if (index >= 0 && index < object_storage_data.end - object_storage_data.begin) + if (index >= 0 && index < vector_length(object_storage_data)) return &object_storage_data.begin[index].set; return 0; } @@ -1426,7 +1401,7 @@ inline static size_t object_vertex_flags_get_vertex_size_comp(object_vertex_flag if (flags & OBJECT_VERTEX_COLOR0) size += 8; if (flags & OBJECT_VERTEX_BONE_DATA) - size += 12; + size += 16; return size; } diff --git a/src/CRE/object.h b/src/CRE/object.h index f04a1bd9..0cbbd4ec 100644 --- a/src/CRE/object.h +++ b/src/CRE/object.h @@ -132,10 +132,10 @@ typedef enum object_primitive_type { typedef enum object_skin_block_constraint_type { OBJECT_SKIN_BLOCK_CONSTRAINT_NONE = 0, - OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION, - OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE, OBJECT_SKIN_BLOCK_CONSTRAINT_ORIENTATION, + OBJECT_SKIN_BLOCK_CONSTRAINT_DIRECTION, OBJECT_SKIN_BLOCK_CONSTRAINT_POSITION, + OBJECT_SKIN_BLOCK_CONSTRAINT_DISTANCE, } object_skin_block_constraint_type; typedef enum object_skin_block_constraint_coupling { diff --git a/src/CRE/render_context.c b/src/CRE/render_context.c index 93f25a51..5b99791f 100644 --- a/src/CRE/render_context.c +++ b/src/CRE/render_context.c @@ -823,9 +823,9 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { int32_t count = 0; shad->field_2EC = 0; for (int32_t i = 0; i < 2; i++) - if (shad->field_2F0[i] && shad->field_1D0[i].end - shad->field_1D0[i].begin > 0) { + if (shad->field_2F0[i] && vector_length(shad->field_1D0[i]) > 0) { shad->field_2EC++; - count += (int32_t)(shad->field_1D0[i].end - shad->field_1D0[i].begin); + count += (int32_t)vector_length(shad->field_1D0[i]); } else shad->field_2F0[i] = false; @@ -835,14 +835,14 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { vector_vec3* v5 = &shad->field_1D0[i]; shad->field_1A8[i] = vec3_null; shad->field_1C8[i] = 0.0f; - if (!shad->field_2F0[i] || !(v5->end - v5->begin)) + if (!shad->field_2F0[i] || vector_length(*v5) < 1) continue; vec3 v7 = vec3_null; for (vec3* j = v5->begin; j != v5->end; j++) vec3_add(v7, *j, v7); - float_t v14 = (float_t)(int32_t)(v5->end - v5->begin); + float_t v14 = (float_t)(int32_t)vector_length(*v5); if (v14 < 0.0f) v14 += 1.8446744e19f; vec3_mult_scalar(v7, 1.0f / v14, v7); @@ -856,9 +856,8 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { vec3_dot(v22, direction, v23); vec3 v25; vec3_mult_scalar(direction, v23, v25); - vec3_sub(v25, v22, v25); float_t v24; - vec3_length(v25, v24); + vec3_distance(v25, v22, v24); v24 -= 0.25f; if (v24 < 0.0f) v24 = 0.0f; @@ -879,15 +878,11 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { vec3 v11; vec3_mult_scalar(shad->direction, shad->field_208, v11); vec3_sub(shad->field_1A8[i], v11, v11); - vec3 v14; - vec3_sub(shad->view_point[i], v11, v14); float_t v9; - vec3_length(v14, v9); + vec3_distance(shad->view_point[i], v11, v9); - vec3 v20; - vec3_sub(shad->interest[i], shad->field_1A8[i], v20); float_t v12; - vec3_length(v20, v12); + vec3_distance(shad->interest[i], shad->field_1A8[i], v12); if (v9 > 0.1f || v12 > 0.1f) { shad->view_point[i] = v11; shad->interest[i] = shad->field_1A8[i]; @@ -961,14 +956,14 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { vector_vec3* v18 = &shad->field_1D0[i]; shad->field_1A8[i] = vec3_null; shad->field_1C8[i] = 0.0; - if (!shad->field_2F0[i] || !(v18->end - v18->begin)) + if (!shad->field_2F0[i] || vector_length(*v18) < 1) continue; vec3 v22 = vec3_null; for (vec3* j = v18->begin; j != v18->end; j++) vec3_add(v22, *j, v22); - int32_t v27 = (int32_t)(v18->end - v18->begin); + int32_t v27 = (int32_t)vector_length(*v18); float_t v29 = (float_t)v27; if (v27 < 0) v29 += 1.8446744e19f; @@ -1001,16 +996,12 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { continue; float_t v51; - vec3 v52; vec3 v53; float_t v54; - vec3 v55; vec3_mult_scalar(shad->direction, shad->field_208, v53); vec3_sub(shad->field_1A8[i], v53, v53); - vec3_sub(shad->view_point[i], v53, v52); - vec3_length(v52, v51); - vec3_sub(shad->interest[i], shad->field_1A8[i], v55); - vec3_length(v55, v54); + vec3_distance(shad->view_point[i], v53, v51); + vec3_distance(shad->interest[i], shad->field_1A8[i], v54); if (v51 > 0.1f || v54 > 0.1f) { shad->view_point[i] = v53; shad->interest[i] = shad->field_1A8[i]; @@ -1021,7 +1012,7 @@ static void shadow_update_inner(shadow* shad, render_context* rctx) { vec3 interest = vec3_null; int32_t count = 0;; for (int32_t i = 0; i < 2; i++) { - int32_t c = (int32_t)(shad->field_1D0[i].end - shad->field_1D0[i].begin); + int32_t c = (int32_t)vector_length(shad->field_1D0[i]); vec3 view_point_temp; vec3 interest_temp; vec3_mult_scalar(shad->view_point[i], (float_t)c, view_point_temp); diff --git a/src/CRE/rob.c b/src/CRE/rob.c index 9a0c39aa..25e0f490 100644 --- a/src/CRE/rob.c +++ b/src/CRE/rob.c @@ -6,6 +6,7 @@ #include "rob.h" #include "data.h" #include "draw_task.h" +#include "../KKdLib/key_val.h" #include "../KKdLib/str_utils.h" vector_func(bone_data) @@ -16,15 +17,28 @@ vector_ptr_func(ex_expression_block) vector_ptr_func(ex_osage_block) vector_ptr_func(ex_node_block) vector_func(ex_data_name_bone_index) +vector_func(item_sub_data_item_change) +vector_func(item_sub_data_texture_change) +vector_func(item_sub_data_texture_change_tex) vector_func(mot_key_set) vector_ptr_func(motion_blend_mot) vector_func(osage_coli) -vector_func(pair_int32_t_ptr_rob_osage_node) +vector_func(pair_int32_t_object_info) vector_func(pair_name_ex_osage_block) +vector_func(pair_object_info_item_id) +vector_func(pair_uint32_t_ptr_rob_osage_node) vector_func(rob_osage_node) vector_ptr_func(rob_osage_node) +vector_func(skin_param_osage_node) +vector_func(skin_param_osage_root_boc) vector_func(skin_param_osage_root_coli) +vector_func(skin_param_osage_root_normal_ref) +vector_func(struc_215) +vector_func(struc_294) vector_func(struc_331) +vector_func(struc_373) + +#define SKP_TEXT_BUF_SIZE 0x400 typedef struct motion_storage { uint32_t set_id; @@ -64,15 +78,15 @@ static float_t* bone_node_get_exp_data_component(bone_node* a1, size_t index, ex_expression_block_stack_type* type); static void bone_data_parent_data_init(bone_data_parent* bone, - rob_chara_data_bone_data* rob_bone_data, bone_database* bone_data); + rob_chara_bone_data* rob_bone_data, bone_database* bone_data); static void bone_data_parent_load_bone_database(bone_data_parent* bone, vector_bone_database_bone* bones, vec3* common_translation, vec3* translation); -static void bone_data_parent_load_rob_chara_data(bone_data_parent* bone); +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* data_scale, mat4* ex_data_mat, mat4* mat); + 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, @@ -83,43 +97,70 @@ static void bone_node_expression_data_set_position_rotation_vec3(bone_node_expre static ex_cloth_block* ex_cloth_block_init(); static void ex_cloth_block_draw(ex_cloth_block* cls); +static void ex_cloth_block_field_8(ex_cloth_block* cls); +static void ex_cloth_block_field_18(ex_cloth_block* cls, int32_t a2, bool a3); +static void ex_cloth_block_field_28(ex_cloth_block* cls); +static void ex_cloth_block_field_40(ex_cloth_block* cls); +static void ex_cloth_block_field_48(ex_cloth_block* cls); +static void ex_cloth_block_field_50(ex_cloth_block* cls); static void ex_cloth_block_reset(ex_cloth_block* cls); static void ex_cloth_block_update(ex_cloth_block* cls); static void ex_cloth_block_dispose(ex_cloth_block* cls); + static ex_constraint_block* ex_constraint_block_init(); -static void ex_constraint_block_init_data(ex_constraint_block* cns, rob_chara_data_item_equip_object* itm_eq_obj, +static void ex_constraint_block_init_data(ex_constraint_block* cns, rob_chara_item_equip_object* itm_eq_obj, object_skin_block_constraint* cns_data, char* cns_data_name, bone_database* bone_data); static void ex_constraint_block_data_set(ex_constraint_block* cns); static void ex_constraint_block_draw(ex_constraint_block* cns); -static void ex_constraint_block_set_default_data(ex_constraint_block* cns); +static void ex_constraint_block_field_8(ex_constraint_block* cns); +static void ex_constraint_block_field_10(ex_constraint_block* cns); +static void ex_constraint_block_field_18(ex_constraint_block* cns, int32_t a2, bool a3); +static void ex_constraint_block_field_28(ex_constraint_block* cns); +static void ex_constraint_block_field_40(ex_constraint_block* cns); +static void ex_constraint_block_field_48(ex_constraint_block* cns); +static void ex_constraint_block_field_50(ex_constraint_block* cns); static void ex_constraint_block_time_step(ex_constraint_block* cns); static void ex_constraint_block_update(ex_constraint_block* cns); static void ex_constraint_block_dispose(ex_constraint_block* cns); + static ex_expression_block* ex_expression_block_init(); static void ex_expression_block_init_data(ex_expression_block* exp, - rob_chara_data_item_equip_object* itm_eq_obj, object_skin_block_expression* exp_data, + rob_chara_item_equip_object* itm_eq_obj, object_skin_block_expression* exp_data, char* exp_data_name, object_info a4, chara_index chara_index, bone_database* bone_data); static void ex_expression_block_data_set(ex_expression_block* exp); static void ex_expression_block_draw(ex_expression_block* exp); -static void ex_expression_block_set_default_data(ex_expression_block* exp); +static void ex_expression_block_field_8(ex_expression_block* exp); +static void ex_expression_block_field_10(ex_expression_block* exp); +static void ex_expression_block_field_18(ex_expression_block* exp, int32_t a2, bool a3); +static void ex_expression_block_field_28(ex_expression_block* exp); +static void ex_expression_block_field_40(ex_expression_block* exp); +static void ex_expression_block_field_48(ex_expression_block* exp); +static void ex_expression_block_field_50(ex_expression_block* exp); static void ex_expression_block_time_step(ex_expression_block* exp); static void ex_expression_block_update(ex_expression_block* exp); static void ex_expression_block_dispose(ex_expression_block* exp); static float_t ex_expression_block_stack_get_value(ex_expression_block_stack* stack); + +static void ex_node_block_field_10(ex_node_block* node); +static void ex_node_block_field_58(ex_node_block* node); static void ex_node_block_init_data(ex_node_block* node, bone_node* bone_node, - ex_node_type type, char* name, rob_chara_data_item_equip_object* itm_eq_obj); + ex_node_type type, char* name, rob_chara_item_equip_object* itm_eq_obj); static void ex_node_block_reset(ex_node_block* node); -static void ex_node_block_set_default_data(ex_node_block* node); static void ex_node_block_free(ex_node_block* node); + static ex_osage_block* ex_osage_block_init(); static void ex_osage_block_draw(ex_osage_block* osg); +static void ex_osage_block_field_8(ex_osage_block* osg); +static void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3); +static void ex_osage_block_field_28(ex_osage_block* osg); +static void ex_osage_block_field_40(ex_osage_block* osg); +static void ex_osage_block_field_48(ex_osage_block* osg); +static void ex_osage_block_field_50(ex_osage_block* osg); +static void ex_osage_block_field_58(ex_osage_block* osg); static void ex_osage_block_init_data(ex_osage_block* osg, - rob_chara_data_item_equip_object* itm_eq_obj, object_skin_block_osage* osg_data, + 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, bone_node* ex_data_bone_nodes, object_skin* skin); -static void sub_1405F3E10(ex_osage_block* osg, object_skin_block_osage* osg_data, - object_skin_osage_node* osg_nodes, vector_pair_int32_t_ptr_rob_osage_node* a4, - vector_pair_name_ex_osage_block* a5); static void ex_osage_block_reset(ex_osage_block* osg); static void ex_osage_block_set_wind_direction(ex_osage_block* osg); static void ex_osage_block_update(ex_osage_block* osg); @@ -163,7 +204,11 @@ static float_t exp_sqrt(float_t v1); static float_t exp_sub(float_t v1, float_t v2); static float_t exp_tan(float_t v1); -static float_t get_osage_gravity_const(); +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_key_frame_interpolate(mot* a1, float_t frame, float_t* value, mot_key_set* a4, uint32_t key_set_count, struc_369* a6); @@ -181,7 +226,7 @@ static void mot_parent_reserve_key_sets(mot_parent* a1); static motion_blend_mot* motion_blend_mot_init(); static void motion_blend_mot_interpolate(motion_blend_mot* a1); static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, - rob_chara_data_bone_data* a2, bone_database* bone_data); + rob_chara_bone_data* a2, 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); @@ -194,101 +239,157 @@ static void osage_coli_set(osage_coli* osg_coli, static void osage_coli_ring_set(osage_coli* osg_coli, vector_skin_param_osage_root_coli* vec_skp_root_coli, mat4* mats); -static rob_chara_data_bone_data* rob_chara_data_bone_data_init(); -static void rob_chara_data_bone_data_calculate_bones(rob_chara_data_bone_data* rob_bone_data, +static rob_chara_bone_data* rob_chara_bone_data_init(); +static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, vector_bone_database_bone* bones); -static void rob_chara_data_bone_data_eyes_xrot_adjust(rob_chara_data_bone_data* rob_bone_data, +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_data_bone_data_get_frame(rob_chara_data_bone_data* rob_bone_data); -static float_t rob_chara_data_bone_data_get_frame_count(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_get_ik_scale( - rob_chara_data_bone_data* rob_bone_data, bone_database* bone_data); -static mat4* rob_chara_data_bone_data_get_mat(rob_chara_data_bone_data* rob_bone_data, size_t index); -static bone_node* rob_chara_data_bone_data_get_node(rob_chara_data_bone_data* rob_bone_data, size_t index); -static void rob_chara_data_bone_data_ik_scale_calculate( - rob_chara_data_bone_data_ik_scale* ik_scale, vector_bone_data* vec_bone_data, +static float_t rob_chara_bone_data_get_frame(rob_chara_bone_data* rob_bone_data); +static float_t rob_chara_bone_data_get_frame_count(rob_chara_bone_data* rob_bone_data); +static void rob_chara_bone_data_get_ik_scale( + rob_chara_bone_data* rob_bone_data, bone_database* bone_data); +static mat4* rob_chara_bone_data_get_mat(rob_chara_bone_data* rob_bone_data, size_t index); +static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_data, size_t index); +static void rob_chara_bone_data_ik_scale_calculate( + rob_chara_bone_data_ik_scale* ik_scale, vector_bone_data* vec_bone_data, bone_database_skeleton_type base_skeleton_type, bone_database_skeleton_type skeleton_type, bone_database* bone_db); -static void rob_chara_data_bone_data_init_data(rob_chara_data_bone_data* rob_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); -static void rob_chara_data_bone_data_init_skeleton(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, bone_database_skeleton_type base_skeleton_type, bone_database_skeleton_type skeleton_type, bone_database* bone_data); -static void rob_chara_data_bone_data_interpolate(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_motion_blend_mot_free(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_motion_blend_mot_init(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_motion_blend_mot_list_free(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data); +static void rob_chara_bone_data_motion_blend_mot_free(rob_chara_bone_data* rob_bone_data); +static void rob_chara_bone_data_motion_blend_mot_init(rob_chara_bone_data* 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); -static void rob_chara_data_bone_data_motion_blend_mot_list_init(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_bone_data, +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); -static void rob_chara_data_bone_data_reserve(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_set_frame(rob_chara_data_bone_data* rob_bone_data, float_t frame); -static void rob_chara_data_bone_data_reset(rob_chara_data_bone_data* rob_bone_data); -static void rob_chara_data_bone_data_set_mats(rob_chara_data_bone_data* rob_bone_data, +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_mats(rob_chara_bone_data* rob_bone_data, vector_bone_database_bone* bones); -static void rob_chara_data_bone_data_set_parent_mats(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, uint16_t* parent_indices); -static void rob_chara_data_bone_data_set_rotation_y(rob_chara_data_bone_data* rob_bone_data, float_t rotation_y); -static void rob_chara_data_bone_data_update(rob_chara_data_bone_data* rob_bone_data, mat4* mat); -static void rob_chara_data_bone_data_dispose(rob_chara_data_bone_data* rob_bone_data); +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_data_item_equip* rob_chara_data_item_equip_init(); -static void rob_chara_data_item_equip_draw( - rob_chara_data_item_equip* rob_item_equip, int32_t chara_id, render_context* rctx); -static void rob_chara_data_item_equip_get_parent_bone_nodes( - rob_chara_data_item_equip* rob_item_equip, bone_node* bone_nodes, bone_database* bone_data); -static void rob_chara_data_item_equip_load_object_info( - rob_chara_data_item_equip* rob_item_equip, object_info object_info, item_id id, bone_database* bone_data); -static void rob_chara_data_item_equip_object_init(rob_chara_data_item_equip_object* itm_eq_obj); -static void rob_chara_data_item_equip_object_clear_ex_data(rob_chara_data_item_equip_object* itm_eq_obj); -static void rob_chara_data_item_equip_object_draw( - rob_chara_data_item_equip_object* itm_eq_obj, mat4* mat, render_context* rctx); -static int32_t rob_chara_data_item_equip_object_get_bone_index( - rob_chara_data_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data); -static bone_node* rob_chara_data_item_equip_object_get_bone_node( - rob_chara_data_item_equip_object* itm_eq_obj, int32_t bone_index); -static bone_node* rob_chara_data_item_equip_object_get_bone_node_by_name( - rob_chara_data_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data); -static void rob_chara_data_item_equip_object_get_parent_bone_nodes( - rob_chara_data_item_equip_object* itm_eq_obj, bone_node* bone_nodes, bone_database* bone_data); -static void rob_chara_data_item_equip_object_init_data(rob_chara_data_item_equip_object* itm_eq_obj, size_t index); -static void rob_chara_data_item_equip_object_init_ex_data_bone_nodes( - rob_chara_data_item_equip_object* itm_eq_obj, object_skin_ex_data* a2); -static void rob_chara_data_item_equip_object_load_ex_data(rob_chara_data_item_equip_object* itm_eq_obj, - object_skin_ex_data* ex_data, bone_database* bone_data); -static void rob_chara_data_item_equip_object_load_object_info_ex_data( - rob_chara_data_item_equip_object* itm_eq_obj, object_info object_info, - bone_node* bone_nodes, bone_database* bone_data); -static void rob_chara_data_item_equip_object_reset(rob_chara_data_item_equip_object* itm_eq_obj); -static void rob_chara_data_item_equip_object_free(rob_chara_data_item_equip_object* itm_eq_obj); -static void rob_chara_data_item_equip_reset(rob_chara_data_item_equip* rob_item_equip); -static void rob_chara_data_item_equip_dispose(rob_chara_data_item_equip* rob_item_equip); +static rob_chara_item_equip* rob_chara_item_equip_init(); +static void rob_chara_item_equip_draw( + rob_chara_item_equip* rob_item_equip, int32_t chara_id, render_context* rctx); +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); +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); +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_draw( + 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); +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); +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_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); +static bool rob_chara_item_equip_object_set_boc(rob_chara_item_equip_object* itm_eq_obj, + skin_param_osage_root* skp_root, ex_osage_block* 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_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, + 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 bool rob_chara_data_check_for_ageageagain_module(chara_index chara_index, int32_t module_index); -static void rob_chara_data_load_default_motion(rob_chara_data* rob_chr_data, +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, + 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 void rob_chara_load_default_motion(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db); -static void rob_chara_data_load_default_motion_sub(rob_chara_data* rob_chr_data, int32_t 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); -static void rob_chara_data_set_draw(rob_chara_data* rob_chr_data, item_id id, bool draw); +static void rob_chara_set_draw(rob_chara* rob_chr, item_id id, bool draw); 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); 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, + 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_coli(rob_osage* rob_osg, mat4* mats); +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_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_skin_param_osage_node* skp_osg_nodes); 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 void skin_param_init(skin_param* skp); +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_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, + skin_param_osage_root* skp_root, bone_database* bone_data); +static void skin_param_osage_root_free(skin_param_osage_root* root); + vector_func(motion_storage) vector_motion_storage motion_storage_data; -rob_chara_data rob_chara_data_array[6]; +rob_chara rob_chara_array[6]; extern wind* wind_ptr; static const exp_func_op1 exp_func_op1_array[] = { @@ -1062,64 +1163,64 @@ static const skeleton_rotation_offset skeleton_rotation_offset_array[] = { { 0, 1, 1, { 0.0f, 0.0f, 0.0f }, }, }; +static const ex_node_block_vtbl ex_cloth_block_vftable = { + (void*)ex_cloth_block_dispose, + (void*)ex_cloth_block_field_8, + (void*)ex_node_block_field_10, + (void*)ex_cloth_block_field_18, + (void*)ex_cloth_block_update, + (void*)ex_cloth_block_field_28, + (void*)ex_cloth_block_draw, + (void*)ex_cloth_block_reset, + (void*)ex_cloth_block_field_40, + (void*)ex_cloth_block_field_48, + (void*)ex_cloth_block_field_50, + (void*)ex_node_block_field_58, +}; + static const ex_node_block_vtbl ex_constraint_block_vftable = { (void*)ex_constraint_block_dispose, - //(void*)sub_1405F35F0, - (void*)ex_constraint_block_set_default_data, - //(void*)sub_1405F4960, + (void*)ex_constraint_block_field_8, + (void*)ex_constraint_block_field_10, + (void*)ex_constraint_block_field_18, (void*)ex_constraint_block_update, - //(void*)sub_1405F2440, + (void*)ex_constraint_block_field_28, (void*)ex_constraint_block_draw, (void*)ex_node_block_reset, - //(void*)sub_1405F2820, - //(void*)sub_1405F4610, - //(void*)sub_1405F4700, - //(void*)sub_1405F48E0, + (void*)ex_constraint_block_field_40, + (void*)ex_constraint_block_field_48, + (void*)ex_constraint_block_field_50, + (void*)ex_node_block_field_58, }; static const ex_node_block_vtbl ex_expression_block_vftable = { (void*)ex_expression_block_dispose, - //(void*)sub_1405F3610, - (void*)ex_expression_block_set_default_data, - //(void*)sub_1405F49A0, + (void*)ex_expression_block_field_8, + (void*)ex_expression_block_field_10, + (void*)ex_expression_block_field_18, (void*)ex_expression_block_update, - //(void*)sub_1405F2450, + (void*)ex_expression_block_field_28, (void*)ex_expression_block_draw, (void*)ex_node_block_reset, - //(void*)sub_1405F2830, - //(void*)sub_1405F4620, - //(void*)sub_1405F4710, - //(void*)sub_1405F48E0, + (void*)ex_expression_block_field_40, + (void*)ex_expression_block_field_48, + (void*)ex_expression_block_field_50, + (void*)ex_node_block_field_58, }; static const ex_node_block_vtbl ex_osage_block_vftable = { (void*)ex_osage_block_dispose, - //(void*)sub_1405F3640, - (void*)ex_node_block_set_default_data, - //(void*)sub_1405F49F0, + (void*)ex_osage_block_field_8, + (void*)ex_node_block_field_10, + (void*)ex_osage_block_field_18, (void*)ex_osage_block_update, - //(void*)sub_1405F2470, + (void*)ex_osage_block_field_28, (void*)ex_osage_block_draw, (void*)ex_osage_block_reset, - //(void*)sub_1405F2860, - //(void*)sub_1405F4640, - //(void*)sub_1405F4730, - //(void*)sub_1405F48F0, -}; - -static const ex_node_block_vtbl ex_cloth_block_vftable = { - (void*)ex_cloth_block_dispose, - //(void*)sub_1405F35B0, - (void*)ex_node_block_set_default_data, - //(void*)sub_1405F4950, - (void*)ex_cloth_block_update, - //(void*)sub_1405F2420, - (void*)ex_cloth_block_draw, - (void*)ex_cloth_block_reset, - //(void*)sub_1405F2810, - //(void*)sub_1405F45F0, - //(void*)sub_1405F46E0, - //(void*)sub_1405F48E0, + (void*)ex_osage_block_field_40, + (void*)ex_osage_block_field_48, + (void*)ex_osage_block_field_50, + (void*)ex_osage_block_field_58, }; chara_init_data* chara_init_data_get(chara_index chara_index) { @@ -1149,8 +1250,8 @@ void motion_set_load_motion(uint32_t set, string* motion_name, motion_database* 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 && msf.vec.end - msf.vec.begin > 0) { + "rom/rob/", string_data(&file), mot_load_file); + if (msf.ready && vector_length(msf.vec) > 0) { motion_storage_insert_motion_set(&msf.vec.begin[0], set); memset(&msf.vec.begin[0], 0, sizeof(mot_set)); } @@ -1163,81 +1264,152 @@ void motion_set_unload(uint32_t set) { motion_storage_delete_motion_set(set); } -void rob_chara_data_init(rob_chara_data* rob_chr_data) { - rob_chr_data->bone_data = rob_chara_data_bone_data_init(); - rob_chr_data->item_equip = rob_chara_data_item_equip_init(); - rob_chara_pv_data_init(&rob_chr_data->pv_data); +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 rob_chara_data_calc(rob_chara_data* rob_chr_data) { - if (rob_chara_data_bone_data_get_frame(rob_chr_data->bone_data) < 0.0) - rob_chara_data_bone_data_set_frame(rob_chr_data->bone_data, 0.0); +static void sub_1405EE878(ex_node_block* node) { + +} - float_t frame = rob_chara_data_bone_data_get_frame(rob_chr_data->bone_data); - float_t frame_count = rob_chara_data_bone_data_get_frame_count(rob_chr_data->bone_data); - if (frame > frame_count) - rob_chara_data_bone_data_set_frame(rob_chr_data->bone_data, frame_count); +static void sub_1405F4BB0(rob_chara_item_equip_object* rob_item_equip, bool a2) { + ex_node_block** begin = rob_item_equip->node_blocks.begin; + ex_node_block** end = rob_item_equip->node_blocks.end; + for (int32_t i = 0; i < 6; i++) + for (ex_node_block** j = begin; j != end; j++) + (*j)->vftable->field_18(*j, i, a2); +} - mat4_get_translation(&rob_chr_data->bone_data->mats.begin[MOTION_BONE_KL_KOSI_ETC_WJ], - &rob_chr_data->item_equip->position); - //rob_chara_data_get_trans_scale(rob_chr_data, 0, &rob_chr_data->item_equip->position); +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) + return; - if (!rob_chr_data->item_equip->field_D8) { - rob_chara_data_item_equip* rob_item_equip = rob_chr_data->item_equip; - for (int32_t i = rob_item_equip->first_item_equip_object; - i < rob_item_equip->max_item_equip_object; i++) { - rob_chara_data_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[i]; + for (ex_node_block** i = itm_eq_obj->node_blocks.begin; + i != itm_eq_obj->node_blocks.end; i++) + (*i)->vftable->field_48(*i); - if (itm_eq_obj->field_B0 > 0) - itm_eq_obj->field_B0 = 0; + for (int32_t v3 = a2; v3; v3--) { + if (itm_eq_obj->field_1B8) + sub_1405F4BB0(itm_eq_obj, true); - for (ex_node_block** i = itm_eq_obj->node_blocks.begin; - i != itm_eq_obj->node_blocks.end; i++) - (*i)->vftable->set_default_data(*i); + for (ex_node_block** i = itm_eq_obj->node_blocks.begin; + i != itm_eq_obj->node_blocks.end; i++) + (*i)->vftable->field_50(*i); + } +} - if (itm_eq_obj->field_1C8) - itm_eq_obj->field_1C8 = 0; - else { - for (ex_node_block** i = itm_eq_obj->node_blocks.begin; - i != itm_eq_obj->node_blocks.end; i++) - (*i)->vftable->update(*i); - } - } +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) + 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, v3->motion_id, &rob_chr, &child_osg_node); + if (!rob_chr) + break; + + for (ex_osage_block** 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 (ex_cloth_block** 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);*/ + } +} + +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; } - /*if (rob_chara_data_check_for_ageageagain_module(rob_chr_data->chara_index, rob_chr_data->module_index)) { - sub_140543520(rob_chr_data->chara_id, 1, rob_chr_data->item_equip->osage_phys_step); - sub_14054FC90(rob_chr_data, 1u, "j_tail_l_006_wj"); - sub_140543520(rob_chr_data->chara_id, 2, rob_chr_data->item_equip->osage_phys_step); - sub_14054FC90(rob_chr_data, 2u, "j_tail_r_006_wj"); + for (ex_node_block** i = itm_eq_obj->node_blocks.begin; + i != itm_eq_obj->node_blocks.end; ++i) + (*i)->vftable->field_10(*i); + + if (itm_eq_obj->field_1C8) { + itm_eq_obj->field_1C8 = 0; + sub_1405F9640(itm_eq_obj); + for (ex_node_block** j = itm_eq_obj->node_blocks.begin; + j != itm_eq_obj->node_blocks.end; ++j) + (*j)->vftable->draw(*j); + } + else { + if (itm_eq_obj->field_1B8) + sub_1405F4BB0(itm_eq_obj, 0); + + for (ex_node_block** k = itm_eq_obj->node_blocks.begin; k != itm_eq_obj->node_blocks.end; ++k) + (*k)->vftable->update(*k); + } + for (ex_node_block** l = itm_eq_obj->node_blocks.begin; l != itm_eq_obj->node_blocks.end; ++l) + (*l)->vftable->field_58(*l); +} + +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]); +} + +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); + + mat4_get_translation(&rob_chr->bone_data->mats.begin[MOTION_BONE_KL_KOSI_ETC_WJ], + &rob_chr->item_equip->position); + //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_data_draw(rob_chara_data* rob_chr_data, render_context* rctx) { - rob_chr_data->item_equip->texture_color_coeff = vec4u_identity; - rob_chr_data->item_equip->mat = mat4u_identity; - rob_chara_data_item_equip_draw(rob_chr_data->item_equip, rob_chr_data->chara_id, rctx); +void rob_chara_draw(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_draw(rob_chr->item_equip, rob_chr->chara_id, rctx); } -mat4* rob_chara_data_get_bone_data_mat(rob_chara_data* chara, size_t index) { - return rob_chara_data_bone_data_get_mat(chara->bone_data, index); +mat4* rob_chara_get_bone_data_mat(rob_chara* chara, size_t index) { + return rob_chara_bone_data_get_mat(chara->bone_data, index); } -float_t rob_chara_data_get_frame(rob_chara_data* rob_chr_data) { - return rob_chara_data_bone_data_get_frame(rob_chr_data->bone_data); +float_t rob_chara_get_frame(rob_chara* rob_chr) { + return rob_chara_bone_data_get_frame(rob_chr->bone_data); } -float_t rob_chara_data_get_frame_count(rob_chara_data* rob_chr_data) { - return rob_chara_data_bone_data_get_frame_count(rob_chr_data->bone_data); +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_data_load_motion(rob_chara_data* rob_chr_data, int32_t motion_id, +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_data_bone_data_motion_load(rob_chr_data->bone_data, motion_id, index, bone_data, mot_db); + rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, index, bone_data, mot_db); } -void rob_chara_data_reload_items(rob_chara_data* rob_chr_data, - item_sub_data* sub_data, bone_database* bone_data) { +void rob_chara_reload_items(rob_chara* rob_chr, item_sub_data* sub_data, + bone_database* bone_data, void* data, object_database* obj_db) { static const item_sub_id array0[] = { ITEM_SUB_ZUJO, ITEM_SUB_KAMI, @@ -1307,9 +1479,10 @@ void rob_chara_data_reload_items(rob_chara_data* rob_chr_data, ITEM_NONE, }; - rob_chara_data_item_equip* rob_item_equip = rob_chr_data->item_equip; - object_info base_face = chara_init_data_array[rob_chr_data->chara_index].base_face; - rob_chara_data_item_equip_load_object_info(rob_item_equip, base_face, ITEM_ATAMA, bone_data); + rob_chara_item_equip* rob_item_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); for (int32_t i = 0; array0[i] != ITEM_SUB_MAX; i++) { item_sub_id sub_id = array0[i]; @@ -1330,7 +1503,8 @@ void rob_chara_data_reload_items(rob_chara_data* rob_chr_data, else if (no == 681) obj_info = (object_info){ 913, 3796 }; } - rob_chara_data_item_equip_load_object_info(rob_item_equip, obj_info, id, bone_data); + rob_chara_item_equip_load_object_info(rob_item_equip, + obj_info, id, bone_data, data, obj_db); } for (int32_t i = 0; array1[i] != ITEM_SUB_MAX; i++) { @@ -1343,7 +1517,8 @@ void rob_chara_data_reload_items(rob_chara_data* rob_chr_data, obj_info = (object_info){ 306, 953 }; else if (no == 181) obj_info = (object_info){ 915, 3794 }; - rob_chara_data_item_equip_load_object_info(rob_item_equip, obj_info, ITEM_ITEM09, bone_data); + rob_chara_item_equip_load_object_info(rob_item_equip, + obj_info, ITEM_ITEM09, bone_data, data, obj_db); } } @@ -1360,46 +1535,72 @@ void rob_chara_data_reload_items(rob_chara_data* rob_chr_data, obj_info = (object_info){ 7, 4 }; else if (no == 481) obj_info = (object_info){ 914, 3795 }; - rob_chara_data_item_equip_load_object_info(rob_item_equip, obj_info, id, bone_data); + rob_chara_item_equip_load_object_info(rob_item_equip, + obj_info, id, bone_data, data, obj_db); } } -void rob_chara_data_reset(rob_chara_data* rob_chr_data, rob_chara_pv_data* pv_data, +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); + }*/ +} + +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_data_bone_data_reset(rob_chr_data->bone_data); - rob_chara_data_bone_data_init_data(rob_chr_data->bone_data, - BONE_DATABASE_SKELETON_COMMON, rob_chr_data->chara_init_data->skeleton_type, bone_data); - rob_chara_data_item_equip_get_parent_bone_nodes(rob_chr_data->item_equip, - rob_chara_data_bone_data_get_node(rob_chr_data->bone_data, 0), bone_data); - rob_chara_data_bone_data_eyes_xrot_adjust(rob_chr_data->bone_data, chara_some_data_array, &pv_data->eyes_adjust); - rob_chara_data_bone_data_get_ik_scale(rob_chr_data->bone_data, bone_data); - rob_chara_data_load_default_motion(rob_chr_data, bone_data, mot_db); - int32_t motion_id = 195; //rob_cmn_mottbl_get_motion_index(rob_chr_data, 0); - rob_chara_data_load_motion(rob_chr_data, motion_id, 0, bone_data, mot_db); - rob_chara_data_set_draw(rob_chr_data, ITEM_MAX, true); + 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_item_equip_get_parent_bone_nodes(rob_chr->item_equip, + rob_chara_bone_data_get_node(rob_chr->bone_data, 0), bone_data); + 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); } -void rob_chara_data_set(rob_chara_data* rob_chr_data, int8_t chara_id, +void rob_chara_set(rob_chara* rob_chr, int8_t chara_id, chara_index chara_index, uint32_t module_index, rob_chara_pv_data* pv_data) { - rob_chr_data->chara_id = chara_id; - rob_chr_data->chara_index = chara_index; - rob_chr_data->module_index = module_index; - rob_chr_data->pv_data = *pv_data; - rob_chr_data->chara_init_data = chara_init_data_get(chara_index); + rob_chr->chara_id = chara_id; + rob_chr->chara_index = chara_index; + rob_chr->module_index = module_index; + rob_chr->pv_data = *pv_data; + rob_chr->chara_init_data = chara_init_data_get(chara_index); } -void rob_chara_data_set_frame(rob_chara_data* rob_chr_data, float_t frame) { - rob_chara_data_bone_data_set_frame(rob_chr_data->bone_data, frame); - rob_chara_data_bone_data_interpolate(rob_chr_data->bone_data); - rob_chara_data_bone_data_update(rob_chr_data->bone_data, 0); +void rob_chara_set_frame(rob_chara* rob_chr, float_t frame) { + rob_chara_bone_data_set_frame(rob_chr->bone_data, frame); + rob_chara_bone_data_interpolate(rob_chr->bone_data); + rob_chara_bone_data_update(rob_chr->bone_data, 0); } -void rob_chara_data_free(rob_chara_data* rob_chr_data) { - if (rob_chr_data->bone_data) - rob_chara_data_bone_data_dispose(rob_chr_data->bone_data); +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_data->item_equip) - rob_chara_data_item_equip_dispose(rob_chr_data->item_equip); + 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) { @@ -1440,7 +1641,7 @@ static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select) { a1->rot_mat[0] = mat4u_identity; } else if (a1->type == BONE_DATABASE_BONE_TYPE_1) { - mat4_mult_vec3_inv(&mat, &a1->trans, &a1->trans); + mat4_mult_vec3_inv_trans(&mat, &a1->trans, &a1->trans); mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat); a1->rot_mat[0] = mat4u_identity; } @@ -1611,21 +1812,21 @@ static bool bone_data_mult_1_ik(bone_data* a1, bone_data* a2) { case MOTION_BONE_N_MOMO_A_L_WJ_CD_EX: v5 = a2[MOTION_BONE_CL_MOMO_L].node; mat4_get_translation(v5[2].mat, &v30); - mat4_mult_vec3_inv(a1->node[0].mat, &v30, &v30); + mat4_mult_vec3_inv_trans(a1->node[0].mat, &v30, &v30); vec3_negate(v30, v30); bone_data_mult_1_ik_legs(a1, &v30); break; case MOTION_BONE_N_MOMO_A_R_WJ_CD_EX: v5 = a2[MOTION_BONE_CL_MOMO_R].node; mat4_get_translation(v5[2].mat, &v30); - mat4_mult_vec3_inv(a1->node[0].mat, &v30, &v30); + mat4_mult_vec3_inv_trans(a1->node[0].mat, &v30, &v30); vec3_negate(v30, v30); bone_data_mult_1_ik_legs(a1, &v30); break; case MOTION_BONE_N_HARA_CD_EX: v5 = a2[MOTION_BONE_KL_MUNE_B_WJ].node; mat4_get_translation(v5[0].mat, &v30); - mat4_mult_vec3_inv(a1->node[0].mat, &v30, &v30); + mat4_mult_vec3_inv_trans(a1->node[0].mat, &v30, &v30); bone_data_mult_1_ik_legs(a1, &v30); break; default: @@ -1636,7 +1837,7 @@ static bool bone_data_mult_1_ik(bone_data* a1, bone_data* a2) { static void bone_data_mult_1_ik_hands(bone_data* a1, vec3* a2) { vec3 v15; - mat4_mult_vec3_inv(a1->node[0].mat, a2, &v15); + mat4_mult_vec3_inv_trans(a1->node[0].mat, a2, &v15); float_t len; vec3_length_squared(v15, len); @@ -1674,7 +1875,7 @@ static void bone_data_mult_1_ik_hands_2(bone_data* a1, vec3* a2, float_t a3) { float_t len; vec3 v8; - mat4_mult_vec3_inv(a1->node[0].mat, a2, &v8); + mat4_mult_vec3_inv_trans(a1->node[0].mat, a2, &v8); v8.x = 0.0f; vec3_length(v8, len); if (len <= 0.000001f) @@ -1721,7 +1922,7 @@ static void bone_data_mult_1_ik_legs(bone_data* a1, vec3* a2) { mat4_mult(&rot_mat, a1->node[0].mat, a1->node[0].mat); } -static bool bone_data_mult_1_exp_data(bone_data* a1, bone_node_expression_data* a2, bone_data* a3) { +static bool bone_data_mult_1_exp_data(bone_data* a1, bone_node_expression_data* exp_data, bone_data* a3) { float_t v10; bone_node* v11; vec3 v15; @@ -1731,12 +1932,12 @@ static bool bone_data_mult_1_exp_data(bone_data* a1, bone_node_expression_data* bool ret = true; switch (a1->motion_bone_index) { case MOTION_BONE_N_EYE_L_WJ_EX: - a2->rotation.x = -a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.x; - a2->rotation.y = a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); + exp_data->rotation.x = -a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.x; + exp_data->rotation.y = a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); break; case MOTION_BONE_N_EYE_R_WJ_EX: - a2->rotation.x = -a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.x; - a2->rotation.y = a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); + exp_data->rotation.x = -a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.x; + exp_data->rotation.y = a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); break; case MOTION_BONE_N_KUBI_WJ_EX: mat4u_to_mat4(&a3[MOTION_BONE_CL_KAO].rot_mat[0], &dst); @@ -1746,87 +1947,87 @@ static bool bone_data_mult_1_exp_data(bone_data* a1, bone_node_expression_data* v10 = v15.z; if (v10 < (float_t)-M_PI_2) v10 += (float_t)(M_PI * 2.0); - a2->rotation.y = (v10 - (float_t)M_PI_2) * 0.2f; + exp_data->rotation.y = (v10 - (float_t)M_PI_2) * 0.2f; break; case MOTION_BONE_N_HITO_L_EX: case MOTION_BONE_N_HITO_R_EX: - a2->rotation.z = (float_t)(-9.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-9.0 * DEG_TO_RAD); break; case MOTION_BONE_N_KO_L_EX: - a2->rotation.x = (float_t)(-8.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(16.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(-8.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(16.0 * DEG_TO_RAD); break; case MOTION_BONE_N_KUSU_L_EX: case MOTION_BONE_N_KUSU_R_EX: - a2->rotation.z = (float_t)(9.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(9.0 * DEG_TO_RAD); break; case MOTION_BONE_N_NAKA_L_EX: case MOTION_BONE_N_NAKA_R_EX: - a2->rotation.z = (float_t)(-1.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-1.0 * DEG_TO_RAD); break; case MOTION_BONE_N_OYA_L_EX: - a2->rotation.x = (float_t)(75.0 * DEG_TO_RAD); - a2->rotation.y = (float_t)(12.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(75.0 * DEG_TO_RAD); + exp_data->rotation.y = (float_t)(12.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); break; case MOTION_BONE_N_STE_L_WJ_EX: - a2->rotation.x = a3[MOTION_BONE_KL_TE_L_WJ].node[0].exp_data.rotation.x; + exp_data->rotation.x = a3[MOTION_BONE_KL_TE_L_WJ].node[0].exp_data.rotation.x; break; case MOTION_BONE_N_SUDE_L_WJ_EX: case MOTION_BONE_N_SUDE_B_L_WJ_EX: v11 = &a3[MOTION_BONE_KL_TE_L_WJ].node[0]; - a2->rotation.x = bone_data_limit_angle(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); + exp_data->rotation.x = bone_data_limit_angle(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_SUDE_R_WJ_EX: case MOTION_BONE_N_SUDE_B_R_WJ_EX: v11 = &a3[MOTION_BONE_KL_TE_R_WJ].node[0]; - a2->rotation.x = bone_data_limit_angle(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); + exp_data->rotation.x = bone_data_limit_angle(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_HIJI_L_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_C_KATA_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_C_KATA_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_UP_KATA_L_EX: case MOTION_BONE_N_UP_KATA_R_EX: break; case MOTION_BONE_N_KO_R_EX: - a2->rotation.x = (float_t)(8.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(16.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(8.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(16.0 * DEG_TO_RAD); break; case MOTION_BONE_N_OYA_R_EX: - a2->rotation.x = (float_t)(-75.0 * DEG_TO_RAD); - a2->rotation.y = (float_t)(-12.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(-75.0 * DEG_TO_RAD); + exp_data->rotation.y = (float_t)(-12.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); break; case MOTION_BONE_N_STE_R_WJ_EX: - a2->rotation.x = a3[MOTION_BONE_KL_TE_R_WJ].node[0].exp_data.rotation.x; + exp_data->rotation.x = a3[MOTION_BONE_KL_TE_R_WJ].node[0].exp_data.rotation.x; break; case MOTION_BONE_N_HIJI_R_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_C_KATA_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_C_KATA_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_HIZA_L_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_CL_MOMO_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_CL_MOMO_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_HIZA_R_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_CL_MOMO_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_CL_MOMO_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_MOMO_B_L_WJ_EX: case MOTION_BONE_N_MOMO_C_L_WJ_EX: v11 = &a3[MOTION_BONE_CL_MOMO_L].node[0]; - a2->rotation.y = bone_data_limit_angle(v11->exp_data.rotation.y + exp_data->rotation.y = bone_data_limit_angle(v11->exp_data.rotation.y + v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_MOMO_B_R_WJ_EX: case MOTION_BONE_N_MOMO_C_R_WJ_EX: v11 = &a3[MOTION_BONE_CL_MOMO_R].node[0]; - a2->rotation.y = bone_data_limit_angle(v11->exp_data.rotation.y + exp_data->rotation.y = bone_data_limit_angle(v11->exp_data.rotation.y + v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_HARA_B_WJ_EX: - a2->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(1.0 / 3.0) + exp_data->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(1.0 / 3.0) + a3[MOTION_BONE_KL_KOSI_Y].node[0].exp_data.rotation.y * (float_t)(2.0 / 3.0); break; case MOTION_BONE_N_HARA_C_WJ_EX: - a2->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(2.0 / 3.0) + exp_data->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(2.0 / 3.0) + a3[MOTION_BONE_KL_KOSI_Y].node[0].exp_data.rotation.y * (float_t)(1.0 / 3.0); break; default: @@ -1843,7 +2044,7 @@ static void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { mat4 mat = *a1->node[0].mat; vec3 v30; - mat4_mult_vec3_inv(&mat, &a1->ik_target, &v30); + mat4_mult_vec3_inv_trans(&mat, &a1->ik_target, &v30); float_t v6; float_t v8; vec2_length_squared(*(vec2*)&v30, v6); @@ -1862,7 +2063,7 @@ static void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { if (a1->pole_target_mat) { vec3 pole_target; mat4_get_translation(a1->pole_target_mat, &pole_target); - mat4_mult_vec3_inv(&mat, &pole_target, &pole_target); + mat4_mult_vec3_inv_trans(&mat, &pole_target, &pole_target); float_t pole_target_length; vec2_length(*(vec2*)&pole_target.y, pole_target_length); if (pole_target_length > 0.000001f) { @@ -1888,7 +2089,7 @@ static void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { float_t rot_cos; float_t rot_2nd_sin; float_t rot_2nd_cos; - if (fabsf(v8) > 0.000001f) { + if (v8 > 0.000001f) { float_t v26 = a1->field_2E0; if (v26 > 0.0001f) { float_t v27 = (ik_segment_length + ik_2nd_segment_length) * v26; @@ -1982,7 +2183,7 @@ 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_data_bone_data* rob_bone_data, bone_database* bone_data) { + rob_chara_bone_data* rob_bone_data, bone_database* bone_data) { char* base_name = bone_database_skeleton_type_to_string(rob_bone_data->base_skeleton_type); char* name = bone_database_skeleton_type_to_string(rob_bone_data->skeleton_type); vector_bone_database_bone* common_bones = 0; @@ -1994,13 +2195,13 @@ static void bone_data_parent_data_init(bone_data_parent* bone, return; bone->rob_bone_data = rob_bone_data; - bone_data_parent_load_rob_chara_data(bone); + bone_data_parent_load_rob_chara(bone); bone_data_parent_load_bone_database(bone, common_bones, common_translation->begin, translation->begin); } static void bone_data_parent_load_bone_database(bone_data_parent* bone, vector_bone_database_bone* bones, vec3* common_translation, vec3* translation) { - rob_chara_data_bone_data* rob_bone_data = bone->rob_bone_data; + 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; @@ -2104,8 +2305,8 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, } } -static void bone_data_parent_load_rob_chara_data(bone_data_parent* bone) { - rob_chara_data_bone_data* rob_bone_data = bone->rob_bone_data; +static void bone_data_parent_load_rob_chara(bone_data_parent* bone) { + rob_chara_bone_data* rob_bone_data = bone->rob_bone_data; if (!rob_bone_data) return; @@ -2179,27 +2380,27 @@ static void bone_data_parent_free(bone_data_parent* bone) { } static void bone_node_expression_data_mat_set(bone_node_expression_data* data, - vec3* data_scale, mat4* ex_data_mat, mat4* mat) { + vec3* parent_scale, mat4* ex_data_mat, mat4* mat) { vec3 position; - vec3_mult(data->position, *data_scale, position); + vec3_mult(data->position, *parent_scale, position); mat4_translate_mult( ex_data_mat, position.x, position.y, position.z, ex_data_mat); vec3 rotation = data->rotation; mat4_rotate_mult(ex_data_mat, rotation.x, rotation.y, rotation.z, ex_data_mat); - vec3_mult(data->scale, *data_scale, data->data_scale); + vec3_mult(data->scale, *parent_scale, data->parent_scale); *mat = *ex_data_mat; - mat4_scale_rot(mat, data->data_scale.x, data->data_scale.y, data->data_scale.z, mat); + 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->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->data_scale = vec3_identity; + data->parent_scale = vec3_identity; } static void bone_node_expression_data_set_position_rotation(bone_node_expression_data* data, @@ -2212,7 +2413,7 @@ static void bone_node_expression_data_set_position_rotation(bone_node_expression data->rotation.z = rotation_z; data->rotation.y = rotation_y; data->scale = vec3_identity; - data->data_scale = vec3_identity; + data->parent_scale = vec3_identity; } static void bone_node_expression_data_set_position_rotation_vec3(bone_node_expression_data* data, @@ -2220,7 +2421,7 @@ static void bone_node_expression_data_set_position_rotation_vec3(bone_node_expre data->position = *position; data->rotation = *rotation; data->scale = vec3_identity; - data->data_scale = vec3_identity; + data->parent_scale = vec3_identity; } static ex_cloth_block* ex_cloth_block_init() { @@ -2234,12 +2435,52 @@ static void ex_cloth_block_draw(ex_cloth_block* cls) { } +static void ex_cloth_block_field_8(ex_cloth_block* cls) { + //cls->rob.field_48(&cls->rob); + cls->cls_data = 0; + cls->field_2428 = 0; + cls->index = 0; +} + +static void ex_cloth_block_field_18(ex_cloth_block* cls, int32_t a2, bool a3) { + +} + +static void sub_1405F98A0(ex_cloth_block* cls) { + //sub_14021FD00(&cls->rob, cls->field_2428); + //cls->rob.__vftable->set_wind_direction(&cls->rob, wind_task_struct_get_wind_direction()); +} + +static void ex_cloth_block_field_28(ex_cloth_block* a1) { + //sub_140218E40(&cls->rob, &cls->base.item_equip_object->item_equip->field_940); +} + +static void ex_cloth_block_field_40(ex_cloth_block* cls) { + +} + +static void ex_cloth_block_field_48(ex_cloth_block* cls) { + sub_1405F98A0(cls); + //sub_14021D480(&cls->rob); +} + +static void ex_cloth_block_field_50(ex_cloth_block* cls) { + sub_1405F98A0(cls); + //sub_14021D840(&cls->rob); +} + static void ex_cloth_block_reset(ex_cloth_block* cls) { } static void ex_cloth_block_update(ex_cloth_block* cls) { - + sub_1405F98A0(cls); + rob_chara_item_equip* rob_item_equip = cls->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) + step = 1.0f; + //sub_140218560(&cls->rob, step, 0); } static void ex_cloth_block_dispose(ex_cloth_block* cls) { @@ -2254,14 +2495,14 @@ static ex_constraint_block* ex_constraint_block_init() { return cns; } -static void ex_constraint_block_init_data(ex_constraint_block* cns, rob_chara_data_item_equip_object* itm_eq_obj, +static void ex_constraint_block_init_data(ex_constraint_block* 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_data_item_equip_object_get_bone_node_by_name( + bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( itm_eq_obj, cns_data_name, bone_data); ex_node_block_init_data(&cns->base, node, EX_CONSTRAINT, node->name, itm_eq_obj); cns->cns_data = cns_data; - cns->source_node_bone_node = rob_chara_data_item_equip_object_get_bone_node_by_name( + 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; @@ -2286,7 +2527,7 @@ static void ex_constraint_block_init_data(ex_constraint_block* cns, rob_chara_da } if (up_vector_name) - cns->direction_up_vector_bone_node = rob_chara_data_item_equip_object_get_bone_node_by_name( + cns->direction_up_vector_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( itm_eq_obj, up_vector_name, bone_data); } @@ -2297,29 +2538,37 @@ static void ex_constraint_block_data_set(ex_constraint_block* cns) { bone_node* node = cns->base.bone_node; bone_node_expression_data* exp_data = &node->exp_data; bone_node* parent_node = cns->base.parent_bone_node; - vec3 data_scale = parent_node->exp_data.data_scale; + 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(data_scale.x) > 0.000001f) - exp_data->position.x /= data_scale.x; - if (fabsf(data_scale.y) > 0.000001f) - exp_data->position.y /= data_scale.z; - if (fabsf(data_scale.z) > 0.000001f) - exp_data->position.z /= data_scale.z; + 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, data_scale.x, data_scale.y, data_scale.z, node->mat); - vec3_mult(exp_data->scale, data_scale, exp_data->data_scale); + 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); } static void ex_constraint_block_draw(ex_constraint_block* cns) { } -static void ex_constraint_block_set_default_data(ex_constraint_block* cns) { +static void ex_constraint_block_field_8(ex_constraint_block* cns) { + cns->type = OBJECT_SKIN_BLOCK_CONSTRAINT_NONE; + cns->source_node_bone_node = 0; + cns->direction_up_vector_bone_node = 0; + cns->cns_data = 0; + cns->field_80 = 0; +} + +static void ex_constraint_block_field_10(ex_constraint_block* cns) { if (cns->base.bone_node) { bone_node_expression_data* exp_data = &cns->base.bone_node->exp_data; object_skin_block_constraint* cns_data = cns->cns_data; @@ -2327,22 +2576,214 @@ static void ex_constraint_block_set_default_data(ex_constraint_block* cns) { exp_data->rotation = cns_data->base.rotation; exp_data->scale = cns_data->base.scale; } - cns->base.set_data = false; + cns->base.field_59 = false; +} + +static void ex_constraint_block_field_18(ex_constraint_block* cns, int32_t a2, bool a3) { + if (cns->base.field_59) + return; + + if (a2 == 0) { + if (cns->base.field_58) + cns->base.vftable->update(&cns->base); + } + else if (a2 == 2) { + if (cns->base.field_5A) + ex_constraint_block_data_set(cns); + } + else if (a2 == 5) + cns->base.vftable->update(&cns->base); +} + +static void ex_constraint_block_field_28(ex_constraint_block* cns) { + cns->base.vftable->update(&cns->base); +} + +static void ex_constraint_block_field_40(ex_constraint_block* cns) { + +} + +static void ex_constraint_block_field_48(ex_constraint_block* cns) { + cns->base.vftable->update(&cns->base); +} + +static void ex_constraint_block_field_50(ex_constraint_block* cns) { + cns->base.vftable->update(&cns->base); +} + +static void sub_1405F10D0(mat4* mat, vec3* a2, float_t a3, float_t a4) { + vec3 v5; + vec3 v6; + vec3 v7; + vec3 v8; + vec3 v9; + vec3_normalize(*a2, v5); + vec3_mult_scalar(v5, 1.0f - a3, v9); + vec3_mult_scalar(v5, v9.x, v6); + vec3_mult_scalar(v5, v9.y, v7); + vec3_mult_scalar(v5, v9.z, v8); + mat->row0.x = v6.x + a3; + mat->row0.y = v6.y - v5.z * a4; + mat->row0.z = v6.z + v5.y * a4; + mat->row0.w = 0.0f; + mat->row1.x = v7.x + v5.z * a4; + mat->row1.y = v7.y + a3; + mat->row1.z = v7.z - v5.x * a4; + mat->row1.w = 0.0f; + mat->row2.x = v8.x - v5.y * a4; + mat->row2.y = v8.y + v5.x * a4; + mat->row2.z = v8.z + a3; + mat->row2.w = 0.0f; + mat->row3 = (vec4){ 0.0f, 0.0f, 0.0f, 1.0f }; +} + +static void sub_1401EB410(mat4* mat, vec3* a2, vec3* target_offset) { + vec3 v3; + vec3 v4; + vec3_normalize(*a2, v3); + vec3_normalize(*target_offset, v4); + vec3 v13; + vec3_cross(v4, v3, v13); + + float_t v18; + vec3_dot(v3, v4, v18); + v18 = clamp(v18, -1.0f, 1.0f); + float_t v19 = 1.0f - v18; + + float_t v20 = 1.0f - v18 * v18; + v20 = sqrtf(clamp(v20, 0.0f, 1.0f)); + + sub_1405F10D0(mat, &v13, v18, v20); } static void ex_constraint_block_time_step(ex_constraint_block* cns) { + bone_node* node = cns->base.bone_node; + if (!node) + return; + + vec3 pos; + bone_node* parent_node = cns->base.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->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_bone_node) { + vec3 affected_axis = cns_data->direction.up_vector.affected_axis; + mat4 v56; + mat4_mult(&v59, &mat, &v56); + mat4_mult_vec3(&v56, &affected_axis, &affected_axis); + mat4* v20 = cns->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: { + 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_bone_node) { + vec3 up_vector_trans; + mat4_get_translation(cns->direction_up_vector_bone_node->mat, &up_vector_trans); + mat4_mult_vec3_inv_trans(&mat, &up_vector_trans, &up_vector_trans); + + mat4 v26; + sub_1401EB410(&v26, &cns_data->position.up_vector.affected_axis, &up_vector_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; + } } static void ex_constraint_block_update(ex_constraint_block* cns) { if (!cns->base.parent_bone_node) return; - if (cns->base.set_data) - cns->base.set_data = false; + if (cns->base.field_59) + cns->base.field_59 = false; else { ex_constraint_block_time_step(cns); ex_constraint_block_data_set(cns); - cns->base.set_data = true; + cns->base.field_59 = true; } } @@ -2359,12 +2800,12 @@ static ex_expression_block* ex_expression_block_init() { } static void ex_expression_block_init_data(ex_expression_block* exp, - rob_chara_data_item_equip_object* itm_eq_obj, object_skin_block_expression* exp_data, + rob_chara_item_equip_object* itm_eq_obj, object_skin_block_expression* exp_data, char* exp_data_name, object_info a4, chara_index chara_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_data_item_equip_object_get_bone_node_by_name( + bone_node* node = rob_chara_item_equip_object_get_bone_node_by_name( itm_eq_obj, exp_data_name, bone_data); ex_node_block_init_data(&exp->base, node, EX_EXPRESSION, node->name, itm_eq_obj); @@ -2410,7 +2851,7 @@ static void ex_expression_block_init_data(ex_expression_block* exp, stack_val->type = EX_EXPRESSION_BLOCK_STACK_VARIABLE; int32_t v40 = *string_data(&func_str) - '0'; if (v40 < 9) { - bone_node* v42 = rob_chara_data_item_equip_object_get_bone_node_by_name(itm_eq_obj, + bone_node* v42 = rob_chara_item_equip_object_get_bone_node_by_name(itm_eq_obj, string_data(&func_str) + 2, bone_data); if (v42) stack_val->var.value = bone_node_get_exp_data_component(v42, v40, &stack_val->type); @@ -2462,18 +2903,17 @@ static void ex_expression_block_init_data(ex_expression_block* exp, } } - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) - exp->osage_phys_step = true; + exp->step = chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO; } static void ex_expression_block_data_set(ex_expression_block* exp) { bone_node* node = exp->base.bone_node; bone_node* parent_node = exp->base.parent_bone_node; bone_node_expression_data* data = &node->exp_data; - vec3 data_scale = exp->base.parent_bone_node->exp_data.data_scale; + vec3 parent_scale = exp->base.parent_bone_node->exp_data.parent_scale; mat4 ex_data_mat = *parent_node->ex_data_mat; mat4 mat = mat4_identity; - bone_node_expression_data_mat_set(data, &data_scale, &ex_data_mat, &mat); + bone_node_expression_data_mat_set(data, &parent_scale, &ex_data_mat, &mat); *node->mat = mat; *node->ex_data_mat = ex_data_mat; } @@ -2482,46 +2922,86 @@ static void ex_expression_block_draw(ex_expression_block* exp) { } -static void ex_expression_block_set_default_data(ex_expression_block* exp) { +static void ex_expression_block_field_8(ex_expression_block* exp) { + exp->frame = 0.0; +} + +static void ex_expression_block_field_10(ex_expression_block* exp) { bone_node_expression_data* exp_data = &exp->base.bone_node->exp_data; object_skin_block_expression* exp_exp_data = exp->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; - exp->base.set_data = false; + exp->base.field_59 = false; +} + +static void ex_expression_block_field_18(ex_expression_block* exp, int32_t a2, bool a3) { + if (exp->base.field_59) + return; + + if (a2 == 0) { + if (exp->base.field_58) + exp->base.vftable->update(&exp->base); + } + else if (a2 == 2) { + if (exp->base.field_5A) + ex_expression_block_data_set(exp); + } + else if (a2 == 5) + exp->base.vftable->update(&exp->base); +} + +static void ex_expression_block_field_28(ex_expression_block* exp) { + exp->base.vftable->update(&exp->base); +} + +static void ex_expression_block_field_40(ex_expression_block* exp) { + +} + +static void ex_expression_block_field_48(ex_expression_block* exp) { + exp->base.vftable->update(&exp->base); +} + +static void ex_expression_block_field_50(ex_expression_block* exp) { + exp->base.vftable->update(&exp->base); } static void ex_expression_block_time_step(ex_expression_block* exp) { float_t delta_frame = get_delta_frame(); - if (exp->osage_phys_step) - delta_frame *= exp->base.item_equip_object->item_equip->osage_phys_step; + if (exp->step) + delta_frame *= exp->base.item_equip_object->item_equip->step; float_t frame = exp->frame + delta_frame; exp->frame = frame >= 65535.0f ? frame - 65535.0f : frame; - if (exp->field_3D28) + if (exp->field_3D28) { exp->field_3D28(&exp->base.bone_node->exp_data); - else - for (int32_t i = 0; i < 9; i++) { - if (!exp->expressions[i]) - break; + return; + } - *exp->values[i] = ex_expression_block_stack_get_value(exp->expressions[i]); - if (exp->types[i] == EX_EXPRESSION_BLOCK_STACK_VARIABLE_RADIAN) - *exp->values[i] *= DEG_TO_RAD_FLOAT; - } + for (int32_t i = 0; i < 9; i++) { + if (!exp->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) + value *= DEG_TO_RAD_FLOAT; + *exp->values[i] = value; + } } static void ex_expression_block_update(ex_expression_block* exp) { if (!exp->base.parent_bone_node) return; - if (exp->base.set_data) - exp->base.set_data = false; - else { - ex_expression_block_time_step(exp); - ex_expression_block_data_set(exp); - exp->base.set_data = true; + if (exp->base.field_59) { + exp->base.field_59 = false; + return; } + + ex_expression_block_time_step(exp); + ex_expression_block_data_set(exp); + exp->base.field_59 = true; } static void ex_expression_block_dispose(ex_expression_block* exp) { @@ -2563,8 +3043,16 @@ static float_t ex_expression_block_stack_get_value(ex_expression_block_stack* st return value; } +static void ex_node_block_field_10(ex_node_block* node) { + node->field_59 = false; +} + +static void ex_node_block_field_58(ex_node_block* node) { + node->field_59 = 0; +} + static void ex_node_block_init_data(ex_node_block* node, bone_node* bone_node, - ex_node_type type, char* name, rob_chara_data_item_equip_object* itm_eq_obj) { + ex_node_type type, char* name, rob_chara_item_equip_object* itm_eq_obj) { node->bone_node = bone_node; node->type = type; if (name) @@ -2579,14 +3067,1189 @@ static void ex_node_block_reset(ex_node_block* node) { node->bone_node = 0; } -static void ex_node_block_set_default_data(ex_node_block* node) { - node->set_data = false; -} - static void ex_node_block_free(ex_node_block* node) { string_free(&node->parent_name); } +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; + } + + 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); + } + mat4_to_mat4u(rob_osg->parent_mat_ptr, &rob_osg->parent_mat); +} + +static void sub_14047F110(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, bool init_rot) { + vec3 position; + vec3_mult(rob_osg->exp_data.position, *parent_scale, position); + mat4_translate_mult(mat, position.x, position.y, position.z, mat); + + vec3 rotation = rob_osg->exp_data.rotation; + mat4_rotate_mult(mat, rotation.x, rotation.y, rotation.z, mat); + + skin_param* skin_param = rob_osg->skin_param_ptr; + vec3 rot = skin_param->rot; + if (init_rot) + vec3_add(rot, skin_param->init_rot, rot); + 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) { + 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 (hinge) { + if (y_rot > hinge->ymax) { + y_rot = hinge->ymax; + clipped = true; + } + + if (y_rot < hinge->ymin) { + y_rot = hinge->ymin; + clipped = true; + } + + if (z_rot > hinge->zmax) { + z_rot = hinge->zmax; + clipped = true; + } + + if (z_rot < hinge->zmin) { + z_rot = hinge->zmin; + clipped = true; + } + } + mat4_rotate_y_mult(mat, y_rot, mat); + 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)); + if (hinge) { + if (y_rot > hinge->ymax) { + y_rot = hinge->ymax; + clipped = true; + } + + if (y_rot < hinge->ymin) { + y_rot = hinge->ymin; + clipped = true; + } + + if (z_rot > hinge->zmax) { + z_rot = hinge->zmax; + clipped = true; + } + + if (z_rot < hinge->zmin) { + z_rot = hinge->zmin; + clipped = true; + } + } + mat4_rotate_z_mult(mat, z_rot, mat); + mat4_rotate_y_mult(mat, y_rot, mat); + } + + if (a4) { + a4->y = y_rot; + a4->z = z_rot; + } + return clipped; +} + +static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, bool a4) { + 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) { + rob_osg->field_1F0E = true; + sub_14047EE90(rob_osg, mat); + } + + if (!rob_osg->field_1F0C) { + rob_osg->field_1F0C = true; + + float_t move_cancel = rob_osg->skin_param_ptr->move_cancel; + if (rob_osg->move_cancel == 1.0f) + move_cancel = 1.0f; + if (move_cancel < 0.0f) + 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++) { + mat4 parent_mat; + vec3 v46; + mat4_mult_vec3_inv_trans(&parent_mat, &v19->trans, &v46); + mat4_mult_vec3_trans(&parent_mat, &v46, &v46); + vec3_sub(v46, v19->trans, v46); + vec3_mult_scalar(v46, move_cancel, v46); + vec3_add(v19->trans, v46, v19->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++) { + 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->bone_node->ex_data_mat = v47; + float_t v34; + vec3_distance(v30->trans, v29->trans, v34); + float_t v35 = parent_scale->x * v30->length; + bool v36; + if (v34 >= fabsf(v35)) { + v35 = v34; + v36 = false; + } + else + v36 = true; + mat4_translate_mult(&v47, v35, 0.0f, 0.0f, &v47); + if (v32 || v36) + 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; + mat4_translate_mult(&v48, parent_scale->x * rob_osg->node.length, 0.0f, 0.0f, &v48); + *rob_osg->node.bone_node->ex_data_mat = v48; + } + } +} + +static void sub_140482300(vec3* a1, vec3* a2, vec3* a3, float_t osage_gravity_const, float_t weight) { + weight *= osage_gravity_const; + vec3 diff; + vec3_sub(*a2, *a3, diff); + float_t dist; + vec3_length(diff, dist); + if (dist <= fabsf(osage_gravity_const)) { + diff.y = osage_gravity_const; + vec3_length(diff, dist); + } + vec3_mult_scalar(diff, weight * diff.y * (1.0f / (dist * dist)), diff); + vec3_negate(diff, diff); + diff.y -= weight; + *a1 = diff; +} + +static void sub_140482F30(vec3* pos1, vec3* pos2, float_t length) { + vec3 diff; + vec3_sub(*pos1, *pos2, diff); + float_t dist; + vec3_length_squared(diff, dist); + if (dist > length * length) { + vec3_mult_scalar(diff, length / sqrtf(dist), diff); + vec3_add(*pos2, diff, *pos1); + } +} + +static void sub_140482490(rob_osage_node* node, float_t step, float_t a3) { + if (step != 1.0f) { + vec3 v4; + vec3_sub(node->trans, node->trans_orig, v4); + + float_t v9; + vec3_length(v4, v9); + if (v9 != 0.0f) + vec3_mult_scalar(v4, 1.0f / v9, v4); + vec3_mult_scalar(v4, step * v9, v4); + vec3_add(node->trans_orig, v4, node->trans); + } + + sub_140482F30(&node->trans, &node[-1].trans, node->length * a3); + if (node->sibling_node) + sub_140482F30(&node->trans, &node->sibling_node->trans, node->distance); +} + +static void sub_140482180(rob_osage_node* node, float_t a2) { + float_t v2 = node->data_ptr->skp_osg_node.coli_r + a2; + if (v2 <= node->trans.y) + return; + + node->trans.y = v2; + vec3 v3; + vec3_sub(node->trans, node[-1].trans, v3); + vec3_normalize(v3, v3); + vec3_mult_scalar(v3, node->length, v3); + vec3_add(node[-1].trans, v3, node->trans); + node->trans_diff = vec3_null; + node->field_C8 += 1.0f; +} + +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) + 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]; + v17->trans_orig = v17->trans; + vec3 v113; + vec3_mult(rob_osg->exp_data.position, *parent_scale, v113); + + mat4 v130 = *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->ex_data_mat = v130; + + v113 = (vec3){ 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) + 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++) { + rob_osage_node_data* v31 = v26->data_ptr; + float_t weight = v31->skp_osg_node.weight; + vec3 v111; + if (!rob_osg->field_1F78) { + sub_140482300(&v111, &v26->trans, &v30->trans, osage_gravity_const, weight); + + if (v26 != &v12[-1]) { + vec3 v112; + sub_140482300(&v112, &v26->trans, &v26[1].trans, osage_gravity_const, weight); + vec3_add(v111, v112, v111); + vec3_mult_scalar(v111, 0.5f, v111); + } + } + else + vec3_mult_scalar(rob_osg->field_1F7C, 1.0f / weight, v111); + + vec3 v127; + vec3_mult_scalar(v128, v31->force * v26->force, v127); + float_t v41 = (1.0f - rob_osg->field_1EB4) * (1.0f - rob_osg->skin_param_ptr->air_res); + + vec3 v126; + 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_add(v126, v111, v126); + + if (!a5) { + vec3_mult_scalar(rob_osg->wind_direction, rob_osg->skin_param_ptr->wind_afc, v111); + vec3_add(v126, v111, v126); + } + + if (stiffness) { + vec3 v116; + vec3_sub(v26->trans_diff, v30->trans_diff, v116); + vec3_mult_scalar(v116, 1.0f - rob_osg->skin_param_ptr->air_res, v116); + vec3_sub(v126, v116, v126); + } + + float_t v49 = 1.0f / (weight - (weight - 1.0f) * v31->skp_osg_node.inertial_cancel); + vec3_mult_scalar(v126, v49, v26->field_28); + } + + if (stiffness) { + mat4 v131 = v130; + vec3 v111; + mat4_get_translation(&v131, &v111); + + for (rob_osage_node* v55 = rob_osg->nodes.begin + 1; v55 != v12; v55++) { + mat4_mult_vec3_trans(&v131, &v55->field_94, &v128); + + vec3 v123; + vec3_add(v55->trans_diff, v55->field_28, v123); + vec3 v126; + vec3_add(v55->trans, v123, v126); + sub_140482F30(&v126, &v111, v25 * v55->length); + vec3 v117; + vec3_sub(v128, v126, v117); + vec3_mult_scalar(v117, rob_osg->skin_param_ptr->stiffness, v117); + float_t weight = v55->data_ptr->skp_osg_node.weight; + float_t v74 = 1.0f / (weight - (weight - 1.0f) * v55->data_ptr->skp_osg_node.inertial_cancel); + vec3_mult_scalar(v117, v74, v117); + vec3_add(v55->field_28, v117, v55->field_28); + vec3_add(v55->trans, v117, v126); + vec3_add(v126, v123, v126); + + vec3 v129; + mat4_mult_vec3_inv_trans(&v131, &v126, &v129); + + sub_140482FF0(&v131, &v129, 0, 0, rob_osg->field_1EB8); + + float_t v58; + vec3_distance(v111, v126, v58); + mat4_translate_mult(&v131, v58, 0.0f, 0.0f, &v131); + + v111 = v126; + } + } + + for (rob_osage_node* 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); + + if (a6) { + rob_osage_node* 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 + || v91->trans.z < rob_osg->ring.ring_rectangle_y - v93 + || v91->trans.x > rob_osg->ring.ring_rectangle_x + rob_osg->ring.ring_rectangle_width + || v91->trans.z > rob_osg->ring.ring_rectangle_y + rob_osg->ring.ring_rectangle_height) + v97 = rob_osg->ring.ring_out_height; + else + 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); + } + } + + if (a7) { + for (rob_osage_node* 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->bone_node->ex_data_mat = v130; + + float_t v104; + vec3_distance(v99->trans, v100->trans, v104); + float_t v105 = v25 * v99->length; + + bool v106; + if (v104 >= fabs(v105)) { + v105 = sqrtf(v104); + v106 = false; + } + else + v106 = true; + + mat4_translate_mult(&v130, v105, 0.0f, 0.0f, &v130); + if (v102 || v106) + 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; + mat4_translate_mult(&v131, v25 * rob_osg->node.length, 0.0f, 0.0f, &v131); + *rob_osg->node.bone_node->ex_data_mat = v131; + } + } + rob_osg->field_2A0 = false; +} + +static int32_t sub_140483DE0(vec3* a1, vec3* a2, vec3* a3, float_t radius) { + vec3 v5; + float_t length; + vec3_sub(*a2, *a3, v5); + vec3_length_squared(v5, length); + if (length > 0.000001f && length < radius * radius) { + vec3_mult_scalar(v5, radius / sqrtf(length) - 1.0f, *a1); + return 1; + } + return 0; +} + +static int32_t sub_140484540(vec3* a1, vec3* a2, osage_coli* coli, float_t radius) { + vec3 v11; + vec3_sub(*a2, coli->bone0_pos, v11); + + float_t v17; + vec3_dot(v11, coli->bone_pos_diff, v17); + if (v17 < 0.0f) + return sub_140483DE0(a1, a2, &coli->bone0_pos, radius); + + float_t v19 = coli->bone_pos_diff_length_squared; + if (fabsf(v19) <= 0.000001f) + return sub_140483DE0(a1, a2, &coli->bone0_pos, radius); + if (v17 > v19) + return sub_140483DE0(a1, a2, &coli->bone1_pos, radius); + + float_t v20; + vec3_length_squared(v11, v20); + float_t v22 = fabsf(v20 - v17 * v17 / v19); + if (v22 <= 0.000001f || v22 >= radius * radius) + return 0; + + vec3 v29; + vec3_mult_scalar(coli->bone_pos_diff, v17 / v19, v29); + vec3_sub(v11, v29, v29); + vec3_mult_scalar(v29, radius / sqrtf(v22) - 1.0f, *a1); + return 1; +} + +static int32_t sub_140484780(vec3* a1, vec3* a2, vec3* a3, vec3* a4, float_t radius) { + float_t v3; + vec3_dot(*a2, *a4, v3); + float_t v4; + vec3_dot(*a3, *a4, v4); + float_t v5 = v3 - v4 - radius; + if (v5 >= 0.0f) + return 0; + + vec3_mult_scalar(*a4, -v5, *a1); + return 1; +} + +static int32_t sub_140483EA0(vec3* a1, vec3* a2, osage_coli* a3, float_t radius) { + if (a3->bone_pos_diff_length <= 0.000001f) + return sub_140483DE0(a1, a2, &a3->bone0_pos, radius); + + float_t v61 = a3->bone_pos_diff_length * 0.5f; + float_t v13 = sqrtf(radius * radius + v61 * v61); + + float_t v20; + vec3 v54; + vec3_sub(*a2, a3->bone0_pos, v54); + vec3_length(v54, v20); + + float_t v21; + vec3 v57; + vec3_sub(*a2, a3->bone1_pos, v57); + vec3_length(v57, v21); + + if (v20 <= 0.000001f || v21 <= 0.000001f) + return 0; + + float_t v22 = v20 + v21; + if (v21 + v20 >= v13 * 2.0f) + return 0; + + float_t v25 = 1.0f / a3->bone_pos_diff_length; + + vec3 v63; + vec3_add(a3->bone0_pos, a3->bone1_pos, v63); + vec3_mult_scalar(v63, 0.5f, v63); + vec3_sub(*a2, v63, v63); + + float_t v58; + vec3_length(v63, v58); + if (v58 != 0.0f) + vec3_mult_scalar(v63, 1.0f / v58, v63); + + float_t v36; + vec3_dot(v63, a3->bone_pos_diff, v36); + v36 *= v25; + float_t v37 = v36 * v36; + v37 = min(v37, 1.0f); + v22 *= 0.5f; + float_t v38 = v22 * v22 - v61; + if (v38 < 0.0f) + return 0; + + float_t v39 = sqrtf(v38); + if (v39 <= 0.000001f) + return 0; + + float_t v42 = sqrtf(1.0f - v37); + v22 = (v13 / v22 - 1.0f) * v36 * v58; + v42 = (radius / v39 - 1.0f) * v42 * v58; + float_t v43 = sqrtf(v42 * v42 + v22 * v22); + if (v20 != 0.0f) + vec3_mult_scalar(v54, 1.0f / v20, v54); + + if (v21 != 0.0f) + vec3_mult_scalar(v57, 1.0f / v21, v57); + + vec3 v48; + vec3_add(v54, v57, v48); + vec3_normalize(v48, v48); + vec3_mult_scalar(v48, v43, *a1); + return 1; +} + +static int32_t sub_140483B30(vec3* a1, vec3* a2, osage_coli* a3, float_t radius) { + vec3 bone_pos_diff; + vec3_add(a3->bone0_pos, a3->bone1_pos, bone_pos_diff); + + vec3 v29; + vec3 v30; + for (int32_t i = 0; i < 3; i++) { + float_t v13 = ((float_t*)a2)[i]; + float_t v14 = ((float_t*)&a3->bone0_pos)[i] - v13; + ((float_t*)&v30)[i] = v14; + if (v14 > radius) + return 0; + + v14 = v13 - ((float_t*)&bone_pos_diff)[i]; + ((float_t*)&v29)[i] = v14; + if (v14 > radius) + return 0; + } + + vec3 v28 = vec3_null; + vec3 v32 = vec3_null; + vec3 v27 = vec3_identity; + + float_t v16 = 0.0f; + for (int32_t i = 0; i < 3; i++) { + float_t v18 = ((float_t*)&v30)[i]; + float_t v19 = ((float_t*)&v29)[i]; + if (fabsf(v18) >= fabsf(v19)) { + ((float_t*)&v28)[i] = v19; + ((float_t*)&v27)[i] = 1.0f; + v18 = v19; + } + else { + ((float_t*)&v28)[i] = v18; + ((float_t*)&v27)[i] = -1.0f; + } + + if (v18 > 0.0f) { + float_t v20 = v18 * v18; + ((float_t*)&v32)[i] = v20; + v16 += v20; + } + } + + if (v16 > radius * radius) + return 0; + + if (v16 > 0.0f) { + vec3_mult(v27, v32, v32); + vec3_mult_scalar(v32, 1.0f / v16, v32); + vec3_mult_scalar(v32, radius - sqrtf(v16), *a1); + } + else { + float_t v25 = ((float_t*)&v28)[0]; + int32_t v26 = 0; + for (int32_t i = 0; i < 3; i++) { + if (((float_t*)&v28)[i] > v25) { + v25 = ((float_t*)&v28)[i]; + v26 = i; + } + } + ((float_t*)a1)[v26] -= ((float_t*)&v27)[v26] * (v25 - radius); + } + return 1; +} + +static int32_t sub_140485220(vec3* a1, skin_param_osage_node* a2, osage_coli* a3, float_t* a4) { + if (!a3) + return 0; + + int32_t v8 = 0; + while (a3->type) { + int32_t v11 = 0; + vec3 v31 = vec3_null; + switch (a3->type) { + case 1: + v11 = sub_140483DE0(&v31, a1, &a3->bone0_pos, a3->radius + a2->coli_r); + break; + case 2: + v11 = sub_140484540(&v31, a1, a3, a3->radius + a2->coli_r); + break; + case 3: + v11 = sub_140484780(&v31, a1, &a3->bone0_pos, &a3->bone1_pos, a2->coli_r); + break; + case 4: + v11 = sub_140483EA0(&v31, a1, a3, a3->radius + a2->coli_r); + break; + case 5: + v11 = sub_140483B30(&v31, a1, a3, a2->coli_r); + break; + } + + if (a4 && v11 > 0) { + if (a3->field_34 < *a4) + *a4 = a3->field_34; + } + a3++; + v8 += v11; + vec3_add(*a1, v31, *a1); + } + return v8; +} + +static int32_t sub_1404851C0(vec3* a1, skin_param_osage_node* a2, vector_osage_coli* a3, float_t* a4) { + if (a3->begin == a3->end || a3->end[-1].type) + return 0; + return sub_140485220(a1, a2, a3->begin, a4); +} + +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) + return; + + osage_coli* coli = rob_osg->coli; + osage_coli* coli_ring = rob_osg->coli_ring; + vector_osage_coli* vec_ring_coli = &rob_osg->ring.coli; + + float_t v9 = 0.0f; + if (step > 0.0f) + v9 = 1.0f / step; + + mat4 v64; + if (a5) + v64 = *rob_osg->nodes.begin[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); + 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]; + 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 + || v16->trans.x > rob_osg->ring.ring_rectangle_x + rob_osg->ring.ring_rectangle_width + || v16->trans.z > rob_osg->ring.ring_rectangle_y + rob_osg->ring.ring_rectangle_height) + v22 = rob_osg->ring.ring_out_height; + else + v22 = rob_osg->ring.ring_height; + v60 = v22 + v18; + } + + float_t v23 = 0.2f; + if (step < 1.0f) + v23 = 0.2f / (2.0f - step); + + if (rob_osg->skin_param_ptr->colli_tgt_osg) { + vector_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++) { + vec3 v62 = vec3_null; + for (rob_osage_node* 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++) { + 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); + 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); + } + sub_140482180(v35, v60); + } + else + sub_140482F30(v38, &v35[-1].trans, v35->length * parent_scale->x); + + vec3 v63; + mat4_mult_vec3_inv_trans(&v64, v38, &v63); + 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; + + if (v35->bone_node_mat) { + mat4* v41 = v35->bone_node_mat; + mat4_scale_rot(&v64, parent_scale->x, parent_scale->y, parent_scale->z, v41); + } + + float_t v42 = v35->length * parent_scale->x; + float_t v44; + bool v45; + vec3_distance_squared(*v38, v35[-1].trans, v44); + if (v44 >= v42 * v42) { + v42 = sqrtf(v44); + v45 = false; + } + else + v45 = true; + + mat4_translate_mult(&v64, v42, 0.0f, 0.0f, &v64); + v35->field_A0.field_24 = v42; + if (v40 || v45) + mat4_get_translation(&v64, v38); + + vec3 v62; + vec3_sub(*v38, v35->trans_orig, v62); + vec3_mult_scalar(v62, v9, v35->trans_diff); + + if (v35->field_C8 > 0.0f) { + if (v35->field_CC < v37) + v37 = v35->field_CC; + vec3_mult_scalar(v35->trans_diff, v37, v35->trans_diff); + } + + float_t v55; + vec3_length_squared(v35->trans_diff, v55); + if (v55 > v23 * v23) + vec3_mult_scalar(v35->trans_diff, v23 / sqrtf(v55), v35->trans_diff); + + mat4 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); + } + + 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; + mat4_translate_mult(&v65, rob_osg->node.length * parent_scale->x, 0.0f, 0.0f, &v65); + *rob_osg->node.bone_node->ex_data_mat = v65; + mat4_scale_rot(&v65, parent_scale->x, parent_scale->y, parent_scale->z, &v65); + *rob_osg->node.bone_node_mat = v65; + rob_osg->node.bone_node->exp_data.parent_scale = *parent_scale; + } +} + +static void sub_140480F40(rob_osage* rob_osg, vec3* a2, float_t a3) { + vec3 v4; + if (a2) + v4 = *a2; + else + v4 = vec3_null; + + size_t v7 = rob_osg->field_298; + size_t v8 = 0; + if (v7 >= 4) { + float_t v9 = a3 * a3 * a3 * a3; + v8 = ((v7 - 4) / 4 + 1) * 4; + for (size_t v10 = v8 / 4; v10; v10--) + vec3_mult_scalar(v4, v9, v4); + } + + if (v8 < v7) + for (size_t v12 = v7 - v8; v12; v12--) + vec3_mult_scalar(v4, a3, 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); + } +} + +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++) + 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_force(rob_osg, 1.0f); + rob_osg->field_1F78 = 0; + rob_osg->field_1F7C = 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->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; + } + + mat4_to_mat4u(rob_osg->parent_mat_ptr, &rob_osg->parent_mat); +} + +static void sub_14047C770(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step, bool a5) { + sub_14047C800(rob_osg, mat, parent_scale, step, a5, false, false); + sub_14047D8C0(rob_osg, mat, parent_scale, step, true); + sub_140480260(rob_osg, mat, parent_scale, step, a5); +} + +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); +} + +static void sub_14047ECA0(rob_osage* rob_osg, float_t step) { + if (step <= 0.0f) + return; + + vector_osage_coli* 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++) { + 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++) { + 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); + } + + 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); + } +} + +void sub_140484E10(vec3* a1, vec3* a2, vec3* a3, vec3* a4) { + vec3 v6; + vec3_sub(*a3, *a2, v6); + + vec3 v7; + vec3_sub(*a4, *a2, v7); + + float_t v8; + vec3_dot(v7, v6, v8); + if (v8 < 0.0f) { + *a1 = *a2; + return; + } + + float_t v9; + vec3_length_squared(v6, v9); + if (v9 <= 0.000001f) + *a1 = *a2; + else if (v8 <= v9) { + float_t v10 = v8 / v9; + vec3_mult_scalar(v6, v8 / v9, v6); + vec3_add(*a2, v6, *a1); + } + else + *a1 = *a3; +} + +static int32_t sub_140484450(vec3* a1, vec3* a2, vec3* a3, vec3* a4, float_t radius) { + vec3 v8; + sub_140484E10(&v8, a2, a3, a4); + return sub_140483DE0(a1, &v8, a4, radius); +} + +static void sub_140484850(vec3* a1, vec3* a2, vec3* a3, osage_coli* coli) { + vec3 v56; + vec3_sub(*a3, *a2, v56); + + vec3 v60; + vec3_cross(v56, coli->bone_pos_diff, v60); + + float_t v46; + vec3_length_squared(v60, v46); + if (v46 <= 0.000001f) { + vec3 v56; + vec3 v57; + vec3 v58; + vec3 v59; + sub_140484E10(&v59, &coli->bone0_pos, &coli->bone1_pos, a2); + sub_140484E10(&v58, &coli->bone0_pos, &coli->bone1_pos, a3); + sub_140484E10(&v57, a2, a3, &coli->bone0_pos); + sub_140484E10(&v56, a2, a3, &coli->bone1_pos); + + float_t v48; + float_t v51; + float_t v52; + float_t v55; + vec3_distance_squared(*a3, coli->bone0_pos, v48); + vec3_distance_squared(coli->bone0_pos, v57, v51); + vec3_distance_squared(coli->bone1_pos, v56, v52); + vec3_distance_squared(*a2, v59, v55); + *a1 = *a2; + + if (v55 > v48) { + *a1 = *a3; + v55 = v48; + } + + if (v55 > v51) { + *a1 = v57; + v55 = v51; + } + + if (v55 > v52) + *a1 = v56; + } + else { + float_t v25; + vec3_length(v56, v25); + if (v25 != 0.0) + vec3_mult_scalar(v56, 1.0f / v25, v56); + + float_t v30 = 1.0f / coli->bone_pos_diff_length; + vec3 v61; + float_t v34; + vec3_mult_scalar(coli->bone_pos_diff, v30, v61); + vec3_dot(v61, v56, v34); + vec3_mult_scalar(v61, v34, v61); + vec3_sub(v61, v56, v61); + vec3_sub(coli->bone0_pos, *a2, v60); + float_t v35; + vec3_dot(v61, v60, v35); + v35 /= (v34 * v34 - 1.0f); + if (v35 < 0.0f) + *a1 = *a2; + else if (v35 <= v25) { + vec3_mult_scalar(v56, v35, v56); + vec3_add(*a2, v56, *a1); + } + else + *a1 = *a3; + + } +} + +static int32_t sub_1404844A0(vec3* a1, vec3* a2, vec3* a3, osage_coli* a4, float_t radius) { + vec3 v8; + sub_140484850(&v8, a2, a3, a4); + return sub_140484540(a1, &v8, a4, radius); +} + +static int32_t sub_1404844F0(vec3* a1, vec3* a2, vec3* a3, osage_coli* a4, float_t radius) { + vec3 v8; + sub_140484850(&v8, a2, a3, a4); + return sub_140483EA0(a1, &v8, a4, radius); +} + +static int32_t sub_140485000(vec3* a1, vec3* a2, skin_param_osage_node* a3, osage_coli* a4) { + if (!a4) + return 0; + + int32_t v8 = 0; + while (a4->type) { + int32_t type = a4->type; + vec3 v21 = vec3_null; + switch (a4->type) { + case 1: { + v8 += sub_140484450(&v21, a1, a2, &a4->bone0_pos, a3->coli_r + a4->radius); + } break; + case 2: + v8 += sub_1404844A0(&v21, a1, a2, a4, a3->coli_r + a4->radius); + break; + case 4: + v8 += sub_1404844F0(&v21, a1, a2, a4, a3->coli_r + a4->radius); + break; + } + + if (v8 > 0) { + vec3_add(*a1, v21, *a1); + vec3_add(*a2, v21, *a2); + } + a4++; + } + return v8; +} + +static void sub_14047D620(rob_osage* rob_osg, float_t step) { + if (step < 0.0f && rob_osg->field_1F0F) + return; + + vector_rob_osage_node* nodes = &rob_osg->nodes; + vec3 v7 = nodes->begin[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++) { + rob_osage_node_data* v11 = v10->data_ptr; + for (rob_osage_node** 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) + + sub_140485000(&v10->trans, &v15->trans, &v11->skp_osg_node, coli_ring)); + v10->field_C8 += v17; + v15->field_C8 += v17; + } + + 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)); + v10[0].field_C8 += v20; + v10[-1].field_C8 += v20; + } + } + nodes->begin[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) + return; + + vec3 v76; + vec3_mult(a1->exp_data.position, *a3, v76); + mat4_mult_vec3_trans(a2, &v76, &v76); + vec3 v74 = v76; + rob_osage_node* v12 = &a1->nodes.begin[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]; + 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; + else + ring_height = a1->ring.ring_height; + + mat4 v78 = *a2; + sub_14047F110(a1, &v78, a3, true); + vec3 v60 = (vec3){ 1.0f, 0.0f, 0.0f }; + mat4_mult_vec3(&v78, &v60, &v60); + + osage_coli* coli_ring = a1->coli_ring; + osage_coli* coli = a1->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++) { + 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); + + skin_param_osage_node* v38 = &j->data_ptr->skp_osg_node; + sub_140485220(&v74, v38, coli_ring, 0); + sub_140485220(&v74, v38, coli, 0); + + float_t v39 = v25 + v38->coli_r; + if (v74.y < v39 && v39 < 1001.0f) { + v74.y = v39; + vec3_sub(v74, i->trans, v74); + vec3_normalize(v74, v74); + vec3_mult_scalar(v74, v16 * j->length, v74); + vec3_add(v74, i->trans, v74); + } + j->trans = v74; + j->trans_diff = vec3_null; + 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->bone_node->exp_data.parent_scale = *a3; + *j->bone_node->ex_data_mat = v78; + if (j->bone_node_mat) + mat4_scale_rot(&v78, a3->x, a3->y, a3->z, j->bone_node_mat); + + float_t v55; + vec3_distance(j->trans, i->trans, v55); + float_t v56 = v16 * j->length; + if (v55 >= fabsf(v56)) + v56 = v55; + mat4_translate_mult(&v78, v56, 0.0f, 0.0f, &v78); + mat4_get_translation(&v78, &j->trans); + 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->ex_data_mat; + mat4_translate_mult(&v79, v16 * a1->node.length, 0.0f, 0.0f, &v79); + *a1->node.bone_node->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->exp_data.parent_scale = *a3; + } +} + +static 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; +} + +static void sub_14053CE30(rob_osage_node_data_normal_ref* normal_ref, mat4* a2) { + if (!normal_ref->field_0) + return; + + vec3 n_trans; + vec3 u_trans; + vec3 d_trans; + vec3 l_trans; + vec3 r_trans; + mat4_get_translation(normal_ref->n->bone_node->ex_data_mat, &n_trans); + mat4_get_translation(normal_ref->u->bone_node->ex_data_mat, &u_trans); + mat4_get_translation(normal_ref->d->bone_node->ex_data_mat, &d_trans); + mat4_get_translation(normal_ref->l->bone_node->ex_data_mat, &l_trans); + mat4_get_translation(normal_ref->r->bone_node->ex_data_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; + mat4u_to_mat4(&normal_ref->mat, &v33); + mat4_mult(&v33, &v34, a2); + } +} + +static void sub_14047E1C0(rob_osage* a1, vec3* a2) { + for (rob_osage_node* i = a1->nodes.begin + 1; i != a1->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, a2->x, a2->y, a2->z, i->bone_node_mat); + } +} + static ex_osage_block* ex_osage_block_init() { ex_osage_block* osg = force_malloc(sizeof(ex_osage_block)); osg->base.vftable = &ex_osage_block_vftable; @@ -2599,19 +4262,18 @@ static void rob_osage_init(rob_osage* rob_osg) { rob_osg->nodes.end = rob_osg->nodes.begin; rob_osage_node_init(&rob_osg->node); rob_osg->wind_direction = vec3_null; - rob_osg->wind_direction.z = 0; rob_osg->field_1EB4 = 0.0f; rob_osg->field_1EB8 = 0; rob_osg->field_2A0 = true; - /*tree_295* v2 = &rob_osg->field_1F60; + /*tree_295* cns_data = &rob_osg->field_1F60; sub_140216750(&rob_osg->field_1F60, rob_osg->field_1F60.head->parent); - v2->head->parent = v2->head; - v2->head->left = v2->head; - v2->head->right = v2->head; + 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->field_1F08 = 0.0; + rob_osg->move_cancel = 0.0f; rob_osg->field_1F0C = false; - rob_osg->field_1F0D = false; + rob_osg->wind_reset = false; rob_osg->field_1F0E = false; rob_osg->ring.ring_rectangle_x = 0.0f; rob_osg->ring.ring_rectangle_y = 0.0f; @@ -2632,8 +4294,8 @@ static void rob_osage_init(rob_osage* rob_osg) { rob_osg->field_2A1 = false; rob_osg->field_1F78 = 0; rob_osg->field_1F7C = vec3_null; - rob_osg->mats = 0; - rob_osg->mat = mat4u_null; + rob_osg->parent_mat_ptr = 0; + rob_osg->parent_mat = mat4u_null; } static void rob_osage_init_data(rob_osage* rob_osg, @@ -2742,8 +4404,91 @@ static void ex_osage_block_draw(ex_osage_block* osg) { } +static void ex_osage_block_field_8(ex_osage_block* osg) { + osg->base.vftable->reset(&osg->base); +} + +static 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) + step = 1.0f; + + bone_node* parent_node = osg->base.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(&osg->rob, parent_node_mat, &parent_scale, osg->base.field_5A); + } break; + case 1: + case 2: { + if ((a2 == 1 && osg->base.field_58) || (a2 == 2 && osg->rob.field_2A0)) { + ex_osage_block_set_wind_direction(osg); + sub_14047C800(&osg->rob, parent_node_mat, &parent_scale, step, a3, true, osg->base.field_5A); + } + } break; + case 3: { + rob_osage_coli_set(&osg->rob, osg->mat); + sub_14047ECA0(&osg->rob, step); + } break; + case 4: { + sub_14047D620(&osg->rob, step); + } break; + case 5: { + sub_14047D8C0(&osg->rob, parent_node_mat, &parent_scale, step, false); + sub_140480260(&osg->rob, parent_node_mat, &parent_scale, step, a3); + osg->base.field_59 = true; + } break; + } +} + +static void ex_osage_block_field_28(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; + //sub_14047E240(&osg->rob, parent_node->ex_data_mat, &parent_scale, &rob_itm_equip->field_940); +} + +static void ex_osage_block_field_40(ex_osage_block* osg) { + +} + +static void ex_osage_block_field_48(ex_osage_block* osg) { + osg->step = 4.0f; + ex_osage_block_set_wind_direction(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; + sub_14047F990(&osg->rob, parent_node->ex_data_mat, &parent_scale, 0); + osg->field_1FF8 &= ~2; +} + +static void ex_osage_block_field_50(ex_osage_block* osg) { + if (osg->base.field_59) { + osg->base.field_59 = 0; + return; + } + + ex_osage_block_set_wind_direction(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); + 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); +} + +static void ex_osage_block_field_58(ex_osage_block* osg) { + bone_node* parent_node = osg->base.parent_bone_node; + vec3 parent_scale = parent_node->exp_data.parent_scale; + sub_14047E1C0(&osg->rob, &parent_scale); +} + static void ex_osage_block_init_data(ex_osage_block* osg, - rob_chara_data_item_equip_object* itm_eq_obj, object_skin_block_osage* osg_data, + 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, bone_node* ex_data_bone_nodes, object_skin* skin) { ex_node_block_init_data(&osg->base, @@ -2754,19 +4499,19 @@ static void ex_osage_block_init_data(ex_osage_block* osg, } static void sub_1405F3E10(ex_osage_block* osg, object_skin_block_osage* osg_data, - object_skin_osage_node* osg_nodes, vector_pair_int32_t_ptr_rob_osage_node* a4, + object_skin_osage_node* osg_nodes, vector_pair_uint32_t_ptr_rob_osage_node* a4, vector_pair_name_ex_osage_block* a5) { rob_osage* v5 = &osg->rob; rob_osage_node* v9 = rob_osage_get_node(&osg->rob, 0); - pair_int32_t_ptr_rob_osage_node* v38 - = vector_pair_int32_t_ptr_rob_osage_node_reserve_back(a4); + pair_uint32_t_ptr_rob_osage_node* v38 + = vector_pair_uint32_t_ptr_rob_osage_node_reserve_back(a4); v38->key = osg_data->external_name_index; v38->value = v9; for (size_t i = 0; i < osg_data->count; i++) { v9 = rob_osage_get_node(v5, i); - v38 = vector_pair_int32_t_ptr_rob_osage_node_reserve_back(a4); + v38 = vector_pair_uint32_t_ptr_rob_osage_node_reserve_back(a4); v38->key = osg_nodes[i].name_index; v38->value = v9; @@ -2778,7 +4523,7 @@ static void sub_1405F3E10(ex_osage_block* osg, object_skin_block_osage* osg_data } v9 = rob_osage_get_node(v5, osg_data->count + 1ULL); - v38 = vector_pair_int32_t_ptr_rob_osage_node_reserve_back(a4); + v38 = vector_pair_uint32_t_ptr_rob_osage_node_reserve_back(a4); v38->key = osg_data->name_index; v38->value = v9; @@ -2794,7 +4539,7 @@ static void ex_osage_block_reset(ex_osage_block* osg) { rob_osage_init(&osg->rob); osg->field_1FF8 &= ~3; osg->mat = 0; - osg->osage_phys_step = 1.0f; + osg->step = 1.0f; ex_node_block_reset(&osg->base); } @@ -2804,1176 +4549,31 @@ static void ex_osage_block_set_wind_direction(ex_osage_block* osg) { osg->rob.wind_direction); } -static void sub_14047F110(rob_osage* rob_osg, mat4* mat, vec3* data_scale, bool init_rot) { - vec3 position; - vec3_mult(rob_osg->exp_data.position, *data_scale, position); - mat4_translate_mult(mat, position.x, position.y, position.z, mat); - - vec3 rotation = rob_osg->exp_data.rotation; - mat4_rotate_mult(mat, rotation.x, rotation.y, rotation.z, mat); - - skin_param* skin_param = rob_osg->skin_param_ptr; - vec3 rot = rob_osg->skin_param_ptr->rot; - if (init_rot) - vec3_add(rot, skin_param->init_rot, rot); - mat4_rotate_mult(mat, rot.x, rot.y, rot.z, mat); -} - -static bool sub_140482FF0(mat4* a1, vec3* a2, skin_param_hinge* hinge, vec3* a4, int32_t* a5) { - bool clipped = false; - float_t y; - float_t z; - if (*a5 == 1) { - y = atan2f(-a2->z, a2->x); - z = atan2f(a2->y, sqrtf(a2->x * a2->x + a2->z * a2->z)); - if (hinge) { - clipped = false; - if (y > hinge->ymax) { - y = hinge->ymax; - clipped = true; - } - - if (y < hinge->ymin) { - y = hinge->ymin; - clipped = true; - } - - if (z > hinge->zmax) { - z = hinge->zmax; - clipped = true; - } - - if (z < hinge->zmin) { - z = hinge->zmin; - clipped = true; - } - } - mat4_rotate_y_mult(a1, y, a1); - mat4_rotate_z_mult(a1, z, a1); - } - else { - z = atan2f(a2->y, a2->x); - y = atan2f(-a2->z, sqrtf(a2->x * a2->x + a2->y * a2->y)); - if (hinge) { - clipped = false; - if (y > hinge->ymax) { - y = hinge->ymax; - clipped = true; - } - - if (y < hinge->ymin) { - y = hinge->ymin; - clipped = true; - } - - if (z > hinge->zmax) { - z = hinge->zmax; - clipped = true; - } - - if (z < hinge->zmin) { - z = hinge->zmin; - clipped = true; - } - } - mat4_rotate_z_mult(a1, z, a1); - mat4_rotate_y_mult(a1, y, a1); - } - - if (a4) { - a4->y = y; - a4->z = z; - } - return clipped; -} - -static void sub_14047EE90(rob_osage* rob_osg, mat4* mat) { - __int64*** v2 = (__int64***)rob_osg->field_1F70; - if (v2) { - __int64* v5 = **v2; - rob_osage_node* v6 = rob_osg->nodes.begin + 1; - if (v6 != rob_osg->nodes.end) { - rob_osage_node* v7 = rob_osg->nodes.begin; - do { - v7->length = *((float_t*)v5 + 4); - v7->trans = *(vec3*)((char*)v5 + 20); - v7->field_10 = *(vec3*)(v5 + 4); - v7->field_1C = *(vec3*)((char*)v5 + 44); - ++v6; - ++v7; - v5 = (__int64*)*v5; - } while (v6 != rob_osg->nodes.end); - } - rob_osg->field_1F70 = 0i64; - } - - rob_osage_node* v8 = rob_osg->nodes.begin + 1; - if (v8 != rob_osg->nodes.end) { - rob_osage_node* v9 = &rob_osg->nodes.begin[1]; - do { - mat4_mult_vec3(mat, &v9->field_AC, &v9->field_1C); - mat4_mult_vec3_trans(mat, &v9->field_A0, &v9->trans); - ++v8; - ++v9; - } while (v8 != rob_osg->nodes.end); - } - mat4_to_mat4u(rob_osg->mats, &rob_osg->mat); -} - -static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* data_scale, bool a4) { - rob_osage_node* v6; // rdi - rob_osage_node* v7; // rbx - float_t v9; // xmm2_4 - skin_param* v15; // rax - float_t v16; // xmm0_4 - float_t v17; // xmm7_4 - bool v18; // cc - rob_osage_node* v19; // rbx - rob_osage_node* v20; // rsi - rob_osage_node* v29; // rbx - rob_osage_node* v30; // rsi - int* v31; // r14 - unsigned __int8 v32; // r13 - float_t v33; // xmm0_4 - float_t v34; // xmm2 - float_t v35; // xmm1_4 - bool v36; // r15 - rob_osage_node* v39; // rax - vec3 src; // [rsp+40h] [rbp-C0h] BYREF - vec3 v45; // [rsp+68h] [rbp-98h] BYREF - vec3 dst; // [rsp+78h] [rbp-88h] BYREF - mat4 v47; // [rsp+90h] [rbp-70h] BYREF - - v6 = rob_osg->nodes.end; - v7 = rob_osg->nodes.begin; - v9 = rob_osg->exp_data.position.y * data_scale->y; - v47 = *mat; - vec3_mult(rob_osg->exp_data.position, *data_scale, src); - mat4_mult_vec3_trans(&v47, &src, &dst); - v7->trans.x = dst.x; - v7->trans.y = dst.y; - v7->trans.z = dst.z; - if (rob_osg->field_1F0D && !rob_osg->field_1F0E) { - rob_osg->field_1F0E = true; - sub_14047EE90(rob_osg, mat); - } - - if (!rob_osg->field_1F0C) { - v15 = rob_osg->skin_param_ptr; - v16 = rob_osg->field_1F08; - rob_osg->field_1F0C = true; - v17 = v15->move_cancel; - if (v16 == 1.0) - v17 = v16; - v18 = v17 <= 0.0; - if (v17 < 0.0) { - v17 = v16; - v18 = v16 <= 0.0; - } - - if (!v18) { - v19 = rob_osg->nodes.begin + 1; - if (v19 != v6) { - v20 = rob_osg->nodes.begin + 1; - do { - mat4 mat; - mat4u_to_mat4(&rob_osg->mat, &mat); - mat4_mult_vec3_inv(&mat, &v20->trans, &dst); - mat4_mult_vec3_trans(&rob_osg->mats[0], &dst, &v45); - vec3_sub(v45, v20->trans, v45); - vec3_mult_scalar(v45, v17, v45); - vec3_add(v20->trans, v45, v20->trans); - ++v19; - ++v20; - } while (v19 != v6); - } - } - } - - if (a4) { - sub_14047F110(rob_osg, &v47, data_scale, false); - *rob_osg->nodes.begin->bone_node_mat = v47; - v29 = rob_osg->nodes.begin + 1; - if (v29 != v6) { - v30 = rob_osg->nodes.begin; - v31 = &rob_osg->field_1EB8; - do { - mat4_mult_vec3_inv(&v47, &v30[1].trans, &v45); - v32 = sub_140482FF0(&v47, &v45, &v30[1].data_ptr->skp_osg_node.hinge, &v30[1].field_B8, v31); - *v30[1].bone_node->ex_data_mat = v47; - v33 = v30[1].trans.y - v30->trans.y; - v34 = v30[1].trans.x; - v34 = (v34 - v30->trans.x) * (v34 - v30->trans.x) - + (v33 * v33) - + ((v30[1].trans.z - v30->trans.z) - * (v30[1].trans.z - v30->trans.z)); - v35 = data_scale->x * v29->length; - if (v34 >= (v35 * v35)) { - v35 = sqrtf(v34); - v36 = 0; - } - else { - v36 = 1; - } - mat4_translate_mult(&v47, v35, 0.0, 0.0, &v47); - if (v32 || v36) - mat4_get_translation(&v47, &v30[1].trans); - ++v29; - ++v30; - } while (v29 != v6); - rob_osg = rob_osg; - } - v39 = rob_osg->nodes.end; - if (rob_osg->nodes.begin != v39 && rob_osg->node.bone_node_mat) - mat4_translate_mult(v39[-1].bone_node->ex_data_mat, - data_scale->x * rob_osg->node.length, 0.0f, 0.0f, - rob_osg->node.bone_node->ex_data_mat); - } -} - -static void sub_140482300(vec3* a1, vec3* a2, vec3* a3, float_t osage_gravity_const, float_t weight) { - float_t v5; // xmm3_4 - float_t v6; // xmm2 - float_t v7; // xmm6_4 - float_t v8; // xmm0_4 - float_t v9; // xmm5_4 - float_t v10; // xmm1_4 - float_t v11; // xmm2 - float_t v12; // [rsp+4h] [rbp-3Ch] - float_t v13; // [rsp+4h] [rbp-3Ch] - - v5 = osage_gravity_const; - v7 = osage_gravity_const * weight; - v8 = a2->x - a3->x; - v12 = a2->y - a3->y; - v9 = a2->z - a3->z; - v6 = v12 * v12 + v8 * v8 + v9 * v9; - v10 = sqrtf(v6); - if (v10 > fabsf(osage_gravity_const)) - v5 = v12; - else { - v11 = v8 * v8 + osage_gravity_const * osage_gravity_const + v9 * v9; - v10 = sqrtf(v11); - } - v10 = 1.0f / v10; - v13 = v5 * v10; - a1->x = -v8 * v10 * v13 * v7; - a1->y = -v7 - v13 * v13 * v7; - a1->z = -v9 * v10 * v13 * v7; -} - -static void sub_140482F30(vec3* a1, vec3* a2, float_t a3) { - vec3 v5; - vec3_sub(*a1, *a2, v5); - - float_t length; - vec3_length_squared(v5, length); - if (length > (a3 * a3)) { - vec3_mult_scalar(v5, a3 / sqrtf(length), v5); - vec3_add(*a2, v5, *a1); - } -} - -static void sub_140482490(rob_osage_node* node, float_t* osage_phys_step, float_t* a3) { - if (*osage_phys_step != 1.0) { - vec3 v4; - vec3_sub(node->trans, node->field_10, v4); - - float_t length; - vec3_length(v4, length); - if (length != 0.0) - vec3_mult_scalar(v4, 1.0f / length, v4); - - vec3_mult_scalar(v4, *osage_phys_step * length, v4); - vec3_add(node->field_10, v4, node->trans); - } - sub_140482F30(&node->trans, &node[-1].trans, node->length * *a3); - - if (node->sibling_node) - sub_140482F30(&node->trans, &node->sibling_node->trans, node->distance); - -} - -static void sub_140482180(rob_osage_node* node, float_t* a2) { - float_t v2 = node->data_ptr->skp_osg_node.coli_r + *a2; - if (v2 <= node->trans.y) - return; - - node->trans.y = v2; - - vec3 v3; - vec3_sub(node->trans, node[-1].trans, v3); - - float_t length; - vec3_length_squared(v3, length); - if (length > 0.000001f) - vec3_mult_scalar(v3, 1.0f / sqrtf(length), v3); - vec3_mult_scalar(v3, node->length, v3); - vec3_add(node[-1].trans, v3, node->trans); - node->field_1C = vec3_null; - node->field_C8 += 1.0f; -} - -static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3* data_scale, float_t osage_phys_step, bool a5, bool a6, bool a7) { - rob_osage_node* v7; // rax - rob_osage_node* v12; // rdi - float_t osage_gravity_const; // xmm0_4 - rob_osage_node* v17; // rcx - vec4 v18; // xmm1 - vec4 v19; // xmm2 - rob_osage_node* v20; // rbx - float_t v21; // xmm0_4 - rob_osage_node* v22; // rax - float_t v25; // xmm9_4 - rob_osage_node* v26; // rbx - bool v27; // r13 - float_t v28; // xmm12_4 - rob_osage_node* v30; // rsi - rob_osage_node_data* v31; // r15 - float_t v32; // xmm8_4 - float_t v33; // xmm5_4 - float_t v34; // xmm6_4 - float_t v35; // xmm7_4 - float_t v36; // xmm2_4 - float_t v38; // xmm2_4 - skin_param* v39; // rax - float_t v40; // xmm4_4 - float_t v41; // xmm3_4 - float_t v42; // xmm6_4 - float_t v43; // xmm7_4 - float_t v44; // xmm5_4 - float_t v45; // xmm0_4 - float_t v46; // xmm1_4 - float_t v47; // xmm3_4 - float_t v48; // xmm1_4 - float_t v49; // xmm2_4 - float_t v50; // xmm0_4 - float_t v51; // xmm1_4 - vec4 v52; // xmm2 - vec4 v53; // xmm3 - vec4 v54; // xmm4 - rob_osage_node* v55; // rbx - vec4 v56; // xmm5 - float_t v57; // xmm12_4 - float_t v58; // er12 - vec2 v59; // r13 - rob_osage_node* v60; // rsi - float_t v61; // eax - float_t v62; // eax - float_t v63; // eax - float_t v64; // xmm3_4 - float_t v65; // xmm4_4 - float_t v68; // xmm8_4 - rob_osage_node_data* v70; // rcx - float_t v71; // xmm0_4 - float_t v72; // xmm1_4 - float_t v73; // xmm0_4 - float_t v74; // xmm2_4 - rob_osage_node* v82; // rax - rob_osage_node* v83; // rdx - rob_osage_node* i; // rbx - rob_osage_node* v91; // rbx - float_t v92; // xmm4_4 - float_t v93; // xmm2_4 - float_t v94; // xmm1_4 - float_t v95; // xmm0_4 - float_t v96; // xmm3_4 - float_t v97; // xmm0_4 - rob_osage_node* v98; // rbx - rob_osage_node* v99; // rbx - rob_osage_node* v100; // rsi - int* v101; // r14 - unsigned __int8 v102; // r13 - float_t v103; // xmm0_4 - float_t v104; // xmm2 - float_t v105; // xmm1_4 - char v106; // r12 - rob_osage_node* v109; // rax - vec3 a1a; // [rsp+30h] [rbp-D0h] BYREF - vec3 v112; // [rsp+40h] [rbp-C0h] BYREF - vec3 src; // [rsp+50h] [rbp-B0h] BYREF - vec2 v114; // [rsp+60h] [rbp-A0h] - float_t v115; // [rsp+68h] [rbp-98h] - vec3 v116; // [rsp+70h] [rbp-90h] - vec3 v117; // [rsp+80h] [rbp-80h] - float_t a3a; // [rsp+90h] [rbp-70h] BYREF - vec3 v119; // [rsp+98h] [rbp-68h] BYREF - vec3 v120; // [rsp+B0h] [rbp-50h] - vec3 v126; // [rsp+E8h] [rbp-18h] BYREF - vec3 dst; // [rsp+100h] [rbp+0h] BYREF - vec3 v128; // [rsp+110h] [rbp+10h] BYREF - vec3 a2a; // [rsp+120h] [rbp+20h] BYREF - mat4 v130; // [rsp+130h] [rbp+30h] BYREF - mat4 v131; // [rsp+170h] [rbp+70h] BYREF - mat4 v132; // [rsp+1B0h] [rbp+B0h] BYREF - - v7 = rob_osg->nodes.end; - if (rob_osg->nodes.begin == v7) - return; - - sub_1404803B0(rob_osg, mat, data_scale, 0); - v12 = rob_osg->nodes.end; - osage_gravity_const = get_osage_gravity_const(); - v17 = rob_osg->nodes.begin; - v130 = *mat; - v18.x = rob_osg->exp_data.position.x; - v17->field_10 = v17->trans; - v20 = rob_osg->nodes.begin; - src.x = rob_osg->exp_data.position.x * data_scale->x; - src.y = rob_osg->exp_data.position.y * data_scale->y; - src.z = rob_osg->exp_data.position.z * data_scale->z; - mat4_mult_vec3_trans(&v130, &src, &dst); - v18.x = dst.y; - v20->trans.x = dst.x; - v21 = dst.z; - v20->trans.y = v18.x; - v20->trans.z = v21; - v22 = rob_osg->nodes.begin; - v18.x = v22->trans.y - v22->field_10.y; - v19.x = v22->trans.z - v22->field_10.z; - v22->field_1C.x = v22->trans.x - v22->field_10.x; - v22->field_1C.y = v18.x; - v22->field_1C.z = v19.x; - sub_14047F110(rob_osg, &v130, data_scale, 0); - *rob_osg->nodes.begin->bone_node_mat = v130; - *rob_osg->nodes.begin->bone_node->ex_data_mat = v130; - src = (vec3){ 1.0f, 0.0f, 0.0f }; - mat4_mult_vec3(&v130, &src, &v128); - v25 = data_scale->x; - a3a = data_scale->x; - if (!rob_osg->field_1F0D && osage_phys_step <= 0.0f) - return; - - v26 = rob_osg->nodes.begin + 1; - if (v26 != v12) { - v27 = a5; - v28 = 0.5f; - v30 = rob_osg->nodes.begin; - do { - v31 = v30[1].data_ptr; - a1a = vec3_null; - v32 = v31->skp_osg_node.weight; - if (!rob_osg->field_1F78) { - sub_140482300( - &a1a, - &v30[1].trans, - &v30->trans, - osage_gravity_const, - v31->skp_osg_node.weight); - - if (v26 == &v12[-1]) { - v35 = a1a.z; - v34 = a1a.y; - v33 = a1a.x; - } - else { - sub_140482300(&v112, &v30[1].trans, &v30[2].trans, osage_gravity_const, v32); - v33 = (a1a.x + v112.x) * v28; - v34 = (a1a.y + v112.y) * v28; - v35 = (a1a.z + v112.z) * v28; - } - } - else { - v33 = rob_osg->field_1F7C.x * (1.0f / v32); - v34 = rob_osg->field_1F7C.y * (1.0f / v32); - v35 = rob_osg->field_1F7C.z * (1.0f / v32); - } - v36 = v31->force; - v38 = v30[1].field_DC; - v39 = rob_osg->skin_param_ptr; - v40 = 1.0f - rob_osg->skin_param_ptr->air_res; - v41 = (1.0f - rob_osg->field_1EB4) * v40; - v42 = ((v34 + (v128.y * v36 * v38)) - (v30[1].field_1C.y * v41)) + (v30[1].field_D0.y * v32); - v43 = ((v35 + (v128.z * v36 * v38)) - (v30[1].field_1C.z * v41)) + (v30[1].field_D0.z * v32); - v44 = ((v33 + (v128.x * v36 * v38)) - (v30[1].field_1C.x * v41)) + (v30[1].field_D0.x * v32); - v126.y = v42; - v126.z = v43; - v126.x = v44; - if (!v27) { - v45 = v39->wind_afc; - v44 = v44 + (rob_osg->wind_direction.x * v45); - v42 = v42 + (rob_osg->wind_direction.y * v45); - v43 = v43 + (rob_osg->wind_direction.z * v45); - v126.x = v44; - v126.y = v42; - v126.z = v43; - } - - if (v39->stiffness > 0.0) { - v46 = v30[1].field_1C.z - v30->field_1C.z; - v47 = v30[1].field_1C.x - v30->field_1C.x; - v114.y = v30[1].field_1C.y - v30->field_1C.y; - v115 = v46; - v114.x = v47; - *(vec2*)&v116.x = v114; - v116.z = v46; - v44 = v44 - (v40 * v47); - v126.x = v44; - v126.y = v42 - (v114.y * v40); - v126.z = v43 - (v46 * v40); - } - v48 = v31->skp_osg_node.weight; - v117 = v126; - ++v26; - ++v30; - v49 = 1.0f / (v48 - (v48 - 1.0f) * v31->skp_osg_node.inertial_cancel); - v50 = v126.y * v49; - v51 = v126.z * v49; - v30->field_28.x = v49 * v44; - v30->field_28.y = v50; - v30->field_28.z = v51; - } while (v26 != v12); - } - - if (rob_osg->skin_param_ptr->stiffness > 0.0) { - v52 = v130.row0; - v53 = v130.row1; - v54 = v130.row2; - v55 = rob_osg->nodes.begin + 1; - v56 = v130.row3; - v131 = v130; - mat4_get_translation(&v130, &a1a); - if (v55 != v12) { - v58 = a1a.z; - v59 = *(vec2*)&a1a.x; - v60 = v55; - while (1) { - v61 = v60->field_94.x; - v132.row0 = v52; - v132.row1 = v53; - v132.row2 = v54; - v119.x = v61; - v62 = v60->field_94.y; - v132.row3 = v56; - v119.y = v62; - v63 = v60->field_94.z; - v119.z = v63; - mat4_mult_vec3_trans(&v132, &v119, &v128); - v68 = v60->field_1C.x + v60->field_28.x; - v64 = v60->field_1C.y + v60->field_28.y; - v65 = v60->field_1C.z + v60->field_28.z; - v126.x = v60->trans.x + v68; - v126.y = v60->trans.y + v64; - v126.z = v60->trans.z + v65; - sub_140482F30(&v126, &a1a, v25 * v55->length); - v70 = v60->data_ptr; - v71 = rob_osg->skin_param_ptr->stiffness; - v72 = v70->skp_osg_node.weight; - vec3_sub(v128, v126, v117); - vec3_mult_scalar(v117, v71, v117); - v120 = v117; - v73 = (v72 - 1.0f) * v70->skp_osg_node.inertial_cancel; - v74 = 1.0f / (v72 - v73); - v60->field_28.x += v117.x * v74; - v60->field_28.y += v117.y * v74; - v60->field_28.z += v117.z * v74; - v116.x = v60->trans.x + v117.x * v74 + v68; - v116.y = v60->trans.y + v117.y * v74 + v64; - v116.z = v60->trans.z + v117.z * v74 + v65; - v126 = v116; - mat4_mult_vec3_inv(&v131, &v116, &a2a); - sub_140482FF0(&v131, &a2a, 0, 0, &rob_osg->field_1EB8); - *(vec2*)&src.x = v59; - src.z = v58; - mat4_translate_mult( - &v131, - sqrtf((v59.x - v126.x) * (v59.x - v126.x) - + (v59.y - v126.y) * (v59.y - v126.y) - + (v58 - v126.z) * (v58 - v126.z)), - 0.0f, - 0.0f, &v131); - v59 = *(vec2*)&v126.x; - v58 = v126.z; - ++v55; - ++v60; - a1a = v126; - if (v55 == v12) - break; - v56 = v131.row3; - v54 = v131.row2; - v53 = v131.row1; - v57 = a1a.x; - v52 = v131.row0; - } - } - } - v82 = rob_osg->nodes.begin + 1; - if (v82 != v12) { - v83 = rob_osg->nodes.begin + 1; - do { - ++v82; - ++v83; - v83->field_10.x = v83->trans.x; - v83->field_10.y = v83->trans.y; - v83->field_10.z = v83->trans.z; - vec3_add(v83->field_1C, v83->field_28, v83->field_1C); - vec3_add(v83->trans, v83->field_1C, v83->trans); - } while (v82 != v12); - } - for (i = v12 - 2; i != rob_osg->nodes.begin; --i) - sub_140482F30(&i->trans, &i[1].trans, v25 * i->child_length); - - if (a6) { - v91 = rob_osg->nodes.begin; - v92 = v91->trans.x; - v93 = v91->data_ptr->skp_osg_node.coli_r; - v94 = rob_osg->ring.ring_rectangle_x - v93; - v95 = rob_osg->ring.ring_rectangle_y - v93; - if (v92 < v94 - || (v96 = v91->trans.z, v96 < v95) - || v92 >(v94 + rob_osg->ring.ring_rectangle_width + v93) - || v96 > (v95 + rob_osg->ring.ring_rectangle_height + v93)) - v97 = rob_osg->ring.ring_out_height; - else - v97 = rob_osg->ring.ring_height; - - v98 = v91 + 1; - for (v126.x = v97 + v93; v98 != v12; ++v98) { - sub_140482490(v98, &osage_phys_step, &a3a); - sub_140482180(v98, &v126.x); - } - } - - if (a7) { - v99 = rob_osg->nodes.begin + 1; - if (v99 != v12) { - v100 = rob_osg->nodes.begin; - v101 = &rob_osg->field_1EB8; - do { - mat4_mult_vec3_inv(&v130, &v100[1].trans, &a2a); - v102 = sub_140482FF0( - &v130, - &a2a, - &v100[1].data_ptr->skp_osg_node.hinge, - &v100[1].field_B8, - v101); - *v100[1].bone_node->ex_data_mat = v130; - v103 = v100[1].trans.y - v100->trans.y; - v104 = (((v100[1].trans.x - v100->trans.x) * (v100[1].trans.x - v100->trans.x)) - + (v103 * v103)) + ((v100[1].trans.z - v100->trans.z) - * (v100[1].trans.z - v100->trans.z)); - v105 = v25 * v99->length; - if (v104 >= (v105 * v105)) { - v105 = sqrtf(v104); - v106 = 0; - } - else - v106 = 1; - mat4_translate_mult(&v130, v105, 0.0f, 0.0f, &v130); - if (v102 || v106) - mat4_get_translation(&v130, &v100[1].trans); - ++v99; - ++v100; - } while (v99 != v12); - rob_osg = rob_osg; - } - v109 = rob_osg->nodes.end; - if (rob_osg->nodes.begin != v109 && rob_osg->node.bone_node_mat) { - mat4_translate_mult(v109[-1].bone_node->ex_data_mat, - v25 * rob_osg->node.length, 0.0f, 0.0f, - rob_osg->node.bone_node->ex_data_mat); - } - } - rob_osg->field_2A0 = false; -} - -static bool sub_140483DE0(vec3* a1, vec3* a2, vec3* a3, float_t radius) { - vec3 v5; - float_t length; - vec3_sub(*a2, *a3, v5); - vec3_length_squared(v5, length); - if (fabs(length) > 0.000001 && length < radius * radius) { - vec3_mult_scalar(v5, radius / sqrtf(length) - 1.0f, *a1); - return true; - } - return false; -} - -static bool sub_140484540(vec3* a1, vec3* a2, osage_coli* a3, float_t radius) { - vec3 v11; - vec3_sub(*a2, a3->bone0_pos, v11); - - float_t v17; - vec3_dot(v11, a3->bone_pos_diff, v17); - if (v17 < 0.0f) - return sub_140483DE0(a1, a2, &a3->bone0_pos, radius); - else if (fabsf(a3->bone_pos_diff_length_squared) <= 0.000001f) - return sub_140483DE0(a1, a2, &a3->bone0_pos, radius); - else if (v17 > a3->bone_pos_diff_length_squared) - return sub_140483DE0(a1, a2, &a3->bone1_pos, radius); - - float_t v20; - vec3_length_squared(v11, v20); - v20 += (v17 * v17) / a3->bone_pos_diff_length_squared; - if (v20 <= 0.000001f || v20 >= radius * radius) - return false; - - vec3 v29; - vec3_mult_scalar(a3->bone_pos_diff, v17 / a3->bone_pos_diff_length_squared, v29); - vec3_sub(v11, v29, v29); - vec3_mult_scalar(v29, radius / sqrtf(v20) - 1.0f, *a1); - return true; -} - -static bool sub_140484780(vec3* a1, vec3* a2, vec3* a3, vec3* a4, float_t radius) { - float v5; // xmm8_4 - float v6; // xmm8_4 - __int64 result; // rax - float_t v8; // xmm1_4 - float_t v9; // xmm2_4 - - float_t v3; - vec3_dot(*a2, *a4, v3); - float_t v4; - vec3_dot(*a3, *a4, v4); - v5 = v3 - v4 - radius; - if (v5 >= 0.0f) - return false; - - vec3_mult_scalar(*a4, -v5, *a1); - return true; -} - -static bool sub_140483EA0(vec3* a1, vec3* a2, osage_coli* a3, float_t radius) { - float v4; // xmm14_4 - float v6; // xmm0_4 - float v7; // xmm10_4 - float v8; // xmm2_4 - float v9; // xmm3_4 - bool v11; // r9 - vec4 v12; // xmm5 - float v13; // xmm6_4 - vec4 v14; // xmm8 - vec4 v15; // xmm0 - float_t v16; // xmm1_4 - float v17; // er11 - float v18; // r10^4 - vec4 v19; // xmm1 - float v20; // xmm15_4 - vec4 v21; // xmm11 - vec4 v22; // xmm7 - float v23; // xmm2_4 - float v24; // xmm3_4 - float v25; // xmm0_4 - float_t v26; // xmm14_4 - float v27; // xmm3_4 - vec4 v28; // xmm10 - float v29; // xmm2_4 - vec4 v30; // xmm0 - float v31; // xmm2_4 - float v32; // xmm1_4 - float v33; // xmm0_4 - float v34; // xmm10_4 - float v35; // xmm1_4 - float v36; // xmm1_4 - float v37; // xmm3_4 - vec4 v38; // xmm0 - float v39; // xmm2_4 - vec4 v40; // xmm0 - float v41; // xmm6_4 - vec4 v42; // xmm1 - float v43; // xmm6_4 - float v44; // xmm8_4 - float v45; // xmm2_4 - float v46; // xmm3_4 - vec4 v47; // xmm0 - vec2 v48; // rax - float v49; // edx - float v50; // xmm1_4 - vec2 v51; // [rsp+20h] [rbp-E0h] - vec2 v52; // [rsp+20h] [rbp-E0h] - float v53; // [rsp+28h] [rbp-D8h] - vec2 v54; // [rsp+30h] [rbp-D0h] - vec2 v55; // [rsp+30h] [rbp-D0h] - vec2 v56; // [rsp+40h] [rbp-C0h] - vec2 v57; // [rsp+40h] [rbp-C0h] - float v58; // [rsp+50h] [rbp-B0h] - float v59; // [rsp+54h] [rbp-ACh] - float v60; // [rsp+58h] [rbp-A8h] - float v61; // [rsp+5Ch] [rbp-A4h] - float v62; // [rsp+60h] [rbp-A0h] - vec3 a3a; // [rsp+70h] [rbp-90h] BYREF - - v4 = a3->bone_pos_diff_length; - v6 = fabs(a3->bone_pos_diff_length); - v7 = a3->bone0_pos.x; - v8 = a3->bone0_pos.y; - v9 = a3->bone0_pos.z; - a3a.x = v7; - a3a.y = v8; - a3a.z = v9; - if (v6 <= 0.000001) - return sub_140483DE0(a1, a2, &a3a, radius); - v11 = 0; - v14.x = a2->x; - v12.x = a2->x - a3->bone1_pos.x; - v61 = (v4 * 0.5) * (v4 * 0.5); - v13 = fsqrt((radius * radius) + v61); - v14.x = a2->x - v7; - v15 = v14; - v16 = a2->y - v8; - v17 = a2->z - v9; - v53 = a2->z - a3->bone1_pos.z; - v15.x = (v14.x * v14.x) + (v16 * v16); - v51.y = a2->y - a3->bone1_pos.y; - v56 = (vec2)__PAIR64__(LODWORD(v16), LODWORD(v14.x)); - v18 = v16; - v19 = v12; - v54 = v56; - v15.x = v15.x + (v17 * v17); - v51.x = v12.x; - v57 = v51; - v20 = _mm_sqrt_ps((__m128)v15).m128_f32[0]; - v19.x = ((v12.x * v12.x) + (v51.y * v51.y)) + (v53 * v53); - v21 = (vec4)_mm_sqrt_ps((__m128)v19); - if (fabs(v20) <= 0.000001 || fabs(v21.x) <= 0.000001) - return 0; - v22 = v21; - v22.x = v21.x + v20; - if ((v21.x + v20) < (v13 * 2.0)) { - v23 = a3->bone_pos_diff.y; - v24 = a3->bone_pos_diff.z; - v25 = 1.0 / v4; - v26 = a3->bone1_pos.x + v7; - v28 = (vec4)LODWORD(a2->x); - v52.x = v26; - v52.y = a3a.y + a3->bone1_pos.y; - v62 = a3->bone_pos_diff.x * v25; - *(vec2*)&a3a.x = v52; - v60 = v23 * v25; - v59 = v24 * v25; - a3a.z = a3a.z + a3->bone1_pos.z; - v27 = a2->z; - v28.x = v28.x - (v26 * 0.5); - v29 = a2->y; - a3a.x = v28.x; - v30 = v28; - a3a.y = v29 - (v52.y * 0.5); - v30.x = ((v28.x * v28.x) + (a3a.y * a3a.y)) - + ((v27 - (a3a.z * 0.5)) * (v27 - (a3a.z * 0.5))); - v31 = v27 - (a3a.z * 0.5); - v32 = _mm_sqrt_ps((__m128)v30).m128_f32[0]; - v58 = v32; - if (v32 == 0.0) { - v35 = a3a.y; - v34 = a3a.x; - } - else { - v33 = 1.0 / v32; - v34 = v28.x * (1.0 / v32); - v35 = a3a.y * (1.0 / v32); - v31 = v31 * v33; - } - v36 = ((v35 * v60) + (v62 * v34)) + (v31 * v59); - v37 = v36 * v36; - if ((v36 * v36) >= 1.0) - v37 = 1.0; - v22.x = v22.x * 0.5; - v38 = v22; - v38.x = (v22.x * v22.x) - v61; - if (v38.x < 0.0) - return 0; - v39 = _mm_sqrt_ps((__m128)v38).m128_f32[0]; - if (fabs(v39) <= 0.000001) - return 0; - v40 = (vec4)0x3F800000u; - v40.x = 1.0 - v37; - v41 = ((v13 / v22.x) - 1.0) * (v36 * v58); - v42 = (vec4)_mm_sqrt_ps((__m128)v40); - v42.x = (((v42.x * v58) * ((radius / v39) - 1.0)) - * ((v42.x * v58) * ((radius / v39) - 1.0))) - + (v41 * v41); - LODWORD(v43) = _mm_sqrt_ps((__m128)v42).m128_u32[0]; - if (v20 == 0.0) { - v44 = v54.x; - } - else { - v44 = v14.x * (1.0 / v20); - v18 = v54.y * (1.0 / v20); - v17 = v17 * (1.0 / v20); - } - v45 = v57.y; - v46 = v53; - if (v21.x == 0.0) { - v12 = (vec4)LODWORD(v57.x); - } - else { - v12.x = v12.x * (1.0 / v21.x); - v45 = v57.y * (1.0 / v21.x); - v46 = v53 * (1.0 / v21.x); - } - v12.x = v12.x + v44; - v47 = v12; - v48 = (vec2)__PAIR64__(v18 + v45, LODWORD(v12.x)); - v49 = v17 + v46; - v47.x = ((v12.x * v12.x) + ((v18 + v45) * (v18 + v45))) - + ((v17 + v46) * (v17 + v46)); - v50 = _mm_sqrt_ps((__m128)v47).m128_f32[0]; - if (v50 != 0.0) { - v12.x = v12.x * (1.0 / v50); - v55.x = v12.x; - v55.y = (v18 + v45) * (1.0 / v50); - v48 = v55; - v49 = (v17 + v46) * (1.0 / v50); - } - *(vec2*)&a3a.x = v48; - a3a.z = v49; - v11 = 1; - a1->x = v12.x * v43; - a1->y = v48.y * v43; - a1->z = v49 * v43; - } - return v11; -} - -int32_t sub_140485220(vec3* a1, float_t* radius, osage_coli* a3, float_t* a4) { - if (!a3) - return 0; - - int32_t v8 = 0; - while (a3->type) { - int32_t v11 = 0; - vec3 v31 = vec3_null; - switch (a3->type) { - case 1: - v11 = sub_140483DE0(&v31, a1, &a3->bone0_pos, a3->radius + *radius); - break; - case 2: - v11 = sub_140484540(&v31, a1, a3, a3->radius + *radius); - break; - case 3: - v11 = sub_140484780(&v31, a1, &a3->bone0_pos, &a3->bone1_pos, *radius); - break; - case 4: - v11 = sub_140483EA0(&v31, a1, a3, a3->radius + *radius); - break; - case 5: - v11 = sub_140483B30(&v31, a1, a3, *radius); - break; - } - - if (a4 && v11 > 0) { - if (a3->field_34 < *a4) - *a4 = a3->field_34; - } - a3++; - v8 += v11; - vec3_add(*a1, v31, *a1); - } - return v8; -} - -static int32_t sub_1404851C0(vec3* a1, float_t* a2, vector_osage_coli* a3, float_t* a4) { - if (a3->begin == a3->end || a3->end[-1].type) - return 0; - else - return sub_140485220(a1, a2, a3->begin, a4); -} - -static void sub_14047D8C0(rob_osage* rob_osg, mat4* mat, vec3* data_scale, float_t osage_phys_step, bool a5) { - float v9; // xmm10_4 - rob_osage_node* v16; // rax - float v17; // xmm4_4 - float v18; // xmm2_4 - float v19; // xmm1_4 - float v20; // xmm0_4 - float v21; // xmm3_4 - float v22; // xmm0_4 - float v23; // xmm9_4 - vector_rob_osage_node* v24; // r15 - rob_osage_node* v25; // rdi - rob_osage_node* v26; // rax - rob_osage_node* v27; // rsi - vec3 v28; - rob_osage_node* v30; // rbx - rob_osage_node* v35; - float v37; // xmm6_4 - bool v39; // al - mat4* v41; // rax - float v42; // xmm7_4 - float_t v44; // xmm2 - bool v45; // di - float_t v55; // xmm2 - rob_osage_node* v59; // rax - float_t v60; // [rsp+30h] [rbp-D0h] BYREF - vec3 src; // [rsp+40h] [rbp-C0h] BYREF - vec3 dst; // [rsp+50h] [rbp-B0h] BYREF - vec3 v63; // [rsp+60h] [rbp-A0h] BYREF - mat4 v64; // [rsp+70h] [rbp-90h] BYREF - - if (!rob_osg->field_1F0D && osage_phys_step <= 0.0f) - return; - - v9 = 0.0f; - if (osage_phys_step > 0.0f) - v9 = 1.0f / osage_phys_step; - - if (a5) - v64 = *rob_osg->nodes.begin[0].bone_node_mat; - else { - vec3_mult(rob_osg->exp_data.position, *data_scale, src); - v64 = *mat; - mat4_mult_vec3_trans(&v64, &src, &rob_osg->nodes.begin[0].trans); - sub_14047F110(rob_osg, &v64, data_scale, 0); - } - - v60 = -1000.0f; - if (a5) { - v16 = &rob_osg->nodes.begin[0]; - v17 = v16->trans.x; - v18 = v16->data_ptr->skp_osg_node.coli_r; - v19 = rob_osg->ring.ring_rectangle_x - v18; - v20 = rob_osg->ring.ring_rectangle_y - v18; - v21 = v16->trans.z; - if (v17 < v19 - || v21 < v20 - || v17 > (v19 + rob_osg->ring.ring_rectangle_width) + v18 - || v21 > (v20 + rob_osg->ring.ring_rectangle_height) + v18) - v22 = rob_osg->ring.ring_out_height; - else - v22 = rob_osg->ring.ring_height; - v60 = v22 + v18; - } - v23 = 0.2f; - if (osage_phys_step < 1.0) - v23 = 0.2f / (2.0f - osage_phys_step); - v24 = rob_osg->skin_param_ptr->colli_tgt_osg; - if (v24) { - v25 = rob_osg->nodes.begin + 1; - if (v25 != rob_osg->nodes.end) { - v26 = v24->end; - v27 = rob_osg->nodes.begin + 1; - do { - v28 = vec3_null; - v30 = v24->begin + 1; - dst = vec3_null; - if (v30 != v26) { - do { - sub_140483DE0( - &dst, - &v27->trans, - &v30->trans, - v27->data_ptr->skp_osg_node.coli_r + v30->data_ptr->skp_osg_node.coli_r); - v26 = v24->end; - ++v30; - } while (v30 != v26); - v28 = dst; - } - vec3_add(v28, v27->trans, v27->trans); - ++v25; - ++v27; - } while (v25 != rob_osg->nodes.end); - } - } - v35 = rob_osg->nodes.begin + 1; - if (v35 != rob_osg->nodes.end) { - do { - v37 = (1.0f - rob_osg->field_1EB4) * rob_osg->skin_param_ptr->friction; - if (a5) { - sub_140482490(v35, &osage_phys_step, &data_scale->x); - v35->field_C8 += (float_t)sub_1404851C0( - &v35->trans, - &v35->data_ptr->skp_osg_node.coli_r, - &rob_osg->ring.coli, - &v35->field_CC); - if (!rob_osg->field_1F0F) { - v35->field_C8 += (float_t)sub_140485180( - rob_osg->coli_ring, - &v35->trans, - &v35->data_ptr->skp_osg_node.coli_r); - v35->field_C8 += (float_t)sub_140485180( - rob_osg->coli, - &v35->trans, - &v35->data_ptr->skp_osg_node.coli_r); - } - sub_140482180(v35, &v60); - } - else - sub_140482F30(&v35->trans, &v35[-1].trans, v35->length * data_scale->x); - - mat4_mult_vec3_inv(&v64, &v35->trans, &v63); - v39 = sub_140482FF0(&v64, &v63, &v35->data_ptr->skp_osg_node.hinge, &v35->field_B8, &rob_osg->field_1EB8); - v35->bone_node->exp_data.data_scale = *data_scale; - *v35->bone_node->ex_data_mat = v64; - v41 = v35->bone_node_mat; - if (v41) - mat4_scale_rot(&v64, data_scale->x, data_scale->y, data_scale->z, v41); - v42 = v35->length * data_scale->x; - vec3 v43; - vec3_sub(v35->trans, v35[-1].trans, v43); - vec3_length_squared(v43, v44); - if (v44 >= (v42 * v42)) { - v42 = sqrtf(v44); - v45 = false; - } - else - v45 = true; - mat4_translate_mult(&v64, v42, 0.0, 0.0, &v64); - v35->field_C4 = v42; - if (v39 || v45) - mat4_get_translation(&v64, &v35->trans); - - vec3_sub(v35->trans, v35->field_10, v35->field_1C); - vec3_mult_scalar(v35->field_1C, v9, v35->field_1C); - if (v35->field_C8 > 0.0) { - if (v35->field_CC < v37) - v37 = v35->field_CC; - vec3_mult_scalar(v35->field_1C, v37, v35->field_1C); - } - vec3_length_squared(v35->field_1C, v55); - if (v55 > v23 * v23) - vec3_mult_scalar(v35->field_1C, v23 / sqrtf(v55), v35->field_1C); - - mat4_mult_vec3_inv(mat, &v35->trans, &v35->field_A0); - sub_1400B39E0(mat, &v35->field_1C, &v35->field_AC); - ++v35; - } while (v35 != rob_osg->nodes.end); - } - - v59 = rob_osg->nodes.end; - if (rob_osg->nodes.begin != v59 && rob_osg->node.bone_node_mat) { - mat4 v65 = *v59[-1].bone_node->ex_data_mat; - mat4_translate_mult(&v65, rob_osg->node.length * data_scale->x, 0.0, 0.0, &v65); - *rob_osg->node.bone_node->ex_data_mat = v65; - mat4_scale_rot(&v65, data_scale->x, data_scale->y, data_scale->z, &v65); - *rob_osg->node.bone_node_mat = v65; - rob_osg->node.bone_node->exp_data.data_scale = *data_scale; - } -} - -static void sub_14047C770(rob_osage* a1, mat4* a2, vec3* a3, float_t osage_phys_step, bool a5) { - sub_14047C800(a1, a2, a3, osage_phys_step, a5, 0, 0); - sub_14047D8C0(a1, a2, a3, osage_phys_step, true); - sub_140480260(a1, a2, a3, osage_phys_step, a5); -} - static void ex_osage_block_update(ex_osage_block* osg) { osg->field_1FF8 &= ~2; - if (osg->base.set_data) { - osg->base.set_data = false; + if (osg->base.field_59) { + osg->base.field_59 = false; return; } - rob_chara_data_item_equip* v2 = osg->base.item_equip_object->item_equip; - float_t osage_phys_step = get_delta_frame() * v2->osage_phys_step; - //if (v2->field_940.begin != v2->field_940.end && v4->field_C) - // osage_phys_step = 1.0f; - bone_node* v6 = osg->base.parent_bone_node; - vec3 data_scale = v6->exp_data.data_scale; - vec3 scale = v6->exp_data.scale; + 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) + step = 1.0f; - mat4 mat; - mat4* v7; + bone_node* parent_node = osg->base.parent_bone_node; + vec3 parent_scale = parent_node->exp_data.parent_scale; + vec3 scale = parent_node->exp_data.scale; + + mat4 mat = *parent_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(v6->ex_data_mat, scale.x, scale.y, scale.z, &mat); - v7 = &mat; + mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat); } - else - v7 = v6->ex_data_mat; ex_osage_block_set_wind_direction(osg); - rob_osage_set_coli(&osg->rob, osg->mat); - sub_14047C770(&osg->rob, v7, &data_scale, osage_phys_step, false); + rob_osage_coli_set(&osg->rob, osg->mat); + sub_14047C770(&osg->rob, &mat, &parent_scale, step, false); } static void ex_osage_block_dispose(ex_osage_block* osg) { @@ -4149,10 +4749,23 @@ static float_t exp_tan(float_t v1) { return tanf(v1); } -static float_t get_osage_gravity_const() { +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_uint32_t_free(&itm_chg->item_ids, 0); +} + +static void item_sub_data_texture_change_free(item_sub_data_texture_change* tex_chg) { + vector_item_sub_data_texture_change_tex_free(&tex_chg->tex, item_sub_data_texture_change_tex_free); +} + +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_key_frame_interpolate(mot* a1, float_t frame, float_t* value, mot_key_set* a4, uint32_t key_set_count, struc_369* a6) { if (a6->field_0 == 4) { @@ -4167,7 +4780,11 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, for (uint32_t i = key_set_count; i; i--, a4++, value++) { mot_key_set_type type = a4->type; float_t* values = a4->values; - if (type == MOT_KEY_SET_STATIC) { + if (type == MOT_KEY_SET_NONE) { + *value = 0.0f; + continue; + } + else if (type == MOT_KEY_SET_STATIC) { *value = values[0]; continue; } @@ -4237,7 +4854,8 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, } } - key_index--; + if (key_index > 0) + key_index--; if (type == MOT_KEY_SET_HERMITE) *value = values[key_index]; else @@ -4410,13 +5028,13 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { keyframe_data = bone_data_set_key_data(data, keyframe_data, skeleton_type, get_data, reverse); } - uint32_t v15 = a1->bone_data.bone_key_set_count; + 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, v15, a1->bone_data.global_key_set_count); + mot_parent_interpolate(&a1->mot_data, frame, bone_key_set_count, a1->bone_data.global_key_set_count); a1->mot_data.frame = frame; } - keyframe_data = (vec3*)&a1->mot_data.key_set_data.begin[v15]; + keyframe_data = (vec3*)&a1->mot_data.key_set_data.begin[bone_key_set_count]; vec3 global_trans = keyframe_data[0]; vec3 global_rotation = keyframe_data[1]; if (reverse) @@ -4453,7 +5071,7 @@ static bool motion_blend_mot_interpolate_get_reverse(int32_t* a1) { } static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, - rob_chara_data_bone_data* a2, bone_database* bone_data) { + rob_chara_bone_data* a2, bone_database* bone_data) { bone_data_parent_data_init(&a1->bone_data, a2, bone_data); mot_parent_init_key_sets( &a1->mot_data, @@ -4474,7 +5092,7 @@ static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, bone[*i].frame = -1.0f; } else { - rob_chara_data_bone_data* rob_bone_data = v7->rob_bone_data; + 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; @@ -4561,37 +5179,37 @@ static void motion_blend_mot_dispose(motion_blend_mot* mot_blend_mot) { static void osage_coli_set(osage_coli* osg_coli, skin_param_osage_root_coli* skp_root_coli, mat4* mats) { - osage_coli* v4 = osg_coli; + 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) { - v4->type = v6->type; - v4->radius = v6->radius; + v5->type = v6->type; + v5->radius = v6->radius; mat4 mat = mats[v6->bone0_index]; - mat4_mult_vec3_trans(&mat, &v4->bone0_pos, &v4->bone0_pos); + 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, &v4->bone1_pos); - vec3_sub(v4->bone1_pos, v4->bone0_pos, v4->bone_pos_diff); + 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(v4->bone_pos_diff, length); - v4->bone_pos_diff_length_squared = length; + vec3_length_squared(v5->bone_pos_diff, length); + v5->bone_pos_diff_length_squared = length; length = sqrtf(length); - v4->bone_pos_diff_length = length; + v5->bone_pos_diff_length = length; if (length < 0.01f) - v4->type = 1; + v5->type = 1; } else if (v6->type == 3) - mat4_mult_vec3(&mat, &v4->bone1_pos, &v4->bone1_pos); + mat4_mult_vec3(&mat, &v6->bone1_pos, &v5->bone1_pos); - v4++; + v5++; v6++; } - v4->type = 0; + v5->type = 0; } static void osage_coli_ring_set(osage_coli* osg_coli, @@ -4604,28 +5222,28 @@ static void osage_coli_ring_set(osage_coli* osg_coli, osg_coli->bone_pos_diff = vec3_null; osg_coli->bone_pos_diff_length = 0.0f; osg_coli->bone_pos_diff_length_squared = 0.0f; - osg_coli->field_34 = 1.0; + osg_coli->field_34 = 1.0f; } else osage_coli_set(osg_coli, vec_skp_root_coli->begin, mats); } -static rob_chara_data_bone_data* rob_chara_data_bone_data_init() { - rob_chara_data_bone_data* rob_bone_data = force_malloc(sizeof(rob_chara_data_bone_data)); +static rob_chara_bone_data* rob_chara_bone_data_init() { + rob_chara_bone_data* rob_bone_data = force_malloc(sizeof(rob_chara_bone_data)); 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 rob_chara_data_bone_data_calculate_bones(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, vector_bone_database_bone* 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); } -static void rob_chara_data_bone_data_eyes_xrot_adjust(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_data, const struc_241* a2, eyes_adjust* a3) { float_t v1_neg; float_t v1_pos; @@ -4668,21 +5286,21 @@ static void rob_chara_data_bone_data_eyes_xrot_adjust(rob_chara_data_bone_data* } } -static float_t rob_chara_data_bone_data_get_frame(rob_chara_data_bone_data* rob_bone_data) { +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; } -static float_t rob_chara_data_bone_data_get_frame_count(rob_chara_data_bone_data* rob_bone_data) { +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; } -static void rob_chara_data_bone_data_get_ik_scale( - rob_chara_data_bone_data* rob_bone_data, bone_database* bone_data) { - if (rob_bone_data->motion_loaded.end - rob_bone_data->motion_loaded.begin < 0) +static void rob_chara_bone_data_get_ik_scale( + rob_chara_bone_data* rob_bone_data, bone_database* bone_data) { + if (vector_length(rob_bone_data->motion_loaded) < 0) return; motion_blend_mot* v2 = rob_bone_data->motion_loaded.begin[0]; - rob_chara_data_bone_data_ik_scale_calculate(&rob_bone_data->ik_scale, &v2->bone_data.bones, + 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; v2->field_4F8.field_C0 = ratio0; @@ -4690,21 +5308,21 @@ static void rob_chara_data_bone_data_get_ik_scale( v2->field_4F8.field_C8 = vec3_null; } -static mat4* rob_chara_data_bone_data_get_mat(rob_chara_data_bone_data* rob_bone_data, size_t index) { - bone_node* node = rob_chara_data_bone_data_get_node(rob_bone_data, index); +static mat4* rob_chara_bone_data_get_mat(rob_chara_bone_data* rob_bone_data, size_t index) { + bone_node* node = rob_chara_bone_data_get_node(rob_bone_data, index); if (node) return node->mat; return 0; } -static bone_node* rob_chara_data_bone_data_get_node(rob_chara_data_bone_data* rob_bone_data, size_t index) { - if ((ssize_t)index < rob_bone_data->nodes.end - rob_bone_data->nodes.begin) +static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_data, size_t index) { + if ((ssize_t)index < vector_length(rob_bone_data->nodes)) return &rob_bone_data->nodes.begin[index]; return 0; } -static void rob_chara_data_bone_data_ik_scale_calculate( - rob_chara_data_bone_data_ik_scale* ik_scale, vector_bone_data* vec_bone_data, +static void rob_chara_bone_data_ik_scale_calculate( + rob_chara_bone_data_ik_scale* ik_scale, vector_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 = bone_database_skeleton_type_to_string(base_skeleton_type); @@ -4733,15 +5351,15 @@ static void rob_chara_data_bone_data_ik_scale_calculate( / (fabsf(b_kl_kubi->base_translation[0].y) + b_cl_mune->ik_segment_length[0] + base_height); } -static void rob_chara_data_bone_data_init_data(rob_chara_data_bone_data* rob_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) { - rob_chara_data_bone_data_init_skeleton(rob_bone_data, base_skeleton_type, skeleton_type, 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); } -static void rob_chara_data_bone_data_init_skeleton(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, bone_database_skeleton_type base_skeleton_type, bone_database_skeleton_type skeleton_type, bone_database* bone_data) { if (rob_bone_data->base_skeleton_type == base_skeleton_type @@ -4755,16 +5373,16 @@ static void rob_chara_data_bone_data_init_skeleton(rob_chara_data_bone_data* rob || !bone_database_get_skeleton_parent_indices(bone_data, name, &parent_indices)) return; - rob_chara_data_bone_data_calculate_bones(rob_bone_data, bones); - rob_chara_data_bone_data_reserve(rob_bone_data); - rob_chara_data_bone_data_set_mats(rob_bone_data, bones); - rob_chara_data_bone_data_set_parent_mats(rob_bone_data, parent_indices->begin); + 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_bone_data->base_skeleton_type = base_skeleton_type; rob_bone_data->skeleton_type = skeleton_type; } -static void rob_chara_data_bone_data_interpolate(rob_chara_data_bone_data* rob_bone_data) { - if (rob_bone_data->motion_loaded.end - rob_bone_data->motion_loaded.begin < 0) +static void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data) { + if (vector_length(rob_bone_data->motion_loaded) < 0) return; for (motion_blend_mot** i = rob_bone_data->motion_loaded.begin; @@ -4772,26 +5390,26 @@ static void rob_chara_data_bone_data_interpolate(rob_chara_data_bone_data* rob_b motion_blend_mot_interpolate(*i); } -static void rob_chara_data_bone_data_motion_blend_mot_free(rob_chara_data_bone_data* rob_bone_data) { +static void rob_chara_bone_data_motion_blend_mot_free(rob_chara_bone_data* rob_bone_data) { vector_size_t_clear(&rob_bone_data->motion_indices, 0); vector_ptr_motion_blend_mot_clear(&rob_bone_data->motions, motion_blend_mot_dispose); } -static void rob_chara_data_bone_data_motion_blend_mot_init(rob_chara_data_bone_data* rob_bone_data) { +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_ptr_motion_blend_mot_reserve_back(&rob_bone_data->motions) = motion_blend_mot_init(); *vector_size_t_reserve_back(&rob_bone_data->motion_indices) = i; } - rob_chara_data_bone_data_motion_blend_mot_list_init(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); } -static void rob_chara_data_bone_data_motion_blend_mot_list_free(rob_chara_data_bone_data* 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] - >= rob_bone_data->motions.end - rob_bone_data->motions.begin && type) + >= vector_length(rob_bone_data->motions) && type) motion_blend_mot_dispose(type); rob_bone_data->motion_loaded.end[-1] = 0; vector_ptr_motion_blend_mot_pop_back(&rob_bone_data->motion_loaded, 0); @@ -4799,7 +5417,7 @@ static void rob_chara_data_bone_data_motion_blend_mot_list_free(rob_chara_data_b } } -static void rob_chara_data_bone_data_motion_blend_mot_list_init(rob_chara_data_bone_data* rob_bone_data) { +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_size_t_pop_back(&rob_bone_data->motion_indices, 0); vector_ptr_motion_blend_mot_push_back(&rob_bone_data->motion_loaded, @@ -4807,7 +5425,7 @@ static void rob_chara_data_bone_data_motion_blend_mot_list_init(rob_chara_data_b vector_size_t_push_back(&rob_bone_data->motion_loaded_indices, &free_index); } -static void rob_chara_data_bone_data_reserve(rob_chara_data_bone_data* rob_bone_data) { +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_mat4_reserve(&rob_bone_data->mats, mats_size); rob_bone_data->mats.end += mats_size; @@ -4827,18 +5445,18 @@ static void rob_chara_data_bone_data_reserve(rob_chara_data_bone_data* rob_bone_ i->exp_data.position = vec3_null; i->exp_data.rotation = vec3_null; i->exp_data.scale = vec3_identity; - i->exp_data.data_scale = vec3_identity; + i->exp_data.parent_scale = vec3_identity; i->ex_data_mat = 0; } } -static void rob_chara_data_bone_data_motion_load(rob_chara_data_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) { - if (rob_bone_data->motion_loaded.end - rob_bone_data->motion_loaded.begin < 1) + if (vector_length(rob_bone_data->motion_loaded) < 1) return; if (index == 1) { - rob_chara_data_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.begin[0], motion_id, bone_data, mot_db); return; } @@ -4846,14 +5464,14 @@ static void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_b if (index != 2) { if (index == 3) index = 0; - rob_chara_data_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.begin[0], motion_id, bone_data, mot_db); return; } - rob_chara_data_bone_data_motion_blend_mot_list_free(rob_bone_data, 2); - if (rob_bone_data->motion_indices.end - rob_bone_data->motion_indices.begin > 0) { - rob_chara_data_bone_data_motion_blend_mot_list_init(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 2); + if (vector_length(rob_bone_data->motion_indices) > 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); return; } @@ -4861,12 +5479,11 @@ static void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_b motion_blend_mot* v16 = motion_blend_mot_init(); motion_blend_mot_load_bone_data(v16, rob_bone_data, bone_data); vector_ptr_motion_blend_mot_push_back(&rob_bone_data->motion_loaded, &v16); - *vector_size_t_reserve_back(&rob_bone_data->motion_loaded_indices) - = (size_t)(rob_bone_data->motions.end - rob_bone_data->motions.begin); + *vector_size_t_reserve_back(&rob_bone_data->motion_loaded_indices) = vector_length(rob_bone_data->motions); motion_blend_mot_load_file(rob_bone_data->motion_loaded.begin[0], motion_id, bone_data, mot_db); } -static void rob_chara_data_bone_data_reset(rob_chara_data_bone_data* rob_bone_data) { +static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { rob_bone_data->object_bone_count = 0; rob_bone_data->motion_bone_count = 0; rob_bone_data->total_bone_count = 0; @@ -4878,15 +5495,15 @@ static void rob_chara_data_bone_data_reset(rob_chara_data_bone_data* rob_bone_da rob_bone_data->base_skeleton_type = BONE_DATABASE_SKELETON_NONE; rob_bone_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; - if (rob_bone_data->motions.end - rob_bone_data->motions.begin == 3) { - rob_chara_data_bone_data_motion_blend_mot_list_free(rob_bone_data, 0); + if (vector_length(rob_bone_data->motions) == 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); - rob_chara_data_bone_data_motion_blend_mot_list_init(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); } else { - rob_chara_data_bone_data_motion_blend_mot_free(rob_bone_data); - rob_chara_data_bone_data_motion_blend_mot_init(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_free(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_init(rob_bone_data); } } @@ -4898,11 +5515,11 @@ static void sub_140414BC0(struc_346* a1, float_t frame) { a1->field_14 = -1.0; } -static void rob_chara_data_bone_data_set_frame(rob_chara_data_bone_data* rob_bone_data, float_t frame) { +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); } -static void rob_chara_data_bone_data_set_mats(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, vector_bone_database_bone* bones) { size_t chain_pos = 0; size_t ik_bone_count = 0; @@ -4954,9 +5571,9 @@ static void rob_chara_data_bone_data_set_mats(rob_chara_data_bone_data* rob_bone i->ex_data_mat = i->mat; } -static void rob_chara_data_bone_data_set_parent_mats(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, uint16_t* parent_indices) { - if (rob_bone_data->nodes.end - rob_bone_data->nodes.begin < 1) + if (vector_length(rob_bone_data->nodes) < 1) return; parent_indices++; @@ -4964,12 +5581,12 @@ static void rob_chara_data_bone_data_set_parent_mats(rob_chara_data_bone_data* r i->parent = &rob_bone_data->nodes.begin[*parent_indices++]; } -static void rob_chara_data_bone_data_set_rotation_y(rob_chara_data_bone_data* rob_bone_data, float_t rotation_y) { +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; } -static void rob_chara_data_bone_data_update(rob_chara_data_bone_data* rob_bone_data, mat4* mat) { - if (rob_bone_data->motion_loaded_indices.end - rob_bone_data->motion_loaded_indices.begin < 1) +static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* mat) { + if (vector_length(rob_bone_data->motion_loaded_indices) < 1) return; for (motion_blend_mot** i = rob_bone_data->motion_loaded.begin; @@ -5035,7 +5652,7 @@ static void rob_chara_data_bone_data_update(rob_chara_data_bone_data* rob_bone_d motion_blend_mot_mult_mat(rob_bone_data->motion_loaded.begin[0], mat); } -static void rob_chara_data_bone_data_dispose(rob_chara_data_bone_data* rob_bone_data) { +static void rob_chara_bone_data_dispose(rob_chara_bone_data* rob_bone_data) { vector_mat4_free(&rob_bone_data->mats, 0); vector_mat4_free(&rob_bone_data->mats2, 0); vector_bone_node_free(&rob_bone_data->nodes, 0); @@ -5049,21 +5666,21 @@ static void rob_chara_data_bone_data_dispose(rob_chara_data_bone_data* rob_bone_ free(rob_bone_data); } -static rob_chara_data_item_equip* rob_chara_data_item_equip_init() { - rob_chara_data_item_equip* rob_item_equip = force_malloc(sizeof(rob_chara_data_item_equip)); - rob_chara_data_item_equip_object* itm_eq_obj = force_malloc_s(rob_chara_data_item_equip_object, 31); +static rob_chara_item_equip* rob_chara_item_equip_init() { + rob_chara_item_equip* rob_item_equip = force_malloc(sizeof(rob_chara_item_equip)); + 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_data_item_equip_object_init(&itm_eq_obj[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_data_item_equip_reset(rob_item_equip); + rob_chara_item_equip_reset(rob_item_equip); return rob_item_equip; } -static float_t sub_140512F60(rob_chara_data_item_equip* rob_item_equip) { +static float_t sub_140512F60(rob_chara_item_equip* rob_item_equip) { float_t v26; float_t v27; float_t v28; @@ -5124,8 +5741,8 @@ static float_t sub_140512F60(rob_chara_data_item_equip* rob_item_equip) { return *v22; } -static void rob_chara_data_item_equip_draw( - rob_chara_data_item_equip* rob_item_equip, int32_t chara_id, render_context* rctx) { +static void rob_chara_item_equip_draw( + rob_chara_item_equip* rob_item_equip, int32_t chara_id, render_context* rctx) { draw_task_flags v2 = 0; if (rctx->chara_reflect) v2 = DRAW_TASK_CHARA_REFLECT; @@ -5173,7 +5790,7 @@ static void rob_chara_data_item_equip_draw( 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_data_item_equip_object_draw(&rob_item_equip->item_equip_object[i], &mat, rctx); + rob_chara_item_equip_object_draw(&rob_item_equip->item_equip_object[i], &mat, rctx); else { for (int32_t i = 1; i < 31; i++) { draw_task_flags v18 = 0; @@ -5192,7 +5809,7 @@ static void rob_chara_data_item_equip_draw( v19 &= ~DRAW_TASK_SHADOW; object_data_set_draw_task_flags(object_data, (draw_task_flags)(v18 | v19 | DRAW_TASK_SSS)); - rob_chara_data_item_equip_object_draw(&rob_item_equip->item_equip_object[i], &mat, rctx); + rob_chara_item_equip_object_draw(&rob_item_equip->item_equip_object[i], &mat, rctx); } } object_data_set_texture_color_coeff(object_data, &v23); @@ -5202,33 +5819,34 @@ static void rob_chara_data_item_equip_draw( object_data_set_shadow_type(object_data, SHADOW_CHARA); } -static void rob_chara_data_item_equip_get_parent_bone_nodes( - rob_chara_data_item_equip* rob_item_equip, bone_node* bone_nodes, bone_database* bone_data) { +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_data_item_equip_object_get_parent_bone_nodes( + rob_chara_item_equip_object_get_parent_bone_nodes( &rob_item_equip->item_equip_object[i], rob_item_equip->bone_nodes, bone_data); } -static void rob_chara_data_item_equip_load_object_info(rob_chara_data_item_equip* rob_item_equip, - object_info object_info, item_id id, 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) { if (id < ITEM_BODY || id > ITEM_ITEM16 || !rob_item_equip->bone_nodes) return; - rob_chara_data_item_equip_object_load_object_info_ex_data( - &rob_item_equip->item_equip_object[id], object_info, rob_item_equip->bone_nodes, bone_data); + 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].draw = true; } -static void rob_chara_data_item_equip_object_init(rob_chara_data_item_equip_object* itm_eq_obj) { - memset(itm_eq_obj, 0, sizeof(rob_chara_data_item_equip_object)); +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_data_item_equip_object_init_data(itm_eq_obj, 0x12345678); + rob_chara_item_equip_object_init_data(itm_eq_obj, 0x12345678); } -static void rob_chara_data_item_equip_object_clear_ex_data(rob_chara_data_item_equip_object* itm_eq_obj) { +static void rob_chara_item_equip_object_clear_ex_data(rob_chara_item_equip_object* itm_eq_obj) { for (ex_osage_block** i = itm_eq_obj->osage_blocks.begin; i != itm_eq_obj->osage_blocks.end; i++) { (*i)->base.vftable->reset(&(*i)->base); @@ -5264,9 +5882,9 @@ static void rob_chara_data_item_equip_object_clear_ex_data(rob_chara_data_item_e itm_eq_obj->node_blocks.end = itm_eq_obj->node_blocks.begin; } -static void rob_chara_data_item_equip_object_draw( - rob_chara_data_item_equip_object* itm_eq_obj, mat4* mat, render_context* rctx) { - if (itm_eq_obj->object_info.id == -1 && itm_eq_obj->object_info.set_id == -1) +static void rob_chara_item_equip_object_draw( + rob_chara_item_equip_object* itm_eq_obj, mat4* mat, render_context* rctx) { + if (itm_eq_obj->obj_info.id == -1 && itm_eq_obj->obj_info.set_id == -1) return; object_data* object_data = &rctx->object_data; @@ -5279,7 +5897,7 @@ static void rob_chara_data_item_equip_object_draw( object_data_set_draw_task_flags(object_data, v4); if (itm_eq_obj->draw) { draw_task_add_draw_object_by_object_info_object_skin(rctx, - itm_eq_obj->object_info, + itm_eq_obj->obj_info, &itm_eq_obj->texture_pattern, &itm_eq_obj->texture_data, itm_eq_obj->alpha, @@ -5295,8 +5913,8 @@ static void rob_chara_data_item_equip_object_draw( object_data_set_draw_task_flags(object_data, v2); } -static int32_t rob_chara_data_item_equip_object_get_bone_index( - rob_chara_data_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data) { +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, bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), name); if (bone_index == -1) @@ -5306,34 +5924,34 @@ static int32_t rob_chara_data_item_equip_object_get_bone_index( return bone_index; } -static bone_node* rob_chara_data_item_equip_object_get_bone_node( - rob_chara_data_item_equip_object* itm_eq_obj, int32_t bone_index) { +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) < (itm_eq_obj->ex_data_bone_nodes.end - itm_eq_obj->ex_data_bone_nodes.begin)) + else if ((bone_index & 0x7FFF) < vector_length(itm_eq_obj->ex_data_bone_nodes)) return &itm_eq_obj->ex_data_bone_nodes.begin[bone_index & 0x7FFF]; return 0; } -static bone_node* rob_chara_data_item_equip_object_get_bone_node_by_name( - rob_chara_data_item_equip_object* itm_eq_obj, char* name, bone_database* bone_data) { - return rob_chara_data_item_equip_object_get_bone_node(itm_eq_obj, - rob_chara_data_item_equip_object_get_bone_index(itm_eq_obj, name, bone_data)); +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) { + 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_data_item_equip_object_get_parent_bone_nodes( - rob_chara_data_item_equip_object* itm_eq_obj, bone_node* bone_nodes, 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) { itm_eq_obj->bone_nodes = bone_nodes; itm_eq_obj->mat = bone_nodes->mat; for (ex_node_block** i = itm_eq_obj->node_blocks.begin; i != itm_eq_obj->node_blocks.end; i++) - (*i)->parent_bone_node = rob_chara_data_item_equip_object_get_bone_node_by_name( + (*i)->parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( itm_eq_obj, string_data(&(*i)->parent_name), bone_data); } -static void rob_chara_data_item_equip_object_init_data(rob_chara_data_item_equip_object* itm_eq_obj, size_t index) { +static void rob_chara_item_equip_object_init_data(rob_chara_item_equip_object* itm_eq_obj, size_t index) { itm_eq_obj->index = index; - itm_eq_obj->object_info = object_info_null; + itm_eq_obj->obj_info = object_info_null; itm_eq_obj->field_14 = -1; itm_eq_obj->mat = 0; itm_eq_obj->texture_pattern.end = itm_eq_obj->texture_pattern.begin; @@ -5349,7 +5967,7 @@ static void rob_chara_data_item_equip_object_init_data(rob_chara_data_item_equip itm_eq_obj->field_A4 = 0; itm_eq_obj->field_A8 = 0; itm_eq_obj->bone_nodes = 0; - rob_chara_data_item_equip_object_clear_ex_data(itm_eq_obj); + 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; @@ -5361,14 +5979,12 @@ static void rob_chara_data_item_equip_object_init_data(rob_chara_data_item_equip itm_eq_obj->field_1C0 = 0; } -static void rob_chara_data_item_equip_object_init_ex_data_bone_nodes( - rob_chara_data_item_equip_object* itm_eq_obj, object_skin_ex_data* a2) { +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 = 40; - if (a2->bone_names_count > 40) - count = a2->bone_names_count; + int32_t count = a2->bone_names_count; vector_bone_node_reserve(&itm_eq_obj->ex_data_bone_nodes, count); itm_eq_obj->ex_data_bone_nodes.end += count; vector_mat4_reserve(&itm_eq_obj->field_F0, count); @@ -5384,17 +6000,16 @@ static void rob_chara_data_item_equip_object_init_ex_data_bone_nodes( if (a2->bone_names) { vector_ex_data_name_bone_index* v14 = &itm_eq_obj->ex_bones; - memset(v14->begin, 0, sizeof(ex_data_name_bone_index) * (v14->end - v14->begin)); - for (ex_data_name_bone_index* i = v14->begin; i != v14->end; ++i) + memset(v14->begin, 0, sizeof(ex_data_name_bone_index) * vector_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 < a2->bone_names_count; i++) { + 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; - mat4_translate(0.0f, 0.0f, -1000.0f, v38->mat); bone_node_expression_data_reset_position_rotation(&v38->exp_data); v38->ex_data_mat = &v8[i]; *v38->ex_data_mat = mat4_identity; @@ -5406,15 +6021,15 @@ static void rob_chara_data_item_equip_object_init_ex_data_bone_nodes( } } -static void rob_chara_data_item_equip_object_load_ex_data(rob_chara_data_item_equip_object* itm_eq_obj, - object_skin_ex_data* ex_data, bone_database* bone_data) { +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_pair_int32_t_ptr_rob_osage_node a4 - = vector_empty(pair_int32_t_ptr_rob_osage_node); + vector_pair_uint32_t_ptr_rob_osage_node a4 + = vector_empty(pair_uint32_t_ptr_rob_osage_node); vector_pair_name_ex_osage_block a5 = vector_empty(pair_name_ex_osage_block); - rob_chara_data_item_equip_object_clear_ex_data(itm_eq_obj); + rob_chara_item_equip_object_clear_ex_data(itm_eq_obj); size_t constraint_count = 0; size_t expression_count = 0; @@ -5455,7 +6070,7 @@ static void rob_chara_data_item_equip_object_load_ex_data(rob_chara_data_item_eq vector_ptr_ex_expression_block_push_back(&itm_eq_obj->expression_blocks, &exp); ex_expression_block_init_data(exp, itm_eq_obj, &v4->expression, bone_names_ptr[v4->expression.name_index & 0x7FFF], - itm_eq_obj->object_info, itm_eq_obj->index, bone_data); + itm_eq_obj->obj_info, itm_eq_obj->index, bone_data); expression_count++; } else if (v4->type == OBJECT_SKIN_BLOCK_OSAGE) { @@ -5466,7 +6081,7 @@ static void rob_chara_data_item_equip_object_load_ex_data(rob_chara_data_item_eq node = &osg->base; vector_ptr_ex_osage_block_push_back(&itm_eq_obj->osage_blocks, &osg); ex_osage_block_init_data(osg, itm_eq_obj, &v4->osage, - bone_names_ptr[v4->constraint.name_index & 0x7FFF], + 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); sub_1405F3E10(osg, &v4->osage, &itm_eq_obj->skin_ex_data->osage_nodes[v4->osage.start_index], &a4, &a5); @@ -5481,10 +6096,10 @@ static void rob_chara_data_item_equip_object_load_ex_data(rob_chara_data_item_eq exp_data.position = v54->position; exp_data.rotation = v54->rotation; exp_data.scale = v54->scale; - exp_data.data_scale = vec3_identity; + exp_data.parent_scale = vec3_identity; string_copy(&v54->parent_name, &node->parent_name); - bone_node* parent_bone_node = rob_chara_data_item_equip_object_get_bone_node_by_name(itm_eq_obj, + 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); node->parent_bone_node = parent_bone_node; if (node->bone_node) { @@ -5503,14 +6118,76 @@ static void rob_chara_data_item_equip_object_load_ex_data(rob_chara_data_item_eq } (*i)->field_58 = true; } - vector_pair_int32_t_ptr_rob_osage_node_free(&a4, 0); + + for (ex_osage_block** i = itm_eq_obj->osage_blocks.begin; + i != itm_eq_obj->osage_blocks.end; i++) { + ex_osage_block* osg = *i; + ex_node_block* node = &osg->base; + ex_node_block* parent_node = node->parent_node; + bone_node* parent_bone_node = 0; + if (parent_node && node->field_58) { + while (!parent_node->field_58) { + parent_node = parent_node->parent_node; + if (!parent_node) + break; + parent_bone_node = parent_node->parent_bone_node; + } + + } + else + parent_bone_node = node->parent_bone_node; + + if (parent_bone_node && parent_bone_node->ex_data_mat) { + osg->rob.parent_mat_ptr = parent_bone_node->ex_data_mat; + mat4_to_mat4u(parent_bone_node->ex_data_mat, &osg->rob.parent_mat); + } + } + + 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; + + 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) + break; + + pair_uint32_t_ptr_rob_osage_node* sibling_node = v6; + for (; sibling_node != v7; sibling_node++) + if (sibling_node->key == 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 (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 (ex_osage_block** i = itm_eq_obj->osage_blocks.begin; i != itm_eq_obj->osage_blocks.end; i++) + v103 += vector_length((*i)->rob.nodes) - 1; + //for (ex_cloth_block** index = itm_eq_obj->cloth_blocks.begin; index != itm_eq_obj->cloth_blocks.end; index++) + // v103 += vector_length((*index)->rob.base.field_20) - (*index)->rob.base.field_10; + itm_eq_obj->field_1C0 = v103; + + vector_pair_uint32_t_ptr_rob_osage_node_free(&a4, 0); vector_pair_name_ex_osage_block_free(&a5, 0); } -static void rob_chara_data_item_equip_object_load_object_info_ex_data( - rob_chara_data_item_equip_object* itm_eq_obj, object_info object_info, - bone_node* bone_nodes, bone_database* bone_data) { - itm_eq_obj->object_info = object_info; +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) { + 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; @@ -5520,23 +6197,123 @@ static void rob_chara_data_item_equip_object_load_object_info_ex_data( itm_eq_obj->ex_bones.end = itm_eq_obj->ex_bones.begin; itm_eq_obj->field_F0.end = itm_eq_obj->field_F0.begin; - rob_chara_data_item_equip_object_clear_ex_data(itm_eq_obj); - object_skin* skin = object_storage_get_object_skin(itm_eq_obj->object_info); + 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) return; itm_eq_obj->skin = skin; itm_eq_obj->skin_ex_data = &skin->ex_data; - rob_chara_data_item_equip_object_init_ex_data_bone_nodes(itm_eq_obj, &skin->ex_data); - rob_chara_data_item_equip_object_load_ex_data(itm_eq_obj, &skin->ex_data, bone_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_data_item_equip_object_reset(rob_chara_data_item_equip_object* itm_eq_obj) { - rob_chara_data_item_equip_object_init_data(itm_eq_obj, 0xDEADBEEF); +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); } -static void rob_chara_data_item_equip_object_free(rob_chara_data_item_equip_object* itm_eq_obj) { - rob_chara_data_item_equip_object_init_data(itm_eq_obj, 0xDDDDDDDD); +static bool rob_chara_item_equip_object_set_boc(rob_chara_item_equip_object* itm_eq_obj, + skin_param_osage_root* skp_root, ex_osage_block* 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; + + bool v6 = false; + for (skin_param_osage_root_boc* i = skp_root->boc.begin; i != skp_root->boc.end; i++) { + ex_osage_block** v8 = itm_eq_obj->osage_blocks.begin; + ex_osage_block** v9 = itm_eq_obj->osage_blocks.end; + if (v8 == v9) + continue; + + while (v8 != v9) { + ex_osage_block* v10 = *v8; + if (str_utils_compare((*v8)->base.name, string_data(&i->ed_root)) + || i->ed_node + 1LL >= vector_length(rob_osg->nodes) + || i->st_node + 1LL >= vector_length(v10->rob.nodes)) { + v8++; + 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_ptr_rob_osage_node_push_back(&v17->data_ptr->boc, &v18); + v6 = true; + break; + } + } + return v6; +} + +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) + return; + + char* colli_tgt_osg = string_data(&skp_root->colli_tgt_osg); + for (ex_osage_block** i = itm_eq_obj->osage_blocks.begin; i != itm_eq_obj->osage_blocks.end; ++i) + if (!str_utils_compare(colli_tgt_osg, (*i)->base.name)) { + skp->colli_tgt_osg = &(*i)->rob.nodes; + break; + } +} + +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_length(kv->key_hash) < 1) + return; + + itm_eq_obj->field_1B8 = 0; + for (ex_osage_block** i = itm_eq_obj->osage_blocks.begin; + i != itm_eq_obj->osage_blocks.end; i++) { + ex_osage_block* 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->base.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 |= root.coli_type != 0; + //itm_eq_obj->field_1B8 |= sub_1405FAA30(itm_eq_obj, &root, 0); + skin_param_osage_root_free(&root); + } + for (ex_cloth_block** i = itm_eq_obj->cloth_blocks.begin; + i != itm_eq_obj->cloth_blocks.end; i++) { + ex_cloth_block* 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->base.name, &root, bone_data); + //rob_cloth_load_skin_param(&cls->rob, &root); + skin_param_osage_root_free(&root); + } +} + +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) { + key_val* kv_ptr = 0;//sub_14060B4B0(itm_eq_obj->object_info); + if (kv_ptr) { + rob_chara_item_equip_object_skp_load(itm_eq_obj, kv_ptr, bone_data); + return; + } + + char buf[0x200]; + char* name = object_database_get_object_name(obj_db, itm_eq_obj->obj_info); + sprintf_s(buf, sizeof(buf), "ext_skp_%s.txt", name); + + for (int32_t i = 0; buf[i]; i++) + if (buf[i] > 0x40 && buf[i] < 0x5B) + buf[i] += 0x20; + + key_val kv; + data_struct_load_file(data, &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); @@ -5580,11 +6357,11 @@ static void rob_chara_data_item_equip_object_free(rob_chara_data_item_equip_obje } -static void rob_chara_data_item_equip_reset(rob_chara_data_item_equip* rob_item_equip) { +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_data_item_equip_object_reset(&rob_item_equip->item_equip_object[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 = -1; rob_item_equip->field_A0 = 5; @@ -5595,17 +6372,58 @@ static void rob_chara_data_item_equip_reset(rob_chara_data_item_equip* rob_item_ rob_item_equip->field_958 = false; rob_item_equip->field_959 = false; rob_item_equip->field_95A = false; - rob_item_equip->osage_phys_step = 0.0f; + rob_item_equip->step = 0.0f; rob_item_equip->field_93C = false; rob_item_equip->first_item_equip_object = 1; rob_item_equip->max_item_equip_object = 30; } -static void rob_chara_data_item_equip_dispose(rob_chara_data_item_equip* rob_item_equip) { - rob_chara_data_item_equip_reset(rob_item_equip); - rob_chara_data_item_equip_object* itm_eq_obj = rob_item_equip->item_equip_object; +static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_item_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; + + mat4u* v7 = rob_item_equip->field_13C; + int32_t* v8 = rob_item_equip->field_18; + for (item_id v6 = ITEM_BODY; v6 < ITEM_MAX; v6++) { + rob_chara_item_equip_object_init_data(&rob_item_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; +} + +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; + if (value) { + rob_item_equip->first_item_equip_object = ITEM_BODY; + rob_item_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; + } +} + +static void rob_chara_item_equip_set_shadow_type(rob_chara_item_equip* rob_item_equip, int32_t chara_id) { + if (chara_id == 0) + rob_item_equip->shadow_type = SHADOW_CHARA; + else + rob_item_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_data_item_equip_object_free(&itm_eq_obj[i]); + rob_chara_item_equip_object_free(&itm_eq_obj[i]); free(itm_eq_obj); if (rob_item_equip->texture_pattern.begin) @@ -5614,17 +6432,114 @@ static void rob_chara_data_item_equip_dispose(rob_chara_data_item_equip* rob_ite free(rob_item_equip); } -static bool rob_chara_data_check_for_ageageagain_module(chara_index chara_index, int32_t module_index) { +static void rob_chara_item_sub_data_init(rob_chara_item_sub_data* rob_item_sub_data) { + rob_item_sub_data->texture_change = vector_empty(item_sub_data_texture_change); + rob_item_sub_data->item_change = vector_empty(item_sub_data_item_change); + rob_item_sub_data->field_F0 = vector_empty(pair_object_info_item_id); + rob_item_sub_data->field_100 = vector_empty(struc_294); + for (int32_t i = 0; i < 31; i++) + rob_item_sub_data->texture_pattern[i] = vector_empty(texture_pattern_struct); + rob_item_sub_data->field_3F8 = vector_empty(pair_int32_t_object_info); + rob_item_sub_data->chara_index = 0; + rob_item_sub_data->chara_index_2nd = 0; + 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 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; + for (item_sub_id 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); + //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_item_sub_data_item_change_clear( + &rob_item_sub_data->item_change, item_sub_data_item_change_free); +} + +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) { + item_sub_data sub_data; + memset(&sub_data, 0, sizeof(item_sub_data)); + sub_data.kami = 500; + sub_data.outer = 1; + sub_data.kata = 301; + //sub_data.kami = 681; + //sub_data.outer = 181; + //sub_data.kata = 481; + //sub_data.head = 981; + rob_chara_reload_items(&rob_chara_array[0], + &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_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_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_pair_object_info_item_id_free(&rob_item_sub_data->field_F0, 0); + vector_struc_294_free(&rob_item_sub_data->field_100, 0); + vector_pair_int32_t_object_info_free(&rob_item_sub_data->field_3F8, 0); + for (int32_t i = 0; i < 31; i++) + vector_texture_pattern_struct_free(&rob_item_sub_data->texture_pattern[i], 0); + vector_item_sub_data_item_change_free( + &rob_item_sub_data->item_change, item_sub_data_item_change_free); + vector_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_ptr_void_free(&rob_mot_blend->field_8.field_110, 0); +} + +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 void rob_chara_data_load_default_motion(rob_chara_data* rob_chr_data, +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_data, 0); - rob_chara_data_load_default_motion_sub(rob_chr_data, 1, motion_id, bone_data, mot_db); + int32_t motion_id = 195; //rob_cmn_mottbl_get_motion_index(rob_chr, 0); + rob_chara_load_default_motion_sub(rob_chr, 1, motion_id, bone_data, mot_db); } -static void sub_14041C680(rob_chara_data_bone_data* rob_bone_data, bool a2) { +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; @@ -5632,7 +6547,7 @@ static void sub_14041C680(rob_chara_data_bone_data* rob_bone_data, bool a2) { v2->field_0 &= ~2; } -static void sub_14041C9D0(rob_chara_data_bone_data* rob_bone_data, bool a2) { +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) @@ -5641,7 +6556,7 @@ static void sub_14041C9D0(rob_chara_data_bone_data* rob_bone_data, bool a2) { v2->field_0 &= ~1; } -static void sub_14041D2D0(rob_chara_data_bone_data* rob_bone_data, bool a2) { +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; @@ -5649,7 +6564,7 @@ static void sub_14041D2D0(rob_chara_data_bone_data* rob_bone_data, bool a2) { v2->field_0 &= ~4; } -static void sub_14041BC40(rob_chara_data_bone_data* rob_bone_data, bool a2) { +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; @@ -5662,11 +6577,11 @@ static void sub_140414F00(struc_308* a1, float_t a2) { a1->eyes_adjust = a2; } -static void sub_14041D270(rob_chara_data_bone_data* rob_bone_data, float_t 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_data_bone_data* rob_bone_data, float_t 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; } @@ -5688,80 +6603,113 @@ static void sub_14041D2A0(rob_chara_data_bone_data* rob_bone_data, float_t a2) { }*/ /*static void sub_140414C60(motion_blend_mot* hinge, float_t v47, float_t hinge, float_t init_rot) { - motion_blend* v4 = hinge->field_5D0; - if (v4) - sub_1403FBED0(v4, v47, hinge, 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_data_bone_data* rob_bone_data, float_t v47, float_t hinge, float_t 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_14041D310(rob_chara_data_bone_data* rob_bone_data) { - motion_blend* v1 = rob_bone_data->motion_loaded.begin[0]->field_5D0; - if (v1) - v1->vftable->field_10(v1); +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 sub_140419820(rob_chara_data_bone_data* rob_bone_data, int32_t skeleton_select) { +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); }*/ -static void rob_chara_data_load_default_motion_sub(rob_chara_data* rob_chr_data, int32_t 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_data->bone_data, -1); - sub_14041BFC0(rob_chr_data->bone_data, -1); - sub_14041C260(rob_chr_data->bone_data, -1); - sub_14041D200(rob_chr_data->bone_data, -1); - sub_14041BDB0(rob_chr_data->bone_data, -1); - sub_14041BD20(rob_chr_data->bone_data, -1);*/ - rob_chara_data_bone_data_motion_load(rob_chr_data->bone_data, motion_id, 1, bone_data, mot_db); - rob_chara_data_bone_data_set_frame(rob_chr_data->bone_data, 0.0f); - sub_14041C680(rob_chr_data->bone_data, 0); - sub_14041C9D0(rob_chr_data->bone_data, 0); - sub_14041D2D0(rob_chr_data->bone_data, 0); - sub_14041BC40(rob_chr_data->bone_data, 0); - sub_14041D270(rob_chr_data->bone_data, 0.0f); - sub_14041D2A0(rob_chr_data->bone_data, 0.0f); - rob_chara_data_bone_data_set_rotation_y(rob_chr_data->bone_data, 0.0f); - //sub_14041BF80(rob_chr_data->bone_data, 0.0f, 1.0f, 1.0f); - //sub_14041D310(rob_chr_data->bone_data); - rob_chara_data_bone_data_interpolate(rob_chr_data->bone_data); - rob_chara_data_bone_data_update(rob_chr_data->bone_data, 0); - //sub_140419820(rob_chr_data->bone_data, skeleton_select); + /*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_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_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_interpolate(rob_chr->bone_data); + rob_chara_bone_data_update(rob_chr->bone_data, 0); + //sub_140419820(rob_chr->bone_data, skeleton_select); } -static void rob_chara_data_set_draw(rob_chara_data* rob_chr_data, item_id id, bool draw) { +static void rob_chara_set_draw(rob_chara* rob_chr, item_id id, bool draw) { if (id < ITEM_BODY) return; else if (id < ITEM_ITEM16) - rob_chr_data->item_equip->item_equip_object[id].draw = draw; + rob_chr->item_equip->item_equip_object[id].draw = draw; else if (id == ITEM_MAX) for (int32_t i = ITEM_ATAMA; i <= ITEM_ITEM16; i++) { - rob_chr_data->item_equip->item_equip_object[i].draw = draw; - /*if (i == ITEM_ATAMA && rob_chara_data_check_for_ageageagain_module( - rob_chr_data->chara_index, rob_chr_data->module_index)) { - sub_140543780(rob_chr_data->chara_id, 1, draw); - sub_140543780(rob_chr_data->chara_id, 2, draw); - sub_1405430F0(rob_chr_data->chara_id, 1); - sub_1405430F0(rob_chr_data->chara_id, 2); + rob_chr->item_equip->item_equip_object[i].draw = draw; + /*if (index == ITEM_ATAMA && rob_chara_check_for_ageageagain_module( + rob_chr->chara_index, rob_chr->module_index)) { + sub_140543780(rob_chr->chara_id, 1, draw); + sub_140543780(rob_chr->chara_id, 2, draw); + sub_1405430F0(rob_chr->chara_id, 1); + sub_1405430F0(rob_chr->chara_id, 2); }*/ } } static rob_osage_node* rob_osage_get_node(rob_osage* rob_osg, size_t index) { - if ((ssize_t)index < rob_osg->nodes.end - rob_osg->nodes.begin) + if ((ssize_t)index < vector_length(rob_osg->nodes)) return &rob_osg->nodes.begin[index]; else return &rob_osg->node; } +static void rob_osage_load_skin_param(rob_osage* rob_osg, key_val* kv, 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; + + 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); + } + + vector_skin_param_osage_node vec = vector_empty(skin_param_osage_node); + size_t count = vector_length(rob_osg->nodes) - 1; + vector_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; + } + skin_param_osage_node_parse(kv, name, &vec, skp_root); + rob_osage_set_skp_osg_nodes(rob_osg, &vec); + vector_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->field_10 = vec3_null; - node->field_1C = 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; @@ -5769,14 +6717,14 @@ static void rob_osage_node_init(rob_osage_node* node) { node->sibling_node = 0; node->distance = 0.0f; node->field_94 = vec3_null; - node->field_A0 = vec3_null; - node->field_AC = vec3_null; - node->field_B8 = vec3_null; - node->field_C4 = 0.0f; + 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->field_DC = 1.0f; + node->force = 1.0f; rob_osage_node_data_init(&node->data); node->data_ptr = &node->data; node->field_198.end = node->field_198.begin; @@ -5793,12 +6741,89 @@ static void rob_osage_node_free(rob_osage_node* node) { vector_ptr_rob_osage_node_free(&node->data.boc, 0); } -static void rob_osage_set_coli(rob_osage* rob_osg, mat4* mats) { +static void rob_osage_set_air_res(rob_osage* rob_osg, float_t air_res) { + rob_osg->skin_param_ptr->air_res = 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); 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++) + 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++) { + i->data_ptr->force = force; + force = force * force_gain; + } +} + +static void rob_osage_set_hinge(rob_osage* rob_osg, float_t hinge_y, float_t hinge_z) { + hinge_y = min(hinge_y, 179.0f); + 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++) { + rob_osage_node_data* data = i->data_ptr; + data->skp_osg_node.hinge.ymin = -hinge_y; + data->skp_osg_node.hinge.ymax = hinge_y; + data->skp_osg_node.hinge.zmin = -hinge_z; + data->skp_osg_node.hinge.zmax = hinge_z; + } +} + +static void rob_osage_set_init_rot(rob_osage* rob_osg, float_t init_rot_y, float_t init_rot_z) { + rob_osg->skin_param_ptr->init_rot.y = init_rot_y * DEG_TO_RAD_FLOAT; + rob_osg->skin_param_ptr->init_rot.z = init_rot_z * DEG_TO_RAD_FLOAT; +} + +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_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_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_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_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_skin_param_osage_node* skp_osg_nodes) { + if (!skp_osg_nodes) + return; + + if (vector_length(rob_osg->nodes) - 1 != vector_length(*skp_osg_nodes)) + 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) { + i->data_ptr->skp_osg_node = *j++; + skin_param_hinge_limit(&i->data_ptr->skp_osg_node.hinge); + i++; + } +} + 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); @@ -5810,6 +6835,39 @@ static void rob_osage_free(rob_osage* rob_osg) { vector_rob_osage_node_free(&rob_osg->nodes, rob_osage_node_free); } +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; @@ -5828,20 +6886,448 @@ static void skin_param_init(skin_param* skp) { skp->colli_tgt_osg = 0; } -void rob_chara_data_array_init() { - for (int32_t i = 0; i < 6; i++) - rob_chara_data_init(&rob_chara_data_array[i]); +static bool skin_param_file_read(void* data, char* path, char* file, uint32_t hash) { + string s; + string_init(&s, path); + string_add(&s, file); + + key_val* kv = data; + key_val_file_read(kv, string_data(&s)); + + string_free(&s); + return kv->buf ? true : false; } -rob_chara_data* rob_chara_data_array_get(int32_t chara_id) { +static void skin_param_osage_node_parse(key_val* kv, char* name, + vector_skin_param_osage_node* vec, skin_param_osage_root* skp_root) { + char buf[SKP_TEXT_BUF_SIZE]; + int32_t count; + size_t len; + size_t len1; + size_t len2; + size_t off; + + key_val lkv; + if (!key_val_get_local_key_val(kv, name, &lkv)) + return; + + len = utf8_length(name); + memcpy(buf, name, len); + off = len; + + len1 = 5; + memcpy(&buf[len], ".node", 5); + off = len + len1; + + 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_length(*vec); + if (c < count) { + vector_skin_param_osage_node_reserve(vec, count - c); + vec->end += count - c; + } + } + else + vector_skin_param_osage_node_clear(vec, 0); + + 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)); + 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; + + float_t coli_r = 0; + if (key_val_read_float_t(&sub_local_key_val, + 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, + buf, off, ".weight", 8, &weight)) + i->weight = weight; + + float_t inertial_cancel = 0; + if (key_val_read_float_t(&sub_local_key_val, + buf, off, ".inertial_cancel", 17, &inertial_cancel)) + i->inertial_cancel = inertial_cancel; + + i->hinge.ymin = -skp_root->hinge_y; + i->hinge.ymax = skp_root->hinge_y; + i->hinge.zmin = -skp_root->hinge_z; + i->hinge.zmax = skp_root->hinge_z; + + float_t hinge_ymax = 0.0f; + if (key_val_read_float_t(&sub_local_key_val, + buf, off, ".hinge_ymax", 17, &hinge_ymax)) + i->hinge.ymax = hinge_ymax; + + float_t hinge_ymin = 0.0f; + if (key_val_read_float_t(&sub_local_key_val, + buf, off, ".hinge_ymin", 17, &hinge_ymin)) + i->hinge.ymin = hinge_ymin; + + float_t hinge_zmax = 0.0f; + if (key_val_read_float_t(&sub_local_key_val, + buf, off, ".hinge_zmax", 17, &hinge_zmax)) + i->hinge.zmax = hinge_zmax; + + float_t hinge_zmin = 0.0f; + if (key_val_read_float_t(&sub_local_key_val, + buf, off, ".hinge_zmin", 17, &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 = "NO-PARAM"; + + vector_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_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, 0); + + vector_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, + skin_param_osage_root* skp_root, bone_database* bone_data) { + char buf[SKP_TEXT_BUF_SIZE]; + int32_t count; + size_t len; + size_t len1; + size_t len2; + size_t len3; + size_t off; + + key_val lkv; + if (!key_val_get_local_key_val(kv, name, &lkv)) + return; + + len = utf8_length(name); + memcpy(buf, name, len); + off = len; + + int32_t node_length = 0; + key_val_read_int32_t(&lkv, + buf, off, ".node.length", 13, &node_length); + + len1 = 5; + memcpy(&buf[len], ".root", 5); + off = len + len1; + + float_t force = 0.0f; + float_t force_gain = 0.0f; + if (key_val_read_float_t(&lkv, + buf, off, ".force", 7, &force) + && key_val_read_float_t(&lkv, + 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, + 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, + buf, off, ".rot_y", 7, &rot_y) + && key_val_read_float_t(&lkv, + 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, + 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)) + skp_root->wind_afc = 0.0f; + } + + int32_t coli_type = 0; + if (key_val_read_int32_t(&lkv, + 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, + buf, off, ".init_rot_y", 12, &init_rot_y) + && key_val_read_float_t(&lkv, + 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; + } + + float_t hinge_y = 0.0f; + float_t hinge_z = 0.0f; + if (key_val_read_float_t(&lkv, + buf, off, ".hinge_y", 9, &hinge_y) + && key_val_read_float_t(&lkv, + 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, + 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, + buf, off, ".stiffness", 11, &stiffness)) + skp_root->stiffness = stiffness; + + float_t move_cancel = 0.0f; + if (key_val_read_float_t(&lkv, + buf, off, ".move_cancel", 13, &move_cancel)) + skp_root->move_cancel = move_cancel; + + len2 = 5; + memcpy(buf + len + len1, ".coli", 5); + off = len + len1 + len2; + + 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_skin_param_osage_root_coli* vc = &skp_root->coli; + + vector_skin_param_osage_root_coli_reserve(vc, count); + vc->end += 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)); + 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, + buf, off, ".type", 6, &type)) + break; + c->type = type; + + float_t radius = 0; + if (!key_val_read_float_t(&sub_local_key_val, + buf, off, ".radius", 8, &radius)) + break; + c->radius = radius; + + char* bone0_name = 0; + if (!key_val_read_string_ptr(&sub_local_key_val, + buf, off, ".bone.0.name", 13, &bone0_name)) + break; + + c->bone0_index = bone_database_get_skeleton_object_bone_index(bone_data, + 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, + buf, off, ".bone.0.posx", 13, &bone0_pos.x)) + break; + + if (!key_val_read_float_t(&sub_local_key_val, + buf, off, ".bone.0.posy", 13, &bone0_pos.y)) + break; + + if (!key_val_read_float_t(&sub_local_key_val, + buf, off, ".bone.0.posz", 13, &bone0_pos.z)) + break; + + c->bone0_pos = bone0_pos; + + char* bone1_name = 0; + if (key_val_read_string_ptr(&sub_local_key_val, + buf, off, ".bone.1.name", 13, &bone1_name)) { + + c->bone1_index = bone_database_get_skeleton_object_bone_index(bone_data, + 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, + buf, off, ".bone.1.posx", 13, &bone1_pos.x)) + break; + + if (!key_val_read_float_t(&sub_local_key_val, + buf, off, ".bone.1.posy", 13, &bone1_pos.y)) + break; + + if (!key_val_read_float_t(&sub_local_key_val, + buf, off, ".bone.1.posz", 13, &bone1_pos.z)) + break; + + c->bone1_pos = bone1_pos; + + } + } + key_val_free(&sub_local_key_val); + } + + len2 = 4; + memcpy(buf + len + len1, ".boc", 4); + 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_skin_param_osage_root_boc* vb = &skp_root->boc; + + vector_skin_param_osage_root_boc_reserve(vb, 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; + int32_t ed_node = 0; + if (key_val_read_int32_t(&sub_local_key_val, + buf, off, ".st_node", 9, &st_node) + && st_node < node_length + && key_val_read_string(&sub_local_key_val, + buf, off, ".ed_root", 9, &ed_root) + && key_val_read_int32_t(&sub_local_key_val, + buf, off, ".ed_node", 9, &ed_node) + && ed_node < node_length) { + skin_param_osage_root_boc* b = vector_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; + } + 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, + buf, off, ".colli_tgt_osg", 15, &colli_tgt_osg)) + skp_root->colli_tgt_osg = colli_tgt_osg; + + len2 = 11; + memcpy(buf + len + len1, ".normal_ref", 11); + 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_skin_param_osage_root_normal_ref* vnr = &skp_root->normal_ref; + + vector_skin_param_osage_root_normal_ref_reserve(vnr, 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, + buf, off, ".N", 3, &n)) { + skin_param_osage_root_normal_ref* nr + = vector_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); + } + } + key_val_free(&sub_local_key_val); + } + + key_val_free(&lkv); +} + +static void skin_param_osage_root_free(skin_param_osage_root* root) { + vector_skin_param_osage_root_normal_ref_free( + &root->normal_ref, skin_param_osage_root_normal_ref_free); + string_free(&root->colli_tgt_osg); + vector_skin_param_osage_root_boc_free(&root->boc, skin_param_osage_root_boc_free); + vector_skin_param_osage_root_coli_free(&root->coli, 0); +} + +void rob_chara_array_init() { + for (int32_t i = 0; i < 6; i++) + rob_chara_init(&rob_chara_array[i]); +} + +rob_chara* rob_chara_array_get(int32_t chara_id) { if (rob_chara_pv_data_array_check_chara_id(chara_id)) - return &rob_chara_data_array[chara_id]; + return &rob_chara_array[chara_id]; return 0; } -void rob_chara_data_array_free() { +void rob_chara_array_free() { for (int32_t i = 0; i < 6; i++) - rob_chara_data_free(&rob_chara_data_array[i]); + rob_chara_free(&rob_chara_array[i]); } void rob_chara_pv_data_init(rob_chara_pv_data* pv_data) { @@ -5870,7 +7356,7 @@ void rob_chara_pv_data_init(rob_chara_pv_data* pv_data) { inline bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id) { //return rob_chara_pv_data_array[chara_id].index != -1; - return rob_chara_data_array[chara_id].chara_id != -1; + return rob_chara_array[chara_id].chara_id != -1; } inline void motion_storage_init() { diff --git a/src/CRE/rob.h b/src/CRE/rob.h index 2b5b12a9..8b5f1f2f 100644 --- a/src/CRE/rob.h +++ b/src/CRE/rob.h @@ -118,6 +118,14 @@ typedef enum item_sub_id { ITEM_SUB_MAX = 0x19, } item_sub_id; +typedef enum motion_blend_type { + MOTION_BLEND_NONE = -1, + MOTION_BLEND = 0x00, + MOTION_BLEND_FREEZE = 0x01, + MOTION_BLEND_CROSS = 0x02, + MOTION_BLEND_COMBINE = 0x03, +} motion_blend_type; + typedef enum motion_bone_index { MOTION_BONE_NONE = -1, MOTION_BONE_N_HARA_CP = 0x00, @@ -308,14 +316,35 @@ 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_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 struct bone_node bone_node; -typedef struct rob_chara_data_bone_data rob_chara_data_bone_data; +typedef struct rob_chara rob_chara; +typedef struct rob_chara_bone_data rob_chara_bone_data; typedef struct bone_node_expression_data { vec3 position; vec3 rotation; vec3 scale; - vec3 data_scale; + vec3 parent_scale; } bone_node_expression_data; struct bone_node { @@ -443,7 +472,7 @@ typedef struct bone_data { vector(bone_data) typedef struct bone_data_parent { - rob_chara_data_bone_data* rob_bone_data; + rob_chara_bone_data* rob_bone_data; size_t motion_bone_count; size_t ik_bone_count; size_t chain_pos; @@ -508,14 +537,14 @@ typedef struct motion_blend_mot { vector_ptr(motion_blend_mot) -typedef struct rob_chara_data_bone_data_ik_scale { +typedef struct rob_chara_bone_data_ik_scale { float_t ratio0; float_t ratio1; float_t ratio2; float_t ratio3; -} rob_chara_data_bone_data_ik_scale; +} rob_chara_bone_data_ik_scale; -struct rob_chara_data_bone_data { +struct rob_chara_bone_data { size_t object_bone_count; size_t total_bone_count; size_t motion_bone_count; @@ -530,7 +559,7 @@ struct rob_chara_data_bone_data { vector_size_t motion_indices; vector_size_t motion_loaded_indices; vector_ptr_motion_blend_mot motion_loaded; - rob_chara_data_bone_data_ik_scale ik_scale; + rob_chara_bone_data_ik_scale ik_scale; }; typedef struct struc_242 { @@ -623,21 +652,21 @@ typedef struct struc_241 { } struc_241; typedef struct ex_node_block ex_node_block; -typedef struct rob_chara_data_item_equip_object rob_chara_data_item_equip_object; +typedef struct rob_chara_item_equip_object rob_chara_item_equip_object; typedef struct ex_node_block_vtbl { void(*dispose)(ex_node_block*); - //void(*field_8)(ex_node_block*); - void(*set_default_data)(ex_node_block*); - //void(*field_18)(ex_node_block*, int32_t, int32_t); + void(*field_8)(ex_node_block*); + void(*field_10)(ex_node_block*); + void(*field_18)(ex_node_block*, int32_t, bool); void(*update)(ex_node_block*); - //void(*field_28)(ex_node_block*); + void(*field_28)(ex_node_block*); void(*draw)(ex_node_block*); void(*reset)(ex_node_block*); - //void(*field_40)(ex_node_block*); - //void(*field_48)(ex_node_block*); - //void(*field_50)(ex_node_block*); - //void(*field_58)(ex_node_block*); + void(*field_40)(ex_node_block*); + void(*field_48)(ex_node_block*); + void(*field_50)(ex_node_block*); + void(*field_58)(ex_node_block*); } ex_node_block_vtbl; struct ex_node_block { @@ -648,16 +677,16 @@ struct ex_node_block { bone_node* parent_bone_node; string parent_name; ex_node_block* parent_node; - rob_chara_data_item_equip_object* item_equip_object; + rob_chara_item_equip_object* item_equip_object; bool field_58; - bool set_data; + bool field_59; bool field_5A; }; typedef struct ex_cloth_block { ex_node_block base; //rob_cloth rob; - object_skin_block_cloth* cloth_block; + object_skin_block_cloth* cls_data; mat4* field_2428; size_t index; } ex_cloth_block; @@ -696,6 +725,8 @@ typedef struct skin_param_osage_node { skin_param_hinge hinge; } skin_param_osage_node; +vector(skin_param_osage_node) + vector_ptr(rob_osage_node) typedef struct rob_osage_node_data { @@ -705,11 +736,18 @@ typedef struct rob_osage_node_data { skin_param_osage_node skp_osg_node; } rob_osage_node_data; +typedef struct struc_479 { + vec3 trans; + vec3 trans_diff; + vec3 rotation; + float_t field_24; +} struc_479; + struct rob_osage_node { float_t length; vec3 trans; - vec3 field_10; - vec3 field_1C; + vec3 trans_orig; + vec3 trans_diff; vec3 field_28; float_t child_length; bone_node* bone_node; @@ -718,19 +756,15 @@ struct rob_osage_node { rob_osage_node* sibling_node; float_t distance; vec3 field_94; - vec3 field_A0; - vec3 field_AC; - vec3 field_B8; - float_t field_C4; + struc_479 field_A0; float_t field_C8; float_t field_CC; vec3 field_D0; - float_t field_DC; + float_t force; rob_osage_node_data* data_ptr; rob_osage_node_data data; - int32_t field_194; vector_struc_331 field_198; - int32_t field_1B0; + float_t field_1B0; vec3 field_1B4; vec3 field_1C0; float_t field_1CC; @@ -738,12 +772,12 @@ struct rob_osage_node { vector(rob_osage_node) -typedef struct pair_int32_t_ptr_rob_osage_node { - int32_t key; +typedef struct pair_uint32_t_ptr_rob_osage_node { + uint32_t key; rob_osage_node* value; -} pair_int32_t_ptr_rob_osage_node; +} pair_uint32_t_ptr_rob_osage_node; -vector(pair_int32_t_ptr_rob_osage_node) +vector(pair_uint32_t_ptr_rob_osage_node) typedef struct skin_param_osage_root_coli { int32_t type; @@ -756,6 +790,47 @@ typedef struct skin_param_osage_root_coli { vector(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; + +typedef struct skin_param_osage_root_boc { + int32_t ed_node; + string ed_root; + int32_t st_node; +} skin_param_osage_root_boc; + +vector(skin_param_osage_root_boc) +vector(skin_param_osage_root_normal_ref) + +typedef struct skin_param_osage_root { + int32_t field_0; + float_t force; + float_t force_gain; + float_t air_res; + float_t rot_y; + float_t rot_z; + float_t init_rot_y; + float_t init_rot_z; + float_t hinge_y; + float_t hinge_z; + char* name; + vector_skin_param_osage_root_coli coli; + float_t coli_r; + float_t friction; + float_t wind_afc; + vector_skin_param_osage_root_boc boc; + int32_t coli_type; + float_t stiffness; + float_t move_cancel; + string colli_tgt_osg; + vector_skin_param_osage_root_normal_ref normal_ref; +} skin_param_osage_root; + typedef struct skin_param { vector_skin_param_osage_root_coli coli; float_t friction; @@ -815,11 +890,11 @@ typedef struct rob_osage { float_t field_1EB4; int32_t field_1EB8; int32_t field_1EBC; - mat4* mats; - mat4u mat; - float_t field_1F08; + mat4* parent_mat_ptr; + mat4u parent_mat; + float_t move_cancel; bool field_1F0C; - bool field_1F0D; + bool wind_reset; bool field_1F0E; bool field_1F0F; osage_ring_data ring; @@ -835,7 +910,7 @@ typedef struct ex_osage_block { rob_osage rob; mat4* mat; int32_t field_1FF8; - float_t osage_phys_step; + float_t step; } ex_osage_block; typedef struct pair_name_ex_osage_block { @@ -908,7 +983,7 @@ typedef struct ex_expression_block { bool field_3D20; void(*field_3D28)(bone_node_expression_data*); float_t frame; - bool osage_phys_step; + bool step; } ex_expression_block; vector_ptr(ex_constraint_block) @@ -924,12 +999,12 @@ typedef struct ex_data_name_bone_index { vector(ex_data_name_bone_index) -typedef struct rob_chara_data_item_equip rob_chara_data_item_equip; +typedef struct rob_chara_item_equip rob_chara_item_equip; -struct rob_chara_data_item_equip_object { +struct rob_chara_item_equip_object { size_t index; mat4* mat; - object_info object_info; + object_info obj_info; int32_t field_14; vector_texture_pattern_struct texture_pattern; texture_data_struct texture_data; @@ -957,17 +1032,28 @@ struct rob_chara_data_item_equip_object { bool field_1C8; object_skin_ex_data* skin_ex_data; object_skin* skin; - rob_chara_data_item_equip* item_equip; + rob_chara_item_equip* item_equip; }; -struct rob_chara_data_item_equip { +typedef struct struc_373 { + int32_t motion_id; + float_t frame; + float_t frame_count; + bool field_C; + motion_blend_type type; + float_t blend; +} struc_373; + +vector(struc_373) + +struct rob_chara_item_equip { bone_node* bone_nodes; mat4* matrices; - rob_chara_data_item_equip_object* item_equip_object; + rob_chara_item_equip_object* item_equip_object; int32_t field_18[31]; bool item_equip_range; - int32_t first_item_equip_object; - int32_t max_item_equip_object; + item_id first_item_equip_object; + item_id max_item_equip_object; int32_t field_A0; shadow_type_enum shadow_type; vec3 position; @@ -981,7 +1067,7 @@ struct rob_chara_data_item_equip { float_t wet; float_t wind_strength; bool chara_color; - bool field_F9; + bool npr_flag; mat4u mat; mat4u field_13C[30]; int32_t field_8BC; @@ -1008,9 +1094,9 @@ struct rob_chara_data_item_equip { int64_t field_920; int64_t field_928; int64_t field_930; - float_t osage_phys_step; + float_t step; bool field_93C; - //vector_struc_373 field_940; + vector_struc_373 field_940; bool field_958; bool field_959; bool field_95A; @@ -1047,15 +1133,886 @@ 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(pair_object_info_item_id) + +typedef struct item_sub_data_texture_change_tex { + texture* org; + texture* chg; + bool changed; +} item_sub_data_texture_change_tex; + +vector(item_sub_data_texture_change_tex) + +typedef struct item_sub_data_texture_change { + uint32_t item_no; + vector_item_sub_data_texture_change_tex tex; +} item_sub_data_texture_change; + +vector(item_sub_data_texture_change) + +typedef struct item_sub_data_item_change { + item_id id; + vector_uint32_t item_ids; +} item_sub_data_item_change; + +vector(item_sub_data_item_change) + +typedef struct struc_294 { + int32_t key; + int32_t value; +} struc_294; + +vector(struc_294) + +typedef struct pair_int32_t_object_info { + int32_t key; + object_info value; +} pair_int32_t_object_info; + +vector(pair_int32_t_object_info) + +typedef struct rob_chara_item_sub_data { + chara_index chara_index; + chara_index chara_index_2nd; + item_sub_data item; + item_sub_data item_2nd; + vector_item_sub_data_texture_change texture_change; + vector_item_sub_data_item_change item_change; + vector_pair_object_info_item_id field_F0; + vector_struc_294 field_100; + vector_texture_pattern_struct texture_pattern[31]; + vector_pair_int32_t_object_info field_3F8; +} rob_chara_item_sub_data; + +typedef struct struc_264 { + int8_t field_0; + int32_t field_4; + int32_t field_8; + int32_t field_C; + int32_t field_10; + int8_t field_14; + int32_t field_18; + int32_t field_1C; + int32_t field_20; + int32_t field_24; + int8_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_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; + int32_t field_68; + int32_t field_6C; + int32_t field_70; + float_t field_74; + int16_t field_78; + int32_t field_7C; + int32_t field_80; + int32_t field_84; + int32_t field_88; + int32_t field_8C; + int32_t field_90; + int32_t field_94; + int8_t field_98; + int32_t field_9C; + int32_t field_A0; + int8_t field_A4; + int8_t field_A5; + 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_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; + int32_t field_140; + int8_t field_144; + int8_t field_145; + int8_t field_146; + int8_t field_147; + int32_t field_148; + int32_t field_14C; + int8_t field_150; + int16_t field_152; + int32_t field_154; + int32_t field_158; + int32_t field_15C; + int32_t field_160; + int32_t field_164; + int32_t field_168; + int32_t field_16C; + int32_t field_170; + int32_t field_174; + int32_t field_178; + int32_t field_17C; + int8_t field_180; + int32_t field_184; + int32_t field_188; + float_t field_18C; + int8_t field_190; + int32_t field_194; + int32_t field_198; + int32_t field_19C; + int32_t field_1A0; + uint8_t field_1A4; + char** field_1A8; + int32_t field_1B0; + int32_t field_1B4; + int32_t field_1B8; + int32_t field_1BC; + int32_t field_1C0; + int32_t field_1C4; + 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; +}; + +typedef struct rob_sub_action_execute_cry { + rob_sub_action_execute base; +} rob_sub_action_execute_cry; + +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; + +typedef struct rob_sub_action_execute_embarrassed { + rob_sub_action_execute base; + int8_t field_10; +} rob_sub_action_execute_embarrassed; + +typedef struct rob_sub_action_execute_angry { + rob_sub_action_execute base; +} rob_sub_action_execute_angry; + +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; + 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; + +typedef struct rob_sub_action_param_count_num { + rob_sub_action_param base; + int32_t field_10; +} rob_sub_action_param_count_num; + +typedef struct rob_sub_action_param_laugh { + rob_sub_action_param base; +} rob_sub_action_param_laugh; + +typedef struct rob_sub_action_param_angry { + rob_sub_action_param base; +} rob_sub_action_param_angry; + +typedef struct rob_sub_action_param_embarrassed { + rob_sub_action_param base; +} rob_sub_action_param_embarrassed; + +typedef struct rob_sub_action_param_shake_hand { + rob_sub_action_param base; + 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; + +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; + +typedef struct rob_sub_action { + rob_sub_action_data data; +} rob_sub_action; + +typedef struct struc_389 { + float_t frame; + float_t prev_frame; + float_t last_frame; +} struc_389; + +typedef struct struc_406 { + float_t frame; + float_t field_4; + float_t field_8; +} struc_406; + +typedef struct rob_partial_motion rob_partial_motion; + +typedef struct rob_partial_motion_vtbl { + void(*dispose)(rob_partial_motion*); + void(*field_8)(rob_partial_motion*); +} rob_partial_motion_vtbl; + +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; +}; + +typedef struct rob_face_motion { + rob_partial_motion base; +} rob_face_motion; + +typedef struct rob_hand_motion { + rob_partial_motion base; +} rob_hand_motion; + +typedef struct rob_mouth_motion { + rob_partial_motion base; +} rob_mouth_motion; + +typedef struct rob_eyes_motion { + rob_partial_motion base; +} rob_eyes_motion; + +typedef struct rob_eyelid_motion { + rob_partial_motion base; +} rob_eyelid_motion; + +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; + int32_t field_1C0; +} struc_405; + +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; + +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; + vec3 field_30; + int32_t field_3C; + int32_t field_40; +} struc_229; + +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; +} struc_222; + +typedef struct struc_268 { + int32_t motion_id; + int32_t prev_motion_id; + struc_389 field_8; + struc_406 field_14; + float_t step; + int32_t field_24; + int8_t field_28; + int8_t field_29; + 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; + float_t field_138; + float_t field_13C; + int32_t field_140; + int32_t field_144; + int32_t field_148; + 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; + 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]; + struc_222 field_12C8[2]; +} struc_268; + +typedef struct struc_228 { + int32_t field_0; + int32_t field_4; + uint32_t field_8; + int32_t field_C; +} struc_228; + +typedef struct struc_227 { + int32_t field_0; + float_t field_4; + float_t field_8; +} struc_227; + +typedef struct struc_377 { + void/*mothead_data*/* field_0; + void/*mothead_data*/* field_8; +} struc_377; + +typedef struct struc_226 { + int8_t field_0[27]; +} struc_226; + +typedef struct struc_225 { + float field_0[27]; +} struc_225; + +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 field_8; + int16_t field_C; + int16_t field_E; + vec3 field_10; + vec3 field_1C; + vec3 field_28; + int32_t field_34; + int32_t field_38; + int32_t field_3C; + int32_t field_40; + int32_t field_44; + int32_t field_48; +} struc_306; + +typedef struct struc_223 { + int32_t field_0; + float_t frame_count; + float_t field_8; + int16_t field_C; + struc_228 field_10; + struc_228 field_20; + struc_228 field_30; + struc_228 field_40; + int16_t field_50; + int16_t field_52; + int16_t field_54; + int32_t field_58; + int32_t field_5C; + int32_t field_60; + int32_t field_64; + int32_t field_68; + int32_t field_6C; + float_t field_70; + float_t field_74; + float_t field_78; + float_t field_7C; + float_t field_80; + int8_t field_84; + int32_t field_88; + int32_t field_8C; + int32_t field_90; + int16_t field_94; + int16_t field_96; + int16_t field_98; + int32_t field_9C; + int16_t field_A0; + int32_t field_A4; + int64_t field_A8; + struc_227 field_B0[26]; + int32_t field_1E8; + float_t field_1EC; + float_t field_1F0; + float_t field_1F4; + float_t field_1F8; + float_t field_1FC; + float_t field_200; + int32_t field_204; + int32_t field_208; + int32_t field_20C; + int64_t field_210; + float_t field_218; + float_t field_21C; + int16_t field_220; + vector_ptr_void field_228; + int16_t field_238; + int32_t field_23C; + int32_t field_240; + int16_t field_244; + int64_t field_248; + int64_t field_250; + float_t field_258; + int32_t field_25C; + int64_t field_260; + int64_t field_268; + int32_t field_270; + int16_t field_274; + int16_t field_276; + int32_t field_278; + int32_t field_27C; + int32_t field_280; + int16_t field_284; + int64_t field_288; + int32_t field_290; + int32_t field_294; + int32_t field_298; + float_t field_29C; + int8_t field_2A0; + float_t field_2A4; + float_t field_2A8; + float_t field_2AC; + int64_t field_2B0; + int16_t field_2B8; + int32_t field_2BC; + float_t field_2C0; + float_t field_2C4; + int32_t field_2C8; + int32_t field_2CC; + int64_t field_2D0; + int64_t field_2D8; + int64_t field_2E0; + int16_t field_2E8; + int32_t field_2EC; + int32_t field_2F0; + int32_t field_2F4; + int32_t field_2F8; + int32_t field_2FC; + int8_t field_300; + int32_t field_304; + int32_t field_308; + float_t field_30C; + int32_t field_310; + int16_t field_314; + float_t field_318; + float_t field_31C; + float_t field_320; + float_t field_324; + float_t field_328; + int32_t field_32C; + struc_377 field_330; + int32_t field_340; + int32_t field_344; + int32_t field_348; + float_t field_34C; + vec3 field_350; + struc_226 field_35C[3]; + struc_225 field_3B0[3]; + struc_224 field_4F4[3]; + int64_t field_638; + float_t field_640; + float_t field_644; + int8_t field_648; + int32_t field_64C; + float_t field_650; + float_t field_654; + float_t field_658; + int32_t field_65C; + float_t field_660; + float_t field_664; + int8_t field_668; + struc_306 field_66C[4]; + int64_t* field_7A0; + int32_t field_7A8; +} struc_223; + +typedef struct struc_399 { + int16_t field_0; + int16_t field_2; + int16_t field_4; + int16_t field_6; + int32_t field_8; + int32_t field_C; + float_t field_10; + int32_t field_14; + vec3 field_18; + vec3 field_24; + float_t field_30; + float_t field_34; + float_t field_38; + vec3 field_3C; + vec3 field_48; + vec3 field_54; + int32_t field_60; + int32_t field_64; + int32_t field_68; + mat4u field_6C; +} struc_399; + +typedef struct struc_220 { + float_t size; + bool height_adjust; + float_t field_8; + vec3 pos_adjust; + float_t field_18; + float_t field_1C; + float_t field_20; + int8_t field_24; + int8_t field_25; + int8_t field_26; + int8_t field_27; + vec3 trans; + mat4u mat; + vec4u field_74; +} struc_220; + +typedef struct struc_195 { + vec3 rotation; + vec3 trans; + float_t scale; + float_t field_1C; + float_t field_20; + float_t field_24; +} struc_195; + +typedef struct struc_210 { + vec2 field_0; + float_t scale; +} struc_210; + +typedef struct struc_215 { + int64_t field_0; + float_t field_8; +} struc_215; + +vector(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 { + int16_t field_0; + int32_t field_4; + int32_t field_8; + int32_t field_C; + int32_t field_10; + int32_t field_14; + int32_t field_18; + int32_t field_1C; + int32_t field_20; + int32_t field_24; + int32_t field_28; + int32_t field_2C; + int32_t field_30; + int32_t field_34; + int32_t field_38; + int32_t field_3C; + int32_t field_40; + int32_t field_44; + int32_t field_48; + int32_t field_4C; + int32_t field_50; + int32_t field_54; + int32_t field_58; + int32_t field_5C; + int32_t field_60; + float_t field_64; + int32_t field_68; + int32_t field_6C; + int32_t field_70; + int32_t field_74; + mat4u field_78[27]; + mat4u field_738[27]; + struc_195 field_DF8[27]; + struc_195 field_1230[27]; + struc_195 field_1668[27]; + struc_210 field_1AA0[27]; + float field_1BE4[27]; + vector_struc_215 field_1C50; + int64_t field_1C68; + int64_t field_1C70; + int32_t field_1C78[4]; + int32_t field_1C88[27]; + int32_t field_1CF4[27]; + int32_t field_1D60[27]; + int32_t field_1DCC; + int32_t field_1DD0; + int32_t field_1DD4; + int32_t field_1DD8; + int32_t field_1DDC; + float_t field_1DE0; + float_t field_1DE4; + int32_t field_1DE8; + int32_t field_1DEC; + float_t field_1DF0; + float_t field_1DF4; + int32_t field_1DF8; + int32_t field_1DFC; + int32_t field_1E00; + int32_t field_1E04; + int32_t field_1E08; + int32_t field_1E0C; + int32_t field_1E10; + int32_t field_1E14; + int32_t field_1E18; + int32_t field_1E1C; + int32_t field_1E20; + int32_t field_1E24; + int32_t field_1E28; + int32_t field_1E2C; + int32_t field_1E30; + int32_t field_1E34; + int32_t field_1E38; + int32_t field_1E3C; + int32_t field_1E40; + int32_t field_1E44; + int32_t field_1E48; + int32_t field_1E4C; + int32_t field_1E50; + int32_t field_1E54; + int32_t field_1E58; + int32_t field_1E5C; + int32_t field_1E60; + int32_t field_1E64; + int32_t field_1E68; + int32_t field_1E6C; + int32_t field_1E70; + int32_t field_1E74; + int32_t field_1E78; + int32_t field_1E7C; + int32_t field_1E80; + int32_t field_1E84; + int32_t field_1E88; + int32_t field_1E8C; + int32_t field_1E90; + int32_t field_1E94; + int32_t field_1E98; + int32_t field_1E9C; + int32_t field_1EA0; + int32_t field_1EA4; + int32_t field_1EA8; + 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; + int8_t field_1F04; + int32_t field_1F08; + int32_t field_1F0C; + int32_t field_1F10; + int32_t field_1F14; + int32_t field_1F18; + int32_t field_1F1C; + int8_t field_1F20; + int8_t field_1F21; + int8_t field_1F22; + int8_t field_1F23; + int8_t field_1F24; + int8_t field_1F25; + int8_t field_1F26; +} struc_209; + typedef struct rob_chara_data { + bool 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; + struc_223 field_1588; + struc_399 field_1D38; + struc_220 field_1DE4; + struc_209 field_1E68; + float_t field_3D90; + int32_t field_3D94; + int16_t field_3D98; + int16_t field_3D9A; + uint8_t field_3D9C; + uint8_t field_3D9D; + int32_t field_3DA0; + uint8_t field_3DA4; + int64_t field_3DA8; + int64_t field_3DB0; + int32_t field_3DB8; + int32_t field_3DBC; + int32_t field_3DC0; + int32_t field_3DC4; + int32_t field_3DC8; + int32_t field_3DCC; + int32_t field_3DD0; + float_t field_3DD4; + int32_t field_3DD8; + float_t field_3DDC; + uint8_t field_3DE0; +} rob_chara_data; + +struct rob_chara { int8_t chara_id; chara_index chara_index; int32_t module_index; - rob_chara_data_bone_data* bone_data; - rob_chara_data_item_equip* item_equip; + rob_chara_bone_data* bone_data; + rob_chara_item_equip* item_equip; + rob_chara_item_sub_data item_sub_data; + rob_chara_data data; + rob_chara_data data_prev; chara_init_data* chara_init_data; rob_chara_pv_data pv_data; -} rob_chara_data; +}; typedef struct skeleton_rotation_offset { bool x; @@ -1064,33 +2021,35 @@ typedef struct skeleton_rotation_offset { vec3 rotation; } skeleton_rotation_offset; -extern rob_chara_data rob_chara_data_array[]; +extern rob_chara rob_chara_array[]; extern chara_init_data* chara_init_data_get(chara_index chara_index); extern void motion_set_load_motion(uint32_t set, string* motion_name, motion_database* mot_db); extern void motion_set_unload(uint32_t set); -extern void rob_chara_data_init(rob_chara_data* rob_chr_data); -extern void rob_chara_data_calc(rob_chara_data* rob_chr_data); -extern void rob_chara_data_draw(rob_chara_data* rob_chr_data, render_context* rctx); -extern mat4* rob_chara_data_get_bone_data_mat(rob_chara_data* chara, size_t index); -extern float_t rob_chara_data_get_frame(rob_chara_data* rob_chr_data); -extern float_t rob_chara_data_get_frame_count(rob_chara_data* rob_chr_data); -extern void rob_chara_data_load_motion(rob_chara_data* rob_chr_data, int32_t motion_id, +extern void rob_chara_init(rob_chara* rob_chr); +extern void rob_chara_calc(rob_chara* rob_chr); +extern void rob_chara_draw(rob_chara* rob_chr, render_context* rctx); +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_data_reload_items(rob_chara_data* rob_chr_data, - item_sub_data* sub_data, bone_database* bone_data); -extern void rob_chara_data_reset(rob_chara_data* a1, rob_chara_pv_data* pv_data, +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_data_set(rob_chara_data* rob_chr_data, int8_t chara_id, +extern void rob_chara_set(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_data_set_frame(rob_chara_data* rob_chr_data, float_t frame); -extern void rob_chara_data_free(rob_chara_data* rob_chr_data); +extern void rob_chara_set_frame(rob_chara* rob_chr, float_t frame); +extern void rob_chara_free(rob_chara* rob_chr); -extern void rob_chara_data_array_init(); -extern rob_chara_data* rob_chara_data_array_get(int32_t chara_id); -extern void rob_chara_data_array_free(); +extern void rob_chara_array_init(); +extern rob_chara* rob_chara_array_get(int32_t chara_id); +extern void rob_chara_array_free(); extern void rob_chara_pv_data_init(rob_chara_pv_data* pv_data); diff --git a/src/CRE/shader.c b/src/CRE/shader.c index 08bf8288..601b08f1 100644 --- a/src/CRE/shader.c +++ b/src/CRE/shader.c @@ -33,7 +33,7 @@ vector_func(program_binary) int32_t shader_bind(shader* shader, uint32_t sub_index) { int32_t num_sub = shader->num_sub; int32_t sub_shader_index = 0; - if (num_sub <= 0) + if (num_sub < 1) return -1; for (shader_sub* i = shader->sub; i->sub_index != sub_index; i++) { @@ -190,8 +190,8 @@ void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load continue; } - uint64_t vert_file_name_cache = hash_fnv1a64m(vert_file_buf, utf8_length(vert_file_buf)); - uint64_t frag_file_name_cache = hash_fnv1a64m(frag_file_buf, utf8_length(frag_file_buf)); + uint64_t vert_file_name_cache = hash_fnv1a64m(vert_file_buf, utf8_length(vert_file_buf), false); + uint64_t frag_file_name_cache = hash_fnv1a64m(frag_file_buf, utf8_length(frag_file_buf), false); for (int32_t i = 0; i < 64; i += 8) if (((vert_file_name_cache >> i) & 0xFF) == 0) vert_file_name_cache |= 0xFFULL << i; @@ -210,8 +210,8 @@ void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load vert_data = shader_parse_include(vert_data, f); frag_data = shader_parse_include(frag_data, f); - uint64_t vert_data_hash = hash_fnv1a64m(vert_data, utf8_length(vert_data)); - uint64_t frag_data_hash = hash_fnv1a64m(frag_data, utf8_length(frag_data)); + uint64_t vert_data_hash = hash_fnv1a64m(vert_data, utf8_length(vert_data), false); + uint64_t frag_data_hash = hash_fnv1a64m(frag_data, utf8_length(frag_data), false); farc_file* shader_cache_file = farc_read_file(&shader_cache_farc, shader_cache_file_name); program_binary* bin = 0; @@ -363,7 +363,7 @@ void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load else free(shader_cache_file->data); - size_t bin_count = program_data_binary.end - program_data_binary.begin; + size_t bin_count = vector_length(program_data_binary); size_t bin_size = sizeof(uint64_t) * 2 + bin_count * sizeof(program_binary); for (program_binary* j = program_data_binary.begin; j != program_data_binary.end; j++) bin_size += j->length; diff --git a/src/CRE/shader_glsl.c b/src/CRE/shader_glsl.c index c23dbc18..87011fc2 100644 --- a/src/CRE/shader_glsl.c +++ b/src/CRE/shader_glsl.c @@ -122,7 +122,7 @@ static GLuint shader_compile(GLenum type, const char* data) { static GLint shader_get_uniform_location(GLint program, GLchar* name, vector_uint64_t* uniform_name_buf, vector_int32_t* uniform_location_buf) { - uint64_t hash = hash_utf8_fnv1a64m(name); + uint64_t hash = hash_utf8_fnv1a64m(name, false); for (uint64_t* i = uniform_name_buf->begin; i != uniform_name_buf->end; i++) if (*i == hash) return uniform_location_buf->begin[i - uniform_name_buf->begin]; @@ -143,7 +143,7 @@ static GLint shader_get_uniform_location(GLint program, GLchar* name, static GLint shader_get_uniform_block_index(GLint program, GLchar* name, vector_uint64_t* uniform_block_name_buf, vector_int32_t* uniform_block_index_buf) { - uint64_t hash = hash_utf8_fnv1a64m(name); + uint64_t hash = hash_utf8_fnv1a64m(name, false); for (uint64_t* i = uniform_block_name_buf->begin; i != uniform_block_name_buf->end; i++) if (*i == hash) return uniform_block_index_buf->begin[i - uniform_block_name_buf->begin]; diff --git a/src/CRE/stage.c b/src/CRE/stage.c index ce80f67b..41c3e7b5 100644 --- a/src/CRE/stage.c +++ b/src/CRE/stage.c @@ -88,10 +88,10 @@ void stage_load(stage* s, data_struct* data, auth_3d_database* auth_3d_db, objec farc f; farc_init(&f); - data_struct_load_file(data, &f, "rom\\auth_3d\\", string_data(&auth_3d_farc), farc_load_file); + data_struct_load_file(data, &f, "rom/auth_3d/", string_data(&auth_3d_farc), farc_load_file); string_free(&auth_3d_farc); - if (!(f.files.end - f.files.begin)) { + if (vector_length(f.files) < 1) { farc_free(&f); continue; } diff --git a/src/CRE/texture.c b/src/CRE/texture.c index 89e51100..d070dd36 100644 --- a/src/CRE/texture.c +++ b/src/CRE/texture.c @@ -72,7 +72,7 @@ bool texture_txp_set_load(txp_set* t, texture*** texs, uint32_t* ids) { if (!t || !texs || !ids) return false; - size_t count = t->end - t->begin; + size_t count = vector_length(*t); *texs = force_malloc_s(texture*, count + 1); texture** tex = *texs; for (size_t i = 0; i < count; i++) @@ -106,6 +106,16 @@ inline texture* texture_storage_get_texture(uint32_t id) { return 0; } +inline size_t texture_storage_get_texture_count() { + return vector_length(texture_storage_data); +} + +inline texture* texture_storage_get_texture_by_index(ssize_t index) { + if (index >= 0 && index < vector_length(texture_storage_data)) + return texture_storage_data.begin[index]; + return 0; +} + inline void texture_storage_delete_texture(uint32_t id) { for (texture** i = texture_storage_data.begin; i != texture_storage_data.end; i++) if (*i && (*i)->id == id) { diff --git a/src/CRE/texture.h b/src/CRE/texture.h index d54045d2..3f83ebde 100644 --- a/src/CRE/texture.h +++ b/src/CRE/texture.h @@ -30,7 +30,9 @@ typedef struct texture { vector(texture) vector_ptr(texture) -#define texture_make_id(id, index) ((uint32_t)((id << 24) | (index & 0xFFFFFF))) +#define texture_make_id(id, index) ((uint32_t)(((id) << 24) | ((index) & 0xFFFFFF))) +#define texture_get_id(id) (((id) >> 24) & 0xFF) +#define texture_get_index(id) ((id) & 0xFFFFFF) extern texture* texture_init(uint32_t id); extern texture* texture_load_tex_2d(uint32_t id, GLenum internal_format, int32_t width, int32_t height, @@ -45,5 +47,7 @@ extern bool texture_txp_set_load(txp_set* t, texture*** texs, uint32_t* ids); extern void texture_storage_init(); extern texture* texture_storage_create_texture(uint32_t id); extern texture* texture_storage_get_texture(uint32_t id); +extern size_t texture_storage_get_texture_count(); +extern texture* texture_storage_get_texture_by_index(ssize_t index); extern void texture_storage_delete_texture(uint32_t id); extern void texture_storage_free(); diff --git a/src/DivaGL/bone_data.c b/src/DivaGL/bone_data.c index 55404b69..f5d6c1bd 100644 --- a/src/DivaGL/bone_data.c +++ b/src/DivaGL/bone_data.c @@ -33,10 +33,20 @@ typedef struct struc_404 { int32_t field_4; } struc_404; +ex_node_block_vtbl* ex_osage_block_vftable = (void*)0x0000000140A82F88; +ex_node_block_vtbl* ex_node_block_vftable = (void*)0x0000000140A82DC8; + +static const aft_object_info aft_object_info_null = { -1, -1 }; + static aft_bone_database_struct** bone_database_ptr = (void*)0x00000000140FBC1C0; static struc_403** rob_cmn_mottbl_data_ptr = (void*)0x00000001411E8258; static void* (*HeapCMallocAllocate)(HeapCMallocType type, size_t size, char* name) = (void*)0x00000001403F2A00; static void(*HeapCMallocFree)(HeapCMallocType type, void* data) = (void*)0x00000001403F2960; +static void(*j_free_2)(void*) = (void*)0x0000000140845378; + +static const float_t get_osage_gravity_const() { + return 0.00299444468691945f; +} 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, @@ -48,19 +58,19 @@ static void bone_node_expression_data_set_position_rotation(bone_node_expression data->rotation.z = rotation_z; data->rotation.y = rotation_y; data->scale = vec3_identity; - data->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->data_scale = vec3_identity; + data->parent_scale = vec3_identity; } static void bone_node_data_reset_position_rotation(bone_node_expression_data* data) { data->position = vec3_null; data->rotation = vec3_null; data->scale = vec3_identity; - data->data_scale = vec3_identity; + data->parent_scale = vec3_identity; } static bone_data* bone_data_init(bone_data* bone) { @@ -185,7 +195,7 @@ static float_t aft_bone_database_get_skeleton_heel_height(aft_bone_database_skel return 0.0f; } -static void rob_chara_data_bone_data_reserve(rob_chara_data_bone_data* rob_bone_data) { +static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data) { if (rob_bone_data->mats.begin) HeapCMallocFree(HeapCMallocSystem, rob_bone_data->mats.begin); @@ -226,19 +236,19 @@ static void rob_chara_data_bone_data_reserve(rob_chara_data_bone_data* rob_bone_ i->exp_data.position = vec3_null; i->exp_data.rotation = vec3_null; i->exp_data.scale = vec3_identity; - i->exp_data.data_scale = vec3_identity; + i->exp_data.parent_scale = vec3_identity; i->ex_data_mat = 0; } } -static void rob_chara_data_bone_data_calculate_bones(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, aft_bone_database_bone* bones) { aft_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); } -static void rob_chara_data_bone_data_set_mats(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, aft_bone_database_bone* a2) { size_t chain_pos = 0; size_t ik_bone_count = 0; @@ -301,9 +311,9 @@ static void rob_chara_data_bone_data_set_mats(rob_chara_data_bone_data* rob_bone printf("ChainPos mismatch\n"); } -static void rob_chara_data_bone_data_set_parent_mats(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, uint16_t* parent_indices) { - if (rob_bone_data->nodes.end - rob_bone_data->nodes.begin < 1) + if (vector_length(rob_bone_data->nodes) < 1) return; parent_indices++; @@ -311,8 +321,8 @@ static void rob_chara_data_bone_data_set_parent_mats(rob_chara_data_bone_data* r i->parent = &rob_bone_data->nodes.begin[*parent_indices++]; } -static void bone_data_parent_load_rob_chara_data(bone_data_parent* a1) { - rob_chara_data_bone_data* rob_bone_data = a1->rob_bone_data; +static void bone_data_parent_load_rob_chara(bone_data_parent* a1) { + rob_chara_bone_data* rob_bone_data = a1->rob_bone_data; if (!rob_bone_data) return; @@ -339,7 +349,7 @@ static void bone_data_parent_load_rob_chara_data(bone_data_parent* a1) { static void bone_data_parent_load_bone_database(bone_data_parent* bone, aft_bone_database_bone* bones, vec3* common_translation, vec3* translation) { - rob_chara_data_bone_data* rob_bone_data = bone->rob_bone_data; + 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; @@ -414,12 +424,12 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, } static void bone_data_parent_data_init(bone_data_parent* bone, - rob_chara_data_bone_data* rob_bone_data) { + rob_chara_bone_data* rob_bone_data) { bone->rob_bone_data = rob_bone_data; aft_bone_database_bone* common_bone_data = aft_bone_database_get_bones_by_type(rob_bone_data->base_skeleton_type); vec3* common_translation = aft_bone_database_get_skeleton_positions_by_type(rob_bone_data->base_skeleton_type); vec3* translation = aft_bone_database_get_skeleton_positions_by_type(rob_bone_data->skeleton_type); - bone_data_parent_load_rob_chara_data(bone); + bone_data_parent_load_rob_chara(bone); bone_data_parent_load_bone_database(bone, common_bone_data, common_translation, translation); } @@ -617,7 +627,7 @@ static void sub_14040E690(struc_313* a1, uint32_t** a2, uint32_t* a3, size_t a4, sub_14040BD00(&v14[v15], a4, a5); sub_14040BDB0(a1->bitfield.begin, a3, v14); sub_14040BDB0(a3, a1->bitfield.end, &v14[v15 + a4]); - size_t v16 = a1->bitfield.end - a1->bitfield.begin + a4; + size_t v16 = vector_length(a1->bitfield) + a4; if (a1->bitfield.begin) HeapCMallocFree(HeapCMallocSystem, a1->bitfield.begin); a1->bitfield.capacity_end = &v14[v12]; @@ -785,7 +795,7 @@ static void sub_140413350(struc_240* a1, bool(*bone_check_func)(motion_bone_inde sub_1404146F0(a1); } -static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, rob_chara_data_bone_data* rob_bone_data, +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( @@ -807,12 +817,12 @@ static void sub_140414900(struc_308* a1, mat4* mat) { } } -static void sub_1401EA670(bone_data* a1, vec3* a2) { +static void bone_data_mult_1_ik_hands(bone_data* a1, vec3* a2) { mat4 mat; mat4_transpose(a1->node[0].mat, &mat); vec3 v15; - mat4_mult_vec3_inv(&mat, a2, &v15); + mat4_mult_vec3_inv_trans(&mat, a2, &v15); float_t len; vec3_length_squared(v15, len); @@ -847,13 +857,13 @@ static void sub_1401EA670(bone_data* a1, vec3* a2) { mat4_transpose(&mat, a1->node[0].mat); } -static void sub_1401EAC20(bone_data* a1, vec3* a2, float_t a3) { +static void bone_data_mult_1_ik_hands_2(bone_data* a1, vec3* a2, float_t a3) { float_t len; vec3 v8; mat4 mat; mat4_transpose(a1->node[0].mat, &mat); - mat4_mult_vec3_inv(&mat, a2, &v8); + mat4_mult_vec3_inv_trans(&mat, a2, &v8); v8.x = 0.0f; vec3_length(v8, len); if (len <= 0.000001f) @@ -865,7 +875,7 @@ static void sub_1401EAC20(bone_data* a1, vec3* a2, float_t a3) { mat4_transpose(&mat, a1->node[0].mat); } -static void sub_1401EA970(bone_data* a1, vec3* a2) { +static void bone_data_mult_1_ik_legs(bone_data* a1, vec3* a2) { vec3 v9 = *a2; float_t len; @@ -904,7 +914,7 @@ static void sub_1401EA970(bone_data* a1, vec3* a2) { mat4_transpose(&mat, a1->node[0].mat); } -static bool sub_1401E9D60(bone_data* a1, bone_data* a2) { +static bool bone_data_mult_1_ik(bone_data* a1, bone_data* a2) { bone_node* v5; vec3 v30; mat4 mat; @@ -914,63 +924,63 @@ static bool sub_1401E9D60(bone_data* a1, bone_data* a2) { v5 = a2[MOTION_BONE_C_KATA_L].node; mat4_transpose(v5[2].mat, &mat); mat4_get_translation(&mat, &v30); - sub_1401EA670(a1, &v30); + bone_data_mult_1_ik_hands(a1, &v30); break; case MOTION_BONE_N_SKATA_R_WJ_CD_EX: v5 = a2[MOTION_BONE_C_KATA_R].node; mat4_transpose(v5[2].mat, &mat); mat4_get_translation(&mat, &v30); - sub_1401EA670(a1, &v30); + bone_data_mult_1_ik_hands(a1, &v30); break; case MOTION_BONE_N_SKATA_B_L_WJ_CD_CU_EX: v5 = a2[MOTION_BONE_N_UP_KATA_L_EX].node; mat4_transpose(v5[0].mat, &mat); mat4_get_translation(&mat, &v30); - sub_1401EAC20(a1, &v30, 0.333f); + bone_data_mult_1_ik_hands_2(a1, &v30, 0.333f); break; case MOTION_BONE_N_SKATA_B_R_WJ_CD_CU_EX: v5 = a2[MOTION_BONE_N_UP_KATA_R_EX].node; mat4_transpose(v5[0].mat, &mat); mat4_get_translation(&mat, &v30); - sub_1401EAC20(a1, &v30, 0.333f); + bone_data_mult_1_ik_hands_2(a1, &v30, 0.333f); break; case MOTION_BONE_N_SKATA_C_L_WJ_CD_CU_EX: v5 = a2[MOTION_BONE_N_UP_KATA_L_EX].node; mat4_transpose(v5[0].mat, &mat); mat4_get_translation(&mat, &v30); - sub_1401EAC20(a1, &v30, 0.5f); + bone_data_mult_1_ik_hands_2(a1, &v30, 0.5f); break; case MOTION_BONE_N_SKATA_C_R_WJ_CD_CU_EX: v5 = a2[MOTION_BONE_N_UP_KATA_R_EX].node; mat4_transpose(v5[0].mat, &mat); mat4_get_translation(&mat, &v30); - sub_1401EAC20(a1, &v30, 0.5f); + bone_data_mult_1_ik_hands_2(a1, &v30, 0.5f); break; case MOTION_BONE_N_MOMO_A_L_WJ_CD_EX: v5 = a2[MOTION_BONE_CL_MOMO_L].node; mat4_transpose(v5[2].mat, &mat); mat4_get_translation(&mat, &v30); mat4_transpose(a1->node[0].mat, &mat); - mat4_mult_vec3_inv(&mat, &v30, &v30); + mat4_mult_vec3_inv_trans(&mat, &v30, &v30); vec3_negate(v30, v30); - sub_1401EA970(a1, &v30); + bone_data_mult_1_ik_legs(a1, &v30); break; case MOTION_BONE_N_MOMO_A_R_WJ_CD_EX: v5 = a2[MOTION_BONE_CL_MOMO_R].node; mat4_transpose(v5[2].mat, &mat); mat4_get_translation(&mat, &v30); mat4_transpose(a1->node[0].mat, &mat); - mat4_mult_vec3_inv(&mat, &v30, &v30); + mat4_mult_vec3_inv_trans(&mat, &v30, &v30); vec3_negate(v30, v30); - sub_1401EA970(a1, &v30); + bone_data_mult_1_ik_legs(a1, &v30); break; case MOTION_BONE_N_HARA_CD_EX: v5 = a2[MOTION_BONE_KL_MUNE_B_WJ].node; mat4_transpose(v5[0].mat, &mat); mat4_get_translation(&mat, &v30); mat4_transpose(a1->node[0].mat, &mat); - mat4_mult_vec3_inv(&mat, &v30, &v30); - sub_1401EA970(a1, &v30); + mat4_mult_vec3_inv_trans(&mat, &v30, &v30); + bone_data_mult_1_ik_legs(a1, &v30); break; default: return false; @@ -994,7 +1004,7 @@ static float_t sub_1401E9D10(float_t a1) { return a1; } -static bool sub_1401EA070(bone_data* a1, bone_node_expression_data* a2, bone_data* a3) { +static bool bone_data_mult_1_exp_data(bone_data* a1, bone_node_expression_data* exp_data, bone_data* a3) { float_t v10; bone_node* v11; vec3 v15; @@ -1004,12 +1014,12 @@ static bool sub_1401EA070(bone_data* a1, bone_node_expression_data* a2, bone_dat bool ret = true; switch (a1->motion_bone_index) { case MOTION_BONE_N_EYE_L_WJ_EX: - a2->rotation.x = -a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.x; - a2->rotation.y = a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); + exp_data->rotation.x = -a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.x; + exp_data->rotation.y = a3[MOTION_BONE_KL_EYE_L].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); break; case MOTION_BONE_N_EYE_R_WJ_EX: - a2->rotation.x = -a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.x; - a2->rotation.y = a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); + exp_data->rotation.x = -a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.x; + exp_data->rotation.y = a3[MOTION_BONE_KL_EYE_R].node[0].exp_data.rotation.y * (float_t)(-1.0 / 2.0); break; case MOTION_BONE_N_KUBI_WJ_EX: mat4u_to_mat4_transpose(&a3[MOTION_BONE_CL_KAO].rot_mat[0], &dst); @@ -1019,87 +1029,87 @@ static bool sub_1401EA070(bone_data* a1, bone_node_expression_data* a2, bone_dat v10 = v15.z; if (v10 < (float_t)-M_PI_2) v10 += (float_t)(M_PI * 2.0); - a2->rotation.y = (v10 - (float_t)M_PI_2) * 0.2f; + exp_data->rotation.y = (v10 - (float_t)M_PI_2) * 0.2f; break; case MOTION_BONE_N_HITO_L_EX: case MOTION_BONE_N_HITO_R_EX: - a2->rotation.z = (float_t)(-9.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-9.0 * DEG_TO_RAD); break; case MOTION_BONE_N_KO_L_EX: - a2->rotation.x = (float_t)(-8.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(16.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(-8.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(16.0 * DEG_TO_RAD); break; case MOTION_BONE_N_KUSU_L_EX: case MOTION_BONE_N_KUSU_R_EX: - a2->rotation.z = (float_t)(9.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(9.0 * DEG_TO_RAD); break; case MOTION_BONE_N_NAKA_L_EX: case MOTION_BONE_N_NAKA_R_EX: - a2->rotation.z = (float_t)(-1.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-1.0 * DEG_TO_RAD); break; case MOTION_BONE_N_OYA_L_EX: - a2->rotation.x = (float_t)(75.0 * DEG_TO_RAD); - a2->rotation.y = (float_t)(12.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(75.0 * DEG_TO_RAD); + exp_data->rotation.y = (float_t)(12.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); break; case MOTION_BONE_N_STE_L_WJ_EX: - a2->rotation.x = a3[MOTION_BONE_KL_TE_L_WJ].node[0].exp_data.rotation.x; + exp_data->rotation.x = a3[MOTION_BONE_KL_TE_L_WJ].node[0].exp_data.rotation.x; break; case MOTION_BONE_N_SUDE_L_WJ_EX: case MOTION_BONE_N_SUDE_B_L_WJ_EX: v11 = &a3[MOTION_BONE_KL_TE_L_WJ].node[0]; - a2->rotation.x = sub_1401E9D10(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); + exp_data->rotation.x = sub_1401E9D10(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_SUDE_R_WJ_EX: case MOTION_BONE_N_SUDE_B_R_WJ_EX: v11 = &a3[MOTION_BONE_KL_TE_R_WJ].node[0]; - a2->rotation.x = sub_1401E9D10(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); + exp_data->rotation.x = sub_1401E9D10(v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_HIJI_L_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_C_KATA_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_C_KATA_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_UP_KATA_L_EX: case MOTION_BONE_N_UP_KATA_R_EX: break; case MOTION_BONE_N_KO_R_EX: - a2->rotation.x = (float_t)(8.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(16.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(8.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(16.0 * DEG_TO_RAD); break; case MOTION_BONE_N_OYA_R_EX: - a2->rotation.x = (float_t)(-75.0 * DEG_TO_RAD); - a2->rotation.y = (float_t)(-12.0 * DEG_TO_RAD); - a2->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); + exp_data->rotation.x = (float_t)(-75.0 * DEG_TO_RAD); + exp_data->rotation.y = (float_t)(-12.0 * DEG_TO_RAD); + exp_data->rotation.z = (float_t)(-24.0 * DEG_TO_RAD); break; case MOTION_BONE_N_STE_R_WJ_EX: - a2->rotation.x = a3[MOTION_BONE_KL_TE_R_WJ].node[0].exp_data.rotation.x; + exp_data->rotation.x = a3[MOTION_BONE_KL_TE_R_WJ].node[0].exp_data.rotation.x; break; case MOTION_BONE_N_HIJI_R_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_C_KATA_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_C_KATA_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_HIZA_L_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_CL_MOMO_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_CL_MOMO_L].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_HIZA_R_WJ_EX: - a2->rotation.z = a3[MOTION_BONE_CL_MOMO_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); + exp_data->rotation.z = a3[MOTION_BONE_CL_MOMO_R].node[2].exp_data.rotation.z * (float_t)(1.0 / 2.0); break; case MOTION_BONE_N_MOMO_B_L_WJ_EX: case MOTION_BONE_N_MOMO_C_L_WJ_EX: v11 = &a3[MOTION_BONE_CL_MOMO_L].node[0]; - a2->rotation.y = sub_1401E9D10(v11->exp_data.rotation.y + exp_data->rotation.y = sub_1401E9D10(v11->exp_data.rotation.y + v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_MOMO_B_R_WJ_EX: case MOTION_BONE_N_MOMO_C_R_WJ_EX: v11 = &a3[MOTION_BONE_CL_MOMO_R].node[0]; - a2->rotation.y = sub_1401E9D10(v11->exp_data.rotation.y + exp_data->rotation.y = sub_1401E9D10(v11->exp_data.rotation.y + v11->exp_data.rotation.x) * (float_t)(1.0 / 3.0); break; case MOTION_BONE_N_HARA_B_WJ_EX: - a2->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(1.0 / 3.0) + exp_data->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(1.0 / 3.0) + a3[MOTION_BONE_KL_KOSI_Y].node[0].exp_data.rotation.y * (float_t)(2.0 / 3.0); break; case MOTION_BONE_N_HARA_C_WJ_EX: - a2->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(2.0 / 3.0) + exp_data->rotation.y = a3[MOTION_BONE_CL_MUNE].node[0].exp_data.rotation.y * (float_t)(2.0 / 3.0) + a3[MOTION_BONE_KL_KOSI_Y].node[0].exp_data.rotation.y * (float_t)(1.0 / 3.0); break; default: @@ -1117,7 +1127,7 @@ void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { mat4_transpose(a1->node[0].mat, &mat); vec3 v30; - mat4_mult_vec3_inv(&mat, &a1->ik_target, &v30); + mat4_mult_vec3_inv_trans(&mat, &a1->ik_target, &v30); float_t v6; float_t v8; vec2_length_squared(*(vec2*)&v30, v6); @@ -1138,7 +1148,7 @@ void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { mat4_transpose(a1->pole_target_mat, &pole_target_mat); vec3 pole_target; mat4_get_translation(&pole_target_mat, &pole_target); - mat4_mult_vec3_inv(&mat, &pole_target, &pole_target); + mat4_mult_vec3_inv_trans(&mat, &pole_target, &pole_target); float_t pole_target_length; vec2_length(*(vec2*)&pole_target.y, pole_target_length); if (pole_target_length > 0.000001f) { @@ -1164,7 +1174,7 @@ void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { float_t v23; float_t v24; float_t v25; - if (fabsf(v8) > 0.000001f) { + if (v8 > 0.000001f) { float_t v26 = a1->field_2E0; if (v26 > 0.0001f) { float_t v27 = (v21 + v20) * v26; @@ -1222,7 +1232,7 @@ static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select) { a1->rot_mat[0] = mat4u_identity; } else if (a1->type == AFT_BONE_DATABASE_BONE_TYPE_1) { - mat4_mult_vec3_inv(&mat, &a1->trans, &a1->trans); + mat4_mult_vec3_inv_trans(&mat, &a1->trans, &a1->trans); mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat); a1->rot_mat[0] = mat4u_identity; } @@ -1277,7 +1287,7 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) { mat4u_to_mat4_transpose(&a1->rot_mat[0], &rot_mat); mat4_get_rotation(&rot_mat, &a1->node[0].exp_data.rotation); } - else if (sub_1401EA070(a1, &a1->node[0].exp_data, a3)) { + else if (bone_data_mult_1_exp_data(a1, &a1->node[0].exp_data, a3)) { vec3 rotation = a1->node[0].exp_data.rotation; mat4_rotate(rotation.x, rotation.y, rotation.z, &rot_mat); mat4_to_mat4u_transpose(&rot_mat, &a1->rot_mat[0]); @@ -1285,7 +1295,7 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) { else { mat4_transpose(&mat, a1->node[0].mat); - if (sub_1401E9D60(a1, a3)) { + if (bone_data_mult_1_ik(a1, a3)) { mat4 dst; mat4_invrot_normalized(&mat, &rot_mat); mat4_transpose(a1->node[0].mat, &dst); @@ -1358,7 +1368,7 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) { } } -void bone_data_mult_2(rob_chara_data_bone_data* rob_bone_data, mat4* mat) { +void bone_data_mult_2(rob_chara_bone_data* rob_bone_data, mat4* mat) { for (bone_node* i = rob_bone_data->nodes.begin; i != rob_bone_data->nodes.end; i++) mat4_mult(i->mat, mat, i->mat); sub_140414900(&rob_bone_data->motion_loaded.head->next->value->field_4F8, mat); @@ -1490,7 +1500,7 @@ static void sub_140410CB0(mot_blend* a1, vector_bone_data* a2) { v1->__vftable->field_28(&a1->field_F8, &a2->begin[i->motion_bone_index], 0); } -static void sub_1404182B0(rob_chara_data_bone_data* rob_bone_data) { +static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { if (!rob_bone_data->motion_loaded.size) return; @@ -1532,7 +1542,7 @@ static void sub_1404182B0(rob_chara_data_bone_data* rob_bone_data) { } } -static void sub_14041B9F0(rob_chara_data_bone_data* rob_bone_data) { +static void sub_14041B9F0(rob_chara_bone_data* rob_bone_data) { list_ptr_motion_blend_mot_node* v1 = rob_bone_data->motion_loaded.head; list_ptr_motion_blend_mot_node* v3 = v1->next; while (v3 != v1) { @@ -1553,7 +1563,7 @@ static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* a2) { bone_data_mult_1(v4, &mat, v3, true); } -void rob_chara_data_bone_data_update(rob_chara_data_bone_data* rob_bone_data, mat4* a2) { +void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* a2) { if (!rob_bone_data->motion_loaded.size) return; @@ -1585,7 +1595,7 @@ static mot_blend* mot_blend_init(mot_blend* a1) { return a1; } -static void rob_chara_data_bone_data_eyes_xrot_adjust(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_data, struc_241* a2, eyes_adjust* a3) { float_t v1_neg; float_t v1_pos; @@ -1628,7 +1638,7 @@ static void rob_chara_data_bone_data_eyes_xrot_adjust(rob_chara_data_bone_data* } } -static void rob_chara_data_bone_data_init_skeleton(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, aft_bone_database_skeleton_type base_skeleton_type, aft_bone_database_skeleton_type skeleton_type) { if (rob_bone_data->base_skeleton_type == base_skeleton_type @@ -1636,11 +1646,11 @@ static void rob_chara_data_bone_data_init_skeleton(rob_chara_data_bone_data* rob return; aft_bone_database_bone* bones = aft_bone_database_get_bones_by_type(base_skeleton_type); - rob_chara_data_bone_data_calculate_bones(rob_bone_data, bones); - rob_chara_data_bone_data_reserve(rob_bone_data); - rob_chara_data_bone_data_set_mats(rob_bone_data, bones); + 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); uint16_t* parent_indices = aft_bone_database_get_skeleton_parent_indices_by_type(base_skeleton_type); - rob_chara_data_bone_data_set_parent_mats(rob_bone_data, parent_indices); + rob_chara_bone_data_set_parent_mats(rob_bone_data, parent_indices); rob_bone_data->base_skeleton_type = base_skeleton_type; rob_bone_data->skeleton_type = skeleton_type; } @@ -1701,10 +1711,10 @@ static void mot_blend_reserve_key_sets(mot_blend* blend, aft_bone_database_skele sub_140413350(&blend->field_0, a3, motion_bone_count); } -static void rob_chara_data_bone_data_init_data(rob_chara_data_bone_data* rob_bone_data, +static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, aft_bone_database_skeleton_type base_type, aft_bone_database_skeleton_type type) { - rob_chara_data_bone_data_init_skeleton(rob_bone_data, base_type, type); + rob_chara_bone_data_init_skeleton(rob_bone_data, base_type, type); 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, motion_blend_mot_check); size_t motion_bone_count = rob_bone_data->motion_bone_count; @@ -1716,6 +1726,394 @@ static void rob_chara_data_bone_data_init_data(rob_chara_data_bone_data* rob_bon mot_blend_reserve_key_sets(&rob_bone_data->eyelid, base_type, mot_blend_eyelid_check, motion_bone_count); } +static void sub_140548350(struc_525* a1) { + a1->field_0 = 0; + a1->field_4 = 0; +} + +static int32_t* sub_140507140(int32_t* a1) { + *a1 = 0; + return a1; +} + +static void sub_140506C20(struc_523* a1) { + a1->field_0 = 0; + a1->field_1 = 0; + a1->field_4 = 0; + a1->field_8 = 0; + a1->field_9 = 0; + a1->field_C = 0; + a1->field_10 = 0; + a1->field_1C = 0; + a1->field_14 = 0; + a1->field_18 = 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; + + list_ptr_void_node* v2 = a1->field_58.head; + list_ptr_void_node* v3 = v2->next; + v2->next = v2; + a1->field_58.head->prev = a1->field_58.head; + a1->field_58.size = 0; + while (v3 != a1->field_58.head) { + list_ptr_void_node* v4 = v3->next; + j_free_2(v3); + v3 = v4; + } + a1->field_68 = 0; + a1->field_70 = 0; + a1->field_78 = 0; + a1->field_80 = 0; +} + +static void sub_1405071C0(struc_526* a1) { + a1->field_0 = 0; + a1->field_4 = 0; +} + +static void sub_140505C90(struc_264* a1) { + a1->field_0 = 0; + a1->field_4.field_0 = 0; + sub_140548350(&a1->field_4.field_4); + a1->field_4.field_C = -1; + a1->field_4.field_10 = 0; + a1->field_18.field_0 = 0; + sub_140548350(&a1->field_18.field_4); + a1->field_18.field_C = -1; + a1->field_18.field_10 = 0; + a1->field_2C.field_0 = 0; + sub_140548350(&a1->field_2C.field_4); + a1->field_2C.field_C = -1; + a1->field_2C.field_10 = 0; + a1->field_40.field_0 = 0; + sub_140548350(&a1->field_40.field_4); + a1->field_40.field_C = -1; + a1->field_40.field_10 = 0; + a1->field_54.field_0 = 0; + sub_140548350(&a1->field_54.field_4); + a1->field_54.field_C = -1; + a1->field_54.field_10 = 0; + a1->field_68 = 0; + a1->field_6C = 0; + a1->field_70 = 0; + a1->field_74 = 0; + a1->field_78 = 0x7FFF; + a1->field_7C = 0; + a1->field_80 = 0; + a1->field_84 = 0; + a1->field_88 = 0; + a1->field_8C = 0; + a1->field_90 = 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; + sub_140507140(&a1->field_AC); + a1->field_B0 = 0; + a1->eyes_adjust = 0; + sub_140506C20(&a1->field_B8); + a1->field_140 = 0; + a1->field_144 = 0; + a1->field_145 = 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_164 = 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; + sub_1405071C0(&a1->field_1C0); + 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 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 int32_t* sub_140507180(int32_t* a1) { + *a1 = 0; + return a1; +} + +static void sub_140506440(struc_268* 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->step = -1.0f; + a1->field_24 = 0; + a1->field_28 = 0; + a1->field_2C = 0; + sub_140507180(&a1->field_30); + a1->field_34 = 0; + + int32_t* v2 = a1->field_38; + int32_t* v3 = a1->field_B8; + for (int32_t i = 0; i < 32; i++) { + *v2++ = -1; + *v3++ = 0; + } + + a1->field_138 = 1.0f; + a1->field_13C = 1.0f; + a1->field_140 = 0; + a1->field_144 = 0; + a1->field_150.field_0.base.__vftable->field_8(&a1->field_150.field_0.base); + a1->field_150.field_48.base.__vftable->field_8(&a1->field_150.field_48.base); + a1->field_150.field_90.base.__vftable->field_8(&a1->field_150.field_90.base); + a1->field_150.field_D8.base.__vftable->field_8(&a1->field_150.field_D8.base); + a1->field_150.field_120.base.__vftable->field_8(&a1->field_150.field_120.base); + a1->field_150.field_168.base.__vftable->field_8(&a1->field_150.field_168.base); + a1->field_150.field_1B0 = aft_object_info_null; + a1->field_150.field_1B4 = aft_object_info_null; + a1->field_150.field_1B8 = aft_object_info_null; + a1->field_150.field_1BC = aft_object_info_null; + a1->field_150.field_1C0 = 0; + a1->field_150.field_1C4 = 0.0f; + a1->field_318.base.__vftable->field_8(&a1->field_318); + a1->field_360.base.__vftable->field_8(&a1->field_360); + a1->field_3A8 = aft_object_info_null; + a1->field_3B0.field_0.base.__vftable->field_8(&a1->field_3B0.field_0.base); + a1->field_3B0.field_48.base.__vftable->field_8(&a1->field_3B0.field_48.base); + a1->field_3B0.field_90.base.__vftable->field_8(&a1->field_3B0.field_90.base); + a1->field_3B0.field_D8.base.__vftable->field_8(&a1->field_3B0.field_D8.base); + a1->field_3B0.field_120.base.__vftable->field_8(&a1->field_3B0.field_120.base); + a1->field_3B0.field_168.base.__vftable->field_8(&a1->field_3B0.field_168.base); + a1->field_3B0.field_1B0 = aft_object_info_null; + a1->field_3B0.field_1B4 = aft_object_info_null; + a1->field_3B0.field_1B8 = aft_object_info_null; + 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; + 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++; + } + + struc_269* v7 = a1->field_10D8; + struc_222* v8 = a1->field_12C8; + struc_229* v9 = a1->field_11B8; + struc_229* v10 = a1->field_1240; + 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->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; + 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; + v7++; + v8++; + v9++; + v10++; + } +} + +static struc_228* sub_14053A660(struc_228* a1) { + a1->field_0 = 0; + a1->field_4 = 0; + a1->field_8 = 0; + a1->field_C = 0; + return a1; +} + +static void sub_140539750(struc_223* a1) { + void(*sub_140537110)(struc_223 * a1) = (void*)0x0000000140537110; + void(*sub_1405335C0)(struc_223 * a1) = (void*)0x00000001405335C0; + + sub_14053A660(&a1->field_20); + sub_14053A660(&a1->field_10); + sub_140537110(a1); + sub_1405335C0(a1); + a1->field_7A0 = 0; + a1->field_7A8 = -1; +} + +static void sub_140505EA0(rob_chara_data* a1) { + void(*sub_140506A20)(struc_399 * a1) = (void*)0x0000000140506A20; + void(*sub_140506AE0)(struc_220 * a1) = (void*)0x0000000140506AE0; + void(*sub_140505FB0)(struc_209 * a1) = (void*)0x0000000140505FB0; + + a1->field_0 = 0; + sub_140505C90(&a1->field_8); + rob_sub_action_init_sub(&a1->rob_sub_action); + sub_140506440(&a1->field_290); + sub_140539750(&a1->field_1588); + sub_140506A20(&a1->field_1D38); + sub_140506AE0(&a1->field_1DE4); + sub_140505FB0(&a1->field_1E68); + a1->field_3D90 = 0.0f; + a1->field_3D94 = 0; + a1->field_3D98 = 0; + a1->field_3D9A = 0; + a1->field_3D9C = 0; + a1->field_3D9D = 0; + a1->field_3DA0 = 0; + a1->field_3DA4 = 0; + a1->field_3DA8 = 0; + a1->field_3DB0 = 0; + a1->field_3DB8 = 0; + a1->field_3DBC = 0; + a1->field_3DC0 = 0; + a1->field_3DC4 = 0; + a1->field_3DC8 = 0; + a1->field_3DCC = 0; + a1->field_3DD0 = 0; + a1->field_3DD8 = 0; + a1->field_3DD4 = 0.0f; + a1->field_3DDC = 0.0f; + a1->field_3DE0 = 0; +} + static void bone_data_parent_reset(bone_data_parent* a1) { a1->rob_bone_data = 0; a1->field_8 = false; @@ -1780,7 +2178,7 @@ static void motion_blend_mot_reset(motion_blend_mot* a1) { a1->field_4A8.field_34 = 0; a1->field_4A8.field_38 = 0.0f; a1->field_4A8.field_40 = 0; - a1->field_4A8.ex_data_mat = 0; + a1->field_4A8.field_48 = 0; sub_140413470(&a1->field_4F8); a1->field_0.bone_check_func = 0; sub_1404119A0(&a1->field_0.field_8); @@ -1830,23 +2228,23 @@ static void mot_blend_reset(mot_blend* a1) { static void sub_1404198D0(struc_258* a1) { a1->field_0 = 0; a1->field_8 = mat4u_identity; - a1->ex_data_mat.field_0 = 0.0f; - a1->ex_data_mat.field_4 = 0.0f; - a1->ex_data_mat.field_8 = 0.0f; - a1->ex_data_mat.field_C = 0.0f; - a1->ex_data_mat.field_10 = 0.0f; - a1->ex_data_mat.field_14 = 0.0f; - a1->ex_data_mat.field_18 = 0.0f; - a1->ex_data_mat.field_1C = 0.0f; - a1->ex_data_mat.field_20 = 0.0f; - a1->ex_data_mat.field_24 = 0.0f; - a1->ex_data_mat.field_28 = 0.0f; - a1->ex_data_mat.field_2C = 1.0f; - a1->ex_data_mat.field_30 = 1.0f; - a1->ex_data_mat.field_34 = -3.8f; - a1->ex_data_mat.field_38 = 6.0f; - a1->ex_data_mat.field_3C = -3.8f; - a1->ex_data_mat.field_40 = 6.0f; + 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 = 0; a1->field_8D = 0; a1->field_8E = 0; @@ -1942,14 +2340,14 @@ static void sub_1403FAEF0(struc_312* a1) { a1->field_88 = 0; } -static void rob_chara_data_bone_data_reset(rob_chara_data_bone_data* rob_bone_data) { - void(*rob_chara_data_bone_data_motion_blend_mot_list_free)(rob_chara_data_bone_data * rob_bone_data, +static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { + void(*rob_chara_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) = (void*)0x0000000140418E80; - void(*rob_chara_data_bone_data_motion_blend_mot_list_init)(rob_chara_data_bone_data * rob_bone_data) + void(*rob_chara_bone_data_motion_blend_mot_list_init)(rob_chara_bone_data * rob_bone_data) = (void*)0x000000014041A9E0; - void(*rob_chara_data_bone_data_motion_blend_mot_free)(rob_chara_data_bone_data * rob_bone_data) + void(*rob_chara_bone_data_motion_blend_mot_free)(rob_chara_bone_data * rob_bone_data) = (void*)0x0000000140419000; - void(*rob_chara_data_bone_data_motion_blend_mot_init)(rob_chara_data_bone_data * rob_bone_data) + void(*rob_chara_bone_data_motion_blend_mot_init)(rob_chara_bone_data * rob_bone_data) = (void*)0x000000014041A1A0; rob_bone_data->field_0 = 0; @@ -1965,16 +2363,15 @@ static void rob_chara_data_bone_data_reset(rob_chara_data_bone_data* rob_bone_da rob_bone_data->base_skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; rob_bone_data->skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; - if (rob_bone_data->motion_loaded.size - && rob_bone_data->motions.end - rob_bone_data->motions.begin == 3) { - rob_chara_data_bone_data_motion_blend_mot_list_free(rob_bone_data, 0); + if (rob_bone_data->motion_loaded.size && vector_length(rob_bone_data->motions) == 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); - rob_chara_data_bone_data_motion_blend_mot_list_init(rob_bone_data); + rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); } else { - rob_chara_data_bone_data_motion_blend_mot_free(rob_bone_data); - rob_chara_data_bone_data_motion_blend_mot_init(rob_bone_data); + 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); @@ -2061,7 +2458,11 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, for (uint32_t i = key_set_count; i; i--, a4++, value++) { mot_key_set_type type = a4->type; float_t* values = a4->values; - if (type == MOT_KEY_SET_STATIC) { + if (type == MOT_KEY_SET_NONE) { + *value = 0.0f; + continue; + } + else if (type == MOT_KEY_SET_STATIC) { *value = values[0]; continue; } @@ -2199,13 +2600,13 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { keyframe_data = bone_data_set_key_data(data, keyframe_data, skeleton_type, get_data, reverse); } - uint32_t v15 = a1->bone_data.bone_key_set_count; + 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, v15, a1->bone_data.global_key_set_count); + mot_parent_interpolate(&a1->mot_data, frame, bone_key_set_count, a1->bone_data.global_key_set_count); a1->mot_data.frame = frame; } - keyframe_data = (vec3*)&a1->mot_data.key_set_data.begin[v15]; + keyframe_data = (vec3*)&a1->mot_data.key_set_data.begin[bone_key_set_count]; vec3 global_trans = keyframe_data[0]; vec3 global_rotation = keyframe_data[1]; if (reverse) @@ -2338,7 +2739,7 @@ static void sub_140413EA0(struc_240* a1, void(*a2)(struc_313*)) { a2(&a1->field_8); } -static void sub_14041AD90(rob_chara_data_bone_data* a1) { +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) 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) @@ -2347,7 +2748,7 @@ static void sub_14041AD90(rob_chara_data_bone_data* a1) { sub_140413EA0(&a1->face.field_0, sub_14041B440); } -static void sub_14041AD50(rob_chara_data_bone_data* a1) { +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) sub_140413EA0(&a1->eyelid.field_0, sub_14041B440); } @@ -2391,7 +2792,7 @@ static void sub_140414ED0(mot_blend* a1, int32_t motion_id) { a1->field_F8.__vftable->field_8(&a1->field_F8); } -static void sub_14041BE50(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id) { +static void sub_14041BE50(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { sub_14041AD90(rob_bone_data); mot_blend* v3 = &rob_bone_data->face; sub_140412F20(v3, &rob_bone_data->motion_loaded.head->next->value->bone_data.bones); @@ -2399,7 +2800,7 @@ static void sub_14041BE50(rob_chara_data_bone_data* rob_bone_data, int32_t motio sub_140414ED0(v3, motion_id); } -static void sub_14041ABA0(rob_chara_data_bone_data* a1) { +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) { @@ -2487,8 +2888,8 @@ static void sub_140415B30(mot_blend* a1) { a1->field_F8.__vftable->field_18(&a1->field_F8, &v3.field_0); } -static void sub_14041DAC0(rob_chara_data_bone_data* a1) { - void(*rob_bone_data_motion_blend_mot_list_free)(rob_chara_data_bone_data * rob_bone_data, +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*)0x0000000140418E80; size_t v2 = 0; @@ -2518,7 +2919,7 @@ static void sub_14041DAC0(rob_chara_data_bone_data* a1) { sub_140415B30(&a1->eyelid); } -void rob_chara_data_bone_data_interpolate(rob_chara_data_bone_data* rob_bone_data) { +void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data) { if (!rob_bone_data->motion_loaded.size) return; @@ -2704,7 +3105,7 @@ static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, v9[*v7].frame = -1.0f; } else { - rob_chara_data_bone_data* rob_bone_data = v6->rob_bone_data; + rob_chara_bone_data* rob_bone_data = v6->rob_bone_data; for (mat4* i = rob_bone_data->mats.begin; i != rob_bone_data->mats.end; i++) *i = mat4_identity; @@ -2716,13 +3117,13 @@ static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, sub_140413C30(&a1->field_4F8); } -static void sub_14041BA60(rob_chara_data_bone_data* rob_bone_data) { +static void sub_14041BA60(rob_chara_bone_data* rob_bone_data) { motion_blend_mot* v1 = rob_bone_data->motion_loaded.head->next->value; if (v1) sub_1404146F0(&v1->field_0); } -static void sub_14041AE40(rob_chara_data_bone_data* a1) { +static void sub_14041AE40(rob_chara_bone_data* a1) { list_ptr_motion_blend_mot_node* v1 = a1->motion_loaded.head; struc_240* v3 = &v1->next->value->field_0; if (!v3) @@ -2753,10 +3154,10 @@ static void sub_14041AE40(rob_chara_data_bone_data* a1) { sub_140413EA0(v3, sub_14041B750); } -void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id, int32_t index) { - void(*rob_bone_data_motion_blend_mot_list_init)(rob_chara_data_bone_data * rob_bone_data) +void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, int32_t motion_id, int32_t index) { + void(*rob_bone_data_motion_blend_mot_list_init)(rob_chara_bone_data * rob_bone_data) = (void*)0x000000014041A9E0; - void(*rob_bone_data_motion_blend_mot_list_free)(rob_chara_data_bone_data * rob_bone_data, + void(*rob_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) = (void*)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, @@ -2764,7 +3165,7 @@ void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_bone_dat list_size_t_node* (*sub_140415DB0)(list_size_t_node * *a1, list_size_t_node * a2, list_size_t_node * a3, size_t * a4) = (void*)0x0000000140415DB0; motion_blend_mot* (*sub_140411A70)(motion_blend_mot * a1, - rob_chara_data_bone_data * rob_bone_data) = (void*)0x0000000140411A70; + rob_chara_bone_data * rob_bone_data) = (void*)0x0000000140411A70; if (!rob_bone_data->motion_loaded.size) return; @@ -2811,7 +3212,7 @@ void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_bone_dat rob_bone_data->motion_loaded.size++; v8->prev = v10; v10->prev->next = v10; - size_t v17 = rob_bone_data->motions.end - rob_bone_data->motions.begin; + size_t v17 = vector_length(rob_bone_data->motions); list_size_t_node* v12 = rob_bone_data->motion_loaded_indices.head->next; list_size_t_node* v13 = sub_140415DB0(&rob_bone_data->motion_loaded_indices.head, v12, v12->prev, &v17); rob_bone_data->motion_loaded_indices.size++; @@ -2821,27 +3222,27 @@ void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* rob_bone_dat motion_blend_mot_load_file(v7->head->next->value, motion_id, 2, 1.0f); } -static void sub_14041BFC0(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id) { +static void sub_14041BFC0(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { sub_140412F20(&rob_bone_data->hand_l, &rob_bone_data->motion_loaded.head->next->value->bone_data.bones); sub_140414ED0(&rob_bone_data->hand_l, motion_id); } -static void sub_14041C260(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id) { +static void sub_14041C260(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { sub_140412F20(&rob_bone_data->hand_r, &rob_bone_data->motion_loaded.head->next->value->bone_data.bones); sub_140414ED0(&rob_bone_data->hand_r, motion_id); } -static void sub_14041D200(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id) { +static void sub_14041D200(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { sub_140412F20(&rob_bone_data->mouth, &rob_bone_data->motion_loaded.head->next->value->bone_data.bones); sub_140414ED0(&rob_bone_data->mouth, motion_id); } -static void sub_14041BDB0(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id) { +static void sub_14041BDB0(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { sub_140412F20(&rob_bone_data->eye, &rob_bone_data->motion_loaded.head->next->value->bone_data.bones); sub_140414ED0(&rob_bone_data->eye, motion_id); } -static void sub_14041BD20(rob_chara_data_bone_data* rob_bone_data, int32_t motion_id) { +static void sub_14041BD20(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { sub_14041AD50(rob_bone_data); mot_blend* v3 = &rob_bone_data->eyelid; sub_140412F20(v3, &rob_bone_data->motion_loaded.head->next->value->bone_data.bones); @@ -2857,11 +3258,11 @@ static void sub_140414BC0(struc_346* a1, float_t frame) { a1->field_14 = -1.0; } -static void rob_chara_data_bone_data_set_frame(rob_chara_data_bone_data* 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); } -static void sub_14041C680(rob_chara_data_bone_data* a1, char a2) { +static void sub_14041C680(rob_chara_bone_data* a1, char a2) { struc_308* v2 = &a1->motion_loaded.head->next->value->field_4F8; if (a2) v2->field_0 |= 2; @@ -2869,7 +3270,7 @@ static void sub_14041C680(rob_chara_data_bone_data* a1, char a2) { v2->field_0 &= ~2; } -static void sub_14041C9D0(rob_chara_data_bone_data* a1, char a2) { +static void sub_14041C9D0(rob_chara_bone_data* a1, char a2) { struc_308* v2 = &a1->motion_loaded.head->next->value->field_4F8; v2->field_8 = (uint8_t)(v2->field_0 & 1); if (a2) @@ -2878,7 +3279,7 @@ static void sub_14041C9D0(rob_chara_data_bone_data* a1, char a2) { v2->field_0 &= ~1; } -static void sub_14041D2D0(rob_chara_data_bone_data* a1, char a2) { +static void sub_14041D2D0(rob_chara_bone_data* a1, char a2) { struc_308* v2 = &a1->motion_loaded.head->next->value->field_4F8; if (a2) v2->field_0 |= 4; @@ -2886,7 +3287,7 @@ static void sub_14041D2D0(rob_chara_data_bone_data* a1, char a2) { v2->field_0 &= ~4; } -static void sub_14041BC40(rob_chara_data_bone_data* a1, char a2) { +static void sub_14041BC40(rob_chara_bone_data* a1, char a2) { struc_308* v2 = &a1->motion_loaded.head->next->value->field_4F8; if (a2) v2->field_0 |= 8; @@ -2899,15 +3300,15 @@ static void sub_140414F00(struc_308* a1, float_t a2) { a1->eyes_adjust = a2; } -static void sub_14041D270(rob_chara_data_bone_data* a1, float_t a2) { +static void sub_14041D270(rob_chara_bone_data* a1, float_t a2) { sub_140414F00(&a1->motion_loaded.head->next->value->field_4F8, a2); } -static void sub_14041D2A0(rob_chara_data_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; } -static void rob_chara_data_bone_data_set_rotation_y(rob_chara_data_bone_data* rob_bone_data, float_t rotation_y) { +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.head->next->value->bone_data.rotation_y = rotation_y; } @@ -2934,50 +3335,50 @@ static void sub_140414C60(motion_blend_mot* a1, float_t a2, float_t a3, float_t sub_1403FBED0(v4, a2, a3, a4); } -static void sub_14041BF80(rob_chara_data_bone_data* a1, float_t a2, float_t a3, float_t a4) { +static void sub_14041BF80(rob_chara_bone_data* a1, float_t a2, float_t a3, float_t a4) { sub_140414C60(a1->motion_loaded.head->next->value, a2, a3, a4); } -static void sub_14041D310(rob_chara_data_bone_data* a1) { +static void sub_14041D310(rob_chara_bone_data* a1) { motion_blend* v1 = a1->motion_loaded.head->next->value->field_5D0; if (v1) v1->__vftable->field_10(v1); } -static void rob_chara_data_load_default_motion_sub(rob_chara_data* a1, int32_t a2, int32_t motion_id) { +static void rob_chara_load_default_motion_sub(rob_chara* a1, int32_t a2, int32_t motion_id) { sub_14041BE50(a1->bone_data, -1); sub_14041BFC0(a1->bone_data, -1); sub_14041C260(a1->bone_data, -1); sub_14041D200(a1->bone_data, -1); sub_14041BDB0(a1->bone_data, -1); sub_14041BD20(a1->bone_data, -1); - rob_chara_data_bone_data_motion_load(a1->bone_data, motion_id, 1); - rob_chara_data_bone_data_set_frame(a1->bone_data, 0.0f); + rob_chara_bone_data_motion_load(a1->bone_data, motion_id, 1); + rob_chara_bone_data_set_frame(a1->bone_data, 0.0f); sub_14041C680(a1->bone_data, 0); sub_14041C9D0(a1->bone_data, 0); sub_14041D2D0(a1->bone_data, 0); sub_14041BC40(a1->bone_data, 0); sub_14041D270(a1->bone_data, 0.0f); sub_14041D2A0(a1->bone_data, 0.0f); - rob_chara_data_bone_data_set_rotation_y(a1->bone_data, 0.0f); + rob_chara_bone_data_set_rotation_y(a1->bone_data, 0.0f); sub_14041BF80(a1->bone_data, 0.0f, 1.0f, 1.0f); sub_14041D310(a1->bone_data); - rob_chara_data_bone_data_interpolate(a1->bone_data); - rob_chara_data_bone_data_update(a1->bone_data, 0); + rob_chara_bone_data_interpolate(a1->bone_data); + rob_chara_bone_data_update(a1->bone_data, 0); sub_140412E10(a1->bone_data->motion_loaded.head->next->value, a2); } -int32_t rob_cmn_mottbl_get_motion_index(rob_chara_data* a1, int32_t a2) { +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->field_440.field_290.field_0; + return a1->data.field_290.motion_id; if (a2 >= 214 && a2 <= 223) - return ((uint32_t*)&a1->field_4228.field_1E68.field_1C88)[a2]; + return ((uint32_t*)&a1->data_prev.field_1E68.field_1C88)[a2]; if (a2 >= 226 && a2 <= 235) - return ((uint32_t*)&a1->field_4228.field_1E68.field_1C78)[a2 + 1]; + return ((uint32_t*)&a1->data_prev.field_1E68.field_1C78)[a2 + 1]; - size_t v7 = a1->field_440.field_8.field_1A4; + size_t v7 = a1->data.field_8.field_1A4; size_t v8 = a1->chara_index; if (!rob_cmn_mottbl_data || v8 < 0 || v8 >= rob_cmn_mottbl_data->field_0 @@ -2991,12 +3392,12 @@ int32_t rob_cmn_mottbl_get_motion_index(rob_chara_data* a1, int32_t a2) { return -1; } -static void rob_chara_data_load_default_motion(rob_chara_data* a1) { - rob_chara_data_load_default_motion_sub(a1, 1, rob_cmn_mottbl_get_motion_index(a1, 0)); +static void rob_chara_load_default_motion(rob_chara* a1) { + rob_chara_load_default_motion_sub(a1, 1, rob_cmn_mottbl_get_motion_index(a1, 0)); } -static bone_node* rob_chara_data_bone_data_get_node(rob_chara_data_bone_data* rob_bone_data, size_t index) { - if ((ssize_t)index < rob_bone_data->nodes.end - rob_bone_data->nodes.begin) +static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_data, size_t index) { + if ((ssize_t)index < vector_length(rob_bone_data->nodes)) return &rob_bone_data->nodes.begin[index]; return 0; } @@ -3005,53 +3406,53 @@ static char* ex_node_block_get_parent_name(ex_node_block* a1) { return string_data(&a1->parent_name); } -static bone_node* rob_chara_data_item_equip_object_get_bone_node( - rob_chara_data_item_equip_object* a1, int32_t a2) { +static bone_node* rob_chara_item_equip_object_get_bone_node( + rob_chara_item_equip_object* a1, int32_t a2) { bool ex_data = a2 & 0x8000 ? true : false; a2 &= 0x7FFF; if (!ex_data) return &a1->bone_nodes[a2]; - else if (a2 < a1->ex_data_bone_nodes.end - a1->ex_data_bone_nodes.begin) + else if (a2 < vector_length(a1->ex_data_bone_nodes)) return &a1->ex_data_bone_nodes.begin[a2]; return 0; } -static bone_node* rob_chara_data_item_equip_object_get_bone_node_by_name( - rob_chara_data_item_equip_object* a1, char* a2) { - int32_t(*rob_chara_data_item_equip_object_get_bone_index)( - rob_chara_data_item_equip_object * a1, char* a2) = (void*)0x00000001405F3400; - return rob_chara_data_item_equip_object_get_bone_node(a1, - rob_chara_data_item_equip_object_get_bone_index(a1, a2)); +static bone_node* rob_chara_item_equip_object_get_bone_node_by_name( + rob_chara_item_equip_object* a1, char* a2) { + int32_t(*rob_chara_item_equip_object_get_bone_index)( + rob_chara_item_equip_object * a1, char* a2) = (void*)0x00000001405F3400; + return rob_chara_item_equip_object_get_bone_node(a1, + rob_chara_item_equip_object_get_bone_index(a1, a2)); } -static void rob_chara_data_item_equip_object_get_parent_bone_nodes( - rob_chara_data_item_equip_object* a1, bone_node* a2) { +static void rob_chara_item_equip_object_get_parent_bone_nodes( + rob_chara_item_equip_object* a1, bone_node* a2) { a1->bone_nodes = a2; a1->mat = a2->mat; for (ex_node_block** i = a1->node_blocks.begin; i != a1->node_blocks.end; i++) - (*i)->parent_bone_node = rob_chara_data_item_equip_object_get_bone_node_by_name( + (*i)->parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( a1, ex_node_block_get_parent_name(*i)); } -static void rob_chara_data_item_equip_get_parent_bone_nodes(rob_chara_data_item_equip* a1, bone_node* a2) { +static void rob_chara_item_equip_get_parent_bone_nodes(rob_chara_item_equip* a1, bone_node* a2) { a1->bone_nodes = a2; a1->matrices = a2->mat; for (int32_t v2 = a1->first_item_equip_object; v2 < a1->max_item_equip_object; v2++) - rob_chara_data_item_equip_object_get_parent_bone_nodes(&a1->item_equip_object[v2], a1->bone_nodes); + rob_chara_item_equip_object_get_parent_bone_nodes(&a1->item_equip_object[v2], a1->bone_nodes); } -static bool rob_chara_data_check_for_ageageagain_module(chara_index chara_index, int32_t module_index) { +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 void sub_140517060(rob_chara_data* a1, bool a2) { +static void sub_140517060(rob_chara* a1, bool a2) { void(*sub_140543780)(int32_t a1, int32_t a2, char a3) = (void*)0x0000000140543780; - a1->field_440.field_0 &= ~1; - a1->field_440.field_3 &= ~1; - a1->field_440.field_0 |= a2 & 1; - a1->field_440.field_3 |= a2 & 1; - if (rob_chara_data_check_for_ageageagain_module(a1->chara_index, a1->module_index)) { + a1->data.field_0 &= ~1; + a1->data.field_3 &= ~1; + a1->data.field_0 |= a2 & 1; + a1->data.field_3 |= a2 & 1; + if (rob_chara_check_for_ageageagain_module(a1->chara_index, a1->module_index)) { sub_140543780(a1->chara_id, 1, a2); sub_140543780(a1->chara_id, 2, a2); } @@ -3068,7 +3469,7 @@ static float_t chara_size_table_get_value(uint32_t a1) { return chara_size_table[a1]; } -static float_t sub_140510320(uint32_t a1) { +static float_t chara_pos_adjust_y_table_get_value(uint32_t a1) { static const float_t flt_1411ADAD0[] = { 0.071732f, 0.0f, -0.03859f, 0.0f, 0.0f }; @@ -3079,25 +3480,25 @@ static float_t sub_140510320(uint32_t a1) { return flt_1411ADAD0[a1]; } -static void sub_14041C5C0(rob_chara_data_bone_data* a1, struc_243* a2) { +static void sub_14041C5C0(rob_chara_bone_data* a1, struc_243* a2) { a1->field_788.field_15C = *a2; } -static void sub_14041D4E0(rob_chara_data_bone_data* a1, struc_242* a2) { +static void sub_14041D4E0(rob_chara_bone_data* a1, struc_242* a2) { a1->field_958.field_0 = *a2; } -static void sub_14041D5C0(rob_chara_data_bone_data* a1, struc_242* a2) { +static void sub_14041D5C0(rob_chara_bone_data* a1, struc_242* a2) { a1->field_958.field_2C = *a2; } -static void sub_14041D560(rob_chara_data_bone_data* a1, char a2, char a3) { +static void sub_14041D560(rob_chara_bone_data* a1, char a2, char a3) { a1->field_958.field_58 = a2; a1->field_958.field_59 = a3; } -static void rob_chara_data_bone_data_ik_scale_calculate( - rob_chara_data_bone_data_ik_scale* a1, vector_bone_data* a2, +static void rob_chara_bone_data_ik_scale_calculate( + rob_chara_bone_data_ik_scale* a1, vector_bone_data* a2, aft_bone_database_skeleton_type base_skeleton_type, aft_bone_database_skeleton_type skeleton_type) { bone_data* b_cl_mune = &a2->begin[MOTION_BONE_CL_MUNE]; @@ -3118,34 +3519,34 @@ static void rob_chara_data_bone_data_ik_scale_calculate( / (fabsf(b_kl_kubi->base_translation[0].y) + b_cl_mune->ik_segment_length[0] + base_height); } -static void rob_chara_data_bone_data_get_ik_scale(rob_chara_data_bone_data* a1) { +static void rob_chara_bone_data_get_ik_scale(rob_chara_bone_data* a1) { if (!a1->motion_loaded.size) return; motion_blend_mot* v2 = a1->motion_loaded.head->next->value; - rob_chara_data_bone_data_ik_scale_calculate(&a1->ik_scale, &v2->bone_data.bones, a1->base_skeleton_type, a1->skeleton_type); + rob_chara_bone_data_ik_scale_calculate(&a1->ik_scale, &v2->bone_data.bones, a1->base_skeleton_type, a1->skeleton_type); float_t ratio0 = a1->ik_scale.ratio0; v2->field_4F8.field_C0 = ratio0; v2->field_4F8.field_C4 = ratio0; v2->field_4F8.field_C8 = vec3_null; } -static float_t rob_chara_data_bone_data_get_ik_scale_ratio0(rob_chara_data_bone_data* a1) { +static float_t rob_chara_bone_data_get_ik_scale_ratio0(rob_chara_bone_data* a1) { return a1->ik_scale.ratio0; } -static void sub_1405167A0(rob_chara_data* a1) { +static void sub_1405167A0(rob_chara* a1) { a1->field_C = 1; } -static void sub_140513C60(rob_chara_data_item_equip* a1, int32_t a2, bool a3) { +static void sub_140513C60(rob_chara_item_equip* a1, int32_t a2, bool a3) { if (a3) a1->field_18[a2] &= ~4; else a1->field_18[a2] |= 4; } -static aft_object_info sub_140525C00(struc_288* a1, int32_t a2) { +static aft_object_info sub_140525C00(rob_chara_item_sub_data* a1, int32_t a2) { tree_pair_int32_t_int32_t_node* v2 = a1->field_3F8.head; tree_pair_int32_t_int32_t_node* v3 = v2; tree_pair_int32_t_int32_t_node* v4 = v2->parent; @@ -3169,21 +3570,21 @@ static aft_object_info sub_140525C00(struc_288* a1, int32_t a2) { return *(aft_object_info*)&v6->value; } -static aft_object_info sub_1405104C0(rob_chara_data* a1, int32_t a2) { +static aft_object_info sub_1405104C0(rob_chara* a1, int32_t a2) { if (a2 > 8) return (aft_object_info) { -1, -1 }; - aft_object_info v3 = sub_140525C00(&a1->field_38, a2); + aft_object_info v3 = sub_140525C00(&a1->item_sub_data, a2); if (v3.id == -1 && v3.set_id == -1) return a1->chara_init_data->head_objects[a2]; return v3; } -static void sub_1405139E0(rob_chara_data_item_equip* a1, uint32_t a2, bool draw) { +static void sub_1405139E0(rob_chara_item_equip* a1, uint32_t a2, bool draw) { a1->item_equip_object[a2].draw = draw; } -static void sub_140517120(rob_chara_data* a1, uint32_t a2, bool draw) { +static void sub_140517120(rob_chara* a1, uint32_t a2, bool draw) { if (a2 < 31) sub_1405139E0(a1->item_equip, a2, draw); else if (a2 == 31) { @@ -3192,7 +3593,7 @@ static void sub_140517120(rob_chara_data* a1, uint32_t a2, bool draw) { for (int32_t i = 1; i < 31; i++) { sub_1405139E0(a1->item_equip, i, draw); - if (i == 1 && rob_chara_data_check_for_ageageagain_module( + if (i == 1 && rob_chara_check_for_ageageagain_module( a1->chara_index, a1->module_index)) { sub_140543780(a1->chara_id, 1, draw); sub_140543780(a1->chara_id, 2, draw); @@ -3203,22 +3604,22 @@ static void sub_140517120(rob_chara_data* a1, uint32_t a2, bool draw) { } } -void rob_chara_data_reset(rob_chara_data* a1, rob_chara_pv_data* a2) { +void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { float_t(*sub_140228BD0)(vec3 * a1, float_t a2) = (void*)0x0000000140228BD0; - void(*sub_140505EA0)(struc_263 * a1) = (void*)0x0000000140505EA0; + void(*sub_140505EA0)(rob_chara_data * a1) = (void*)0x0000000140505EA0; struc_243* (*sub_140510550)(int32_t a1) = (void*)0x0000000140510550; struc_241* (*sub_1405106E0)(int32_t a1) = (void*)0x00000001405106E0; - void(*sub_1405552A0)(rob_chara_data * a1, int32_t motion_id, + void(*rob_chara_load_motion)(rob_chara * a1, int32_t motion_id, bool a3, float_t a4, int32_t a5) = (void*)0x00000001405552A0; - int32_t v2 = a1->field_440.field_8.field_1CC; - rob_chara_data_bone_data_reset(a1->bone_data); - rob_chara_data_bone_data_init_data(a1->bone_data, + int32_t v2 = a1->data.field_8.field_1CC; + 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->field_440); - sub_140505EA0(&a1->field_4228); - rob_chara_data_item_equip_get_parent_bone_nodes(a1->item_equip, - rob_chara_data_bone_data_get_node(a1->bone_data, 0)); + sub_140505EA0(&a1->data); + sub_140505EA0(&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; sub_140517060(a1, a2->field_4); a1->field_A = a2->field_16; @@ -3230,35 +3631,35 @@ void rob_chara_data_reset(rob_chara_data* a1, rob_chara_pv_data* a2) { v8.y = sub_140228BD0(&v19, 0.0); } - struc_263* v3 = &a1->field_440; + 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.ex_data_mat = v8; - v3->field_1DE4.scale = chara_size_table_get_value(a1->pv_data.field_9C); - v3->field_1DE4.field_4 = a1->pv_data.field_A0; - v3->field_1DE4.field_8 = sub_140510320(a1->pv_data.field_9C); + v3->field_1D38.field_48 = v8; + v3->field_1DE4.size = chara_size_table_get_value(a1->pv_data.field_9C); + v3->field_1DE4.height_adjust = a1->pv_data.height_adjust; + v3->field_1DE4.field_8 = chara_pos_adjust_y_table_get_value(a1->pv_data.field_9C); v3->field_8.field_1A8 = a1->chara_init_data->field_838[v3->field_8.field_1A4]; sub_14041C5C0(a1->bone_data, sub_140510550(a1->chara_index)); - rob_chara_data_bone_data_eyes_xrot_adjust(a1->bone_data, + rob_chara_bone_data_eyes_xrot_adjust(a1->bone_data, sub_1405106E0(a1->chara_index), &a2->eyes_adjust); sub_14041D4E0(a1->bone_data, &a2->field_18); sub_14041D5C0(a1->bone_data, &a2->field_44); sub_14041D560(a1->bone_data, 1, 0); - rob_chara_data_bone_data_get_ik_scale(a1->bone_data); - float_t ratio0 = rob_chara_data_bone_data_get_ik_scale_ratio0(a1->bone_data); + 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; - rob_chara_data_load_default_motion(a1); - v3->field_8.field_4 = 1; - v3->field_8.field_10 = rob_cmn_mottbl_get_motion_index(a1, 0); + rob_chara_load_default_motion(a1); v3->field_8.field_0 = 0; - v3->field_8.field_14 = a2->field_5; - sub_1405552A0(a1, v3->field_8.field_10, v3->field_8.field_14, 0.0, 0); + v3->field_8.field_4.field_0 = 1; + v3->field_8.field_4.field_C = rob_cmn_mottbl_get_motion_index(a1, 0); + v3->field_8.field_4.field_10 = a2->field_5; + rob_chara_load_motion(a1, v3->field_8.field_4.field_C, v3->field_8.field_4.field_10, 0.0, 0); if (!a2->field_6) v3->field_8.field_1CC = v2; sub_1405167A0(a1); @@ -3267,8 +3668,1477 @@ void rob_chara_data_reset(rob_chara_data* 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_300 = v17; - v3->field_290.field_560 = v17; + v3->field_290.field_150.field_1B0 = v17; + v3->field_290.field_3B0.field_1B0 = v17; sub_140517120(a1, 0x1F, true); a1->field_20 = 0; } + +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 = (skin_param_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 void rob_osage_node_init(rob_osage_node* node) { + void (*sub_14021DCC0)(vector_struc_331 * vec, size_t size) = (void*)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_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; + sub_14021DCC0(&node->field_198, 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 = (skin_param_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*)0x0000000140216750; + void (*vector_rob_osage_node_clear)(vector_rob_osage_node * vec, + rob_osage_node * begin, rob_osage_node * end) = (void*)0x00000001404817E0; + + vector_rob_osage_node_clear(&rob_osg->nodes, rob_osg->nodes.begin, rob_osg->nodes.end); + rob_osg->nodes.end = rob_osg->nodes.begin; + 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->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; + rob_osg->move_cancel = 0.0f; + rob_osg->field_1F0C = false; + rob_osg->wind_reset = false; + rob_osg->field_1F0E = false; + rob_osg->ring.ring_height = -1000.0f; + 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_out_height = -1000.0f; + rob_osg->ring.field_18 = 0; + rob_osg->ring.ring_rectangle_height = 0.0f; + 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->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->field_2A4 = 0.0f; + rob_osg->field_2A1 = 0; + rob_osg->field_1F78 = 0; + rob_osg->field_1F7C = 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->data.boc.begin) { + j_free_2(node->data.boc.begin); + node->data.boc.begin = 0; + node->data.boc.end = 0; + node->data.boc.capacity_end = 0; + } +} + +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*)0x000000014021BEF0; + void (*vector_rob_osage_node_clear)(vector_rob_osage_node * vec, + rob_osage_node * begin, rob_osage_node * end) = (void*)0x00000001404817E0; + + 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); + + if (rob_osg->ring.skp_root_coli.begin) { + j_free_2(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); + 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); + rob_osg->skin_param.coli.begin = 0; + rob_osg->skin_param.coli.end = 0; + rob_osg->skin_param.coli.capacity_end = 0; + } + + rob_osage_node_free(&rob_osg->node); + + if (rob_osg->nodes.begin) { + vector_rob_osage_node_clear(&rob_osg->nodes, rob_osg->nodes.begin, rob_osg->nodes.end); + j_free_2(rob_osg->nodes.begin); + rob_osg->nodes.begin = 0; + rob_osg->nodes.end = 0; + rob_osg->nodes.capacity_end = 0; + } +} + +void ex_node_block_field_10(ex_node_block* node) { + node->field_59 = false; +} + +void* ex_osage_block_dispose(ex_osage_block* osg, bool dispose) { + osg->base.__vftable = ex_osage_block_vftable; + ex_osage_block_reset(osg); + 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); + osg->base.parent_name = string_empty; + if (dispose) + j_free_2(osg); + return osg; +} + +void ex_osage_block_field_8(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; + for (rob_osage_node* v6 = rob_osg->nodes.begin + 1; v6 != rob_osg->nodes.end; v6++) { + v6->field_A0 = v5->value; + v5 = v5->next; + } + rob_osg->field_1F70 = 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_to_mat4u(rob_osg->parent_mat_ptr, &rob_osg->parent_mat); +} + +static void sub_14047F110(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, bool init_rot) { + mat4_transpose(mat, mat); + vec3 position; + vec3_mult(rob_osg->exp_data.position, *parent_scale, position); + mat4_translate_mult(mat, position.x, position.y, position.z, mat); + + vec3 rotation = rob_osg->exp_data.rotation; + mat4_rotate_mult(mat, rotation.x, rotation.y, rotation.z, mat); + + skin_param* skin_param = rob_osg->skin_param_ptr; + vec3 rot = skin_param->rot; + if (init_rot) + vec3_add(rot, skin_param->init_rot, rot); + mat4_rotate_mult(mat, rot.x, rot.y, rot.z, mat); + mat4_transpose(mat, mat); +} + +static bool sub_140482FF0(mat4* mat, vec3* a2, skin_param_hinge* hinge, vec3* a4, int32_t a5) { + 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 (hinge) { + if (y_rot > hinge->ymax) { + y_rot = hinge->ymax; + clipped = true; + } + + if (y_rot < hinge->ymin) { + y_rot = hinge->ymin; + clipped = true; + } + + if (z_rot > hinge->zmax) { + z_rot = hinge->zmax; + clipped = true; + } + + if (z_rot < hinge->zmin) { + z_rot = hinge->zmin; + clipped = true; + } + } + mat4_rotate_y_mult(mat, y_rot, mat); + 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)); + if (hinge) { + if (y_rot > hinge->ymax) { + y_rot = hinge->ymax; + clipped = true; + } + + if (y_rot < hinge->ymin) { + y_rot = hinge->ymin; + clipped = true; + } + + if (z_rot > hinge->zmax) { + z_rot = hinge->zmax; + clipped = true; + } + + if (z_rot < hinge->zmin) { + z_rot = hinge->zmin; + clipped = true; + } + } + mat4_rotate_z_mult(mat, z_rot, mat); + mat4_rotate_y_mult(mat, y_rot, mat); + } + mat4_transpose(mat, mat); + + if (a4) { + a4->y = y_rot; + a4->z = z_rot; + } + return clipped; +} + +static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, bool a4) { + mat4 v47 = *mat; + vec3 v45; + 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) { + rob_osg->field_1F0E = true; + sub_14047EE90(rob_osg, mat); + } + + if (!rob_osg->field_1F0C) { + rob_osg->field_1F0C = true; + + float_t move_cancel = rob_osg->skin_param_ptr->move_cancel; + if (rob_osg->move_cancel == 1.0f) + move_cancel = 1.0f; + if (move_cancel < 0.0f) + 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++) { + mat4 parent_mat; + vec3 v46; + mat4u_to_mat4_transpose(&rob_osg->parent_mat, &parent_mat); + mat4_mult_vec3_inv_trans(&parent_mat, &v19->trans, &v46); + mat4_transpose(rob_osg->parent_mat_ptr, &parent_mat); + mat4_mult_vec3_trans(&parent_mat, &v46, &v46); + vec3_sub(v46, v19->trans, v46); + vec3_mult_scalar(v46, move_cancel, v46); + vec3_add(v19->trans, v46, v19->trans); + } + } + + if (a4) { + mat4_transpose(&v47, &v47); + sub_14047F110(rob_osg, &v47, parent_scale, 0); + *rob_osg->nodes.begin->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++) { + vec3 v46; + 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; + mat4_transpose(&v47, &v47); + float_t v34; + vec3_distance(v30->trans, v29->trans, v34); + float_t v35 = parent_scale->x * v30->length; + bool v36; + if (v34 >= fabsf(v35)) { + v35 = v34; + v36 = false; + } + else + v36 = true; + mat4_translate_mult(&v47, v35, 0.0f, 0.0f, &v47); + if (v32 || v36) + 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; + 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; + } + } +} + +static void rob_osage_set_wind_direction(rob_osage* osg_block_data, vec3* wind_direction) { + if (wind_direction) + osg_block_data->wind_direction = *wind_direction; + else + osg_block_data->wind_direction = vec3_null; +} + +static void ex_osage_block_set_wind_direction(ex_osage_block* osg) { + vec3* (*wind_task_struct_get_wind_direction)() = (void*)0x000000014053D560; + + vec3 wind_direction = *wind_task_struct_get_wind_direction(); + rob_chara_item_equip_object* item_equip_object = osg->base.item_equip_object; + vec3_mult_scalar(wind_direction, item_equip_object->item_equip->wind_strength, wind_direction); + rob_osage_set_wind_direction(&osg->rob, &wind_direction); +} + +static void sub_140482300(vec3* a1, vec3* a2, vec3* a3, float_t osage_gravity_const, float_t weight) { + weight *= osage_gravity_const; + vec3 diff; + vec3_sub(*a2, *a3, diff); + float_t dist; + vec3_length(diff, dist); + if (dist <= fabsf(osage_gravity_const)) { + diff.y = osage_gravity_const; + vec3_length(diff, dist); + } + vec3_mult_scalar(diff, weight * diff.y * (1.0f / (dist * dist)), diff); + vec3_negate(diff, diff); + diff.y -= weight; + *a1 = diff; +} + +static void sub_140482F30(vec3* pos1, vec3* pos2, float_t length) { + vec3 diff; + vec3_sub(*pos1, *pos2, diff); + float_t dist; + vec3_length_squared(diff, dist); + if (dist > length * length) { + vec3_mult_scalar(diff, length / sqrtf(dist), diff); + vec3_add(*pos2, diff, *pos1); + } +} + +static void sub_140482490(rob_osage_node* node, float_t step, float_t a3) { + if (step != 1.0f) { + vec3 v4; + vec3_sub(node->trans, node->trans_orig, v4); + + float_t v9; + vec3_length(v4, v9); + if (v9 != 0.0f) + vec3_mult_scalar(v4, 1.0f / v9, v4); + vec3_mult_scalar(v4, step * v9, v4); + vec3_add(node->trans_orig, v4, node->trans); + } + + sub_140482F30(&node->trans, &node[-1].trans, node->length * a3); + if (node->sibling_node) + sub_140482F30(&node->trans, &node->sibling_node->trans, node->distance); +} + +static void sub_140482180(rob_osage_node* node, float_t a2) { + float_t v2 = node->data_ptr->skp_osg_node.coli_r + a2; + if (v2 <= node->trans.y) + return; + + node->trans.y = v2; + vec3 v3; + vec3_sub(node->trans, node[-1].trans, v3); + vec3_normalize(v3, v3); + vec3_mult_scalar(v3, node->length, v3); + vec3_add(node[-1].trans, v3, node->trans); + node->trans_diff = vec3_null; + node->field_C8 += 1.0f; +} + +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) + 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]; + v17->trans_orig = v17->trans; + vec3 v113; + vec3_mult(rob_osg->exp_data.position, *parent_scale, v113); + + mat4 v130 = *mat; + mat4_transpose(&v130, &v130); + mat4_mult_vec3_trans(&v130, &v113, &v17->trans); + 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; + mat4_transpose(&v130, &v130); + + v113 = (vec3){ 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) + 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++) { + rob_osage_node_data* v31 = v26->data_ptr; + float_t weight = v31->skp_osg_node.weight; + vec3 v111; + if (!rob_osg->field_1F78) { + sub_140482300(&v111, &v26->trans, &v30->trans, osage_gravity_const, weight); + + if (v26 != &v12[-1]) { + vec3 v112; + sub_140482300(&v112, &v26->trans, &v26[1].trans, osage_gravity_const, weight); + vec3_add(v111, v112, v111); + vec3_mult_scalar(v111, 0.5f, v111); + } + } + else + vec3_mult_scalar(rob_osg->field_1F7C, 1.0f / weight, v111); + + vec3 v127; + vec3_mult_scalar(v128, v31->force * v26->force, v127); + float_t v41 = (1.0f - rob_osg->field_1EB4) * (1.0f - rob_osg->skin_param_ptr->air_res); + + vec3 v126; + 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_add(v126, v111, v126); + + if (!a5) { + vec3_mult_scalar(rob_osg->wind_direction, rob_osg->skin_param_ptr->wind_afc, v111); + vec3_add(v126, v111, v126); + } + + if (stiffness) { + vec3 v116; + vec3_sub(v26->trans_diff, v30->trans_diff, v116); + vec3_mult_scalar(v116, 1.0f - rob_osg->skin_param_ptr->air_res, v116); + vec3_sub(v126, v116, v126); + } + + float_t v49 = 1.0f / (weight - (weight - 1.0f) * v31->skp_osg_node.inertial_cancel); + vec3_mult_scalar(v126, v49, v26->field_28); + } + + if (stiffness) { + mat4 v131 = v130; + vec3 v111; + mat4_get_translation(&v131, &v111); + + for (rob_osage_node* v55 = rob_osg->nodes.begin + 1; v55 != v12; v55++) { + mat4_mult_vec3_trans(&v131, &v55->field_94, &v128); + + vec3 v123; + vec3_add(v55->trans_diff, v55->field_28, v123); + vec3 v126; + vec3_add(v55->trans, v123, v126); + sub_140482F30(&v126, &v111, v25 * v55->length); + vec3 v117; + vec3_sub(v128, v126, v117); + vec3_mult_scalar(v117, rob_osg->skin_param_ptr->stiffness, v117); + float_t weight = v55->data_ptr->skp_osg_node.weight; + float_t v74 = 1.0f / (weight - (weight - 1.0f) * v55->data_ptr->skp_osg_node.inertial_cancel); + vec3_mult_scalar(v117, v74, v117); + vec3_add(v55->field_28, v117, v55->field_28); + vec3_add(v55->trans, v117, v126); + vec3_add(v126, v123, v126); + + vec3 v129; + mat4_mult_vec3_inv_trans(&v131, &v126, &v129); + + mat4_transpose(&v131, &v131); + sub_140482FF0(&v131, &v129, 0, 0, rob_osg->field_1EB8); + mat4_transpose(&v131, &v131); + + float_t v58; + vec3_distance(v111, v126, v58); + mat4_translate_mult(&v131, v58, 0.0f, 0.0f, &v131); + + v111 = v126; + } + } + + for (rob_osage_node* 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); + + if (a6) { + rob_osage_node* 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 + || v91->trans.z < rob_osg->ring.ring_rectangle_y - v93 + || v91->trans.x > rob_osg->ring.ring_rectangle_x + rob_osg->ring.ring_rectangle_width + || v91->trans.z > rob_osg->ring.ring_rectangle_y + rob_osg->ring.ring_rectangle_height) + v97 = rob_osg->ring.ring_out_height; + else + 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); + } + } + + if (a7) { + for (rob_osage_node* 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); + 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; + mat4_transpose(&v130, &v130); + + float_t v104; + vec3_distance(v99->trans, v100->trans, v104); + float_t v105 = v25 * v99->length; + + bool v106; + if (v104 >= fabs(v105)) { + v105 = sqrtf(v104); + v106 = false; + } + else + v106 = true; + + mat4_translate_mult(&v130, v105, 0.0f, 0.0f, &v130); + if (v102 || v106) + 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; + 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->field_2A0 = false; +} + +void sub_140484E10(vec3* a1, vec3* a2, vec3* a3, vec3* a4) { + vec3 v6; + vec3_sub(*a3, *a2, v6); + + vec3 v7; + vec3_sub(*a4, *a2, v7); + + float_t v8; + vec3_dot(v7, v6, v8); + if (v8 < 0.0f) { + *a1 = *a2; + return; + } + + float_t v9; + vec3_length_squared(v6, v9); + if (v9 <= 0.000001f) + *a1 = *a2; + else if (v8 <= v9) { + float_t v10 = v8 / v9; + vec3_mult_scalar(v6, v8 / v9, v6); + vec3_add(*a2, v6, *a1); + } + else + *a1 = *a3; +} + +static int32_t sub_140483DE0(vec3* a1, vec3* a2, vec3* a3, float_t radius) { + vec3 v5; + float_t length; + vec3_sub(*a2, *a3, v5); + vec3_length_squared(v5, length); + if (length > 0.000001f && length < radius * radius) { + vec3_mult_scalar(v5, radius / sqrtf(length) - 1.0f, *a1); + return 1; + } + return 0; +} + +static int32_t sub_140484450(vec3* a1, vec3* a2, vec3* a3, vec3* a4, float_t* radius) { + vec3 v8; + sub_140484E10(&v8, a2, a3, a4); + return sub_140483DE0(a1, &v8, a4, *radius); +} + +static void sub_140484850(vec3* a1, vec3* a2, vec3* a3, osage_coli* coli) { + vec3 v56; + vec3_sub(*a3, *a2, v56); + + vec3 v60; + vec3_cross(v56, coli->bone_pos_diff, v60); + + float_t v46; + vec3_length_squared(v60, v46); + if (v46 <= 0.000001f) { + vec3 v56; + vec3 v57; + vec3 v58; + vec3 v59; + sub_140484E10(&v59, &coli->bone0_pos, &coli->bone1_pos, a2); + sub_140484E10(&v58, &coli->bone0_pos, &coli->bone1_pos, a3); + sub_140484E10(&v57, a2, a3, &coli->bone0_pos); + sub_140484E10(&v56, a2, a3, &coli->bone1_pos); + + float_t v48; + float_t v51; + float_t v52; + float_t v55; + vec3_distance_squared(*a3, coli->bone0_pos, v48); + vec3_distance_squared(coli->bone0_pos, v57, v51); + vec3_distance_squared(coli->bone1_pos, v56, v52); + vec3_distance_squared(*a2, v59, v55); + *a1 = *a2; + + if (v55 > v48) { + *a1 = *a3; + v55 = v48; + } + + if (v55 > v51) { + *a1 = v57; + v55 = v51; + } + + if (v55 > v52) + *a1 = v56; + } + else { + float_t v25; + vec3_length(v56, v25); + if (v25 != 0.0) + vec3_mult_scalar(v56, 1.0f / v25, v56); + + float_t v30 = 1.0f / coli->bone_pos_diff_length; + vec3 v61; + float_t v34; + vec3_mult_scalar(coli->bone_pos_diff, v30, v61); + vec3_dot(v61, v56, v34); + vec3_mult_scalar(v61, v34, v61); + vec3_sub(v61, v56, v61); + vec3_sub(coli->bone0_pos, *a2, v60); + float_t v35; + vec3_dot(v61, v60, v35); + v35 /= (v34 * v34 - 1.0f); + if (v35 < 0.0f) + *a1 = *a2; + else if (v35 <= v25) { + vec3_mult_scalar(v56, v35, v56); + vec3_add(*a2, v56, *a1); + } + else + *a1 = *a3; + + } +} + +static int32_t sub_140484540(vec3* a1, vec3* a2, osage_coli* coli, float_t radius) { + + vec3 v11; + vec3_sub(*a2, coli->bone0_pos, v11); + float_t v17; + vec3_dot(v11, coli->bone_pos_diff, v17); + if (v17 < 0.0f) + return sub_140483DE0(a1, a2, &coli->bone0_pos, radius); + + float_t v19 = coli->bone_pos_diff_length_squared; + if (fabs(coli->bone_pos_diff_length_squared) <= 0.000001) + return sub_140483DE0(a1, a2, &coli->bone0_pos, radius); + if (v17 > v19) + return sub_140483DE0(a1, a2, &coli->bone1_pos, radius); + + float_t v20; + vec3_length_squared(v11, v20); + float_t v22 = fabsf(v20 - v17 * v17 / v19); + if (v22 <= 0.000001f || v22 >= radius * radius) + return 0; + + vec3 v29; + vec3_mult_scalar(coli->bone_pos_diff, v17 / v19, v29); + vec3_sub(v11, v29, v29); + vec3_mult_scalar(v29, radius / sqrtf(v22) - 1.0f, *a1); + return 1; +} + +static int32_t sub_1404844A0(vec3* a1, vec3* a2, vec3* a3, osage_coli* a4, float_t radius) { + vec3 v8; + sub_140484850(&v8, a2, a3, a4); + return sub_140484540(a1, &v8, a4, radius); +} + +static int32_t sub_140483EA0(vec3* a1, vec3* a2, osage_coli* a3, float_t radius) { + if (a3->bone_pos_diff_length <= 0.000001f) + return sub_140483DE0(a1, a2, &a3->bone0_pos, radius); + + float_t v61 = a3->bone_pos_diff_length * 0.5f; + float_t v13 = sqrtf(radius * radius + v61 * v61); + + float_t v20; + vec3 v54; + vec3_sub(*a2, a3->bone0_pos, v54); + vec3_length(v54, v20); + + float_t v21; + vec3 v57; + vec3_sub(*a2, a3->bone1_pos, v57); + vec3_length(v57, v21); + + if (v20 <= 0.000001f || v21 <= 0.000001f) + return 0; + + float_t v22 = v20 + v21; + if (v21 + v20 >= v13 * 2.0f) + return 0; + + float_t v25 = 1.0f / a3->bone_pos_diff_length; + + vec3 v63; + vec3_add(a3->bone0_pos, a3->bone1_pos, v63); + vec3_mult_scalar(v63, 0.5f, v63); + vec3_sub(*a2, v63, v63); + + float_t v58; + vec3_length(v63, v58); + if (v58 != 0.0f) + vec3_mult_scalar(v63, 1.0f / v58, v63); + + float_t v36; + vec3_dot(v63, a3->bone_pos_diff, v36); + v36 *= v25; + float_t v37 = v36 * v36; + v37 = min(v37, 1.0f); + v22 *= 0.5f; + float_t v38 = v22 * v22 - v61; + if (v38 < 0.0f) + return 0; + + float_t v39 = sqrtf(v38); + if (v39 <= 0.000001f) + return 0; + + float_t v42 = sqrtf(1.0f - v37); + v22 = (v13 / v22 - 1.0f) * v36 * v58; + v42 = (radius / v39 - 1.0f) * v42 * v58; + float_t v43 = sqrtf(v42 * v42 + v22 * v22); + if (v20 != 0.0f) + vec3_mult_scalar(v54, 1.0f / v20, v54); + + if (v21 != 0.0f) + vec3_mult_scalar(v57, 1.0f / v21, v57); + + vec3 v48; + vec3_add(v54, v57, v48); + vec3_normalize(v48, v48); + vec3_mult_scalar(v48, v43, *a1); + return 1; +} + +static int32_t sub_1404844F0(vec3* a1, vec3* a2, vec3* a3, osage_coli* a4, float_t radius) { + vec3 v8; + sub_140484850(&v8, a2, a3, a4); + return sub_140483EA0(a1, &v8, a4, radius); +} + +static int32_t sub_140485000(vec3* a1, vec3* a2, skin_param_osage_node* a3, osage_coli* a4) { + if (!a4) + return 0; + + int32_t v8 = 0; + while (a4->type) { + int32_t type = a4->type; + vec3 v21 = vec3_null; + switch (a4->type) { + case 1: { + vec3 v22 = a4->bone0_pos; + float_t v23 = a3->coli_r + a4->radius; + v8 += sub_140484450(&v21, a1, a2, &v22, &v23); + } break; + case 2: + v8 += sub_1404844A0(&v21, a1, a2, a4, a3->coli_r + a4->radius); + break; + case 4: + v8 += sub_1404844F0(&v21, a1, a2, a4, a3->coli_r + a4->radius); + break; + } + + if (v8 > 0) { + vec3_add(*a1, v21, *a1); + vec3_add(*a2, v21, *a2); + } + a4++; + } + return v8; +} + +static void osage_coli_set(osage_coli* osg_coli, skin_param_osage_root_coli* skp_root_coli, mat4* mats) { + osg_coli->type = 0; + if (!skp_root_coli || !mats) + return; + + 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_transpose(&mat, &mat); + 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_transpose(&mat, &mat); + 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; + } + 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_skin_param_osage_root_coli* vec_skp_root_coli, mat4* mats) { + if (vec_skp_root_coli->begin == vec_skp_root_coli->end) { + osg_coli->type = 0; + osg_coli->radius = 0.0f; + osg_coli->bone0_pos = vec3_null; + osg_coli->bone1_pos = vec3_null; + osg_coli->bone_pos_diff = vec3_null; + osg_coli->bone_pos_diff_length = 0.0f; + osg_coli->bone_pos_diff_length_squared = 0.0f; + osg_coli->field_34 = 1.0f; + } + else + osage_coli_set(osg_coli, vec_skp_root_coli->begin, mats); +} + +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); + osage_coli_ring_set(rob_osg->coli_ring, &rob_osg->ring.skp_root_coli, mats); +} + +static int32_t sub_140484780(vec3* a1, vec3* a2, vec3* a3, vec3* a4, float_t a5) { + float_t v5; + float_t v6; + vec3_dot(*a2, *a4, v5); + vec3_dot(*a3, *a4, v6); + v5 -= v6; + v5 -= a5; + if (v5 >= 0.0f) + return 0; + vec3_mult_scalar(*a4, -v5, *a1); + return 1; +} + +static int32_t sub_140483B30(vec3* a1, vec3* a2, osage_coli* a3, float_t radius) { + vec3 bone_pos_diff; + vec3_add(a3->bone0_pos, a3->bone1_pos, bone_pos_diff); + + vec3 v29; + vec3 v30; + for (int32_t i = 0; i < 3; i++) { + float_t v13 = ((float_t*)a2)[i]; + float_t v14 = ((float_t*)&a3->bone0_pos)[i] - v13; + ((float_t*)&v30)[i] = v14; + if (v14 > radius) + return 0; + + v14 = v13 - ((float_t*)&bone_pos_diff)[i]; + ((float_t*)&v29)[i] = v14; + if (v14 > radius) + return 0; + } + + vec3 v28 = vec3_null; + vec3 v32 = vec3_null; + vec3 v27 = vec3_identity; + + float_t v16 = 0.0f; + for (int32_t i = 0; i < 3; i++) { + float_t v18 = ((float_t*)&v30)[i]; + float_t v19 = ((float_t*)&v29)[i]; + if (fabsf(v18) >= fabsf(v19)) { + ((float_t*)&v28)[i] = v19; + ((float_t*)&v27)[i] = 1.0f; + v18 = v19; + } + else { + ((float_t*)&v28)[i] = v18; + ((float_t*)&v27)[i] = -1.0f; + } + + if (v18 > 0.0f) { + float_t v20 = v18 * v18; + ((float_t*)&v32)[i] = v20; + v16 += v20; + } + } + + if (v16 > radius * radius) + return 0; + + if (v16 > 0.0f) { + vec3_mult(v27, v32, v32); + vec3_mult_scalar(v32, 1.0f / v16, v32); + vec3_mult_scalar(v32, radius - sqrtf(v16), *a1); + } + else { + float_t v25 = ((float_t*)&v28)[0]; + int32_t v26 = 0; + for (int32_t i = 0; i < 3; i++) { + if (((float_t*)&v28)[i] > v25) { + v25 = ((float_t*)&v28)[i]; + v26 = i; + } + } + ((float_t*)a1)[v26] -= ((float_t*)&v27)[v26] * (v25 - radius); + } + return 1; +} + +static int32_t sub_140485220(vec3* a1, skin_param_osage_node* a2, osage_coli* coli, float_t* a4){ + if (!coli) + return 0; + + int32_t v8 = 0; + for (osage_coli* v9 = coli; v9->type; v9++) { + int32_t v11 = 0; + vec3 v31 = vec3_null; + switch (v9->type) { + case 1: + v11 = sub_140483DE0(&v31, a1, &v9->bone0_pos, v9->radius + a2->coli_r); + break; + case 2: + v11 = sub_140484540(&v31, a1, v9, v9->radius + a2->coli_r); + break; + case 3: + v11 = sub_140484780(&v31, a1, &v9->bone0_pos, &v9->bone1_pos, a2->coli_r); + break; + case 4: + v11 = sub_140483EA0(&v31, a1, v9, v9->radius + a2->coli_r); + break; + case 5: + v11 = sub_140483B30(&v31, a1, v9, a2->coli_r); + break; + } + + if (a4 && v11 > 0 && v9->field_34 < *a4) + *a4 = v9->field_34; + + vec3_add(*a1, v31, *a1); + v8 += v11; + } + return v8; +} + +static int32_t sub_1404851C0(vec3* a1, skin_param_osage_node* a2, vector_osage_coli* a3, float_t* a4) { + if (a3->begin == a3->end || a3->end[-1].type) + return 0; + + return sub_140485220(a1, a2, a3->begin, 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_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_osage_coli* ring_coli = &rob_osg->ring.coli; + bool v11 = rob_osg->field_1F0F; + for (rob_osage_node* 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, ring_coli, &i->field_CC); + if (v11) + continue; + + for (rob_osage_node** j = data->boc.begin; j != data->boc.end; j++) { + rob_osage_node* k = *j; + 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); + } +} + +static void sub_14047D620(rob_osage* rob_osg, float_t step) { + if (step < 0.0f && rob_osg->field_1F0F) + return; + + vector_rob_osage_node* nodes = &rob_osg->nodes; + vec3 v7 = nodes->begin[0].trans; + osage_coli* coli = rob_osg->coli; + osage_coli* coli_ring = rob_osg->coli_ring; + for (rob_osage_node* 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++) { + rob_osage_node* v15 = *j; + float_t v17 = (float_t)( + sub_140485000(&v10->trans, &v15->trans, &v11->skp_osg_node, coli) + + sub_140485000(&v10->trans, &v15->trans, &v11->skp_osg_node, coli_ring)); + v10->field_C8 += v17; + v15->field_C8 += v17; + } + + int32_t v18 = rob_osg->skin_param_ptr->coli_type; + if (v18 && (v18 != 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)); + v10[0].field_C8 += v20; + v10[-1].field_C8 += v20; + } + } + nodes->begin[0].trans = v7; +} + +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) + return; + + osage_coli* coli = rob_osg->coli; + osage_coli* coli_ring = rob_osg->coli_ring; + vector_osage_coli* vec_ring_coli = &rob_osg->ring.coli; + + float_t v9 = 0.0f; + if (step > 0.0f) + v9 = 1.0f / step; + + mat4 v64; + if (a5) + v64 = *rob_osg->nodes.begin[0].bone_node_mat; + else { + v64 = *mat; + + vec3 trans; + vec3_mult(rob_osg->exp_data.position, *parent_scale, trans); + mat4_transpose(&v64, &v64); + mat4_mult_vec3_trans(&v64, &trans, &rob_osg->nodes.begin[0].trans); + mat4_transpose(&v64, &v64); + sub_14047F110(rob_osg, &v64, parent_scale, 0); + } + mat4_transpose(&v64, &v64); + + float_t v60 = -1000.0f; + if (a5) { + float_t v22; + rob_osage_node* v16 = &rob_osg->nodes.begin[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 + || v16->trans.x > rob_osg->ring.ring_rectangle_x + rob_osg->ring.ring_rectangle_width + || v16->trans.z > rob_osg->ring.ring_rectangle_y + rob_osg->ring.ring_rectangle_height) + v22 = rob_osg->ring.ring_out_height; + else + v22 = rob_osg->ring.ring_height; + v60 = v22 + v18; + } + + float_t v23 = 0.2f; + if (step < 1.0f) + v23 = 0.2f / (2.0f - step); + + if (rob_osg->skin_param_ptr->colli_tgt_osg) { + vector_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++) { + vec3 v62 = vec3_null; + for (rob_osage_node* 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++) { + 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); + 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); + } + sub_140482180(v35, v60); + } + else + sub_140482F30(v38, &v35[-1].trans, v35->length * parent_scale->x); + + vec3 v63; + mat4_mult_vec3_inv_trans(&v64, v38, &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; + mat4_transpose(&v64, &v64); + + if (v35->bone_node_mat) { + mat4* v41 = v35->bone_node_mat; + mat4_scale_rot(&v64, parent_scale->x, parent_scale->y, parent_scale->z, v41); + mat4_transpose(v41, v41); + } + + float_t v42 = v35->length * parent_scale->x; + float_t v44; + bool v45; + vec3_distance_squared(*v38, v35[-1].trans, v44); + if (v44 >= v42 * v42) { + v42 = sqrtf(v44); + v45 = false; + } + else + v45 = true; + + mat4_translate_mult(&v64, v42, 0.0f, 0.0f, &v64); + v35->field_A0.field_24 = v42; + if (v40 || v45) + mat4_get_translation(&v64, v38); + + vec3 v62; + vec3_sub(*v38, v35->trans_orig, v62); + vec3_mult_scalar(v62, v9, v35->trans_diff); + + if (v35->field_C8 > 0.0f) { + if (v35->field_CC < v37) + v37 = v35->field_CC; + vec3_mult_scalar(v35->trans_diff, v37, v35->trans_diff); + } + + float_t v55; + vec3_length_squared(v35->trans_diff, v55); + if (v55 > v23 * v23) + vec3_mult_scalar(v35->trans_diff, v23 / sqrtf(v55), v35->trans_diff); + + 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); + } + + 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; + 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; + 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; + } +} + +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; + } + + vec3 v4 = *a2; + size_t v7 = rob_osg->field_298; + size_t v8 = 0; + if (v7 >= 4) { + float_t v9 = a3 * a3 * a3 * a3; + size_t v10 = ((v7 - 4ULL) >> 2) + 1; + v8 = 4 * v10; + for (; v10; v10--) + vec3_mult_scalar(v4, v9, v4); + } + + if (v8 < v7) + for (size_t v12 = v7 - v8; v12; v12--) + 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; + vec3_mult_scalar(v4, a3, v4); + } +} + +static void rob_osage_set_nodes_force(rob_osage* rob_osg, float_t a2) { + for (rob_osage_node* i = rob_osg->nodes.begin + 1; i != rob_osg->nodes.end; i++) + i->force = a2; +} + +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_force(rob_osg, 1.0f); + rob_osg->field_1F78 = 0; + rob_osg->field_1F7C = vec3_null; + } + + for (rob_osage_node* v6 = rob_osg->nodes.begin; v6 != rob_osg->nodes.end; v6++) { + v6->field_C8 = 0.0f; + v6->field_CC = 1.0f; + } + + 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->field_1F0E = false; + mat4_to_mat4u(rob_osg->parent_mat_ptr, &rob_osg->parent_mat); +} + +void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3) { + float_t(*get_delta_frame)() = (void*)0x0000000140192D50; + + 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) + step = 1.0f; + + bone_node* parent_node = osg->base.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(&osg->rob, parent_node_mat, &parent_scale, osg->base.field_5A); + break; + case 1: + case 2: + if ((a2 == 1 && osg->base.field_58) || (a2 == 2 && osg->rob.field_2A0)) { + ex_osage_block_set_wind_direction(osg); + sub_14047C800(&osg->rob, parent_node_mat, &parent_scale, step, a3, true, osg->base.field_5A); + } + break; + case 3: + rob_osage_coli_set(&osg->rob, osg->mat); + sub_14047ECA0(&osg->rob, step); + break; + case 4: + sub_14047D620(&osg->rob, step); + break; + case 5: + sub_14047D8C0(&osg->rob, parent_node_mat, &parent_scale, step, false); + sub_140480260(&osg->rob, parent_node_mat, &parent_scale, step, a3); + osg->base.field_59 = true; + break; + } +} + +static void sub_14047C770(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, float_t step, bool a5) { + sub_14047C800(rob_osg, mat, parent_scale, step, a5, false, false); + sub_14047D8C0(rob_osg, mat, parent_scale, step, true); + sub_140480260(rob_osg, mat, parent_scale, step, a5); +} + +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); +} + +void ex_osage_block_update(ex_osage_block* osg) { + osg->field_1FF8 &= ~2; + if (osg->base.field_59) { + osg->base.field_59 = false; + return; + } + + float_t(*get_delta_frame) () = (void*)0x0000000140192D50; + void (*_sub_14047C750)(rob_osage * rob_osg, mat4 * mat, + vec3 * parent_scale, float_t step) = (void*)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) + step = 1.0f; + + bone_node* parent_node = osg->base.parent_bone_node; + vec3 parent_scale = parent_node->exp_data.parent_scale; + vec3 scale = parent_node->exp_data.scale; + + mat4 mat = *parent_node->ex_data_mat; + if (scale.x != 1.0f || scale.y != 1.0f || scale.z != 1.0f) { + vec3_div(vec3_identity, scale, scale); + mat4_transpose(&mat, &mat); + mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat); + mat4_transpose(&mat, &mat); + } + 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); +} + +void ex_osage_block_field_28(ex_osage_block* osg) { + void (*sub_14047E240) (rob_osage * a1, mat4 * a2, vec3 * a3, vector_struc_373 * a4) = (void*)0x000000014047E240; + + 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; + sub_14047E240(&osg->rob, parent_node->ex_data_mat, &parent_scale, &rob_itm_equip->field_940); +} + +void ex_osage_block_draw(ex_osage_block* osg) { + +} + +void ex_osage_block_reset(ex_osage_block* osg) { + osg->index = 0; + rob_osage_init(&osg->rob); + osg->field_1FF8 &= ~3; + osg->mat = 0; + osg->step = 1.0f; + osg->base.bone_node = 0; +} + +void ex_osage_block_field_40(ex_osage_block* osg) { + +} + +void ex_osage_block_field_48(ex_osage_block* osg) { + void (*sub_14047F990) (rob_osage * a1, mat4 * a2, vec3 * a3, bool a4) = (void*)0x000000014047F990; + + osg->step = 4.0f; + ex_osage_block_set_wind_direction(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; + sub_14047F990(&osg->rob, parent_node->ex_data_mat, &parent_scale, false); + osg->field_1FF8 &= ~2; +} + +void ex_osage_block_field_50(ex_osage_block* osg) { + if (osg->base.field_59) { + osg->base.field_59 = 0; + return; + } + + void (*sub_14047C770) (rob_osage * rob_osg, mat4 * mat, + vec3 * parent_scale, float_t step, bool a5) = (void*)0x000000014047C770; + + ex_osage_block_set_wind_direction(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); + 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); +} + +void ex_osage_block_field_58(ex_osage_block* osg) { + void (*sub_14047E1C0) (rob_osage * a1, vec3 * a2) = (void*)0x000000014047E1C0; + + bone_node* parent_node = osg->base.parent_bone_node; + vec3 parent_scale = parent_node->exp_data.parent_scale; + sub_14047E1C0(&osg->rob, &parent_scale); +} diff --git a/src/DivaGL/bone_data.h b/src/DivaGL/bone_data.h index 6ea2441e..4a55f82c 100644 --- a/src/DivaGL/bone_data.h +++ b/src/DivaGL/bone_data.h @@ -626,7 +626,7 @@ typedef struct list_ptr_##t { \ size_t size; \ } list_ptr_##t; -#define tree_def(t1, t2) \ +#define tree_def(t) \ typedef struct tree_##t##_node tree_##t##_node; \ \ struct tree_##t##_node { \ @@ -643,7 +643,7 @@ typedef struct tree_##t { \ size_t size; \ } tree_##t; -#define tree_ptr(t1, t2) \ +#define tree_ptr(t) \ typedef struct tree_ptr_##t##_node tree_ptr_##t##_node; \ \ struct tree_ptr_##t##_node { \ @@ -729,7 +729,7 @@ typedef struct aft_bone_database_skeleton { int32_t field_34; char** motion_bone_names; uint16_t* parent_indices; - int32_t ex_data_mat; + int32_t field_48; int32_t field_4C; int32_t field_50; int32_t field_54; @@ -744,16 +744,16 @@ typedef struct aft_bone_database_struct { char** skeleton_names; } aft_bone_database_struct; -typedef struct rob_chara_data rob_chara_data; -typedef struct rob_chara_data_bone_data rob_chara_data_bone_data; -typedef struct rob_chara_data_item_equip rob_chara_data_item_equip; +typedef struct rob_chara rob_chara; +typedef struct rob_chara_bone_data rob_chara_bone_data; +typedef struct rob_chara_item_equip rob_chara_item_equip; typedef struct bone_node bone_node; typedef struct bone_node_expression_data { vec3 position; vec3 rotation; vec3 scale; - vec3 data_scale; + vec3 parent_scale; } bone_node_expression_data; typedef struct bone_node { @@ -849,7 +849,7 @@ tree_pair(int32_t, int32_t) list_ptr(void) -typedef struct struc_288 { +typedef struct rob_chara_item_sub_data { chara_index chara_index; int32_t field_4; request_data_object_data field_8; @@ -860,34 +860,64 @@ typedef struct struc_288 { list_ptr_void field_100; struc_298 field_110[31]; tree_pair_int32_t_int32_t field_3F8; -} struc_288; +} rob_chara_item_sub_data; -typedef struct struc_264 { - uint8_t field_0; +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 field_C; + uint8_t field_10; +} struc_524; + +typedef struct struc_523 { + uint8_t field_0; + uint8_t field_1; + int32_t field_4; + uint8_t field_8; + uint8_t field_9; int32_t field_C; int32_t field_10; - uint8_t field_14; + int32_t field_14; int32_t field_18; int32_t field_1C; int32_t field_20; int32_t field_24; - uint8_t field_28; + int32_t field_28; int32_t field_2C; int32_t field_30; int32_t field_34; int32_t field_38; - uint8_t field_3C; + int32_t field_3C; int32_t field_40; int32_t field_44; - int32_t ex_data_mat; + int32_t field_48; int32_t field_4C; uint8_t field_50; int32_t field_54; - int64_t field_58; - int32_t field_60; - uint8_t field_64; + list_ptr_void field_58; + int64_t field_68; + int64_t field_70; + int64_t field_78; + int32_t field_80; +} struc_523; + +typedef struct struc_526 { + int32_t field_0; + int32_t field_4; +} struc_526; + +typedef struct struc_264 { + uint8_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; @@ -909,34 +939,7 @@ typedef struct struc_264 { int32_t field_AC; int32_t field_B0; uint8_t eyes_adjust; - int32_t field_B8; - int32_t field_BC; - int16_t field_C0; - int32_t field_C4; - float_t field_C8; - float_t field_CC; - float_t field_D0; - 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; - list_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; - int32_t field_138; - int32_t field_13C; + struc_523 field_B8; int32_t field_140; uint8_t field_144; uint8_t field_145; @@ -972,8 +975,7 @@ 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; uint8_t field_1C8; uint8_t field_1C9; uint8_t field_1CA; @@ -982,18 +984,24 @@ typedef struct struc_264 { int32_t field_1D4; } struc_264; +typedef struct rob_sub_action rob_sub_action; + +typedef struct rob_sub_action_vtbl { + void(*dispose)(rob_sub_action*, bool); +} rob_sub_action_vtbl; + typedef struct rob_sub_action_execute rob_sub_action_execute; typedef struct rob_sub_action_execute_vftable { 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_data*); - void(*field_20)(rob_sub_action_execute*, rob_chara_data*); + void(*field_18)(rob_sub_action_execute*, rob_chara*); + void(*field_20)(rob_sub_action_execute*, rob_chara*); } rob_sub_action_execute_vftable; struct rob_sub_action_execute { - rob_sub_action_execute_vftable* vftable; + rob_sub_action_execute_vftable* __vftable; rob_sub_action_execute_type type; int32_t field_C; }; @@ -1031,30 +1039,40 @@ typedef struct rob_sub_action_param { rob_sub_action_param_type type; } rob_sub_action_param; -typedef struct rob_sub_action { - void** dispose; +typedef struct rob_sub_action_data { + rob_sub_action_execute* field_0; rob_sub_action_execute* field_8; - rob_sub_action_execute* field_10; - rob_sub_action_param* field_18; - rob_sub_action_execute* field_20; + 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; +} rob_sub_action_data; + +struct rob_sub_action { + rob_sub_action_vtbl* __vftable; + rob_sub_action_data data; +}; typedef struct struc_389 { - float_t field_0; + float_t frame; + float_t prev_frame; + float_t last_frame; +} struc_389; + +typedef struct struc_406 { + float_t frame; float_t field_4; float_t field_8; -} struc_389; +} struc_406; typedef struct rob_partial_motion rob_partial_motion; typedef struct rob_partial_motion_vtbl { - void(*dispose)(rob_partial_motion*); + void(*dispose)(rob_partial_motion*, bool); void(*field_8)(void*); } rob_partial_motion_vtbl; @@ -1101,7 +1119,7 @@ typedef struct struc_269 { float_t field_4; float_t field_8; vec3 field_C; - float_t field_18; + float_t force; float_t field_1C; int32_t field_20; int32_t field_24; @@ -1154,87 +1172,51 @@ typedef struct aft_object_info { uint16_t set_id; } aft_object_info; +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; + aft_object_info field_1B0; + aft_object_info field_1B4; + aft_object_info field_1B8; + aft_object_info field_1BC; + int32_t field_1C0; + float_t field_1C4; +} struc_405; + typedef struct struc_268 { - int32_t field_0; - int32_t field_4; + int32_t motion_id; + int32_t prev_motion_id; struc_389 field_8; - struc_389 step; - float_t osage_phys_step; + struc_406 field_14; + float_t step; int32_t field_24; uint8_t field_28; uint8_t field_29; uint8_t field_2A; int32_t field_2C; int32_t field_30; - int64_t field_38; - int64_t field_40; - int64_t ex_data_mat; - 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; + int32_t field_34; + 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; int32_t field_14C; - rob_face_motion field_150; - rob_hand_motion field_198; - rob_hand_motion field_1E0; - rob_mouth_motion field_228; - rob_eyes_motion field_270; - rob_eyelid_motion field_2B8; - aft_object_info field_300; - aft_object_info field_304; - aft_object_info field_308; - aft_object_info field_30C; - int32_t field_310; - float_t field_314; + struc_405 field_150; rob_hand_motion field_318; rob_hand_motion field_360; aft_object_info field_3A8; aft_object_info field_3AC; - rob_face_motion field_3B0; - rob_hand_motion field_3F8; - rob_hand_motion field_440; - rob_mouth_motion field_488; - rob_eyes_motion field_4D0; - rob_eyelid_motion field_518; - aft_object_info field_560; - aft_object_info field_564; - aft_object_info field_568; - aft_object_info field_56C; - float_t field_570; + struc_405 field_3B0; struc_269 field_578[13]; struc_269 field_B28[13]; - struc_269 field_10D8; - struc_269 field_1148; + struc_269 field_10D8[2]; struc_229 field_11B8[2]; struc_229 field_1240[2]; struc_222 field_12C8[2]; @@ -1290,7 +1272,7 @@ typedef struct struc_306 { int32_t field_3C; int32_t field_40; int32_t field_44; - int32_t ex_data_mat; + int32_t field_48; } struc_306; typedef struct struc_223 { @@ -1439,7 +1421,7 @@ typedef struct struc_399 { int32_t field_3C; int32_t field_40; int32_t field_44; - vec3 ex_data_mat; + vec3 field_48; vec3 field_54; int32_t field_60; int32_t field_64; @@ -1448,10 +1430,10 @@ typedef struct struc_399 { } struc_399; typedef struct struc_220 { - float_t scale; - uint8_t field_4; + float_t size; + bool height_adjust; float_t field_8; - vec3 field_C; + vec3 pos_adjust; float_t field_18; float_t field_1C; float_t field_20; @@ -1511,7 +1493,7 @@ typedef struct struc_209 { int32_t field_3C; int32_t field_40; int32_t field_44; - int32_t ex_data_mat; + int32_t field_48; int32_t field_4C; int32_t field_50; int32_t field_54; @@ -1614,7 +1596,7 @@ typedef struct struc_209 { uint8_t field_1F26; } struc_209; -typedef struct struc_263 { +typedef struct rob_chara_data { bool field_0; uint8_t field_1; uint8_t field_2; @@ -1648,7 +1630,7 @@ typedef struct struc_263 { int32_t field_3DD8; float_t field_3DDC; uint8_t field_3DE0; -} struc_263; +} rob_chara_data; typedef struct struc_242 { int32_t field_0; @@ -1693,7 +1675,7 @@ typedef struct rob_chara_pv_data { int32_t field_94; int32_t field_98; int32_t field_9C; - uint8_t field_A0; + bool height_adjust; int32_t field_A4[4]; eyes_adjust eyes_adjust; } rob_chara_pv_data; @@ -1747,7 +1729,7 @@ typedef struct struc_307 { int16_t field_1C; int16_t field_1E; int64_t field_20; - rob_chara_data_bone_data* field_28; + rob_chara_bone_data* field_28; } struc_307; typedef struct struc_218 { @@ -1783,7 +1765,7 @@ typedef struct chara_init_data { int32_t field_3C; int32_t field_40; int32_t field_44; - int32_t ex_data_mat; + int32_t field_48; int32_t field_4C; int32_t field_50; int32_t field_54; @@ -2301,11 +2283,11 @@ typedef struct chara_init_data { } chara_init_data; typedef struct rob_detail { - rob_chara_data* field_8; - struc_263* field_10; + rob_chara* field_8; + rob_chara_data* field_10; } rob_detail; -struct rob_chara_data { +struct rob_chara { uint8_t chara_id; uint8_t field_1; uint8_t field_2; @@ -2320,11 +2302,11 @@ struct rob_chara_data { int32_t field_18; float_t field_1C; struc_307* field_20; - rob_chara_data_bone_data* bone_data; - rob_chara_data_item_equip* item_equip; - struc_288 field_38; - struc_263 field_440; - struc_263 field_4228; + rob_chara_bone_data* bone_data; + rob_chara_item_equip* item_equip; + rob_chara_item_sub_data item_sub_data; + rob_chara_data data; + rob_chara_data data_prev; chara_init_data* chara_init_data; rob_detail* rob_detail; rob_chara_pv_data pv_data; @@ -2538,7 +2520,7 @@ typedef struct struc_243 { typedef struct struc_258 { vector_bone_data* field_0; mat4u field_8; - struc_241 ex_data_mat; + struc_241 field_48; uint8_t field_8C; uint8_t field_8D; uint8_t field_8E; @@ -2610,7 +2592,7 @@ typedef struct struc_312 { } struc_312; typedef struct bone_data_parent { - rob_chara_data_bone_data* rob_bone_data; + rob_chara_bone_data* rob_bone_data; bool field_8; bool field_9; size_t motion_bone_count; @@ -2632,7 +2614,7 @@ typedef struct struc_370 { bool field_34; float_t field_38; float_t* field_40; - float_t* ex_data_mat; + float_t* field_48; } struc_370; typedef struct struc_308 { @@ -2671,14 +2653,14 @@ vector_ptr(motion_blend_mot) list_ptr(motion_blend_mot) list(size_t) -typedef struct rob_chara_data_bone_data_ik_scale { +typedef struct rob_chara_bone_data_ik_scale { float_t ratio0; float_t ratio1; float_t ratio2; float_t ratio3; -} rob_chara_data_bone_data_ik_scale; +} rob_chara_bone_data_ik_scale; -struct rob_chara_data_bone_data { +struct rob_chara_bone_data { uint8_t field_0; uint8_t field_1; size_t object_bone_count; @@ -2702,7 +2684,7 @@ struct rob_chara_data_bone_data { mot_blend eye; mot_blend eyelid; uint8_t field_758; - rob_chara_data_bone_data_ik_scale ik_scale; + rob_chara_bone_data_ik_scale ik_scale; vec3 field_76C; vec3 field_778; int32_t field_784; @@ -2741,7 +2723,7 @@ typedef struct aft_obj_skin_block_osage { int32_t external_name_index; int32_t name_index; aft_obj_skin_block_osage_node* nodes; - int32_t ex_data_mat; + int32_t field_48; int32_t field_4C; int32_t field_50; int32_t field_54; @@ -2798,7 +2780,7 @@ typedef struct aft_obj_skin_block_cloth { struc_251* field_20; uint16_t* field_24; uint16_t* field_28; - int64_t ex_data_mat; + int64_t field_48; uint32_t field_30; uint32_t field_54; } aft_obj_skin_block_cloth; @@ -2865,7 +2847,7 @@ typedef struct aft_obj_skin_block { }; } aft_obj_skin_block; -typedef struct rob_chara_data_item_equip_object rob_chara_data_item_equip_object; +typedef struct rob_chara_item_equip_object rob_chara_item_equip_object; typedef struct ex_node_block ex_node_block; typedef struct ex_node_block_vtbl { @@ -2873,10 +2855,10 @@ typedef struct ex_node_block_vtbl { void(*field_8)(ex_node_block*); void(*field_10)(ex_node_block*); void(*field_18)(ex_node_block*, int64_t, int64_t); - void(*field_20)(ex_node_block*); + void(*update)(ex_node_block*); void(*field_28)(ex_node_block*); - void* (*field_30)(ex_node_block*); - void(*field_38)(ex_node_block*); + void(*draw)(ex_node_block*); + void(*reset)(ex_node_block*); void(*field_40)(ex_node_block*); void(*field_48)(ex_node_block*); void(*field_50)(ex_node_block*); @@ -2887,12 +2869,11 @@ struct ex_node_block { ex_node_block_vtbl* __vftable; bone_node* bone_node; ex_node_type type; - int32_t field_14; char* name; bone_node* parent_bone_node; string parent_name; ex_node_block* parent_node; - rob_chara_data_item_equip_object* field_50; + rob_chara_item_equip_object* item_equip_object; bool field_58; bool field_59; bool field_5A; @@ -2905,16 +2886,15 @@ typedef struct ex_null_block { typedef struct rob_osage_node rob_osage_node; -typedef struct struc_419 { +typedef struct rob_osage_node_data_normal_ref { bool field_0; - int32_t field_4; - rob_osage_node* field_8; - rob_osage_node* field_10; - rob_osage_node* field_18; - rob_osage_node* field_20; - rob_osage_node* field_28; - mat4u field_30; -} struc_419; + rob_osage_node* n; + rob_osage_node* u; + rob_osage_node* d; + rob_osage_node* l; + rob_osage_node* r; + mat4u mat; +} rob_osage_node_data_normal_ref; typedef struct skin_param_hinge { float_t ymin; @@ -2930,12 +2910,12 @@ typedef struct skin_param_osage_node { skin_param_hinge hinge; } skin_param_osage_node; +vector_ptr(rob_osage_node) + typedef struct rob_osage_node_data { float_t force; - int64_t field_8; - int64_t field_10; - int64_t field_18; - struc_419 field_20; + vector_ptr_rob_osage_node boc; + rob_osage_node_data_normal_ref normal_ref; skin_param_osage_node skp_osg_node; } rob_osage_node_data; @@ -2947,63 +2927,75 @@ typedef struct struc_331 { vector(struc_331) +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 struc_479 { + vec3 trans; + vec3 trans_diff; + vec3 rotation; + float_t field_24; +} struc_479; + struct rob_osage_node { float_t length; - vec3 field_4; - vec3 field_10; - vec3 field_1C; - int32_t field_28; - int32_t field_2C; - int32_t field_30; - float_t field_34; - bone_node* field_38; - mat4u* field_40; - mat4u ex_data_mat; - float_t field_88; - float_t field_8C; - float_t field_90; + vec3 trans; + vec3 trans_orig; + vec3 trans_diff; + vec3 field_28; + float_t child_length; + bone_node* bone_node; + mat4* bone_node_mat; + mat4u mat; + rob_osage_node* sibling_node; + float_t distance; vec3 field_94; - int64_t field_A0; - int64_t field_A8; - int64_t field_B0; - int64_t field_B8; - int64_t field_C0; - int32_t field_C8; + struc_479 field_A0; + float_t field_C8; float_t field_CC; vec3 field_D0; - int32_t field_DC; - rob_osage_node_data* field_E0; - rob_osage_node_data field_E8; - int32_t field_194; + float_t force; + rob_osage_node_data* data_ptr; + rob_osage_node_data data; vector_struc_331 field_198; - int32_t field_1B0; - int32_t field_1B4; - int32_t field_1B8; - int32_t field_1BC; - int32_t field_1C0; - int32_t field_1C4; - int32_t field_1C8; - int32_t field_1CC; + struc_476 field_1B0; }; vector(rob_osage_node) +typedef struct skin_param_osage_root_coli { + 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(skin_param_osage_root_coli) + typedef struct skin_param { - int64_t field_0; - int64_t field_8; - int64_t field_10; - int64_t field_18; - int64_t field_20; - int64_t field_28; - int64_t field_30; - int64_t field_38; - int64_t field_40; - int32_t ex_data_mat; - vec4u field_4C; - int32_t field_5C; - int32_t field_60; - int32_t field_64; - int64_t field_68; + vector_skin_param_osage_root_coli coli; + float_t friction; + float_t wind_afc; + float_t air_res; + vec3 rot; + vec3 init_rot; + int32_t coli_type; + float_t stiffness; + float_t move_cancel; + float_t coli_r; + skin_param_hinge hinge; + float_t force; + float_t force_gain; + vector_rob_osage_node* colli_tgt_osg; } skin_param; typedef struct osage_coli { @@ -3017,16 +3009,52 @@ typedef struct osage_coli { float_t field_34; } osage_coli; +vector(osage_coli) + +typedef struct osage_ring_data { + float_t ring_rectangle_x; + float_t ring_rectangle_y; + float_t ring_rectangle_width; + float_t ring_rectangle_height; + float_t ring_height; + float_t ring_out_height; + bool field_18; + vector_osage_coli coli; + vector_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; + +tree_def(struc_478) + +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; +}; + +typedef struct list_struc_479 { + list_struc_479_node* head; + size_t size; +} list_struc_479; + typedef struct rob_osage { - skin_param* field_0; - bone_node_expression_data field_8; - vector_rob_osage_node field_38; - rob_osage_node field_50; - skin_param field_220; + skin_param* skin_param_ptr; + bone_node_expression_data exp_data; + vector_rob_osage_node nodes; + rob_osage_node node; + skin_param skin_param; int32_t field_290; int64_t field_298; - uint8_t field_2A0; - uint8_t field_2A1; + bool field_2A0; + bool field_2A1; float_t field_2A4; osage_coli coli[64]; osage_coli coli_ring[64]; @@ -3034,40 +3062,27 @@ typedef struct rob_osage { float_t field_1EB4; int32_t field_1EB8; int32_t field_1EBC; - mat4* field_1EC0; - mat4u field_1EC8; - float_t field_1F08; + mat4* parent_mat_ptr; + mat4u parent_mat; + float_t move_cancel; bool field_1F0C; - bool field_1F0D; + bool wind_reset; bool field_1F0E; bool field_1F0F; - float_t field_1F10; - float_t field_1F14; - float_t field_1F18; - float_t field_1F1C; - float_t field_1F20; - float_t field_1F24; - bool field_1F28; - int64_t field_1F30; - int64_t field_1F38; - int64_t field_1F40; - int64_t field_1F48; - int64_t field_1F50; - int64_t field_1F58; - int64_t field_1F60; - int64_t field_1F68; - int64_t field_1F70; - uint8_t field_1F78; + osage_ring_data ring; + tree_struc_478 field_1F60; + list_struc_479* field_1F70; + bool field_1F78; vec3 field_1F7C; } rob_osage; typedef struct ex_osage_block { ex_node_block base; - int64_t field_60; + size_t index; rob_osage rob; mat4* mat; int32_t field_1FF8; - float_t field_1FFC; + float_t step; } ex_osage_block; typedef struct ex_constraint_block { @@ -3156,7 +3171,7 @@ typedef struct cloth_vftable { void(*field_30)(void*); void(*field_38)(void*); void(*field_40)(void*); - void(*ex_data_mat)(void*); + void(*field_48)(void*); void(*field_50)(void*); void(*field_58)(void*); } cloth_vftable; @@ -3211,7 +3226,7 @@ struct cloth { int64_t field_30; vec3 field_38; float_t field_44; - uint8_t ex_data_mat; + uint8_t field_48; vec3 field_4C; vector_struc_341 field_58; skin_param* field_70; @@ -3379,7 +3394,7 @@ typedef struct aft_obj { uint32_t field_3C; uint32_t field_40; uint32_t field_44; - uint32_t ex_data_mat; + uint32_t field_48; uint32_t field_4C; uint32_t field_50; uint32_t field_54; @@ -3433,7 +3448,7 @@ typedef struct aft_obj_skin_ex_data { int64_t osage_sibling_infos; int32_t field_40; int32_t field_44; - int32_t ex_data_mat; + int32_t field_48; int32_t field_4C; int32_t field_50; int32_t field_54; @@ -3572,10 +3587,10 @@ typedef struct rob_cloth { int64_t field_1D40; int64_t field_1D48; int64_t field_1D50; - rob_chara_data_item_equip_object* field_1D58; + rob_chara_item_equip_object* field_1D58; struc_230* field_1D60; - aft_obj_skin_block_cloth* cloth_block; - float_t field_1D70; + aft_obj_skin_block_cloth* cls_data; + float_t move_cancel; uint8_t field_1D74; aft_obj_mesh field_1D78[2]; struc_332 field_1FD8[2]; @@ -3590,7 +3605,7 @@ typedef struct rob_cloth { typedef struct ex_cloth_block { ex_node_block base; rob_cloth rob; - aft_obj_skin_block_cloth* cloth_block; + aft_obj_skin_block_cloth* cls_data; mat4* field_2428; int64_t field_2430; } ex_cloth_block; @@ -3617,7 +3632,7 @@ typedef struct texture_data_struct { vec3 field_28; } texture_data_struct; -struct rob_chara_data_item_equip_object { +struct rob_chara_item_equip_object { size_t index; mat4* mat; aft_object_info object_info; @@ -3649,13 +3664,13 @@ struct rob_chara_data_item_equip_object { char field_1C8; aft_obj_skin_ex_data* skin_ex_data; aft_obj_skin* skin; - rob_chara_data_item_equip* item_equip; + rob_chara_item_equip* item_equip; }; -struct rob_chara_data_item_equip { +struct rob_chara_item_equip { bone_node* bone_nodes; mat4* matrices; - rob_chara_data_item_equip_object* item_equip_object; + rob_chara_item_equip_object* item_equip_object; int32_t field_18[31]; bool item_equip_range; int32_t first_item_equip_object; @@ -3671,9 +3686,9 @@ struct rob_chara_data_item_equip { int32_t field_DC; vec4u texture_color_coeff; float_t wet; - float_t field_F4; - uint8_t chara_color; - uint8_t field_F9; + float_t wind_strength; + bool chara_color; + bool npr_flag; mat4u mat; mat4u field_13C[30]; int32_t field_8BC; @@ -3700,7 +3715,7 @@ struct rob_chara_data_item_equip { int64_t field_920; int64_t field_928; int64_t field_930; - float_t osage_phys_step; + float_t step; uint8_t field_93C; vector_struc_373 field_940; uint8_t field_958; @@ -3710,8 +3725,22 @@ struct rob_chara_data_item_equip { extern void bone_data_mult_ik(bone_data* a1, int32_t a2); extern void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool solve_ik); -extern void bone_data_mult_2(rob_chara_data_bone_data* a1, mat4* a2); -extern void rob_chara_data_bone_data_motion_load(rob_chara_data_bone_data* a1, int32_t motion_id, int32_t a3); -extern void rob_chara_data_bone_data_interpolate(rob_chara_data_bone_data* a1); -extern void rob_chara_data_bone_data_update(rob_chara_data_bone_data* a1, mat4* a2); -extern void rob_chara_data_reset(rob_chara_data* a1, rob_chara_pv_data* a2); +extern void bone_data_mult_2(rob_chara_bone_data* a1, mat4* a2); +extern void rob_chara_bone_data_motion_load(rob_chara_bone_data* a1, int32_t motion_id, int32_t a3); +extern void rob_chara_bone_data_interpolate(rob_chara_bone_data* a1); +extern void rob_chara_bone_data_update(rob_chara_bone_data* a1, mat4* a2); +extern void rob_chara_reset(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_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_draw(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); +extern void ex_osage_block_field_48(ex_osage_block* osg); +extern void ex_osage_block_field_50(ex_osage_block* osg); +extern void ex_osage_block_field_58(ex_osage_block* osg); diff --git a/src/DivaGL/inject.c b/src/DivaGL/inject.c index 16d6b934..bacdae36 100644 --- a/src/DivaGL/inject.c +++ b/src/DivaGL/inject.c @@ -74,10 +74,25 @@ static patch_struct patch_data[] = { //{ (void*)0x000000014041CF50, (uint64_t)&rob_chara_data_bone_data_motion_load, }, //{ (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*)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*)0x00000001405F26F0, (uint64_t)&ex_osage_block_draw, }, + { (void*)0x00000001405F2640, (uint64_t)&ex_osage_block_reset, }, + { (void*)0x00000001405F2860, (uint64_t)&ex_osage_block_field_40, }, + { (void*)0x00000001405F4640, (uint64_t)&ex_osage_block_field_48, }, + { (void*)0x00000001405F4730, (uint64_t)&ex_osage_block_field_50, }, + { (void*)0x00000001405F48F0, (uint64_t)&ex_osage_block_field_58, }, }; static uint64_t shader_bind_func_orig_data[6]; +extern bool toggle1[10]; +extern bool toggle2[10]; + void inject_patches() { char buf[12]; buf[0] = 0x48; diff --git a/src/DivaGL/shader_table.c b/src/DivaGL/shader_table.c index 9ceea8ac..188229ed 100644 --- a/src/DivaGL/shader_table.c +++ b/src/DivaGL/shader_table.c @@ -95,7 +95,7 @@ void FASTCALL aft_shader_bind_tone_map(aft_shader* shader) { int32_t FASTCALL aft_shader_bind(aft_shader* shader, aft_shader_sub_enum name) { int32_t num_sub = shader->num_sub; int32_t subshader_index = 0; - if (num_sub <= 0) + if (num_sub < 1) return -1; for (aft_shader_sub* i = shader->subs; i->sub_name != name; i++) { diff --git a/src/KKdLib/a3da.c b/src/KKdLib/a3da.c index 9e104e50..ce7adb72 100644 --- a/src/KKdLib/a3da.c +++ b/src/KKdLib/a3da.c @@ -1514,13 +1514,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { vector_int32_t sort_index = vector_empty(int32_t); vector_int32_t sort_index1 = vector_empty(int32_t); - if (a->ambient.end - a->ambient.begin && a->format == A3DA_FORMAT_MGF) { + if (vector_length(a->ambient) && a->format == A3DA_FORMAT_MGF) { len = 7; memcpy(buf, "ambient", 7); off = len; vector_a3da_ambient* va = &a->ambient; - count = (int32_t)(va->end - va->begin); + count = (int32_t)vector_length(*va); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_ambient* a = &va->begin[sort_index.begin[i]]; @@ -1541,13 +1541,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->auth_2d.end - a->auth_2d.begin) { + if (vector_length(a->auth_2d)) { len = 7; memcpy(buf, "auth_2d", 7); off = len; vector_string* va2 = &a->auth_2d; - count = (int32_t)(va2->end - va2->begin); + count = (int32_t)vector_length(*va2); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { string* a2 = &va2->begin[sort_index.begin[i]]; @@ -1588,13 +1588,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { } } - if (a->camera_root.end - a->camera_root.begin) { + if (vector_length(a->camera_root) > 0) { len = 11; memcpy(buf, "camera_root", 11); off = len; vector_a3da_camera_root* vcr = &a->camera_root; - count = (int32_t)(vcr->end - vcr->begin); + count = (int32_t)vector_length(*vcr); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_camera_root* cr = &vcr->begin[sort_index.begin[i]]; @@ -1646,13 +1646,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->chara.end - a->chara.begin) { + if (vector_length(a->chara) > 0) { len = 5; memcpy(buf, "chara", 5); off = len; vector_a3da_chara* vc = &a->chara; - count = (int32_t)(vc->end - vc->begin); + count = (int32_t)vector_length(*vc); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_chara* c = &vc->begin[sort_index.begin[i]]; @@ -1669,13 +1669,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->curve.end - a->curve.begin) { + if (vector_length(a->curve) > 0) { len = 5; memcpy(buf, "curve", 5); off = len; vector_a3da_curve* vc = &a->curve; - count = (int32_t)(vc->end - vc->begin); + count = (int32_t)vector_length(*vc); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_curve* c = &vc->begin[sort_index.begin[i]]; @@ -1703,13 +1703,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { buf, off, "", 1, &d->model_transform, 0x1F); } - if (a->event.end - a->event.begin) { + if (vector_length(a->event) > 0) { len = 5; memcpy(buf, "event", 5); off = len; vector_a3da_event* ve = &a->event; - count = (int32_t)(ve->end - ve->begin); + count = (int32_t)vector_length(*ve); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_event* e = &ve->begin[sort_index.begin[i]]; @@ -1732,13 +1732,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->fog.end - a->fog.begin) { + if (vector_length(a->fog) > 0) { len = 3; memcpy(buf, "fog", 3); off = len; vector_a3da_fog* vf = &a->fog; - count = (int32_t)(vf->end - vf->begin); + count = (int32_t)vector_length(*vf); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_fog* f = &vf->begin[sort_index.begin[i]]; @@ -1761,7 +1761,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->light.end - a->light.begin) { + if (vector_length(a->light) > 0) { len = 5; memcpy(buf, "light", 5); off = len; @@ -1769,7 +1769,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { bool xhd = a->format == A3DA_FORMAT_XHD; vector_a3da_light* vl = &a->light; - count = (int32_t)(vl->end - vl->begin); + count = (int32_t)vector_length(*vl); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_light* l = &vl->begin[sort_index.begin[i]]; @@ -1849,13 +1849,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->m_object_hrc.end - a->m_object_hrc.begin) { + if (vector_length(a->m_object_hrc) > 0) { len = 8; memcpy(buf, "m_objhrc", 8); off = len; vector_a3da_m_object_hrc* vmoh = &a->m_object_hrc; - count = (int32_t)(vmoh->end - vmoh->begin); + count = (int32_t)vector_length(*vmoh); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_m_object_hrc* moh = &vmoh->begin[sort_index.begin[i]]; @@ -1868,7 +1868,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { off = len + len1 + len2; vector_a3da_object_instance* voi = &moh->instance; - count1 = (int32_t)(voi->end - voi->begin); + count1 = (int32_t)vector_length(*voi); key_val_get_lexicographic_order(&sort_index1, count1); for (int32_t j = 0; j < count; j++) { a3da_object_instance* oi = &voi->begin[sort_index1.begin[i]]; @@ -1907,7 +1907,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { off = len + len1 + len2; vector_a3da_object_node* vmohn = &moh->node; - count1 = (int32_t)(vmohn->end - vmohn->begin); + count1 = (int32_t)vector_length(*vmohn); key_val_get_lexicographic_order(&sort_index1, count1); for (int32_t j = 0; j < count; j++) { a3da_object_node* mohn = &vmohn->begin[sort_index1.begin[i]]; @@ -1941,13 +1941,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->m_object_hrc_list.end - a->m_object_hrc_list.begin) { + if (vector_length(a->m_object_hrc_list) > 0) { len = 13; memcpy(buf, "m_objhrc_list", 13); off = len; vector_string* vmohl = &a->m_object_hrc_list; - count = (int32_t)(vmohl->end - vmohl->begin); + count = (int32_t)vector_length(*vmohl); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { string* mohl = &vmohl->begin[sort_index.begin[i]]; @@ -1962,14 +1962,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->material_list.end - a->material_list.begin - && (a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD)) { + if (vector_length(a->material_list) > 0 && (a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD)) { len = 13; memcpy(buf, "material_list", 13); off = len; vector_a3da_material_list* vml = &a->material_list; - count = (int32_t)(vml->end - vml->begin); + count = (int32_t)vector_length(*vml); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_material_list* ml = &vml->begin[sort_index.begin[i]]; @@ -1992,13 +1991,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->motion.end - a->motion.begin) { + if (vector_length(a->motion) > 0) { len = 6; memcpy(buf, "motion", 6); off = len; vector_string* vm = &a->motion; - count = (int32_t)(vm->end - vm->begin); + count = (int32_t)vector_length(*vm); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { string* m = &vm->begin[sort_index.begin[i]]; @@ -2013,13 +2012,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->object.end - a->object.begin) { + if (vector_length(a->object) > 0) { len = 6; memcpy(buf, "object", 6); off = len; vector_a3da_object* vo = &a->object; - count = (int32_t)(vo->end - vo->begin); + count = (int32_t)vector_length(*vo); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_object* o = &vo->begin[sort_index.begin[i]]; @@ -2055,7 +2054,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { off = len + len1 + len2; vector_a3da_object_texture_pattern* votp = &o->texture_pattern; - count1 = (int32_t)(votp->end - votp->begin); + count1 = (int32_t)vector_length(*votp); key_val_get_lexicographic_order(&sort_index1, count1); for (int32_t j = 0; j < count; j++) { a3da_object_texture_pattern* otp = &votp->begin[sort_index1.begin[i]]; @@ -2082,7 +2081,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { off = len + len1 + len2; vector_a3da_object_texture_transform* vott = &o->texture_transform; - count1 = (int32_t)(vott->end - vott->begin); + count1 = (int32_t)vector_length(*vott); key_val_get_lexicographic_order(&sort_index1, count1); for (int32_t j = 0; j < count; j++) { a3da_object_texture_transform* ott = &vott->begin[sort_index1.begin[i]]; @@ -2141,13 +2140,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->object_list.end - a->object_list.begin) { + if (vector_length(a->object_list) > 0) { len = 11; memcpy(buf, "object_list", 11); off = len; vector_string* vol = &a->object_list; - count = (int32_t)(vol->end - vol->begin); + count = (int32_t)vector_length(*vol); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { string* ol = &vol->begin[sort_index.begin[i]]; @@ -2162,13 +2161,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->object_hrc.end - a->object_hrc.begin) { + if (vector_length(a->object_hrc) > 0) { len = 6; memcpy(buf, "objhrc", 6); off = len; vector_a3da_object_hrc* voh = &a->object_hrc; - count = (int32_t)(voh->end - voh->begin); + count = (int32_t)vector_length(*voh); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_object_hrc* oh = &voh->begin[sort_index.begin[i]]; @@ -2184,7 +2183,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { off = len + len1 + len2; vector_a3da_object_node* vohn = &oh->node; - count1 = (int32_t)(vohn->end - vohn->begin); + count1 = (int32_t)vector_length(*vohn); key_val_get_lexicographic_order(&sort_index1, count1); for (int32_t j = 0; j < count; j++) { a3da_object_node* ohn = &vohn->begin[sort_index1.begin[i]]; @@ -2224,13 +2223,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (a->object_hrc_list.end - a->object_hrc_list.begin) { + if (vector_length(a->object_hrc_list) > 0) { len = 11; memcpy(buf, "objhrc_list", 11); off = len; vector_string* vohl = &a->object_hrc_list; - count = (int32_t)(vohl->end - vohl->begin); + count = (int32_t)vector_length(*vohl); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { string* ohl = &vohl->begin[sort_index.begin[i]]; @@ -2295,13 +2294,13 @@ static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { key_val_write_a3da_key(&s, buf, off, ".lens_shaft", 12, &pp->lens_shaft); } - if (a->point.end - a->point.begin) { + if (vector_length(a->point) > 0) { len = 5; memcpy(buf, "point", 5); off = len; vector_a3da_point* vp = &a->point; - count = (int32_t)(vp->end - vp->begin); + count = (int32_t)vector_length(*vp); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { a3da_point* p = &vp->begin[sort_index.begin[i]]; @@ -2918,7 +2917,7 @@ static void key_val_write_a3da_key(stream* s, char* buf, memcpy(buf + offset, ".key", 5); offset += 4; - int32_t length = (int32_t)(value->keys.end - value->keys.begin); + int32_t length = (int32_t)vector_length(value->keys); vector_int32_t sort_index = vector_empty(int32_t); key_val_get_lexicographic_order(&sort_index, length); @@ -3073,7 +3072,7 @@ 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); - int32_t length = (int32_t)(value->keys.end - value->keys.begin); + int32_t length = (int32_t)vector_length(value->keys); if (value->raw_data_binary) { key_val_write_int32_t(s, buf, offset, ".raw_data.value_list_offset", 6, value->raw_data_value_list_offset); @@ -3365,13 +3364,13 @@ static void a3dc_read_a3da_key_f16(void* data, size_t length, a3da_key* value, a static void a3dc_write_a3da_key_f16(stream* s, a3da_key* value, a3da_compress_f16 f16) { if (value->raw_data) { - if ((int32_t)(value->keys.end - value->keys.begin) < 1) { + if (vector_length(value->keys) < 1) { value->raw_data = false; value->raw_data_binary = false; value->type = A3DA_KEY_NONE; vector_kft3_free(&value->keys, 0); } - else if ((int32_t)(value->keys.end - value->keys.begin) == 1) { + else if (vector_length(value->keys) == 1) { value->raw_data = false; value->raw_data_binary = false; value->type = A3DA_KEY_STATIC; @@ -3386,7 +3385,7 @@ static void a3dc_write_a3da_key_f16(stream* s, a3da_key* value, a3da_compress_f1 value->raw_data_value_list_offset = (int32_t)io_get_position(s); - int32_t len = (int32_t)(value->keys.end - value->keys.begin); + int32_t len = (int32_t)vector_length(value->keys); value->raw_data_value_list_size = len * 4; for (int32_t i = 0; i < len; i++) { kft3* k = &value->keys.begin[i]; @@ -3412,7 +3411,7 @@ static void a3dc_write_a3da_key_f16(stream* s, a3da_key* value, a3da_compress_f1 return; } - uint32_t len = (uint32_t)(value->keys.end - value->keys.begin); + uint32_t len = (uint32_t)vector_length(value->keys); a3dc_key_header head; memset(&head, 0, sizeof(a3dc_key_header)); diff --git a/src/KKdLib/database/auth_3d.c b/src/KKdLib/database/auth_3d.c index 922628e5..315b8dac 100644 --- a/src/KKdLib/database/auth_3d.c +++ b/src/KKdLib/database/auth_3d.c @@ -186,7 +186,7 @@ static void auth_3d_database_load_categories(auth_3d_database* auth_3d_db, auth_3d_database_file* auth_3d_db_file, bool mdata) { vector_auth_3d_database_category* category = &auth_3d_db->category; vector_string* category_file = &auth_3d_db_file->category; - int32_t count_file = (int32_t)(category_file->end - category_file->begin); + int32_t count_file = (int32_t)vector_length(*category_file); if (!mdata) vector_auth_3d_database_category_reserve(category, count_file); @@ -214,8 +214,8 @@ static void auth_3d_database_load_categories(auth_3d_database* auth_3d_db, static void auth_3d_database_load_uids(auth_3d_database* auth_3d_db, auth_3d_database_file* auth_3d_db_file, bool mdata) { - size_t uid_file_count = auth_3d_db_file->uid.end - auth_3d_db_file->uid.begin; - size_t uid_count = auth_3d_db->uid.end - auth_3d_db->uid.begin; + size_t uid_file_count = vector_length(auth_3d_db_file->uid); + size_t uid_count = vector_length(auth_3d_db->uid); bool reserve = true; size_t uid_reserve = 0; @@ -404,13 +404,13 @@ static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_f io_write(&s, "# date time was eliminated.\n", 28); vector_int32_t sort_index = vector_empty(int32_t); - if (auth_3d_db_file->category.end - auth_3d_db_file->category.begin) { + if (vector_length(auth_3d_db_file->category) > 0) { len = 8; memcpy(buf, "category", 8); off = len; vector_string* vc = &auth_3d_db_file->category; - count = (int32_t)(vc->end - vc->begin); + count = (int32_t)vector_length(*vc); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { string* c = &vc->begin[sort_index.begin[i]]; @@ -425,14 +425,14 @@ static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_f key_val_write_int32_t(&s, buf, off, ".length", 8, count); } - if (auth_3d_db_file->uid.end - auth_3d_db_file->uid.begin) { + if (vector_length(auth_3d_db_file->uid) > 0) { len = 3; memcpy(buf, "uid", 3); off = len; int32_t uid_max = -1; vector_auth_3d_database_uid_file* vu = &auth_3d_db_file->uid; - count = (int32_t)(vu->end - vu->begin); + count = (int32_t)vector_length(*vu); key_val_get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { auth_3d_database_uid_file* u = &vu->begin[sort_index.begin[i]]; diff --git a/src/KKdLib/database/bone.c b/src/KKdLib/database/bone.c index aa32117e..f2eecfed 100644 --- a/src/KKdLib/database/bone.c +++ b/src/KKdLib/database/bone.c @@ -604,7 +604,7 @@ 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)(bone_data->skeleton.end - bone_data->skeleton.begin); + uint32_t skeleton_count = (uint32_t)vector_length(bone_data->skeleton); ssize_t skeleton_offsets_offset = io_get_position(s); io_write(s, 0, skeleton_count * 0x04ULL); @@ -626,10 +626,10 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* for (uint32_t i = 0; i < skeleton_count; i++) { bone_database_skeleton* skel = &bone_data->skeleton.begin[i]; - uint32_t bone_count = (uint32_t)(skel->bone.end - skel->bone.begin); - uint32_t position_count = (uint32_t)(skel->position.end - skel->position.begin); - uint32_t object_bone_count = (uint32_t)(skel->object_bone.end - skel->object_bone.begin); - uint32_t motion_bone_count = (uint32_t)(skel->motion_bone.end - skel->motion_bone.begin); + uint32_t bone_count = (uint32_t)vector_length(skel->bone); + uint32_t position_count = (uint32_t)vector_length(skel->position); + uint32_t object_bone_count = (uint32_t)vector_length(skel->object_bone); + uint32_t motion_bone_count = (uint32_t)vector_length(skel->motion_bone); vector_string_reserve(&strings, bone_count); vector_ssize_t_reserve(&string_offsets, bone_count); @@ -932,7 +932,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)(bone_data->skeleton.end - bone_data->skeleton.begin); + uint32_t skeleton_count = (uint32_t)vector_length(bone_data->skeleton); if (!is_x) { uint32_t pos; @@ -951,10 +951,10 @@ 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]; - uint32_t bone_count = (uint32_t)(skel->bone.end - skel->bone.begin); - uint32_t position_count = (uint32_t)(skel->position.end - skel->position.begin); - uint32_t object_bone_count = (uint32_t)(skel->object_bone.end - skel->object_bone.begin); - uint32_t motion_bone_count = (uint32_t)(skel->motion_bone.end - skel->motion_bone.begin); + uint32_t bone_count = (uint32_t)vector_length(skel->bone); + uint32_t position_count = (uint32_t)vector_length(skel->position); + uint32_t object_bone_count = (uint32_t)vector_length(skel->object_bone); + uint32_t motion_bone_count = (uint32_t)vector_length(skel->motion_bone); ee = (enrs_entry){ off, 1, 56, 1, vector_empty(enrs_sub_entry) }; vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 14, ENRS_DWORD }); @@ -1044,10 +1044,10 @@ 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]; - uint32_t bone_count = (uint32_t)(skel->bone.end - skel->bone.begin); - uint32_t position_count = (uint32_t)(skel->position.end - skel->position.begin); - uint32_t object_bone_count = (uint32_t)(skel->object_bone.end - skel->object_bone.begin); - uint32_t motion_bone_count = (uint32_t)(skel->motion_bone.end - skel->motion_bone.begin); + uint32_t bone_count = (uint32_t)vector_length(skel->bone); + uint32_t position_count = (uint32_t)vector_length(skel->position); + uint32_t object_bone_count = (uint32_t)vector_length(skel->object_bone); + uint32_t motion_bone_count = (uint32_t)vector_length(skel->motion_bone); bone_count++; off += 8; @@ -1140,10 +1140,10 @@ 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]; - uint32_t bone_count = (uint32_t)(skel->bone.end - skel->bone.begin); - uint32_t position_count = (uint32_t)(skel->position.end - skel->position.begin); - uint32_t object_bone_count = (uint32_t)(skel->object_bone.end - skel->object_bone.begin); - uint32_t motion_bone_count = (uint32_t)(skel->motion_bone.end - skel->motion_bone.begin); + uint32_t bone_count = (uint32_t)vector_length(skel->bone); + uint32_t position_count = (uint32_t)vector_length(skel->position); + uint32_t object_bone_count = (uint32_t)vector_length(skel->object_bone); + uint32_t motion_bone_count = (uint32_t)vector_length(skel->motion_bone); skh[i].offset = io_get_position(&s_bone); io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); @@ -1205,10 +1205,10 @@ 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]; - uint32_t bone_count = (uint32_t)(skel->bone.end - skel->bone.begin); - uint32_t position_count = (uint32_t)(skel->position.end - skel->position.begin); - uint32_t object_bone_count = (uint32_t)(skel->object_bone.end - skel->object_bone.begin); - uint32_t motion_bone_count = (uint32_t)(skel->motion_bone.end - skel->motion_bone.begin); + uint32_t bone_count = (uint32_t)vector_length(skel->bone); + uint32_t position_count = (uint32_t)vector_length(skel->position); + uint32_t object_bone_count = (uint32_t)vector_length(skel->object_bone); + uint32_t motion_bone_count = (uint32_t)vector_length(skel->motion_bone); skh[i].bones_offset = io_get_position(&s_bone); @@ -1299,10 +1299,10 @@ 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]; - uint32_t bone_count = (uint32_t)(skel->bone.end - skel->bone.begin); - uint32_t position_count = (uint32_t)(skel->position.end - skel->position.begin); - uint32_t object_bone_count = (uint32_t)(skel->object_bone.end - skel->object_bone.begin); - uint32_t motion_bone_count = (uint32_t)(skel->motion_bone.end - skel->motion_bone.begin); + uint32_t bone_count = (uint32_t)vector_length(skel->bone); + uint32_t position_count = (uint32_t)vector_length(skel->position); + uint32_t object_bone_count = (uint32_t)vector_length(skel->object_bone); + uint32_t motion_bone_count = (uint32_t)vector_length(skel->motion_bone); io_position_push(&s_bone, skh[i].offset, SEEK_SET); if (!is_x) { diff --git a/src/KKdLib/database/motion.c b/src/KKdLib/database/motion.c index bd754d13..0d07e79a 100644 --- a/src/KKdLib/database/motion.c +++ b/src/KKdLib/database/motion.c @@ -150,7 +150,7 @@ void motion_database_merge_mdata(motion_database* mot_db, vector_string* bone_name = &mot_db->bone_name; vector_string* base_bone_name = &base_mot_db->bone_name; - int32_t bone_count = (int32_t)(base_bone_name->end - base_bone_name->begin); + int32_t bone_count = (int32_t)vector_length(*base_bone_name); vector_string_reserve(bone_name, bone_count); bone_name->end += bone_count; @@ -161,7 +161,7 @@ void motion_database_merge_mdata(motion_database* mot_db, vector_motion_set_info* base_motion_set = &base_mot_db->motion_set; vector_motion_set_info* mdata_motion_set = &mdata_mot_db->motion_set; - int32_t count = (int32_t)(base_motion_set->end - base_motion_set->begin); + int32_t count = (int32_t)vector_length(*base_motion_set); vector_motion_set_info_reserve(motion_set, count); motion_set->end += count; @@ -171,9 +171,9 @@ void motion_database_merge_mdata(motion_database* mot_db, set_info->id = b_set_info->id; string_copy(&b_set_info->name, &set_info->name); - set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length); + set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length, false); - int32_t info_count = (int32_t)(b_set_info->motion.end - b_set_info->motion.begin); + int32_t info_count = (int32_t)vector_length(b_set_info->motion); vector_motion_info_reserve(&set_info->motion, info_count); set_info->motion.end += info_count; @@ -183,11 +183,11 @@ void motion_database_merge_mdata(motion_database* mot_db, info->id = b_info->id; string_copy(&b_info->name, &info->name); - info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length); + info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length, false); } } - int32_t mdata_count = (int32_t)(mdata_motion_set->end - mdata_motion_set->begin); + int32_t mdata_count = (int32_t)vector_length(*mdata_motion_set); for (int32_t i = 0; i < mdata_count; i++) { motion_set_info* m_set_info = &mdata_motion_set->begin[i]; @@ -204,10 +204,10 @@ void motion_database_merge_mdata(motion_database* mot_db, set_info->id = m_set_info->id; string_replace(&m_set_info->name, &set_info->name); - set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length); + set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length, false); vector_motion_info_clear(&set_info->motion, motion_info_free); - int32_t info_count = (int32_t)(m_set_info->motion.end - m_set_info->motion.begin); + int32_t info_count = (int32_t)vector_length(m_set_info->motion); vector_motion_info_reserve(&set_info->motion, info_count); set_info->motion.end += info_count; @@ -217,7 +217,7 @@ void motion_database_merge_mdata(motion_database* mot_db, info->id = m_info->id; string_copy(&m_info->name, &info->name); - info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length); + info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length, false); } } @@ -246,7 +246,7 @@ motion_set_info* motion_database_get_motion_set_by_name(motion_database* mot_db, if (!mot_db || !name) return 0; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name), false); for (motion_set_info* i = mot_db->motion_set.begin; i != mot_db->motion_set.end; i++) if (name_hash == i->name_hash) @@ -258,7 +258,7 @@ uint32_t motion_database_get_motion_set_id(motion_database* mot_db, char* name) if (!mot_db || !name) return -1; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name), false); for (motion_set_info* i = mot_db->motion_set.begin; i != mot_db->motion_set.end; i++) if (name_hash == i->name_hash) @@ -291,7 +291,7 @@ motion_info* motion_database_get_motion_by_name(motion_database* mot_db, char* n if (!mot_db || !name) return 0; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name), false); for (motion_set_info* i = mot_db->motion_set.begin; i != mot_db->motion_set.end; i++) for (motion_info* j = i->motion.begin; j != i->motion.end; j++) @@ -304,7 +304,7 @@ uint32_t motion_database_get_motion_id(motion_database* mot_db, char* name) { if (!mot_db || !name) return -1; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name), false); for (motion_set_info* i = mot_db->motion_set.begin; i != mot_db->motion_set.end; i++) for (motion_info* j = i->motion.begin; j != i->motion.end; j++) @@ -413,8 +413,8 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { vector_string* bone_name = &mot_db->bone_name; vector_motion_set_info* motion_set = &mot_db->motion_set; - ssize_t bone_name_count = bone_name->end - bone_name->begin; - ssize_t motion_set_count = motion_set->end - motion_set->begin; + ssize_t bone_name_count = vector_length(*bone_name); + ssize_t motion_set_count = vector_length(*motion_set); ssize_t motion_sets_offset = io_get_position(s); io_write(s, 0, 0x10 * motion_set_count + 0x10); @@ -439,7 +439,7 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { ssize_t motion_names_offset = io_get_position(s); size = 0; for (motion_set_info* i = motion_set->begin; i != motion_set->end; i++) - size += 0x04 * (i->motion.end - i->motion.begin); + size += 0x04 * vector_length(i->motion); io_write(s, 0, size); io_align_write(s, 0x20); @@ -492,11 +492,11 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { for (motion_set_info* i = motion_set->begin; i != motion_set->end; i++) { io_write_uint32_t(s, (uint32_t)motion_set_name_offset); io_write_uint32_t(s, (uint32_t)motion_names_offset); - io_write_uint32_t(s, (uint32_t)(i->motion.end - i->motion.begin)); + io_write_uint32_t(s, (uint32_t)vector_length(i->motion)); io_write_uint32_t(s, (uint32_t)motion_ids_offset); motion_set_name_offset += i->name.length + 1; - motion_names_offset += 0x04 * (i->motion.end - i->motion.begin); - motion_ids_offset += 0x04 * (i->motion.end - i->motion.begin); + motion_names_offset += 0x04 * vector_length(i->motion); + motion_ids_offset += 0x04 * vector_length(i->motion); } io_write(s, 0, 0x10); io_position_pop(s); diff --git a/src/KKdLib/database/object.c b/src/KKdLib/database/object.c index 15e9ca2c..00158266 100644 --- a/src/KKdLib/database/object.c +++ b/src/KKdLib/database/object.c @@ -222,7 +222,7 @@ void object_database_merge_mdata(object_database* obj_db, vector_string* bone_name = &obj_db->bone_name; vector_string* base_bone_name = &base_obj_db->bone_name; - int32_t bone_count = (int32_t)(base_bone_name->end - base_bone_name->begin); + int32_t bone_count = (int32_t)vector_length(*base_bone_name); vector_string_reserve(bone_name, bone_count); bone_name->end += bone_count; @@ -233,7 +233,7 @@ void object_database_merge_mdata(object_database* obj_db, vector_object_set_info* base_object_set = &base_obj_db->object_set; vector_object_set_info* mdata_object_set = &mdata_obj_db->object_set; - int32_t count = (int32_t)(base_object_set->end - base_object_set->begin); + int32_t count = (int32_t)vector_length(*base_object_set); vector_object_set_info_reserve(object_set, count); object_set->end += count; @@ -242,13 +242,13 @@ void object_database_merge_mdata(object_database* obj_db, object_set_info* set_info = &object_set->begin[i]; string_copy(&b_set_info->name, &set_info->name); - set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length); + set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length, 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)(b_set_info->object.end - b_set_info->object.begin); + int32_t info_count = (int32_t)vector_length(b_set_info->object); vector_object_info_data_reserve(&set_info->object, info_count); set_info->object.end += info_count; @@ -258,14 +258,14 @@ void object_database_merge_mdata(object_database* obj_db, info->id = b_info->id; string_copy(&b_info->name, &info->name); - info->name_hash_fnv1a64m = hash_fnv1a64m(string_data(&info->name), info->name.length); - info->name_hash_fnv1a64m_upper = hash_fnv1a64m_upper(string_data(&info->name), info->name.length); + info->name_hash_fnv1a64m = hash_fnv1a64m(string_data(&info->name), info->name.length, false); + info->name_hash_fnv1a64m_upper = hash_fnv1a64m(string_data(&info->name), info->name.length, true); info->name_hash_murmurhash = hash_murmurhash(string_data(&info->name), info->name.length, 0, false, false); } } - int32_t mdata_count = (int32_t)(mdata_object_set->end - mdata_object_set->begin); + int32_t mdata_count = (int32_t)vector_length(*mdata_object_set); for (int32_t i = 0; i < mdata_count; i++) { object_set_info* m_set_info = &mdata_object_set->begin[i]; @@ -281,14 +281,14 @@ void object_database_merge_mdata(object_database* obj_db, set_info = vector_object_set_info_reserve_back(object_set); string_replace(&m_set_info->name, &set_info->name); - set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length); + set_info->name_hash = hash_fnv1a64m(string_data(&set_info->name), set_info->name.length, 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_object_info_data_clear(&set_info->object, object_info_data_free); - int32_t info_count = (int32_t)(m_set_info->object.end - m_set_info->object.begin); + int32_t info_count = (int32_t)vector_length(m_set_info->object); vector_object_info_data_reserve(&set_info->object, info_count); set_info->object.end += info_count; @@ -298,8 +298,8 @@ void object_database_merge_mdata(object_database* obj_db, info->id = m_info->id; string_copy(&m_info->name, &info->name); - info->name_hash_fnv1a64m = hash_fnv1a64m(string_data(&info->name), info->name.length); - info->name_hash_fnv1a64m_upper = hash_fnv1a64m_upper(string_data(&info->name), info->name.length); + info->name_hash_fnv1a64m = hash_fnv1a64m(string_data(&info->name), info->name.length, false); + info->name_hash_fnv1a64m_upper = hash_fnv1a64m(string_data(&info->name), info->name.length, true); info->name_hash_murmurhash = hash_murmurhash(string_data(&info->name), info->name.length, 0, false, false); } @@ -324,7 +324,7 @@ bool object_database_get_object_set_info(object_database* obj_db, if (!obj_db || !name) return false; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(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) { @@ -360,7 +360,7 @@ bool object_database_get_object_info_data(object_database* obj_db, if (!obj_db || !name) return false; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(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++) @@ -429,19 +429,31 @@ object_info object_database_get_object_info(object_database* obj_db, char* name) return object_info_null; size_t name_len = utf8_length(name); - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(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_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 (object_info) { 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.id == -1 && obj_info.set_id == -1)) + 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_object_set_info_free(&obj_db->object_set, object_set_info_free); } @@ -528,7 +540,7 @@ 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)(obj_db->object_set.end - obj_db->object_set.begin); + uint32_t object_set_count = (uint32_t)vector_length(obj_db->object_set); vector_ssize_t string_offsets = vector_empty(ssize_t); vector_ssize_t_reserve(&string_offsets, object_set_count * 4ULL); @@ -558,7 +570,7 @@ static void object_database_classic_write_inner(object_database* obj_db, stream* io_write(s, 0, 0x10); if (max_object_set_id < i->id) max_object_set_id = i->id; - object_count += (uint32_t)(i->object.end - i->object.begin); + object_count += (uint32_t)vector_length(i->object); } vector_ssize_t_clear(&string_offsets, 0); @@ -706,11 +718,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)(obj_db->object_set.end - obj_db->object_set.begin); + uint32_t object_set_count = (uint32_t)vector_length(obj_db->object_set); 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)(i->object.end - i->object.begin); + object_count += (uint32_t)vector_length(i->object); if (!is_x) { ee = (enrs_entry){ 0, 1, 1, 1, vector_empty(enrs_sub_entry) }; @@ -796,7 +808,7 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* } } - vector_ssize_t_reserve(&string_offsets, strings.end - strings.begin); + vector_ssize_t_reserve(&string_offsets, vector_length(strings)); for (string* i = strings.begin; i != strings.end; i++) { ssize_t off = io_get_position(&s_mosi); diff --git a/src/KKdLib/database/object.h b/src/KKdLib/database/object.h index 1e83772e..c96ff06d 100644 --- a/src/KKdLib/database/object.h +++ b/src/KKdLib/database/object.h @@ -74,6 +74,7 @@ extern bool object_database_get_object_info_data_by_fnv1a64m_hash_upper(object_d 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 char* object_database_get_object_name(object_database* obj_db, object_info obj_info); extern void object_database_free(object_database* obj_db); extern void object_info_data_free(object_info_data* info); diff --git a/src/KKdLib/database/stage.c b/src/KKdLib/database/stage.c index dd872319..e944336c 100644 --- a/src/KKdLib/database/stage.c +++ b/src/KKdLib/database/stage.c @@ -216,7 +216,7 @@ void stage_database_merge_mdata(stage_database* stage_data, vector_stage_info* base_stage = &base_stage_data->stage; vector_stage_info* mdata_stage = &mdata_stage_data->stage; - int32_t count = (int32_t)(base_stage->end - base_stage->begin); + int32_t count = (int32_t)vector_length(*base_stage); vector_stage_info_reserve(stage, count); stage->end += count; @@ -239,7 +239,7 @@ void stage_database_merge_mdata(stage_database* stage_data, } } - int32_t mdata_count = (int32_t)(mdata_stage->end - mdata_stage->begin); + int32_t mdata_count = (int32_t)vector_length(*mdata_stage); mdata_count -= count; if (mdata_count > 0) vector_stage_info_reserve(stage, mdata_count); diff --git a/src/KKdLib/database/texture.c b/src/KKdLib/database/texture.c index 5673eeb9..ace87a1d 100644 --- a/src/KKdLib/database/texture.c +++ b/src/KKdLib/database/texture.c @@ -219,7 +219,7 @@ void texture_database_merge_mdata(texture_database* tex_db, vector_texture_info* base_texture = &base_tex_db->texture; vector_texture_info* mdata_texture = &mdata_tex_db->texture; - int32_t count = (int32_t)(base_texture->end - base_texture->begin); + int32_t count = (int32_t)vector_length(*base_texture); vector_texture_info_reserve(texture, count); texture->end += count; @@ -229,10 +229,10 @@ void texture_database_merge_mdata(texture_database* tex_db, info->id = b_info->id; string_copy(&b_info->name, &info->name); - info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length); + info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length, false); } - int32_t mdata_count = (int32_t)(mdata_texture->end - mdata_texture->begin); + int32_t mdata_count = (int32_t)vector_length(*mdata_texture); for (int32_t i = 0; i < mdata_count; i++) { texture_info* m_info = &mdata_texture->begin[i]; @@ -248,7 +248,7 @@ void texture_database_merge_mdata(texture_database* tex_db, info->id = m_info->id; string_replace(&m_info->name, &info->name); - info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length); + info->name_hash = hash_fnv1a64m(string_data(&info->name), info->name.length, false); } tex_db->ready = true; @@ -266,7 +266,7 @@ uint32_t texture_database_get_texture_id(texture_database* tex_db, char* name) { if (!tex_db || !name) return -1; - uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name)); + uint64_t name_hash = hash_fnv1a64m(name, utf8_length(name), false); for (texture_info* i = tex_db->texture.begin; i != tex_db->texture.end; i++) if (name_hash == i->name_hash) @@ -323,7 +323,7 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea io_write_uint32_t(s, 0x90669066); io_align_write(s, 0x20); - uint32_t texture_count = (uint32_t)(tex_db->texture.end - tex_db->texture.begin); + uint32_t texture_count = (uint32_t)vector_length(tex_db->texture); vector_ssize_t string_offsets = vector_empty(ssize_t); vector_ssize_t_reserve(&string_offsets, texture_count); @@ -395,7 +395,7 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream bool is_x = tex_db->is_x; - uint32_t texture_count = (uint32_t)(tex_db->texture.end - tex_db->texture.begin); + uint32_t texture_count = (uint32_t)vector_length(tex_db->texture); if (!is_x) { ee = (enrs_entry){ 0, 2, 8, texture_count, vector_empty(enrs_sub_entry) }; @@ -446,7 +446,7 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream } } - vector_ssize_t_reserve(&string_offsets, strings.end - strings.begin); + vector_ssize_t_reserve(&string_offsets, vector_length(strings)); for (string* i = strings.begin; i != strings.end; i++) { *vector_ssize_t_reserve_back(&string_offsets) = io_get_position(&s_mtxi); diff --git a/src/KKdLib/dds.c b/src/KKdLib/dds.c index 4561e451..0deea011 100644 --- a/src/KKdLib/dds.c +++ b/src/KKdLib/dds.c @@ -269,7 +269,7 @@ void dds_wread(dds* d, wchar_t* path) { d->format = TXP_DXT1a; vector_ptr_void_push_back(&d->data, &data); } - while (d->has_cube_map && (d->data.end - d->data.begin) / d->mipmaps_count < 6); + while (d->has_cube_map && vector_length(d->data) / d->mipmaps_count < 6); } End: io_free(&s); @@ -277,7 +277,7 @@ End: } void dds_write(dds* d, char* path) { - if (!d || !path || d->data.end - d->data.begin < 1) + if (!d || !path || vector_length(d->data) < 1) return; wchar_t* path_buf = utf8_to_utf16(path); @@ -286,7 +286,7 @@ void dds_write(dds* d, char* path) { } void dds_wwrite(dds* d, wchar_t* path) { - if (!d || !path || d->data.end - d->data.begin < 1) + if (!d || !path || vector_length(d->data) < 1) return; wchar_t* path_dds = str_utils_wadd(path, L".dds"); diff --git a/src/KKdLib/dsc.c b/src/KKdLib/dsc.c index 187cfb04..dbc773ec 100644 --- a/src/KKdLib/dsc.c +++ b/src/KKdLib/dsc.c @@ -5,6 +5,7 @@ #include "dsc.h" #include "f2/struct.h" +#include "str_utils.h" vector_func(dsc_data) @@ -45,8 +46,8 @@ static const dsc_func dsc_ac101_func[] = { { 33, 2, "SHADOWPOS" }, { 34, 2, "NEAR_CLIP" }, { 35, 1, "CLOTH_WET" }, - { 36, 6, "SCENE_FADE" }, // AC110 - { 37, 6, "TONE_TRANS" }, // AC120 + { 36, 6, "SCENE_FADE" }, // AC110 + { 37, 6, "TONE_TRANS" }, // AC120 { 38, 1, "SATURATE" }, { 39, 1, "FADE_MODE" }, }; @@ -110,14 +111,14 @@ static const dsc_func_ac dsc_ac_func[] = { { 55, 1, 1, "FADE_MODE" }, { 56, 2, 2, "AUTO_BLINK" }, { 57, 3, 3, "PARTS_DISP" }, - { 58, 1, 1, "TARGET_FLYING_TIME" }, // AC210 + { 58, 1, 1, "TARGET_FLYING_TIME" }, // AC210 { 59, 2, 2, "CHARA_SIZE" }, { 60, 2, 2, "CHARA_HEIGHT_ADJUST" }, { 61, 4, 4, "ITEM_ANIM" }, { 62, 4, 4, "CHARA_POS_ADJUST" }, { 63, 1, 1, "SCENE_ROT" }, - { 64, 2, 2, "EDIT_MOT_SMOOTH_LEN" }, // AC500 - { 65, 1, 1, "PV_BRANCH_MODE" }, // AC510 + { 64, 2, 2, "EDIT_MOT_SMOOTH_LEN" }, // AC500 + { 65, 1, 1, "PV_BRANCH_MODE" }, // AC510 { 66, 2, 2, "DATA_CAMERA_START" }, { 67, 1, 1, "MOVIE_PLAY" }, { 68, 1, 1, "MOVIE_DISP" }, @@ -139,12 +140,12 @@ static const dsc_func_ac dsc_ac_func[] = { { 84, 1, 1, "TARGET_FLAG" }, { 85, 3, 3, "ITEM_ANIM_ATTACH" }, { 86, 1, 1, "SHADOW_RANGE" }, - { 87, 3, 3, "HAND_SCALE" }, // AFT101 + { 87, 3, 3, "HAND_SCALE" }, // AFT101 { 88, 4, 4, "LIGHT_POS" }, - { 89, 1, 1, "FACE_TYPE" }, // AFT200 - { 90, 2, 2, "SHADOW_CAST" }, // AFT300 - { 91, 6, 6, "EDIT_MOTION_F" }, // AFT310 - { 92, 3, 3, "FOG" }, // AFT410 + { 89, 1, 1, "FACE_TYPE" }, // AFT200 + { 90, 2, 2, "SHADOW_CAST" }, // AFT300 + { 91, 6, 6, "EDIT_MOTION_F" }, // AFT310 + { 92, 3, 3, "FOG" }, // AFT410 { 93, 2, 2, "BLOOM" }, { 94, 3, 3, "COLOR_COLLE" }, { 95, 3, 3, "DOF" }, @@ -157,8 +158,8 @@ static const dsc_func_ac dsc_ac_func[] = { { 102, 1, 1, "MOVIE_CUT_CHG" }, { 103, 3, 3, "CHARA_LIGHT" }, { 104, 3, 3, "STAGE_LIGHT" }, - { 105, 8, 8, "AGEAGE_CTR" }, // AFT701 - { 106, 2, 2, "PSE" }, // FT + { 105, 8, 8, "AGEAGE_CTR" }, // AFT701 + { 106, 2, 2, "PSE" }, // FT }; static const dsc_func_ac dsc_f_func[] = { @@ -211,7 +212,7 @@ static const dsc_func_ac dsc_f_func[] = { { 46, 3, 3, "AIM" }, { 47, 3, 3, "HAND_ITEM" }, { 48, 1, 1, "EDIT_BLUSH" }, - { 49, 2, 2, "NEAR_CLIP" }, + { 49, 2, 2, "NEAR_CLIP" }, // DT 2nd { 50, 1, 2, "CLOTH_WET" }, { 51, 3, 3, "LIGHT_ROT" }, { 52, 6, 6, "SCENE_FADE" }, @@ -226,7 +227,7 @@ static const dsc_func_ac dsc_f_func[] = { { 61, 4, 4, "ITEM_ANIM" }, { 62, 4, 4, "CHARA_POS_ADJUST" }, { 63, 1, 1, "SCENE_ROT" }, - { 64, 2, 2, "EDIT_MOT_SMOOTH_LEN" }, + { 64, 2, 2, "EDIT_MOT_SMOOTH_LEN" }, // F { 65, 1, 1, "PV_BRANCH_MODE" }, { 66, 2, 2, "DATA_CAMERA_START" }, { 67, 1, 1, "MOVIE_PLAY" }, @@ -352,6 +353,120 @@ static const dsc_func dsc_f2_func[] = { { 100, 3, "SHIMMER" }, { 101, 4, "ITEM_ALPHA" }, { 102, 1, "MOVIE_CUT" }, + { 103, 112, "EDIT_CAMERA_BOX" }, + { 104, 1, "EDIT_STAGE_PARAM" }, + { 105, 1, "EDIT_CHANGE_FIELD" }, + { 106, 7, "MIKUDAYO_ADJUST" }, + { 107, 2, "LYRIC_2" }, + { 108, 2, "LYRIC_READ" }, + { 109, 2, "LYRIC_READ_2" }, + { 110, 5, "ANNOTATION" }, +}; + +static const dsc_func dsc_mgf_func[] = { + { 0, 0, "END" }, + { 1, 1, "TIME" }, + { 2, 4, "MIKU_MOVE" }, + { 3, 2, "MIKU_ROT" }, + { 4, 2, "MIKU_DISP" }, + { 5, 2, "MIKU_SHADOW" }, + { 6, 12, "TARGET" }, + { 7, 4, "SET_MOTION" }, + { 8, 2, "SET_PLAYDATA" }, + { 9, 6, "EFFECT" }, + { 10, 2, "FADEIN_FIELD" }, + { 11, 1, "EFFECT_OFF" }, + { 12, 6, "SET_CAMERA" }, + { 13, 2, "DATA_CAMERA" }, + { 14, 2, "CHANGE_FIELD" }, + { 15, 1, "HIDE_FIELD" }, + { 16, 3, "MOVE_FIELD" }, + { 17, 2, "FADEOUT_FIELD" }, + { 18, 3, "EYE_ANIM" }, + { 19, 5, "MOUTH_ANIM" }, + { 20, 5, "HAND_ANIM" }, + { 21, 4, "LOOK_ANIM" }, + { 22, 4, "EXPRESSION" }, + { 23, 5, "LOOK_CAMERA" }, + { 24, 2, "LYRIC" }, + { 25, 0, "MUSIC_PLAY" }, + { 26, 2, "MODE_SELECT" }, + { 27, 4, "EDIT_MOTION" }, + { 28, 2, "BAR_TIME_SET" }, + { 29, 2, "SHADOWHEIGHT" }, + { 30, 1, "EDIT_FACE" }, + { 31, 21, "MOVE_CAMERA" }, + { 32, 0, "PV_END" }, + { 33, 3, "SHADOWPOS" }, + { 34, 2, "EDIT_LYRIC" }, + { 35, 5, "EDIT_TARGET" }, + { 36, 1, "EDIT_MOUTH" }, + { 37, 1, "SET_CHARA" }, + { 38, 7, "EDIT_MOVE" }, + { 39, 1, "EDIT_SHADOW" }, + { 40, 1, "EDIT_EYELID" }, + { 41, 2, "EDIT_EYE" }, + { 42, 1, "EDIT_ITEM" }, + { 43, 2, "EDIT_EFFECT" }, + { 44, 1, "EDIT_DISP" }, + { 45, 2, "EDIT_HAND_ANIM" }, + { 46, 3, "AIM" }, + { 47, 3, "HAND_ITEM" }, + { 48, 1, "EDIT_BLUSH" }, + { 49, 2, "NEAR_CLIP" }, + { 50, 2, "CLOTH_WET" }, + { 51, 3, "LIGHT_ROT" }, + { 52, 6, "SCENE_FADE" }, + { 53, 6, "TONE_TRANS" }, + { 54, 1, "SATURATE" }, + { 55, 1, "FADE_MODE" }, + { 56, 2, "AUTO_BLINK" }, + { 57, 3, "PARTS_DISP" }, + { 58, 1, "TARGET_FLYING_TIME" }, + { 59, 2, "CHARA_SIZE" }, + { 60, 2, "CHARA_HEIGHT_ADJUST" }, + { 61, 4, "ITEM_ANIM" }, + { 62, 4, "CHARA_POS_ADJUST" }, + { 63, 1, "SCENE_ROT" }, + { 64, 2, "EDIT_MOT_SMOOTH_LEN" }, + { 65, 1, "PV_BRANCH_MODE" }, + { 66, 2, "DATA_CAMERA_START" }, + { 67, 1, "MOVIE_PLAY" }, + { 68, 1, "MOVIE_DISP" }, + { 69, 3, "WIND" }, + { 70, 3, "OSAGE_STEP" }, + { 71, 3, "OSAGE_MV_CC" }, + { 72, 2, "CHARA_COLOR" }, + { 73, 1, "SE_EFFECT" }, + { 74, 9, "EDIT_MOVE_XYZ" }, + { 75, 3, "EDIT_EYELID_ANIM" }, + { 76, 2, "EDIT_INSTRUMENT_ITEM" }, + { 77, 4, "EDIT_MOTION_LOOP" }, + { 78, 2, "EDIT_EXPRESSION" }, + { 79, 3, "EDIT_EYE_ANIM" }, + { 80, 2, "EDIT_MOUTH_ANIM" }, + { 81, 22, "EDIT_CAMERA" }, + { 82, 1, "EDIT_MODE_SELECT" }, + { 83, 2, "PV_END_FADEOUT" }, + { 84, 1, "RESERVE" }, + { 85, 6, "RESERVE" }, + { 86, 1, "RESERVE" }, + { 87, 9, "RESERVE" }, + { 88, 2, "PV_AUTH_LIGHT_PRIORITY" }, + { 89, 3, "PV_CHARA_LIGHT" }, + { 90, 3, "PV_STAGE_LIGHT" }, + { 91, 11, "TARGET_EFFECT" }, + { 92, 3, "FOG" }, + { 93, 2, "BLOOM" }, + { 94, 3, "COLOR_CORRECTION" }, + { 95, 3, "DOF" }, + { 96, 4, "CHARA_ALPHA" }, + { 97, 1, "AUTO_CAPTURE_BEGIN" }, + { 98, 1, "MANUAL_CAPTURE" }, + { 99, 3, "TOON_EDGE" }, + { 100, 3, "SHIMMER" }, + { 101, 4, "ITEM_ALPHA" }, + { 102, 1, "MOVIE_CUT" }, { 103, 1, "CROSSFADE" }, { 104, 1, "SUBFRAMERENDER" }, { 105, 36, "EVENT_JUDGE" }, @@ -694,138 +809,316 @@ static const dsc_func dsc_vrfl_func[] = { { 162, 2, "VR_LIVE_CHARA_VOICE" }, }; +#define DSC_AC101_FUNC_COUNT 36 +#define DSC_AC110_FUNC_COUNT 37 +#define DSC_AC120_FUNC_COUNT 40 +#define DSC_AC200_FUNC_COUNT 58 +#define DSC_AC210_FUNC_COUNT 64 +#define DSC_AC500_FUNC_COUNT 65 +#define DSC_AC510_FUNC_COUNT 87 +#define DSC_AFT101_FUNC_COUNT 88 +#define DSC_AFT200_FUNC_COUNT 90 +#define DSC_AFT300_FUNC_COUNT 91 +#define DSC_AFT310_FUNC_COUNT 92 +#define DSC_AFT410_FUNC_COUNT 105 +#define DSC_AFT701_FUNC_COUNT 106 +#define DSC_FT_FUNC_COUNT 107 +#define DSC_PSP_FUNC_COUNT 36 +#define DSC_2ND_FUNC_COUNT 49 +#define DSC_DT_FUNC_COUNT 36 +#define DSC_DT2_FUNC_COUNT 64 +#define DSC_F_FUNC_COUNT 84 +#define DSC_F2_FUNC_COUNT 111 +#define DSC_MGF_FUNC_COUNT 111 +#define DSC_X_FUNC_COUNT 163 +#define DSC_VRFL_FUNC_COUNT 163 + +const int32_t dsc_ac101_func_count = DSC_AC101_FUNC_COUNT; +const int32_t dsc_ac110_func_count = DSC_AC110_FUNC_COUNT; +const int32_t dsc_ac120_func_count = DSC_AC120_FUNC_COUNT; +const int32_t dsc_ac200_func_count = DSC_AC200_FUNC_COUNT; +const int32_t dsc_ac210_func_count = DSC_AC210_FUNC_COUNT; +const int32_t dsc_ac500_func_count = DSC_AC500_FUNC_COUNT; +const int32_t dsc_ac510_func_count = DSC_AC510_FUNC_COUNT; +const int32_t dsc_aft101_func_count = DSC_AFT101_FUNC_COUNT; +const int32_t dsc_aft200_func_count = DSC_AFT200_FUNC_COUNT; +const int32_t dsc_aft300_func_count = DSC_AFT300_FUNC_COUNT; +const int32_t dsc_aft310_func_count = DSC_AFT310_FUNC_COUNT; +const int32_t dsc_aft410_func_count = DSC_AFT410_FUNC_COUNT; +const int32_t dsc_aft701_func_count = DSC_AFT701_FUNC_COUNT; +const int32_t dsc_ft_func_count = DSC_FT_FUNC_COUNT; +const int32_t dsc_psp_func_count = DSC_PSP_FUNC_COUNT; +const int32_t dsc_2nd_func_count = DSC_2ND_FUNC_COUNT; +const int32_t dsc_dt_func_count = DSC_DT_FUNC_COUNT; +const int32_t dsc_dt2_func_count = DSC_DT2_FUNC_COUNT; +const int32_t dsc_f_func_count = DSC_F_FUNC_COUNT; +const int32_t dsc_f2_func_count = DSC_F2_FUNC_COUNT; +const int32_t dsc_mgf_func_count = DSC_MGF_FUNC_COUNT; +const int32_t dsc_x_func_count = DSC_X_FUNC_COUNT; +const int32_t dsc_vrfl_func_count = DSC_VRFL_FUNC_COUNT; + inline int32_t dsc_ac101_get_func_length(int32_t id) { - return id > -1 && id < 36 ? dsc_ac101_func[id].length : -1; + return id > -1 && id < DSC_AC101_FUNC_COUNT ? dsc_ac101_func[id].length : -1; } inline int32_t dsc_ac110_get_func_length(int32_t id) { - return id > -1 && id < 37 ? dsc_ac101_func[id].length : -1; + return id > -1 && id < DSC_AC110_FUNC_COUNT ? dsc_ac101_func[id].length : -1; } inline int32_t dsc_ac120_get_func_length(int32_t id) { - return id > -1 && id < 40 ? dsc_ac101_func[id].length : -1; + return id > -1 && id < DSC_AC120_FUNC_COUNT ? dsc_ac101_func[id].length : -1; } inline int32_t dsc_ac200_get_func_length(int32_t id) { - return id > -1 && id < 58 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AC200_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_ac210_get_func_length(int32_t id) { - return id > -1 && id < 64 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_ac500_get_func_length(int32_t id) { - return id > -1 && id < 65 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_ac510_get_func_length(int32_t id) { - return id > -1 && id < 87 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AC510_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_aft101_get_func_length(int32_t id) { - return id > -1 && id < 88 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AFT101_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_aft200_get_func_length(int32_t id) { - return id > -1 && id < 90 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AFT200_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_aft300_get_func_length(int32_t id) { - return id > -1 && id < 91 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AFT300_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_aft310_get_func_length(int32_t id) { - return id > -1 && id < 92 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AFT310_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_aft410_get_func_length(int32_t id) { - return id > -1 && id < 105 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AFT410_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_aft701_get_func_length(int32_t id) { - return id > -1 && id < 106 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_AFT701_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_ft_get_func_length(int32_t id) { - return id > -1 && id < 107 ? dsc_ac_func[id].length : -1; + return id > -1 && id < DSC_FT_FUNC_COUNT ? dsc_ac_func[id].length : -1; } inline int32_t dsc_psp_get_func_length(int32_t id) { - return id > -1 && id < 36 ? dsc_ac101_func[id].length : -1; + return id > -1 && id < DSC_PSP_FUNC_COUNT ? dsc_ac101_func[id].length : -1; } inline int32_t dsc_2nd_get_func_length(int32_t id) { - return id > -1 && id < 64 ? dsc_f_func[id].length : -1; + return id > -1 && id < DSC_2ND_FUNC_COUNT ? dsc_f_func[id].length : -1; +} + +inline int32_t dsc_dt_get_func_length(int32_t id) { + return id > -1 && id < DSC_DT_FUNC_COUNT ? dsc_ac101_func[id].length : -1; +} + +inline int32_t dsc_dt2_get_func_length(int32_t id) { + return id > -1 && id < DSC_DT2_FUNC_COUNT ? dsc_f_func[id].length : -1; } inline int32_t dsc_f_get_func_length(int32_t id) { - return id > -1 && id < 84 ? dsc_f_func[id].length : -1; + return id > -1 && id < DSC_F_FUNC_COUNT ? dsc_f_func[id].length : -1; } inline int32_t dsc_f2_get_func_length(int32_t id) { - return id > -1 && id < 111 ? dsc_f2_func[id].length : -1; + return id > -1 && id < DSC_F2_FUNC_COUNT ? dsc_f2_func[id].length : -1; } inline int32_t dsc_mgf_get_func_length(int32_t id) { - return id > -1 && id < 111 ? dsc_f2_func[id].length : -1; + return id > -1 && id < DSC_MGF_FUNC_COUNT ? dsc_mgf_func[id].length : -1; } inline int32_t dsc_x_get_func_length(int32_t id) { - return id > -1 && id < 163 ? dsc_x_func[id].length : -1; + return id > -1 && id < DSC_X_FUNC_COUNT ? dsc_x_func[id].length : -1; } inline int32_t dsc_vrfl_get_func_length(int32_t id) { - return id > -1 && id < 163 ? dsc_x_func[id].length : -1; + return id > -1 && id < DSC_VRFL_FUNC_COUNT ? dsc_x_func[id].length : -1; } inline int32_t dsc_ac200_get_func_length_old(int32_t id) { - return id > -1 && id < 58 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AC200_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_ac210_get_func_length_old(int32_t id) { - return id > -1 && id < 64 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_ac500_get_func_length_old(int32_t id) { - return id > -1 && id < 65 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AC500_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_ac510_get_func_length_old(int32_t id) { - return id > -1 && id < 87 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AC510_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_aft101_get_func_length_old(int32_t id) { - return id > -1 && id < 88 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AFT101_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_aft200_get_func_length_old(int32_t id) { - return id > -1 && id < 90 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AFT200_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_aft300_get_func_length_old(int32_t id) { - return id > -1 && id < 91 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AFT300_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_aft310_get_func_length_old(int32_t id) { - return id > -1 && id < 92 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AFT310_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_aft410_get_func_length_old(int32_t id) { - return id > -1 && id < 105 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AFT410_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_aft701_get_func_length_old(int32_t id) { - return id > -1 && id < 106 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_AFT701_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; } inline int32_t dsc_ft_get_func_length_old(int32_t id) { - return id > -1 && id < 107 ? dsc_ac_func[id].length_old : -1; + return id > -1 && id < DSC_FT_FUNC_COUNT ? dsc_ac_func[id].length_old : -1; +} + +inline int32_t dsc_dt2_get_func_length_old(int32_t id) { + return id > -1 && id < DSC_DT_FUNC_COUNT ? dsc_f_func[id].length_old : -1; } inline int32_t dsc_f_get_func_length_old(int32_t id) { - return id > -1 && id < 84 ? dsc_f_func[id].length_old : -1; + return id > -1 && id < DSC_F_FUNC_COUNT ? dsc_f_func[id].length_old : -1; } +inline const char* dsc_ac101_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC101_FUNC_COUNT ? dsc_ac101_func[id].name : 0; +} + +inline const char* dsc_ac110_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC110_FUNC_COUNT ? dsc_ac101_func[id].name : 0; +} + +inline const char* dsc_ac120_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC120_FUNC_COUNT ? dsc_ac101_func[id].name : 0; +} + +inline const char* dsc_ac200_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC200_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_ac210_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_ac500_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC500_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_ac510_get_func_name(int32_t id) { + return id > -1 && id < DSC_AC510_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_aft101_get_func_name(int32_t id) { + return id > -1 && id < DSC_AFT101_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_aft200_get_func_name(int32_t id) { + return id > -1 && id < DSC_AFT200_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_aft300_get_func_name(int32_t id) { + return id > -1 && id < DSC_AFT300_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_aft310_get_func_name(int32_t id) { + return id > -1 && id < DSC_AFT310_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_aft410_get_func_name(int32_t id) { + return id > -1 && id < DSC_AFT410_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_aft701_get_func_name(int32_t id) { + return id > -1 && id < DSC_AFT701_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_ft_get_func_name(int32_t id) { + return id > -1 && id < DSC_FT_FUNC_COUNT ? dsc_ac_func[id].name : 0; +} + +inline const char* dsc_psp_get_func_name(int32_t id) { + return id > -1 && id < DSC_PSP_FUNC_COUNT ? dsc_ac101_func[id].name : 0; +} + +inline const char* dsc_2nd_get_func_name(int32_t id) { + return id > -1 && id < DSC_2ND_FUNC_COUNT ? dsc_f_func[id].name : 0; +} + +inline const char* dsc_dt_get_func_name(int32_t id) { + return id > -1 && id < DSC_DT_FUNC_COUNT ? dsc_ac101_func[id].name : 0; +} + +inline const char* dsc_dt2_get_func_name(int32_t id) { + return id > -1 && id < DSC_DT2_FUNC_COUNT ? dsc_f_func[id].name : 0; +} + +inline const char* dsc_f_get_func_name(int32_t id) { + return id > -1 && id < DSC_F_FUNC_COUNT ? dsc_f_func[id].name : 0; +} + +inline const char* dsc_f2_get_func_name(int32_t id) { + return id > -1 && id < DSC_F2_FUNC_COUNT ? dsc_f2_func[id].name : 0; +} + +inline const char* dsc_mgf_get_func_name(int32_t id) { + return id > -1 && id < DSC_MGF_FUNC_COUNT ? dsc_mgf_func[id].name : 0; +} + +inline const char* dsc_x_get_func_name(int32_t id) { + return id > -1 && id < DSC_X_FUNC_COUNT ? dsc_x_func[id].name : 0; +} + +inline const char* dsc_vrfl_get_func_name(int32_t id) { + return id > -1 && id < DSC_VRFL_FUNC_COUNT ? dsc_x_func[id].name : 0; +} + +const int32_t dsc_func_count_array[] = { + [DSC_AC101] = DSC_AC101_FUNC_COUNT, + [DSC_AC110] = DSC_AC110_FUNC_COUNT, + [DSC_AC120] = DSC_AC120_FUNC_COUNT, + [DSC_AC200] = DSC_AC200_FUNC_COUNT, + [DSC_AC210] = DSC_AC210_FUNC_COUNT, + [DSC_AC500] = DSC_AC500_FUNC_COUNT, + [DSC_AC510] = DSC_AC510_FUNC_COUNT, + [DSC_AFT101] = DSC_AFT101_FUNC_COUNT, + [DSC_AFT200] = DSC_AFT200_FUNC_COUNT, + [DSC_AFT300] = DSC_AFT300_FUNC_COUNT, + [DSC_AFT310] = DSC_AFT310_FUNC_COUNT, + [DSC_AFT410] = DSC_AFT410_FUNC_COUNT, + [DSC_AFT701] = DSC_AFT701_FUNC_COUNT, + [DSC_FT] = DSC_FT_FUNC_COUNT, + [DSC_PSP] = DSC_PSP_FUNC_COUNT, + [DSC_2ND] = DSC_2ND_FUNC_COUNT, + [DSC_DT] = DSC_DT_FUNC_COUNT, + [DSC_DT2] = DSC_DT2_FUNC_COUNT, + [DSC_F] = DSC_F_FUNC_COUNT, + [DSC_F2] = DSC_F2_FUNC_COUNT, + [DSC_MGF] = DSC_MGF_FUNC_COUNT, + [DSC_X] = DSC_X_FUNC_COUNT, + [DSC_VRFL] = DSC_VRFL_FUNC_COUNT, +}; + const dsc_get_func_length dsc_get_func_length_array[] = { [DSC_AC101] = dsc_ac101_get_func_length, [DSC_AC110] = dsc_ac110_get_func_length, @@ -843,6 +1136,8 @@ const dsc_get_func_length dsc_get_func_length_array[] = { [DSC_FT] = dsc_ft_get_func_length, [DSC_PSP] = dsc_psp_get_func_length, [DSC_2ND] = dsc_2nd_get_func_length, + [DSC_DT] = dsc_dt_get_func_length, + [DSC_DT2] = dsc_dt2_get_func_length, [DSC_F] = dsc_f_get_func_length, [DSC_F2] = dsc_f2_get_func_length, [DSC_MGF] = dsc_mgf_get_func_length, @@ -867,6 +1162,8 @@ const dsc_get_func_length dsc_get_func_length_old_array[] = { [DSC_FT] = dsc_ft_get_func_length, [DSC_PSP] = dsc_psp_get_func_length, [DSC_2ND] = dsc_2nd_get_func_length, + [DSC_DT] = dsc_dt_get_func_length, + [DSC_DT2] = dsc_dt2_get_func_length, [DSC_F] = dsc_f_get_func_length_old, [DSC_F2] = dsc_f2_get_func_length, [DSC_MGF] = dsc_mgf_get_func_length, @@ -874,23 +1171,432 @@ const dsc_get_func_length dsc_get_func_length_old_array[] = { [DSC_VRFL] = dsc_vrfl_get_func_length, }; +const dsc_get_func_name dsc_get_func_name_array[] = { + [DSC_AC101] = dsc_ac101_get_func_name, + [DSC_AC110] = dsc_ac110_get_func_name, + [DSC_AC120] = dsc_ac120_get_func_name, + [DSC_AC200] = dsc_ac200_get_func_name, + [DSC_AC210] = dsc_ac210_get_func_name, + [DSC_AC500] = dsc_ac500_get_func_name, + [DSC_AC510] = dsc_ac510_get_func_name, + [DSC_AFT101] = dsc_aft101_get_func_name, + [DSC_AFT200] = dsc_aft200_get_func_name, + [DSC_AFT300] = dsc_aft300_get_func_name, + [DSC_AFT310] = dsc_aft310_get_func_name, + [DSC_AFT410] = dsc_aft410_get_func_name, + [DSC_AFT701] = dsc_aft701_get_func_name, + [DSC_FT] = dsc_ft_get_func_name, + [DSC_PSP] = dsc_psp_get_func_name, + [DSC_2ND] = dsc_2nd_get_func_name, + [DSC_DT] = dsc_dt_get_func_name, + [DSC_DT2] = dsc_dt2_get_func_name, + [DSC_F] = dsc_f_get_func_name, + [DSC_F2] = dsc_f2_get_func_name, + [DSC_MGF] = dsc_mgf_get_func_name, + [DSC_X] = dsc_x_get_func_name, + [DSC_VRFL] = dsc_vrfl_get_func_name, +}; + +static void dsc_convert_from_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_from_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_to_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_change_field1_to_change_field2(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_change_field2_to_change_field1(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_dummy(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_note7_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_note7_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_note11_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_note11_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_note12_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static void dsc_convert_note12_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); +static dsc_get_func_length dsc_get_dsc_get_func_length(dsc* d); +static uint32_t* dsc_replace_add_func(dsc_replace* dr, dsc_replace_data* drd); +inline static dsc_get_func_length dsc_type_get_dsc_get_func_length(dsc_type type, bool has_perf_id); + void dsc_init(dsc* d) { + if (!d) + return; memset(d, 0, sizeof(dsc)); } +void dsc_convert(dsc* d, dsc_type dst_type) { + if (!d || d->type < DSC_AC101 || d->type > DSC_VRFL + || dst_type < DSC_AC101 || dst_type > DSC_VRFL) + return; + + static const dsc_func_convert dsc_convert_ac100[3][21] = { + { + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + (void*)0, + }, + { + dsc_convert_to_ac100_miku_move, + dsc_convert_to_ac100_miku_rot, + dsc_convert_to_ac100_miku_disp, + dsc_convert_to_ac100_miku_shadow, + dsc_convert_to_ac100_set_motion, + dsc_convert_to_ac100_set_playdata, + dsc_convert_to_ac100_effect, + dsc_convert_to_ac100_eye_anim, + dsc_convert_to_ac100_mouth_anim, + dsc_convert_to_ac100_hand_anim, + dsc_convert_to_ac100_look_anim, + dsc_convert_to_ac100_expression, + dsc_convert_to_ac100_look_camera, + dsc_convert_to_ac100_lyric, + dsc_convert_to_ac100_mode_select, + dsc_convert_to_ac100_edit_motion, + dsc_convert_to_ac100_shadowheight, + dsc_convert_to_ac100_edit_face, + dsc_convert_to_ac100_move_camera, + dsc_convert_to_ac100_shadowpos, + dsc_convert_to_ac100_cloth_wet, + }, + { + dsc_convert_from_ac100_miku_move, + dsc_convert_from_ac100_miku_rot, + dsc_convert_from_ac100_miku_disp, + dsc_convert_from_ac100_miku_shadow, + dsc_convert_from_ac100_set_motion, + dsc_convert_from_ac100_set_playdata, + dsc_convert_from_ac100_effect, + dsc_convert_from_ac100_eye_anim, + dsc_convert_from_ac100_mouth_anim, + dsc_convert_from_ac100_hand_anim, + dsc_convert_from_ac100_look_anim, + dsc_convert_from_ac100_expression, + dsc_convert_from_ac100_look_camera, + dsc_convert_from_ac100_lyric, + dsc_convert_from_ac100_mode_select, + dsc_convert_from_ac100_edit_motion, + dsc_convert_from_ac100_shadowheight, + dsc_convert_from_ac100_move_camera, + dsc_convert_from_ac100_edit_face, + dsc_convert_from_ac100_shadowpos, + dsc_convert_from_ac100_cloth_wet, + }, + }; + + static const dsc_func_convert change_field_convert_func_array[2][2] = { + { + 0, + dsc_convert_change_field1_to_change_field2, + }, + { + dsc_convert_change_field2_to_change_field1, + 0, + }, + }; + + static const dsc_func_convert edit_camera_convert_func_array[2][2] = { + { + 0, + dsc_convert_dummy, + }, + { + dsc_convert_dummy, + 0, + }, + }; + + static const dsc_func_convert note_convert_func_array[3][3] = { + { + 0, + dsc_convert_note7_to_note11, + dsc_convert_note7_to_note12, + }, + { + dsc_convert_note11_to_note7, + 0, + dsc_convert_note11_to_note12, + }, + { + dsc_convert_note12_to_note7, + dsc_convert_note12_to_note11, + 0, + }, + }; + + static const dsc_func_convert vr_live_transform_convert_func_array[2][2] = { + { + 0, + dsc_convert_dummy, + }, + { + dsc_convert_dummy, + 0, + }, + }; + + bool src_has_perf_id = d->signature >= 0x10101514; + int32_t dsc_convert_ac100_type = src_has_perf_id ? 0 : 2; + + if (dsc_convert_ac100_type == 2 && d->signature < 0x10000000) + d->signature = 0x10101514; + + bool dst_has_perf_id; + switch (dst_type) { + default: + dst_has_perf_id = d->signature >= 0x10101514; + break; + case DSC_PSP: + case DSC_DT: + case DSC_AC101: + case DSC_AC110: + case DSC_AC120: + dst_has_perf_id = false; + dsc_convert_ac100_type = src_has_perf_id ? 1 : 0; + break; + } + + if (dsc_convert_ac100_type == 1) + d->signature = 0; + + int32_t note_convert_src; + switch (d->type) { + default: + note_convert_src = 0; + break; + case DSC_2ND: + note_convert_src = 1; + break; + case DSC_DT2: + case DSC_F: + note_convert_src = src_has_perf_id ? 1 : 0; + break; + case DSC_F2: + case DSC_MGF: + case DSC_X: + case DSC_VRFL: + note_convert_src = 2; + break; + } + + int32_t note_convert_dst; + switch (dst_type) { + default: + note_convert_dst = 0; + break; + case DSC_2ND: + note_convert_dst = 1; + break; + case DSC_DT2: + case DSC_F: + note_convert_dst = dst_has_perf_id ? 1 : 0; + break; + case DSC_F2: + case DSC_MGF: + case DSC_X: + case DSC_VRFL: + note_convert_dst = 2; + break; + } + + bool enable_edit_camera = ((note_convert_src == 0 || note_convert_src == 1) + && (note_convert_dst == 0 || note_convert_dst == 1) + || note_convert_src == 2 && note_convert_dst == 2); + bool enable_edit_camera_ac = (note_convert_src == 0 || note_convert_src == 1) + && (note_convert_dst == 0 || note_convert_dst == 1) && dst_has_perf_id; + + dsc_replace dr; + dsc_replace_init(&dr, d->type, dst_type, dst_has_perf_id); + + int32_t src_func_count = dsc_func_count_array[d->type]; + dsc_get_func_name src_get_func_name = dsc_get_func_name_array[d->type]; + + for (int32_t i = 0; i < src_func_count; i++) { + dsc_replace_data* repl_data = &dr.replace_data[i]; + char* src_func_name = (char*)src_get_func_name(i); + if (!repl_data->func && !str_utils_compare(src_func_name, "MIKU_MOVE")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][0]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "MIKU_ROT")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][1]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "MIKU_DISP")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][2]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "MIKU_SHADOW")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][3]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "TARGET")) + repl_data->func = note_convert_func_array[note_convert_src][note_convert_dst]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "SET_MOTION")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][4]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "SET_PLAYDATA")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][5]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "EFFECT")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][6]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "CHANGE_FIELD")) + repl_data->func = change_field_convert_func_array + [note_convert_src == 2 ? 1 : 0][note_convert_dst == 2 ? 1 : 0]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "EYE_ANIM")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][7]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "MOUTH_ANIM")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][8]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "HAND_ANIM")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][9]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "LOOK_ANIM")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][10]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "EXPRESSION")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][11]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "LOOK_CAMERA")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][12]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "LYRIC")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][13]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "MODE_SELECT")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][14]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "EDIT_MOTION")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][15]; + else if (dr.bar_time_set_func_id == -1 && !str_utils_compare( + src_func_name, "BAR_TIME_SET")) + dr.bar_time_set_func_id = i; + else if (!repl_data->func && !str_utils_compare(src_func_name, "SHADOWHEIGHT")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][16]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "EDIT_FACE")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][17]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "MOVE_CAMERA")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][18]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "SHADOWPOS")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][19]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "CLOTH_WET")) + repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][20]; + else if (dr.target_flying_time_func_id == -1 && !str_utils_compare( + src_func_name, "TARGET_FLYING_TIME")) + dr.target_flying_time_func_id = i; + else if (!repl_data->func && !str_utils_compare(src_func_name, "EDIT_CAMERA")) + repl_data->func = edit_camera_convert_func_array + [note_convert_src == 2 ? 1 : 0][note_convert_dst == 2 ? 1 : 0]; + else if (!repl_data->func && !str_utils_compare(src_func_name, "VR_LIVE_TRANSFORM")) + repl_data->func = vr_live_transform_convert_func_array + [d->type == DSC_VRFL][dst_type == DSC_VRFL]; + } + + for (dsc_data* i = d->data.begin; i != d->data.end; i++) { + int32_t func = i->func; + if (func == -1 || dr.replace_data[func].func_id == -1) + continue; + + uint32_t* data = dsc_data_get_func_data(d, i); + dsc_replace_data* repl_data = &dr.replace_data[func]; + if (func == dr.bar_time_set_func_id) { + dr.bpm = data[0]; + dr.time_signature = data[1]; + dr.target_flying_time = -1000; + + uint32_t* bar_time_set = dsc_replace_add_func(&dr, repl_data); + *bar_time_set++ = dr.bpm; + *bar_time_set++ = dr.time_signature; + } + else if (func == dr.target_flying_time_func_id) { + dr.target_flying_time = data[0]; + + uint32_t* target_flying_time = dsc_replace_add_func(&dr, repl_data); + *target_flying_time++ = dr.target_flying_time; + } + else if (dr.replace_data[func].func) + dr.replace_data[func].func(&dr, repl_data, data); + else { + uint32_t* dst_data = dsc_replace_add_func(&dr, repl_data); + memmove(dst_data, data, sizeof(uint32_t) * repl_data->length); + } + } + + vector_dsc_data_free(&d->data, 0); + vector_uint32_t_free(&d->data_buffer, 0); + + d->type = dr.dst_type; + switch (d->type) { + case DSC_F: + if (d->signature >= 0x10000000) + d->signature = 0x12020220; + break; + case DSC_F2: + case DSC_MGF: + case DSC_X: + case DSC_VRFL: + d->signature = 0x13120420; + d->id = 0; + break; + } + d->data = dr.dsc.data; + d->data_buffer = dr.dsc.data_buffer; + + dr.dsc.data = vector_empty(dsc_data); + dr.dsc.data_buffer = vector_empty(uint32_t); + dsc_replace_free(&dr); +} + void dsc_data_buffer_rebuild(dsc* d) { - dsc_get_func_length func = dsc_get_func_length_array[d->type]; + if (!d) + return; + + dsc_get_func_length get_func_length = dsc_get_dsc_get_func_length(d); size_t size = 0; for (dsc_data* i = d->data.begin; i != d->data.end; i++) - size += func(i->func); + size += get_func_length(i->func); vector_uint32_t data_buffer = vector_empty(uint32_t); vector_uint32_t_reserve(&data_buffer, size); for (dsc_data* i = d->data.begin; i != d->data.end; i++) { uint32_t* func_data = dsc_data_get_func_data(d, i); - i->data_offset = (uint32_t)(data_buffer.end - data_buffer.begin); + i->data_offset = (uint32_t)vector_length(data_buffer); - for (int32_t j = func(i->func); j; j--) + for (int32_t j = get_func_length(i->func); j; j--) vector_uint32_t_push_back(&data_buffer, func_data++); } vector_uint32_t_free(&d->data_buffer, 0); @@ -901,33 +1607,35 @@ inline void* dsc_data_get_func_data(dsc* d, dsc_data* data) { return d->data_buffer.begin + data->data_offset; } -void dsc_parse(dsc* d, void* data, size_t length, dsc_type type) { - if (!d || !data || !(length / 4)) - return; +bool dsc_parse(dsc* d, void* data, size_t length, dsc_type type) { + if (!d || !data || !(length / 4) || type < DSC_AC101 || type > DSC_VRFL) + return false; uint32_t* data_dsc = data; f2_struct st; memset(&st, 0, sizeof(f2_struct)); + d->signature = 0; switch (type) { - case DSC_AC200: - case DSC_AC210: - case DSC_AC500: - case DSC_AC510: - case DSC_AFT101: - case DSC_AFT200: - case DSC_AFT300: - case DSC_AFT310: - case DSC_AFT410: - case DSC_AFT701: - case DSC_FT: + default: + if (*data_dsc >= 0x10000000) { + d->signature = *data_dsc++; + length--; + } + break; case DSC_F: - d->signature = *data_dsc++; + if (*data_dsc >= 0x10000000) { + if (*data_dsc != 0x12020220) + return false; + + data_dsc++; + d->signature = 0x12020220; + } break; case DSC_F2: case DSC_MGF: case DSC_X: - case DSC_VRFL: { + case DSC_VRFL: f2_struct_mread(&st, data, length); data_dsc = st.data; if (st.header.use_big_endian) @@ -937,16 +1645,20 @@ void dsc_parse(dsc* d, void* data, size_t length, dsc_type type) { data_dsc = st.data; if (*data_dsc++ != 0x13120420) { f2_struct_free(&st); - return; + return false; } + + d->signature = 0x13120420; d->id = *data_dsc++; - } break; + break; } length /= 4; d->type = type; - dsc_get_func_length func = dsc_get_func_length_array[type]; + + dsc_get_func_name get_func_name = dsc_get_func_name_array[type]; + dsc_get_func_length get_func_length = dsc_get_dsc_get_func_length(d); size_t func_count = 0; size_t data_size = 0; @@ -957,7 +1669,7 @@ void dsc_parse(dsc* d, void* data, size_t length, dsc_type type) { break; } - int32_t func_length = func(*func_data++); + int32_t func_length = get_func_length(*func_data++); if (func_length < 0) { length = i; break; @@ -977,36 +1689,31 @@ void dsc_parse(dsc* d, void* data, size_t length, dsc_type type) { func_data = data_dsc; for (size_t i = 0; i < func_count; i++) { dsc_data* data = vector_dsc_data_reserve_back(&d->data); + data->name = get_func_name(*func_data); data->func = *func_data++; - data->data_offset = (uint32_t)(d->data_buffer.end - d->data_buffer.begin); - for (int32_t j = func(data->func); j; j--) - vector_uint32_t_push_back(&d->data_buffer, func_data++); + data->data_offset = (uint32_t)vector_length(d->data_buffer); + + int32_t func_length = get_func_length(data->func); + vector_uint32_t_insert_range(&d->data_buffer, + data->data_offset, func_data, func_data + func_length); + func_data += func_length; } f2_struct_free(&st); + return true; } void dsc_unparse(dsc* d, void** data, size_t* length) { if (!d || !data || !length) return; - dsc_get_func_length func = dsc_get_func_length_array[d->type]; + dsc_get_func_length get_func_length = dsc_get_dsc_get_func_length(d); bool f2 = false; size_t size = 1; switch (d->type) { - case DSC_AC200: - case DSC_AC210: - case DSC_AC500: - case DSC_AC510: - case DSC_AFT101: - case DSC_AFT200: - case DSC_AFT300: - case DSC_AFT310: - case DSC_AFT410: - case DSC_AFT701: - case DSC_FT: - case DSC_F: - size++; + default: + if (d->signature >= 0x10000000) + size++; break; case DSC_F2: case DSC_MGF: @@ -1018,7 +1725,7 @@ void dsc_unparse(dsc* d, void** data, size_t* length) { } for (dsc_data* i = d->data.begin; i != d->data.end; i++) - size += func(i->func) + 1ULL; + size += get_func_length(i->func) + 1ULL; size_t data_size = size; if (f2) @@ -1028,33 +1735,27 @@ void dsc_unparse(dsc* d, void** data, size_t* length) { uint32_t* func_data = data_dsc; switch (d->type) { - case DSC_AC200: - case DSC_AC210: - case DSC_AC500: - case DSC_AC510: - case DSC_AFT101: - case DSC_AFT200: - case DSC_AFT300: - case DSC_AFT310: - case DSC_AFT410: - case DSC_AFT701: - case DSC_FT: + default: + if (d->signature >= 0x10000000) + *func_data++ = d->signature; + break; case DSC_F: - *func_data++ = d->signature; + if (d->signature >= 0x10000000) + *func_data++ = 0x12020220; break; case DSC_F2: case DSC_MGF: case DSC_X: - case DSC_VRFL: { + case DSC_VRFL: *func_data++ = 0x13120420; *func_data++ = d->id; - } break; + break; } for (dsc_data* i = d->data.begin; i != d->data.end; i++) { *func_data++ = i->func; uint32_t* data = dsc_data_get_func_data(d, i); - for (int32_t j = func(i->func); j; j--) + for (int32_t j = get_func_length(i->func); j; j--) *func_data++ = *data++; } *func_data++ = 0; @@ -1086,7 +1787,580 @@ void dsc_unparse(dsc* d, void** data, size_t* length) { } } +bool dsc_load_file(void* data, char* path, char* file, uint32_t hash) { + string s; + string_init(&s, path); + string_add(&s, file); + + stream dsc_s; + io_open(&dsc_s, string_data(&s), "rb"); + void* dsc_data = force_malloc(dsc_s.length); + size_t dsc_replace_data = dsc_s.length; + io_read(&dsc_s, dsc_data, dsc_replace_data); + + dsc* d = data; + bool ret = dsc_parse(d, dsc_data, dsc_replace_data, d->type); + + io_free(&dsc_s); + string_free(&s); + free(dsc_data); + return ret; +} + void dsc_free(dsc* d) { + if (!d) + return; + vector_dsc_data_free(&d->data, 0); vector_uint32_t_free(&d->data_buffer, 0); } + +void dsc_replace_init(dsc_replace* dr, dsc_type src_type, + dsc_type dst_type, bool dst_has_perf_id) { + if (!dr) + return; + + memset(dr, 0, sizeof(dsc_replace)); + dr->bpm = 120; + dr->time_signature = 3; + dr->target_flying_time = -1000; + + dr->bar_time_set_func_id = -1; + dr->target_flying_time_func_id = -1; + dr->dst_has_perf_id = dst_has_perf_id; + + if (src_type < DSC_AC101 || src_type > DSC_VRFL + || dst_type < DSC_AC101 || dst_type > DSC_VRFL) + return; + + dr->src_type = src_type; + dr->dst_type = dst_type; + dr->replace_data = 0; + dsc_init(&dr->dsc); + + int32_t src_func_count = dsc_func_count_array[src_type]; + int32_t dst_func_count = dsc_func_count_array[dst_type]; + dsc_get_func_name src_get_func_name = dsc_get_func_name_array[src_type]; + dsc_get_func_name dst_get_func_name = dsc_get_func_name_array[dst_type]; + dsc_get_func_length dst_get_func_length = dsc_type_get_dsc_get_func_length(dst_type, dst_has_perf_id); + dsc_replace_data* replace_data = force_malloc_s(dsc_replace_data, src_func_count); + dr->replace_data = replace_data; + + for (int32_t i = 0; i < src_func_count; i++) { + replace_data->name = 0; + replace_data->func_id = -1; + replace_data->length = 0; + replace_data->func = 0; + char* src_func_name = (char*)src_get_func_name(i); + if (str_utils_compare(src_func_name, "")) + for (int32_t j = 0; j < dst_func_count; j++) { + if (!str_utils_compare(src_func_name, (char*)dst_get_func_name(j))) { + replace_data->name = src_func_name; + replace_data->func_id = j; + replace_data->length = dst_get_func_length(j); + break; + } + } + replace_data++; + } +} + +void dsc_replace_free(dsc_replace* dr) { + if (!dr) + return; + + free(dr->replace_data); + dsc_free(&dr->dsc); +} + +inline int32_t dsc_calculate_target_flying_time(int32_t bpm, int32_t time_signature) { + return (int32_t)((float_t)time_signature * (60.0f / (float_t)bpm) * 1000.0f); +} + +static void dsc_convert_from_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* cloth_wet = dsc_replace_add_func(dr, drd); + cloth_wet[0] = 0; + cloth_wet[1] = data[0]; +} + +static void dsc_convert_from_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* edit_face = dsc_replace_add_func(dr, drd); + edit_face[0] = data[0]; +} + +static void dsc_convert_from_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* edit_motion = dsc_replace_add_func(dr, drd); + edit_motion[0] = data[0]; + edit_motion[1] = data[1]; + edit_motion[2] = 0; + edit_motion[3] = 0; +} + +static void dsc_convert_from_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* effect = dsc_replace_add_func(dr, drd); + effect[0] = 0; + effect[1] = data[0]; + effect[2] = data[1]; + effect[3] = data[2]; + effect[4] = data[3]; + effect[5] = data[4]; +} + +static void dsc_convert_from_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* expression = dsc_replace_add_func(dr, drd); + expression[0] = 0; + expression[1] = data[0]; + expression[2] = data[1]; + expression[3] = data[2]; +} + +static void dsc_convert_from_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* eye_anim = dsc_replace_add_func(dr, drd); + eye_anim[0] = 0; + eye_anim[1] = data[0]; + eye_anim[2] = data[1]; +} + +static void dsc_convert_from_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* hand_anim = dsc_replace_add_func(dr, drd); + hand_anim[0] = 0; + hand_anim[1] = data[0]; + hand_anim[2] = data[1]; + hand_anim[3] = data[2]; + hand_anim[4] = data[3]; +} + +static void dsc_convert_from_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* look_anim = dsc_replace_add_func(dr, drd); + look_anim[0] = 0; + look_anim[1] = data[0]; + look_anim[2] = data[1]; + look_anim[3] = data[2]; +} + +static void dsc_convert_from_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* look_camera = dsc_replace_add_func(dr, drd); + look_camera[0] = 0; + look_camera[1] = data[0]; + look_camera[2] = data[1]; + look_camera[3] = data[2]; + look_camera[4] = data[3]; +} + +static void dsc_convert_from_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* lyric = dsc_replace_add_func(dr, drd); + lyric[0] = data[0]; + lyric[1] = 0xFFFFFFFF; +} + +static void dsc_convert_from_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* miku_disp = dsc_replace_add_func(dr, drd); + miku_disp[0] = 0; + miku_disp[1] = data[0]; +} + +static void dsc_convert_from_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* miku_move = dsc_replace_add_func(dr, drd); + miku_move[0] = 0; + miku_move[1] = data[0]; + miku_move[2] = data[1]; + miku_move[3] = data[2]; +} + +static void dsc_convert_from_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* miku_rot = dsc_replace_add_func(dr, drd); + miku_rot[0] = 0; + miku_rot[1] = data[0]; +} + +static void dsc_convert_from_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* miku_shadow = dsc_replace_add_func(dr, drd); + miku_shadow[0] = 0; + miku_shadow[1] = data[0]; +} + +static void dsc_convert_from_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* mode_select = dsc_replace_add_func(dr, drd); + mode_select[0] = 0x1F; + mode_select[1] = data[0]; +} + +static void dsc_convert_from_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* mouth_anim = dsc_replace_add_func(dr, drd); + mouth_anim[0] = 0; + mouth_anim[1] = 0; + mouth_anim[2] = data[0]; + mouth_anim[3] = data[1]; + mouth_anim[4] = data[2]; +} + +static void dsc_convert_from_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* move_camera = dsc_replace_add_func(dr, drd); + memmove(move_camera, data, sizeof(uint32_t) * 19); + move_camera[19] = 0; + move_camera[20] = 1000; +} + +static void dsc_convert_from_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* set_motion = dsc_replace_add_func(dr, drd); + set_motion[0] = 0; + set_motion[1] = data[0]; + set_motion[2] = data[1]; + set_motion[3] = data[2]; +} + +static void dsc_convert_from_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* set_playdata = dsc_replace_add_func(dr, drd); + set_playdata[0] = 0; + set_playdata[1] = data[0]; +} + +static void dsc_convert_from_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* shadowheight = dsc_replace_add_func(dr, drd); + shadowheight[0] = 0; + shadowheight[1] = data[0]; +} + +static void dsc_convert_from_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* shadowpos = dsc_replace_add_func(dr, drd); + shadowpos[0] = 0; + shadowpos[1] = data[0]; + shadowpos[2] = data[1]; +} + +static void dsc_convert_to_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* cloth_wet = dsc_replace_add_func(dr, drd); + cloth_wet[0] = data[1]; +} + +static void dsc_convert_to_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* edit_face = dsc_replace_add_func(dr, drd); + edit_face[0] = data[0]; + edit_face[1] = -1; +} + +static void dsc_convert_to_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* edit_motion = dsc_replace_add_func(dr, drd); + edit_motion[0] = data[0]; + edit_motion[1] = data[1]; +} + +static void dsc_convert_to_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* effect = dsc_replace_add_func(dr, drd); + effect[0] = data[1]; + effect[1] = data[2]; + effect[2] = data[3]; + effect[3] = data[4]; + effect[4] = data[5]; +} + +static void dsc_convert_to_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* expression = dsc_replace_add_func(dr, drd); + expression[0] = data[1]; + expression[1] = data[2]; + expression[2] = data[3]; + expression[3] = data[4]; +} + +static void dsc_convert_to_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* eye_anim = dsc_replace_add_func(dr, drd); + eye_anim[0] = data[1]; + eye_anim[1] = data[2]; +} + +static void dsc_convert_to_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* hand_anim = dsc_replace_add_func(dr, drd); + hand_anim[0] = data[1]; + hand_anim[1] = data[2]; + hand_anim[2] = data[3]; + hand_anim[3] = data[4]; +} + +static void dsc_convert_to_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* look_anim = dsc_replace_add_func(dr, drd); + look_anim[0] = data[1]; + look_anim[1] = data[2]; + look_anim[2] = data[3]; +} + +static void dsc_convert_to_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* look_camera = dsc_replace_add_func(dr, drd); + look_camera[0] = data[1]; + look_camera[1] = data[2]; + look_camera[2] = data[3]; + look_camera[3] = data[4]; +} + +static void dsc_convert_to_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* lyric = dsc_replace_add_func(dr, drd); + lyric[0] = data[0]; +} + +static void dsc_convert_to_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* miku_disp = dsc_replace_add_func(dr, drd); + miku_disp[0] = data[1]; +} + +static void dsc_convert_to_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* miku_move = dsc_replace_add_func(dr, drd); + miku_move[0] = data[1]; + miku_move[1] = data[2]; + miku_move[2] = data[3]; +} + +static void dsc_convert_to_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* miku_rot = dsc_replace_add_func(dr, drd); + miku_rot[0] = data[1]; +} + +static void dsc_convert_to_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* miku_shadow = dsc_replace_add_func(dr, drd); + miku_shadow[0] = data[1]; +} + +static void dsc_convert_to_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* mode_select = dsc_replace_add_func(dr, drd); + mode_select[0] = data[1]; +} + +static void dsc_convert_to_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* mouth_anim = dsc_replace_add_func(dr, drd); + mouth_anim[0] = data[2]; + mouth_anim[1] = data[3]; + mouth_anim[2] = data[4]; +} + +static void dsc_convert_to_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* move_camera = dsc_replace_add_func(dr, drd); + memmove(move_camera, data, sizeof(uint32_t) * 19); +} + +static void dsc_convert_to_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* set_motion = dsc_replace_add_func(dr, drd); + set_motion[0] = data[1]; + set_motion[1] = data[2]; + set_motion[2] = data[3]; +} + +static void dsc_convert_to_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* set_playdata = dsc_replace_add_func(dr, drd); + set_playdata[0] = data[1]; +} + +static void dsc_convert_to_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* shadowheight = dsc_replace_add_func(dr, drd); + shadowheight[0] = data[1]; +} + +static void dsc_convert_to_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + if (data[0]) + return; + + uint32_t* shadowpos = dsc_replace_add_func(dr, drd); + shadowpos[0] = data[1]; + shadowpos[1] = data[2]; +} + +static void dsc_convert_change_field1_to_change_field2(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* change_field1 = dsc_replace_add_func(dr, drd); + change_field1[0] = data[0]; + change_field1[1] = 1; +} + +static void dsc_convert_change_field2_to_change_field1(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + uint32_t* change_field1 = dsc_replace_add_func(dr, drd); + change_field1[0] = data[0]; +} + +static void dsc_convert_dummy(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + +} + +static void dsc_convert_note7_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + dsc_note7* dn = (dsc_note7*)data; + dsc_note11* note11 = (dsc_note11*)dsc_replace_add_func(dr, drd); + note11->type = dn->type; + note11->hold_timer = -1; + note11->hold_end = -1; + note11->x_pos = dn->x_pos; + note11->y_pos = dn->y_pos; + note11->angle = dn->angle; + note11->wave_count = dn->wave_count; + note11->distance = dn->distance; + note11->amplitude = dn->amplitude; + note11->target_flying_time = dr->target_flying_time; + note11->time_signature = dr->target_flying_time != -1000 ? dr->time_signature : 0; +} + +static void dsc_convert_note7_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + dsc_note7* dn = (dsc_note7*)data; + dsc_note12* note12 = (dsc_note12*)dsc_replace_add_func(dr, drd); + note12->type = dn->type; + note12->hold_timer = -1; + note12->hold_end = -1; + note12->x_pos = dn->x_pos; + note12->y_pos = dn->y_pos; + note12->angle = dn->angle; + note12->wave_count = dn->wave_count; + note12->distance = dn->distance; + note12->amplitude = dn->amplitude; + note12->target_flying_time = dr->target_flying_time; + note12->time_signature = dr->target_flying_time != -1000 ? dr->time_signature : 0; + note12->target_effect = -1; +} + +static void dsc_convert_note11_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + dsc_note11* dn = (dsc_note11*)data; + if (dn->target_flying_time != -1000) { + if (dr->time_signature != dn->time_signature) { + dsc_replace_data* repl_data = &dr->replace_data[dr->bar_time_set_func_id]; + uint32_t* bar_time_set = dsc_replace_add_func(dr, repl_data); + *bar_time_set++ = dr->bpm; + *bar_time_set++ = dn->time_signature; + dr->time_signature = dn->time_signature; + } + + if (dr->target_flying_time != dn->target_flying_time) { + dsc_replace_data* repl_data = &dr->replace_data[dr->target_flying_time_func_id]; + uint32_t* target_flying_time = dsc_replace_add_func(dr, repl_data); + *target_flying_time++ = dn->target_flying_time; + dr->target_flying_time = dn->target_flying_time; + } + } + + dsc_note7* note7 = (dsc_note7*)dsc_replace_add_func(dr, drd); + note7->type = dn->type; + note7->x_pos = dn->x_pos; + note7->y_pos = dn->y_pos; + note7->angle = dn->angle; + note7->distance = dn->distance; + note7->amplitude = dn->amplitude; + note7->wave_count = dn->wave_count; +} + +static void dsc_convert_note11_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + dsc_note11* dn = (dsc_note11*)data; + dsc_note12* note12 = (dsc_note12*)dsc_replace_add_func(dr, drd); + note12->type = dn->type; + note12->hold_timer = dn->hold_timer; + note12->hold_end = dn->hold_end; + note12->x_pos = dn->x_pos; + note12->y_pos = dn->y_pos; + note12->angle = dn->angle; + note12->wave_count = dn->wave_count; + note12->distance = dn->distance; + note12->amplitude = dn->amplitude; + note12->target_flying_time = dn->target_flying_time; + note12->time_signature = dn->time_signature; + note12->target_effect = -1; +} + +static void dsc_convert_note12_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + dsc_note12* dn = (dsc_note12*)data; + if (dn->target_flying_time != -1000) { + if (dr->time_signature != dn->time_signature) { + dsc_replace_data* repl_data = &dr->replace_data[dr->bar_time_set_func_id]; + uint32_t* bar_time_set = dsc_replace_add_func(dr, repl_data); + *bar_time_set++ = dr->bpm; + *bar_time_set++ = dn->time_signature; + dr->time_signature = dn->time_signature; + } + + if (dr->target_flying_time != dn->target_flying_time) { + dsc_replace_data* repl_data = &dr->replace_data[dr->target_flying_time_func_id]; + uint32_t* target_flying_time = dsc_replace_add_func(dr, repl_data); + *target_flying_time++ = dn->target_flying_time; + dr->target_flying_time = dn->target_flying_time; + } + } + + dsc_note7* note7 = (dsc_note7*)dsc_replace_add_func(dr, drd); + note7->type = dn->type; + note7->x_pos = dn->x_pos; + note7->y_pos = dn->y_pos; + note7->angle = dn->angle; + note7->distance = dn->distance; + note7->amplitude = dn->amplitude; + note7->wave_count = dn->wave_count; +} + +static void dsc_convert_note12_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) { + dsc_note12* dn = (dsc_note12*)data; + dsc_note11* note11 = (dsc_note11*)dsc_replace_add_func(dr, drd); + note11->type = dn->type; + note11->hold_timer = dn->hold_timer; + note11->hold_end = dn->hold_end; + note11->x_pos = dn->x_pos; + note11->y_pos = dn->y_pos; + note11->angle = dn->angle; + note11->wave_count = dn->wave_count; + note11->distance = dn->distance; + note11->amplitude = dn->amplitude; + note11->target_flying_time = dn->target_flying_time; + note11->time_signature = dn->time_signature; +} + +inline static dsc_get_func_length dsc_get_dsc_get_func_length(dsc* d) { + return d->signature >= 0x10101514 + ? dsc_get_func_length_array[d->type] + : dsc_get_func_length_old_array[d->type]; +} + +static uint32_t* dsc_replace_add_func(dsc_replace* dr, dsc_replace_data* drd) { + dsc_data* data = vector_dsc_data_reserve_back(&dr->dsc.data); + data->name = drd->name; + data->func = drd->func_id; + data->data_offset = (uint32_t)vector_length(dr->dsc.data_buffer); + return vector_uint32_t_reserve_back_range(&dr->dsc.data_buffer, drd->length); +} + +inline static dsc_get_func_length dsc_type_get_dsc_get_func_length(dsc_type type, bool has_perf_id) { + return has_perf_id + ? dsc_get_func_length_array[type] + : dsc_get_func_length_old_array[type]; +} diff --git a/src/KKdLib/dsc.h b/src/KKdLib/dsc.h index ab9ca717..05a15f39 100644 --- a/src/KKdLib/dsc.h +++ b/src/KKdLib/dsc.h @@ -41,6 +41,8 @@ typedef enum dsc_type { DSC_FT, DSC_PSP, DSC_2ND, + DSC_DT, + DSC_DT2, DSC_F, DSC_F2, DSC_MGF, @@ -69,8 +71,8 @@ typedef struct dsc_note11 { int32_t wave_count; int32_t distance; int32_t amplitude; - int32_t timing; - int32_t bar_time; + int32_t target_flying_time; + int32_t time_signature; } dsc_note11; typedef struct dsc_note12 { @@ -83,8 +85,8 @@ typedef struct dsc_note12 { int32_t wave_count; int32_t distance; int32_t amplitude; - int32_t timing; - int32_t bar_time; + int32_t target_flying_time; + int32_t time_signature; int32_t target_effect; } dsc_note12; #pragma endregion @@ -262,6 +264,7 @@ typedef enum dsc_target_id_x { #pragma endregion typedef struct dsc_data { + const char* name; int32_t func; uint32_t data_offset; } dsc_data; @@ -270,15 +273,64 @@ vector(dsc_data) typedef struct dsc { dsc_type type; - union { - uint32_t signature; - uint32_t id; - }; + uint32_t signature; + uint32_t id; vector_dsc_data data; vector_uint32_t data_buffer; } dsc; +typedef struct dsc_replace dsc_replace; +typedef struct dsc_replace_data dsc_replace_data; + typedef int32_t(*dsc_get_func_length)(int32_t id); +typedef const char*(*dsc_get_func_name)(int32_t id); +typedef const void(*dsc_func_convert)(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data); + +struct dsc_replace_data { + const char* name; + int32_t func_id; + int32_t length; + dsc_func_convert func; +}; + +struct dsc_replace { + dsc_type src_type; + dsc_type dst_type; + dsc_replace_data* replace_data; + dsc dsc; + bool dst_has_perf_id; + + int32_t bpm; + int32_t time_signature; + int32_t target_flying_time; + + int32_t bar_time_set_func_id; + int32_t target_flying_time_func_id; +}; + +extern const int32_t dsc_ac101_func_count; +extern const int32_t dsc_ac110_func_count; +extern const int32_t dsc_ac120_func_count; +extern const int32_t dsc_ac200_func_count; +extern const int32_t dsc_ac210_func_count; +extern const int32_t dsc_ac500_func_count; +extern const int32_t dsc_ac510_func_count; +extern const int32_t dsc_aft101_func_count; +extern const int32_t dsc_aft200_func_count; +extern const int32_t dsc_aft300_func_count; +extern const int32_t dsc_aft310_func_count; +extern const int32_t dsc_aft410_func_count; +extern const int32_t dsc_aft701_func_count; +extern const int32_t dsc_ft_func_count; +extern const int32_t dsc_psp_func_count; +extern const int32_t dsc_2nd_func_count; +extern const int32_t dsc_dt_func_count; +extern const int32_t dsc_dt2_func_count; +extern const int32_t dsc_f_func_count; +extern const int32_t dsc_f2_func_count; +extern const int32_t dsc_mgf_func_count; +extern const int32_t dsc_x_func_count; +extern const int32_t dsc_vrfl_func_count; extern int32_t dsc_ac101_get_func_length(int32_t id); extern int32_t dsc_ac110_get_func_length(int32_t id); @@ -296,6 +348,8 @@ extern int32_t dsc_aft701_get_func_length(int32_t id); extern int32_t dsc_ft_get_func_length(int32_t id); extern int32_t dsc_psp_get_func_length(int32_t id); extern int32_t dsc_2nd_get_func_length(int32_t id); +extern int32_t dsc_dt_get_func_length(int32_t id); +extern int32_t dsc_dt2_get_func_length(int32_t id); extern int32_t dsc_f_get_func_length(int32_t id); extern int32_t dsc_f2_get_func_length(int32_t id); extern int32_t dsc_mgf_get_func_length(int32_t id); @@ -313,14 +367,49 @@ extern int32_t dsc_aft310_get_func_length_old(int32_t id); extern int32_t dsc_aft410_get_func_length_old(int32_t id); extern int32_t dsc_aft701_get_func_length_old(int32_t id); extern int32_t dsc_ft_get_func_length_old(int32_t id); +extern int32_t dsc_dt2_get_func_length_old(int32_t id); extern int32_t dsc_f_get_func_length_old(int32_t id); +extern const char* dsc_ac101_get_func_name(int32_t id); +extern const char* dsc_ac110_get_func_name(int32_t id); +extern const char* dsc_ac120_get_func_name(int32_t id); +extern const char* dsc_ac200_get_func_name(int32_t id); +extern const char* dsc_ac210_get_func_name(int32_t id); +extern const char* dsc_ac500_get_func_name(int32_t id); +extern const char* dsc_ac510_get_func_name(int32_t id); +extern const char* dsc_aft101_get_func_name(int32_t id); +extern const char* dsc_aft200_get_func_name(int32_t id); +extern const char* dsc_aft300_get_func_name(int32_t id); +extern const char* dsc_aft310_get_func_name(int32_t id); +extern const char* dsc_aft410_get_func_name(int32_t id); +extern const char* dsc_aft701_get_func_name(int32_t id); +extern const char* dsc_ft_get_func_name(int32_t id); +extern const char* dsc_psp_get_func_name(int32_t id); +extern const char* dsc_2nd_get_func_name(int32_t id); +extern const char* dsc_dt_get_func_name(int32_t id); +extern const char* dsc_dt2_get_func_name(int32_t id); +extern const char* dsc_f_get_func_name(int32_t id); +extern const char* dsc_f2_get_func_name(int32_t id); +extern const char* dsc_mgf_get_func_name(int32_t id); +extern const char* dsc_x_get_func_name(int32_t id); +extern const char* dsc_vrfl_get_func_name(int32_t id); + +extern const int32_t dsc_func_count_array[]; extern const dsc_get_func_length dsc_get_func_length_array[]; extern const dsc_get_func_length dsc_get_func_length_old_array[]; +extern const dsc_get_func_name dsc_get_func_name_array[]; extern void dsc_init(dsc* d); +extern void dsc_convert(dsc* d, dsc_type dst_type); extern void dsc_data_buffer_rebuild(dsc* d); extern void* dsc_data_get_func_data(dsc* d, dsc_data* data); -extern void dsc_parse(dsc* d, void* data, size_t length, dsc_type type); +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 void dsc_free(dsc* d); + +extern void dsc_replace_init(dsc_replace* dr, dsc_type src_type, + dsc_type dst_type, bool dst_has_perf_id); +extern void dsc_replace_free(dsc_replace* dr); + +extern int32_t dsc_calculate_target_flying_time(int32_t bpm, int32_t time_signature); diff --git a/src/KKdLib/f2/enrs.c b/src/KKdLib/f2/enrs.c index a54f6c50..ea00979a 100644 --- a/src/KKdLib/f2/enrs.c +++ b/src/KKdLib/f2/enrs.c @@ -71,7 +71,7 @@ uint32_t enrs_length(vector_enrs_entry* enrs) { o = 0; for (i = enrs->begin; i != enrs->end; i++) { entry = *i; - entry.count = (uint32_t)(entry.sub.end - entry.sub.begin); + entry.count = (uint32_t)vector_length(entry.sub); if (i != enrs->begin && i[-1].count < 1) { o += (uint32_t)((size_t)i[-1].size * i[-1].repeat_count); if (i->count > 0) { @@ -159,12 +159,12 @@ void enrs_write(stream* s, vector_enrs_entry* enrs) { o = 0; size_t length = enrs_length(enrs); io_write_uint32_t(s, 0); - io_write_uint32_t(s, (uint32_t)(enrs->end - enrs->begin)); + io_write_uint32_t(s, (uint32_t)vector_length(*enrs)); io_write_uint32_t(s, 0); io_write_uint32_t(s, 0); for (i = enrs->begin; i != enrs->end; i++) { entry = *i; - entry.count = (uint32_t)(entry.sub.end - entry.sub.begin); + entry.count = (uint32_t)vector_length(entry.sub); if (i != enrs->begin && i[-1].count < 1) { o += (uint32_t)((size_t)i[-1].size * i[-1].repeat_count); if (i->count > 0) { diff --git a/src/KKdLib/f2/struct.c b/src/KKdLib/f2/struct.c index fc6341ac..39e64cd9 100644 --- a/src/KKdLib/f2/struct.c +++ b/src/KKdLib/f2/struct.c @@ -132,9 +132,9 @@ static void f2_struct_get_length(f2_struct* s, bool shift_x) { uint32_t l; vector_f2_struct ls; - has_pof = s->pof.end - s->pof.begin > 0 ? true : false; - has_enrs = s->enrs.end - s->enrs.begin > 0 ? true : false; - has_sub_structs = s->sub_structs.end - s->sub_structs.begin > 0 ? true : false; + has_pof = vector_length(s->pof) > 0 ? true : false; + has_enrs = vector_length(s->enrs) > 0 ? true : false; + has_sub_structs = vector_length(s->sub_structs) > 0 ? true : false; s->header.section_size = s->data ? (uint32_t)s->length : 0; @@ -202,7 +202,7 @@ static void f2_struct_read_data(stream* s, f2_struct* st, f2_header* h) { } } - if (st->sub_structs.end - st->sub_structs.begin < 1) + if (vector_length(st->sub_structs) < 1) vector_f2_struct_free(&st->sub_structs, f2_struct_free); } diff --git a/src/KKdLib/farc.c b/src/KKdLib/farc.c index d385ed56..ea7e6618 100644 --- a/src/KKdLib/farc.c +++ b/src/KKdLib/farc.c @@ -209,7 +209,7 @@ bool farc_load_file(void* data, char* path, char* file, uint32_t hash) { farc* f = data; farc_read(f, buf, true, false); - bool ret = f->files.end - f->files.begin ? true : false; + bool ret = vector_length(f->files) ? true : false; if (!ret) farc_free(f); return ret; @@ -233,14 +233,14 @@ static errno_t farc_get_files(farc* f) { vector_wstring files = vector_empty(wstring); path_wget_files(&files, f->directory_path); - if (files.end - files.begin < 1) { + if (vector_length(files) < 1) { vector_wstring_free(&files, wstring_free); return -1; } f->files = vector_empty(farc_file); - vector_farc_file_reserve(&f->files, files.end - files.begin); - f->files.end = &f->files.begin[files.end - files.begin]; + vector_farc_file_reserve(&f->files, vector_length(files)); + f->files.end = &f->files.begin[vector_length(files)]; for (farc_file* i = f->files.begin; i != f->files.end; i++) { memset(i, 0, sizeof(farc_file)); string_copy_wstring(&files.begin[i - f->files.begin], &i->name); diff --git a/src/KKdLib/hash.c b/src/KKdLib/hash.c index 7771531b..20e3cead 100644 --- a/src/KKdLib/hash.c +++ b/src/KKdLib/hash.c @@ -5,60 +5,84 @@ #include "hash.h" +static const uint16_t hash_crc16_ccitt_table[] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, +}; + const uint64_t hash_fnv1a64m_empty = 0xCBF29CE44FD0BFC1; const uint32_t hash_murmurhash_empty = 0x0CAD3078; +const uint32_t hash_crc16_ccitt_empty = 0xFFFF; -inline uint64_t hash_fnv1a64m(uint8_t* data, size_t length) { // 0x1403B04D0 in SBZV_7.10; FNV 1a 64-bit Modified +// FNV 1a 64-bit Modified +// 0x1403B04D0 in SBZV_7.10 +inline uint64_t hash_fnv1a64m(uint8_t* data, size_t length, bool make_upper) { uint64_t hash = 0xCBF29CE484222325; if (data) - for (size_t i = 0; i < length; i++) { - hash ^= data[i]; - hash *= 0x100000001B3; - } + if (make_upper) // Modification for only uppercase latin text + for (size_t i = 0; i < length; i++) { + uint8_t a = data[i]; + if (a > 0x60 && a < 0x7B) + a -= 0x20; + hash ^= a; + hash *= 0x100000001B3; + } + else + for (size_t i = 0; i < length; i++) { + hash ^= data[i]; + hash *= 0x100000001B3; + } return (hash >> 32) ^ hash; // Actual Modification } -inline uint64_t hash_utf8_fnv1a64m(char* data) { - uint64_t hash = hash_fnv1a64m((uint8_t*)data, utf8_length(data)); +inline uint64_t hash_utf8_fnv1a64m(char* data, bool make_upper) { + uint64_t hash = hash_fnv1a64m((uint8_t*)data, utf8_length(data), make_upper); return hash; } -inline uint64_t hash_utf16_fnv1a64m(wchar_t* data) { +inline uint64_t hash_utf16_fnv1a64m(wchar_t* data, bool make_upper) { char* temp = utf16_to_utf8(data); - uint64_t hash = hash_fnv1a64m((uint8_t*)temp, utf8_length(temp)); - free(temp); - return hash; -} - -inline uint64_t hash_fnv1a64m_upper(uint8_t* data, size_t length) { // FNV 1a 64-bit Modified; Always Upper - uint64_t hash = 0xCBF29CE484222325; - if (data) - for (size_t i = 0; i < length; i++) { - uint8_t a = data[i]; - if (a > 0x60 && a < 0x7B) - a -= 0x20; - hash ^= a; - hash *= 0x100000001B3; - } - return (hash >> 32) ^ hash; // Actual Modification -} - -inline uint64_t hash_utf8_fnv1a64m_upper(char* data) { - uint64_t hash = hash_fnv1a64m_upper((uint8_t*)data, utf8_length(data)); - return hash; -} - -inline uint64_t hash_utf16_fnv1a64m_upper(wchar_t* data) { - char* temp = utf16_to_utf8(data); - uint64_t hash = hash_fnv1a64m_upper((uint8_t*)temp, utf8_length(temp)); + uint64_t hash = hash_fnv1a64m((uint8_t*)temp, utf8_length(temp), make_upper); free(temp); return hash; } +// MurmurHash +// 0x814D7A9C in PCSB00554 +// 0x8134C304 in PCSB01007 +// 0x0069CEA4 in NPEB02013 uint32_t hash_murmurhash(uint8_t* data, size_t length, - uint32_t seed, bool upper, bool big_endian) { // 0x814D7A9C in PCSB00554; MurmurHash - // 0x8134C304 in PCSB01007 - // 0x0069CEA4 in NPEB02013 + uint32_t seed, bool upper, bool big_endian) { uint32_t a, b, hash; size_t i; @@ -195,3 +219,32 @@ inline uint32_t hash_utf16_murmurhash(wchar_t* data, uint32_t seed, bool upper) free(temp); return hash; } + +// CRC16-CCITT +// 0x140011A90 in SBZV_7.10 +uint16_t hash_crc16_ccitt(uint8_t* data, size_t length, bool make_upper) { + uint16_t hash = 0xFFFF; + if (make_upper) // Modification for only uppercase latin text + for (size_t i = 0; i < length; i++) { + uint8_t a = data[i]; + if (a > 0x60 && a < 0x7B) + a -= 0x20; + hash = (uint16_t)(hash_crc16_ccitt_table[(hash >> 8) ^ a] ^ (hash << 8)); + } + else + for (size_t i = 0; i < length; i++) + hash = (uint16_t)(hash_crc16_ccitt_table[(hash >> 8) ^ data[i]] ^ (hash << 8)); + return hash; +} + +uint16_t hash_utf8_crc16_ccitt(uint8_t* data, bool make_upper) { + uint32_t hash = hash_crc16_ccitt((uint8_t*)data, utf8_length(data), make_upper); + return hash; +} + +uint16_t hash_utf16_crc16_ccitt(wchar_t* data, bool make_upper) { + char* temp = utf16_to_utf8(data); + uint32_t hash = hash_crc16_ccitt((uint8_t*)temp, utf8_length(temp), make_upper); + free(temp); + return hash; +} diff --git a/src/KKdLib/hash.h b/src/KKdLib/hash.h index 9ee37959..de57e640 100644 --- a/src/KKdLib/hash.h +++ b/src/KKdLib/hash.h @@ -9,13 +9,14 @@ 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(uint8_t* data, size_t length); -extern uint64_t hash_utf8_fnv1a64m(char* data); -extern uint64_t hash_utf16_fnv1a64m(wchar_t* data); -extern uint64_t hash_fnv1a64m_upper(uint8_t* data, size_t length); -extern uint64_t hash_utf8_fnv1a64m_upper(char* data); -extern uint64_t hash_utf16_fnv1a64m_upper(wchar_t* data); +extern uint64_t hash_fnv1a64m(uint8_t* data, size_t length, bool make_upper); +extern uint64_t hash_utf8_fnv1a64m(char* data, bool make_upper); +extern uint64_t hash_utf16_fnv1a64m(wchar_t* data, bool make_upper); extern uint32_t hash_murmurhash(uint8_t* 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_utf16_murmurhash(wchar_t* data, uint32_t seed, bool upper); +extern uint16_t hash_crc16_ccitt(uint8_t* data, size_t length, bool make_upper); +extern uint16_t hash_utf8_crc16_ccitt(uint8_t* data, bool make_upper); +extern uint16_t hash_utf16_crc16_ccitt(wchar_t* data, bool make_upper); diff --git a/src/KKdLib/io/msgpack.c b/src/KKdLib/io/msgpack.c index fd24cad4..924293ee 100644 --- a/src/KKdLib/io/msgpack.c +++ b/src/KKdLib/io/msgpack.c @@ -238,13 +238,13 @@ static void io_msgpack_write_inner(stream* s, msgpack* msg) { break; case MSGPACK_ARRAY: { msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - io_msgpack_write_array(s, ptr->end - ptr->begin); + io_msgpack_write_array(s, vector_length(*ptr)); for (msgpack* i = ptr->begin; i != ptr->end; i++) io_msgpack_write_inner(s, i); } break; case MSGPACK_MAP: { msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - io_msgpack_write_map(s, ptr->end - ptr->begin); + io_msgpack_write_map(s, vector_length(*ptr)); for (msgpack* i = ptr->begin; i != ptr->end; i++) io_msgpack_write_inner(s, i); } break; diff --git a/src/KKdLib/io/path.c b/src/KKdLib/io/path.c index 41194ba2..55eebf08 100644 --- a/src/KKdLib/io/path.c +++ b/src/KKdLib/io/path.c @@ -390,7 +390,7 @@ void path_get_directories_recursive(vector_string* directories, char* path, vector_string_push_back(directories, i); - if (!(temp.end - temp.begin)) { + if (vector_length(temp) < 1) { vector_string_free(&temp, string_free); continue; } @@ -511,7 +511,7 @@ void path_wget_directories_recursive(vector_wstring* directories, wchar_t* path, vector_wstring_push_back(directories, i); - if (!(temp.end - temp.begin)) { + if (vector_length(temp) < 1) { vector_wstring_free(&temp, wstring_free); continue; } diff --git a/src/KKdLib/io/stream.c b/src/KKdLib/io/stream.c index 387b14c8..09e3c49d 100644 --- a/src/KKdLib/io/stream.c +++ b/src/KKdLib/io/stream.c @@ -55,7 +55,7 @@ void io_mcopy(stream* s, void** data, size_t* length) { if (!s || !data || !length || s->type != STREAM_MEMORY) return; - *length = s->io.data.vec.end - s->io.data.vec.begin; + *length = vector_length(s->io.data.vec); *data = force_malloc(*length); memcpy(*data, s->io.data.vec.begin, *length); } @@ -158,7 +158,7 @@ inline ssize_t io_get_length(stream* s) { s->length = 0; break; case STREAM_MEMORY: - s->length = s->io.data.vec.end - s->io.data.vec.begin; + s->length = vector_length(s->io.data.vec); break; default: s->length = 0; @@ -189,7 +189,7 @@ int32_t io_set_position(stream* s, ssize_t pos, int32_t seek) { if (pos < 0) return EOF; - capacity = s->io.data.vec.capacity_end - s->io.data.vec.begin; + capacity = vector_capacity(s->io.data.vec); if (capacity < pos) vector_uint8_t_reserve(&s->io.data.vec, pos - capacity); @@ -223,7 +223,7 @@ int32_t io_set_position(stream* s, ssize_t pos, int32_t seek) { if (pos < 0) return EOF; - capacity = s->io.data.vec.end - s->io.data.vec.begin; + capacity = vector_length(s->io.data.vec); if (capacity < pos) return EOF; @@ -242,7 +242,7 @@ inline int32_t io_position_push(stream* s, ssize_t pos, int32_t seek) { } inline void io_position_pop(stream* s) { - if (!(s->position_stack.end - s->position_stack.begin)) + if (vector_length(s->position_stack) < 1) return; ssize_t position = s->position_stack.end[-1]; @@ -373,40 +373,41 @@ inline void io_write_uint8_t(stream* s, uint8_t val) { } inline void io_read_string(stream* s, string* str, size_t length) { - char* temp = force_malloc(length + 1); + string_init_length(str, 0, length); + char* temp = string_data(str); io_read(s, temp, length); temp[length] = 0; - string_init_length(str, temp, length); - free(temp); } inline void io_read_wstring(stream* s, wstring* str, size_t length) { - wchar_t* temp = force_malloc_s(wchar_t, length + 1); + wstring_init_length(str, 0, length); + wchar_t* temp = wstring_data(str); io_read(s, temp, sizeof(wchar_t) * length); temp[length] = 0; - wstring_init_length(str, temp, length); - free(temp); } inline void io_read_string_null_terminated(stream* s, string* str) { ssize_t offset = io_get_position(s); - char* temp = io_read_utf8_string_null_terminated_offset(s, offset); - string_init(str, temp); + size_t length = 0; + char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); + string_init_length(str, temp, length); free(temp); } inline void io_read_wstring_null_terminated(stream* s, wstring* str) { ssize_t offset = io_get_position(s); - wchar_t* temp = io_read_utf16_string_null_terminated_offset(s, offset); - wstring_init(str, temp); + size_t length = 0; + wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); + wstring_init_length(str, temp, length); free(temp); } inline void io_read_string_null_terminated_offset(stream* s, ssize_t offset, string* str) { if (offset) { - char* temp = io_read_utf8_string_null_terminated_offset(s, offset); - string_init(str, temp); + size_t length = 0; + char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); + string_init_length(str, temp, length); free(temp); } else @@ -416,8 +417,9 @@ inline void io_read_string_null_terminated_offset(stream* s, inline void io_read_wstring_null_terminated_offset(stream* s, ssize_t offset, wstring* str) { if (offset) { - wchar_t* temp = io_read_utf16_string_null_terminated_offset(s, offset); - wstring_init(str, temp); + size_t length = 0; + wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); + wstring_init_length(str, temp, length); free(temp); } else @@ -426,15 +428,37 @@ inline void io_read_wstring_null_terminated_offset(stream* s, inline char* io_read_utf8_string_null_terminated(stream* s) { ssize_t offset = io_get_position(s); - return io_read_utf8_string_null_terminated_offset(s, offset); + size_t length = 0; + return io_read_utf8_string_null_terminated_offset_length(s, offset, &length); } inline wchar_t* io_read_utf16_string_null_terminated(stream* s) { ssize_t offset = io_get_position(s); - return io_read_utf16_string_null_terminated_offset(s, offset); + size_t length = 0; + return io_read_utf16_string_null_terminated_offset_length(s, offset, &length); } -char* io_read_utf8_string_null_terminated_offset(stream* s, ssize_t offset) { +inline char* io_read_utf8_string_null_terminated_length(stream* s, ssize_t* length) { + ssize_t offset = io_get_position(s); + return io_read_utf8_string_null_terminated_offset_length(s, offset, length); +} + +inline wchar_t* io_read_utf16_string_null_terminated_length(stream* s, ssize_t* length) { + ssize_t offset = io_get_position(s); + return io_read_utf16_string_null_terminated_offset_length(s, offset, length); +} + +inline char* io_read_utf8_string_null_terminated_offset(stream* s, ssize_t offset) { + size_t length = 0; + return io_read_utf8_string_null_terminated_offset_length(s, offset, &length); +} + +inline wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, ssize_t offset) { + size_t length = 0; + return io_read_utf16_string_null_terminated_offset_length(s, offset, &length); +} + +char* io_read_utf8_string_null_terminated_offset_length(stream* s, ssize_t offset, ssize_t* length) { io_position_push(s, offset, SEEK_SET); size_t name_length = 0; @@ -444,6 +468,7 @@ char* io_read_utf8_string_null_terminated_offset(stream* s, ssize_t offset) { if (name_length == 0) { io_position_pop(s); + *length = 0; return 0; } @@ -453,10 +478,11 @@ char* io_read_utf8_string_null_terminated_offset(stream* s, ssize_t offset) { str[name_length] = 0; io_position_pop(s); + *length = name_length; return str; } -wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, ssize_t offset) { +wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, ssize_t offset, ssize_t* length) { io_position_push(s, offset, SEEK_SET); size_t name_length = 0; @@ -466,8 +492,11 @@ wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, ssize_t offset) && (((c0 & 0xFF) | ((c1 & 0xFF) << 8)) != 0)) name_length++; - if (name_length == 0) + if (name_length == 0) { + io_position_pop(s); + *length = 0; return 0; + } wchar_t* str = force_malloc_s(wchar_t, name_length + 1); io_set_position(s, offset, SEEK_SET); @@ -475,6 +504,7 @@ wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, ssize_t offset) str[name_length] = 0; io_position_pop(s); + *length = name_length; return str; } diff --git a/src/KKdLib/io/stream.h b/src/KKdLib/io/stream.h index a5a8cafb..3136db9d 100644 --- a/src/KKdLib/io/stream.h +++ b/src/KKdLib/io/stream.h @@ -61,8 +61,12 @@ extern void io_read_string_null_terminated_offset(stream* s, ssize_t offset, str extern void io_read_wstring_null_terminated_offset(stream* s, ssize_t offset, wstring* str); extern char* io_read_utf8_string_null_terminated(stream* s); extern wchar_t* io_read_utf16_string_null_terminated(stream* s); +extern char* io_read_utf8_string_null_terminated_length(stream* s, ssize_t* length); +extern wchar_t* io_read_utf16_string_null_terminated_length(stream* s, ssize_t* length); extern char* io_read_utf8_string_null_terminated_offset(stream* s, ssize_t offset); extern wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, ssize_t offset); +extern char* io_read_utf8_string_null_terminated_offset_length(stream* s, ssize_t offset, ssize_t* length); +extern wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, ssize_t offset, ssize_t* length); extern void io_write_string(stream* s, string* str); extern void io_write_wstring(stream* s, wstring* str); extern void io_write_string_null_terminated(stream* s, string* str); diff --git a/src/KKdLib/key_val.c b/src/KKdLib/key_val.c index b7d31422..0f44a8e5 100644 --- a/src/KKdLib/key_val.c +++ b/src/KKdLib/key_val.c @@ -4,6 +4,7 @@ */ #include "key_val.h" +#include "io/path.h" #include "hash.h" #include "str_utils.h" @@ -50,7 +51,7 @@ void key_val_init(key_val* kv, uint8_t* data, size_t length) { size_t key_length = c - s; size_t val_length = len - (key_length + 1); - uint64_t key_hash = hash_fnv1a64m(key_str_data, key_length); + uint64_t key_hash = hash_fnv1a64m(key_str_data, key_length, false); vector_ptr_char_push_back(&kv->key, &key_str_data); vector_size_t_push_back(&kv->key_len, &key_length); @@ -62,6 +63,46 @@ void key_val_init(key_val* kv, uint8_t* data, size_t length) { 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.length); + io_read(&s, d, s.length); + key_val_init(kv, 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.length); + io_read(&s, d, s.length); + key_val_init(kv, 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_ptr_empty(char); @@ -79,7 +120,7 @@ bool key_val_get_local_key_val(key_val* kv, char* str, key_val* lkv) { char** i = kv->key.begin; size_t* i_len = kv->key_len.begin; - size_t j = kv->key.end - kv->key.begin; + size_t j = vector_length(kv->key); for (; j; i++, i_len++, j--) if (str_length <= *i_len && !memcmp(str, (char*)*i, str_length)) { if (!first) @@ -109,7 +150,7 @@ bool key_val_has_key(key_val* kv, char* str) { char** i = kv->key.begin; size_t* i_len = kv->key_len.begin; - size_t j = kv->key.end - kv->key.begin; + size_t j = vector_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)) @@ -320,7 +361,7 @@ void key_val_write_vec3(stream* s, char* buf, void key_val_free(key_val* kv) { if (kv->buf) { - size_t count = kv->key.end - kv->key.begin; + size_t count = vector_length(kv->key); memset(kv->key.begin, 0, sizeof(char*) * count); memset(kv->val.begin, 0, sizeof(char*) * count); @@ -339,7 +380,7 @@ void key_val_get_lexicographic_order(vector_int32_t* vec, int32_t length) { int32_t i, j, m; - if (length <= 0) + if (length < 1) return; vector_int32_t_reserve(vec, length); @@ -391,13 +432,13 @@ void key_val_get_lexicographic_order(vector_int32_t* vec, int32_t length) { } static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length) { - if (!(kv->key_hash.end - kv->key_hash.begin)) + if (vector_length(kv->key_hash) < 1) return -1; - uint64_t hash = hash_fnv1a64m(str, length); + uint64_t hash = hash_fnv1a64m(str, length, false); uint64_t* key = kv->key_hash.begin; - size_t len = kv->key.end - kv->key.begin; + size_t len = vector_length(kv->key); size_t temp; while (len > 0) { if (hash < key[temp = len / 2]) @@ -424,7 +465,7 @@ 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 = kv->key.end - kv->key.begin; + size_t count = vector_length(kv->key); kv->key_hash = vector_empty(uint64_t); kv->key_index = vector_empty(size_t); @@ -439,7 +480,7 @@ static void key_val_sort(key_val* kv) { size_t* key_index = kv->key_index.begin; for (size_t i = 0; i < count; i++) { *key_index++ = i; - *key_hash++ = hash_fnv1a64m(*key++, *key_len++); + *key_hash++ = hash_fnv1a64m(*key++, *key_len++, false); } if (count < 2) diff --git a/src/KKdLib/key_val.h b/src/KKdLib/key_val.h index c3e3f884..96da1730 100644 --- a/src/KKdLib/key_val.h +++ b/src/KKdLib/key_val.h @@ -21,6 +21,8 @@ typedef struct key_val { } key_val; 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_has_key(key_val* kv, char* str); extern bool key_val_read_bool(key_val* kv, char* buf, diff --git a/src/KKdLib/kkc.c b/src/KKdLib/kkc.c index 657c3791..9a9c82a2 100644 --- a/src/KKdLib/kkc.c +++ b/src/KKdLib/kkc.c @@ -54,13 +54,13 @@ void kkc_init_from_key(kkc* c, vector_uint8_t* key) { c->state = 1; c->error = KKC_ERROR_NONE; - if (!key || !key->begin || key->end - key->begin < 1) { + if (!key || !key->begin || vector_length(*key) < 1) { c->error = KKC_ERROR_INVALID_KEY; return; } kkc_key_type type = 0; - size_t kl = key->end - key->begin; + size_t kl = vector_length(*key); switch (kl) { case 16: diff --git a/src/KKdLib/mat.c b/src/KKdLib/mat.c index a9eb8e98..565be311 100644 --- a/src/KKdLib/mat.c +++ b/src/KKdLib/mat.c @@ -278,7 +278,7 @@ inline void mat3_normalize(mat3* x, mat3* z) { z->row2 = *(vec3*)&xt2; } -void mat3_normalize_rotation(mat3* x, mat3* z) { +inline void mat3_normalize_rotation(mat3* x, mat3* z) { __m128 xt; __m128 yt; *(vec3*)&xt = x->row0; @@ -681,7 +681,6 @@ inline void mat4_mult_vec3_inv(mat4* x, vec3* y, vec3* z) { *(vec3*)&yt = *y; yt = _mm_and_ps(yt, vec4_mask_vec3); - yt = _mm_sub_ps(yt, x->row3.data); zt = _mm_mul_ps(yt, x->row0.data); zt = _mm_hadd_ps(zt, zt); z->x = _mm_cvtss_f32(_mm_hadd_ps(zt, zt)); @@ -911,7 +910,7 @@ inline void mat4_normalize(mat4* x, mat4* z) { z->row3.data = _mm_mul_ps(x->row3.data, det); } -void mat4_normalize_rotation(mat4* x, mat4* z) { +inline void mat4_normalize_rotation(mat4* x, mat4* z) { __m128 xt; __m128 yt; xt = _mm_and_ps(x->row0.data, vec4_mask_vec3); @@ -937,7 +936,7 @@ void mat4_normalize_rotation(mat4* x, mat4* z) { if (yt.m128_f32[0] != 0.0f) yt.m128_f32[0] = 1.0f / yt.m128_f32[0]; xt = _mm_mul_ps(xt, _mm_shuffle_ps(yt, yt, 0)); - *(vec3*)&z->row2.data = *(vec3*)&xt; + *(vec3*)&z->row2 = *(vec3*)&xt; z->row0.w = x->row0.w; z->row1.w = x->row1.w; z->row2.w = x->row2.w; @@ -1707,6 +1706,38 @@ inline void mat4_from_quat(quat* quat, mat4* mat) { mat->row3 = (vec4){ 0.0f, 0.0f, 0.0f, 1.0f }; } +float_t vec3_angle_between_two_vectors(vec3* x, vec3* y) { + vec3 z_t; + vec3_cross(*x, *y, z_t); + float_t v2; + vec3_length(z_t, v2); + float_t v3; + vec3_dot(*x, *y, v3); + return fabsf(atan2f(v2, v3)); +} + +void mat4_from_two_vectors(vec3* x, vec3* y, mat4* mat) { + *mat = mat4_identity; + if (x->x == y->x && y->y == x->y && y->z == x->z) + return; + + float_t v5; + vec3_dot(*x, *y, v5); + if (fabsf(1.0f - v5) <= 0.000001f) + return; + + vec3 axis; + vec3_cross(*x, *y, axis); + float_t axis_length; + vec3_length(axis, axis_length); + if (axis_length > 0.000001f) { + float_t angle = vec3_angle_between_two_vectors(x, y); + if (axis_length != 0.0) + vec3_mult_scalar(axis, 1.0f / axis_length, axis); + mat4_from_axis_angle(&axis, angle, mat); + } +} + inline void mat4_from_axis_angle(vec3* axis, float_t angle, mat4* mat) { float_t angle_sin; float_t angle_cos; @@ -1811,6 +1842,29 @@ inline void mat4_set_translation(mat4* x, vec3* z) { *(vec3*)&x->row3 = *z; } +inline void mat4_blend(mat4* x, mat4* y, mat4* 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; @@ -1824,6 +1878,52 @@ inline void mat4_blend_rotation(mat4* x, mat4* y, mat4* z, float_t blend) { mat4_from_quat(&q2, z); } +void mat4_lerp_rotation(mat4* dst, mat4* src0, mat4* src1, float_t blend) { + vec3 m0; + vec3 m1; + vec3_lerp_scalar(*(vec3*)&src0->row0, *(vec3*)&src1->row0, m0, blend); + vec3_lerp_scalar(*(vec3*)&src0->row1, *(vec3*)&src1->row1, m1, blend); + + float_t m0_len_sq; + float_t m1_len_sq; + vec3_length_squared(m0, m0_len_sq); + vec3_length_squared(m1, m1_len_sq); + + if (m0_len_sq <= 0.000001f || m1_len_sq <= 0.000001f) { + *dst = *src1; + return; + } + + vec3 m2; + vec3_cross(m0, m1, m2); + vec3_cross(m2, m0, m1); + + float_t m2_len_sq; + vec3_length_squared(m1, m1_len_sq); + vec3_length_squared(m2, m2_len_sq); + if (m2_len_sq <= 0.000001f || m1_len_sq <= 0.000001) { + *dst = *src1; + return; + } + + float_t m0_len = sqrtf(m0_len_sq); + if (m0_len != 0.0f) + vec3_div_scalar(m0, 1.0f / m0_len, m0); + + float_t m1_len = sqrtf(m1_len_sq); + if (m1_len != 0.0f) + vec3_div_scalar(m1, 1.0f / m1_len, m1); + + float_t m2_len = sqrtf(m2_len_sq); + if (m2_len != 0.0f) + vec3_div_scalar(m2, 1.0f / m2_len, m2); + + *dst = mat4_identity; + *(vec3*)&dst->row0 = m0; + *(vec3*)&dst->row1 = m1; + *(vec3*)&dst->row2 = m2; +} + inline float_t mat4_get_max_scale(mat4* x) { mat4 mat; mat4_transpose(x, &mat); diff --git a/src/KKdLib/mat.h b/src/KKdLib/mat.h index 0b0c6431..c64655e7 100644 --- a/src/KKdLib/mat.h +++ b/src/KKdLib/mat.h @@ -151,12 +151,14 @@ 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_set_translation(mat4* x, vec3* z); +extern void mat4_blend(mat4* x, mat4* y, mat4* z, float_t blend); extern void mat4_blend_rotation(mat4* x, mat4* y, mat4* 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 float_t mat4_get_max_scale(mat4* x); extern void mat4_to_mat4u(mat4* x, mat4u* z); extern void mat4u_to_mat4(mat4u* x, mat4* z); diff --git a/src/KKdLib/mot.c b/src/KKdLib/mot.c index 02b47d81..2e82be60 100644 --- a/src/KKdLib/mot.c +++ b/src/KKdLib/mot.c @@ -51,7 +51,7 @@ void mot_read(mot_set_farc* msf, char* path, bool modern) { farc_init(&f); farc_read(&f, path_farc, true, false); - vector_mot_set_reserve(&msf->vec, f.files.end - f.files.begin); + vector_mot_set_reserve(&msf->vec, vector_length(f.files)); if (!modern) for (farc_file* i = f.files.begin; i != f.files.end; i++) { if (!i->data || !i->size @@ -116,7 +116,7 @@ void mot_wread(mot_set_farc* msf, wchar_t* path, bool modern) { farc_init(&f); farc_wread(&f, path_farc, true, false); - vector_mot_set_reserve(&msf->vec, f.files.end - f.files.begin); + vector_mot_set_reserve(&msf->vec, vector_length(f.files)); if (!modern) for (farc_file* i = f.files.begin; i != f.files.end; i++) { if (!i->data || !i->size @@ -178,7 +178,7 @@ void mot_mread(mot_set_farc* msf, void* data, size_t length, bool modern) { farc_init(&f); farc_mread(&f, data, length, true); - vector_mot_set_reserve(&msf->vec, f.files.end - f.files.begin); + vector_mot_set_reserve(&msf->vec, vector_length(f.files)); if (!modern) for (farc_file* i = f.files.begin; i != f.files.end; i++) { if (!i->data || !i->size @@ -514,7 +514,7 @@ 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 = ms->vec.end - ms->vec.begin; + size_t count = vector_length(ms->vec); 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++) { @@ -727,7 +727,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { enrs_entry ee; vector_size_t pof = vector_empty(size_t); uint32_t murmurhash = 0; - if (ms->vec.end - ms->vec.begin > 0) { + if (vector_length(ms->vec) > 0) { mot_header_modern mh; memset(&mh, 0, sizeof(mot_header_modern)); mot_data* m = ms->vec.begin; diff --git a/src/KKdLib/msgpack.c b/src/KKdLib/msgpack.c index 8683d4f9..6c81e29e 100644 --- a/src/KKdLib/msgpack.c +++ b/src/KKdLib/msgpack.c @@ -190,7 +190,7 @@ msgpack* msgpack_get_by_index(msgpack* msg, size_t index) { return 0; msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - if ((ssize_t)index < ptr->end - ptr->begin) + if ((ssize_t)index < vector_length(*ptr)) return &ptr->begin[index]; return 0; } @@ -200,7 +200,7 @@ void msgpack_set_by_index(msgpack* msg, msgpack* m, size_t index) { return; msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - if ((ssize_t)index < ptr->end - ptr->begin) { + if ((ssize_t)index < vector_length(*ptr)) { msgpack_free(&ptr->begin[index]); ptr->begin[index] = *m; } diff --git a/src/KKdLib/obj.c b/src/KKdLib/obj.c index 9683acf6..2b22b14e 100644 --- a/src/KKdLib/obj.c +++ b/src/KKdLib/obj.c @@ -402,10 +402,8 @@ void obj_free(obj_set* os) { for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; - string_free(&sub->sub_data_0.bone_name); - string_free(&sub->sub_data_1.bone_name); - string_free(&sub->sub_data_2.bone_name); - string_free(&sub->sub_data_3.bone_name); + for (int32_t l = 0; l < 4; l++) + string_free(&sub->sub_data[l].bone_name); } free(cloth->field_1C); free(cloth->field_20); @@ -1164,14 +1162,15 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { for (int32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; - char* block_signature = io_read_utf8_string_null_terminated_offset(s, - bhs[i].block_signature_offset); - if (!block_signature || utf8_length(block_signature) != 3) { - free(block_signature); + string block_signature = string_empty; + io_read_string_null_terminated_offset(s, + bhs[i].block_signature_offset, &block_signature); + if (block_signature.length != 3) { + string_free(&block_signature); continue; } - uint32_t signature = load_reverse_endianness_uint32_t(block_signature); + uint32_t signature = load_reverse_endianness_uint32_t(string_data(&block_signature)); switch (signature) { case 'CLS\0': block->type = OBJ_SKIN_BLOCK_CLOTH; @@ -1204,7 +1203,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { s, bone_names); break; } - free(block_signature); + string_free(&block_signature); } free(bhs); } @@ -1220,7 +1219,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { obj_skin_osage_sibling_info* osis = force_malloc_s( obj_skin_osage_sibling_info, ex->osage_sibling_infos_count); ex->osage_sibling_infos = osis; - io_set_position(s, exh.blocks_offset, SEEK_SET); + io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); 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); @@ -1393,10 +1392,9 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { obj_skin_strings_push_back_check(&strings, string_data(&cloth->backface_mesh_name)); for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_0.bone_name)); - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_1.bone_name)); - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_2.bone_name)); - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_3.bone_name)); + for (int32_t l = 0; l < 4; l++) + obj_skin_strings_push_back_check(&strings, + string_data(&sub->sub_data[l].bone_name)); } obj_skin_strings_push_back_check(&strings, "CLS"); } break; @@ -1407,20 +1405,23 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { bone_names_ptr, constraint->name_index); obj_skin_strings_push_back_check(&strings, string_data(&constraint->source_node_name)); switch (constraint->type) { - case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - obj_skin_strings_push_back_check(&strings, "Direction"); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->direction.up_vector.name)); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - obj_skin_strings_push_back_check(&strings, "Distance"); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->distance.up_vector.name)); - break; case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: obj_skin_strings_push_back_check(&strings, "Orientation"); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: + obj_skin_strings_push_back_check(&strings, "Direction"); + obj_skin_strings_push_back_check(&strings, + string_data(&constraint->direction.up_vector.name)); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: obj_skin_strings_push_back_check(&strings, "Position"); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->position.up_vector.name)); + obj_skin_strings_push_back_check(&strings, + string_data(&constraint->position.up_vector.name)); + break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + obj_skin_strings_push_back_check(&strings, "Distance"); + obj_skin_strings_push_back_check(&strings, + string_data(&constraint->distance.up_vector.name)); break; } obj_skin_strings_push_back_check(&strings, "CNS"); @@ -1521,7 +1522,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } } - exh.bone_names_count = (int32_t)(bone_names.end - bone_names.begin); + exh.bone_names_count = (int32_t)vector_length(bone_names); exh.bone_names_offset = io_get_position(s); for (string* i = bone_names.begin; i != bone_names.end; i++) io_write_int32_t(s, 0); @@ -1580,24 +1581,24 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_write(s, 0, 0x28); io_write(s, 0, 0x10); switch (block->constraint.type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + io_write(s, 0, 0x0C); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: io_write(s, 0, 0x24); io_write(s, 0, 0x18); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + io_write(s, 0, 0x24); + io_write(s, 0, 0x14); + io_write(s, 0, 0x14); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: io_write(s, 0, 0x24); io_write(s, 0, 0x04); io_write(s, 0, 0x14); io_write(s, 0, 0x14); break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write(s, 0, 0x0C); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - io_write(s, 0, 0x24); - io_write(s, 0, 0x14); - io_write(s, 0, 0x14); - break; } } io_align_write(s, 0x10); @@ -1726,7 +1727,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } } - vector_ssize_t_reserve(&string_offsets, strings.end - strings.begin); + vector_ssize_t_reserve(&string_offsets, vector_length(strings)); for (string* i = strings.begin; i != strings.end; i++) { *vector_ssize_t_reserve_back(&string_offsets) = io_get_position(s); @@ -1759,13 +1760,13 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { ssize_t constraint_type_name_offsets[4]; constraint_type_name_offsets[0] = obj_skin_strings_get_string_offset(&strings, - &string_offsets, "Direction"); - constraint_type_name_offsets[1] = obj_skin_strings_get_string_offset(&strings, - &string_offsets, "Distance"); - constraint_type_name_offsets[2] = obj_skin_strings_get_string_offset(&strings, &string_offsets, "Orientation"); - constraint_type_name_offsets[3] = obj_skin_strings_get_string_offset(&strings, + constraint_type_name_offsets[1] = obj_skin_strings_get_string_offset(&strings, + &string_offsets, "Direction"); + constraint_type_name_offsets[2] = obj_skin_strings_get_string_offset(&strings, &string_offsets, "Position"); + constraint_type_name_offsets[3] = obj_skin_strings_get_string_offset(&strings, + &string_offsets, "Distance"); char** bone_names_ptr = ex->bone_names; for (int32_t i = 0; i < ex->blocks_count; i++) { @@ -1906,7 +1907,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_write_int32_t(s, 0); io_position_pop(s); - exh.osage_count = (int32_t)(osage_names.end - osage_names.begin); + exh.osage_count = (int32_t)vector_length(osage_names); exh.osage_count -= exh.cloth_count; io_position_push(s, exh.osage_names_offset, SEEK_SET); for (string* i = osage_names.begin; i != osage_names.end; i++) { @@ -2012,10 +2013,9 @@ static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, f->field_1C = io_read_uint32_t(s); f->field_20 = io_read_uint32_t(s); f->field_24 = io_read_uint32_t(s); - obj_classic_read_skin_block_cloth_field_1C_sub(&f->sub_data_0, s, str); - obj_classic_read_skin_block_cloth_field_1C_sub(&f->sub_data_1, s, str); - obj_classic_read_skin_block_cloth_field_1C_sub(&f->sub_data_2, s, str); - obj_classic_read_skin_block_cloth_field_1C_sub(&f->sub_data_3, s, str); + + for (int32_t j = 0; j < 4; j++) + obj_classic_read_skin_block_cloth_field_1C_sub(&f->sub_data[j], s, str); } io_position_pop(s); } @@ -2025,16 +2025,8 @@ static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, b->field_20 = force_malloc_s(obj_skin_block_cloth_field_20, b->count); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_0, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_1, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_2, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_3, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_4, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_5, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_6, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_7, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_8, s, str); - obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data_9, s, str); + for (int32_t j = 0; j < 10; j++) + obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data[j], s, str); } io_position_pop(s); } @@ -2123,10 +2115,10 @@ static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, io_write_uint32_t(s, f->field_1C); io_write_uint32_t(s, f->field_20); io_write_uint32_t(s, f->field_24); - obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data_0, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data_1, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data_2, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data_3, s, strings, string_offsets); + + for (int32_t j = 0; j < 4; j++) + obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data[j], + s, strings, string_offsets); } io_position_pop(s); *field_1C_offset += (10 * sizeof(int32_t) @@ -2137,16 +2129,9 @@ static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, io_position_push(s, *field_20_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_0, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_1, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_2, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_3, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_4, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_5, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_6, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_7, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_8, s, strings, string_offsets); - obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data_9, s, strings, string_offsets); + for (int32_t j = 0; j < 10; j++) + obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data[j], + s, strings, string_offsets); } io_position_pop(s); *field_20_offset += 10 * (11 * sizeof(int32_t)) * b->count; @@ -2241,7 +2226,13 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, int32_t source_node_name_offset = io_read_int32_t(s); io_read_string_null_terminated_offset(s, source_node_name_offset, &b->source_node_name); - if (!str_utils_compare(type, "Direction")) { + if (!str_utils_compare(type, "Orientation")) { + b->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; + b->orientation.offset.x = io_read_float_t(s); + b->orientation.offset.y = io_read_float_t(s); + b->orientation.offset.z = io_read_float_t(s); + } + else if (!str_utils_compare(type, "Direction")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION; obj_classic_read_skin_block_constraint_up_vector(&b->direction.up_vector, s, str); @@ -2252,6 +2243,15 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, b->direction.target_offset.y = io_read_float_t(s); b->direction.target_offset.z = io_read_float_t(s); } + else if (!str_utils_compare(type, "Position")) { + b->type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; + obj_classic_read_skin_block_constraint_up_vector(&b->position.up_vector, + s, str); + obj_classic_read_skin_block_constraint_attach_point(&b->position.constrained_object, + s, str); + obj_classic_read_skin_block_constraint_attach_point(&b->position.constraining_object, + s, str); + } else if (!str_utils_compare(type, "Distance")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE; obj_classic_read_skin_block_constraint_up_vector(&b->distance.up_vector, @@ -2262,21 +2262,6 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, obj_classic_read_skin_block_constraint_attach_point(&b->distance.constraining_object, s, str); } - else if (!str_utils_compare(type, "Orientation")) { - b->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; - b->orientation.offset.x = io_read_float_t(s); - b->orientation.offset.y = io_read_float_t(s); - b->orientation.offset.z = io_read_float_t(s); - } - else if (!str_utils_compare(type, "Position")) { - b->type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; - obj_classic_read_skin_block_constraint_up_vector(&b->position.up_vector, - s, str); - obj_classic_read_skin_block_constraint_attach_point(&b->position.constrained_object, - s, str); - obj_classic_read_skin_block_constraint_attach_point(&b->position.constraining_object, - s, str); - } else b->type = OBJ_SKIN_BLOCK_CONSTRAINT_NONE; free(type); @@ -2288,16 +2273,16 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b ssize_t type_offset = 0; switch (b->type) { - case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: type_offset = offsets[0]; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: type_offset = offsets[1]; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: type_offset = offsets[2]; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: type_offset = offsets[3]; break; } @@ -2314,6 +2299,11 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b io_write_int32_t(s, (int32_t)source_node_name_offset); switch (b->type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + io_write_float_t(s, b->orientation.offset.x); + io_write_float_t(s, b->orientation.offset.y); + io_write_float_t(s, b->orientation.offset.z); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: obj_classic_write_skin_block_constraint_up_vector(&b->direction.up_vector, s, strings, string_offsets); @@ -2324,6 +2314,14 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b io_write_float_t(s, b->direction.target_offset.y); io_write_float_t(s, b->direction.target_offset.z); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + obj_classic_write_skin_block_constraint_up_vector(&b->position.up_vector, + s, strings, string_offsets); + obj_classic_write_skin_block_constraint_attach_point(&b->position.constrained_object, + s, strings, string_offsets); + obj_classic_write_skin_block_constraint_attach_point(&b->position.constraining_object, + s, strings, string_offsets); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: obj_classic_write_skin_block_constraint_up_vector(&b->distance.up_vector, s, strings, string_offsets); @@ -2333,19 +2331,6 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b obj_classic_write_skin_block_constraint_attach_point(&b->distance.constraining_object, s, strings, string_offsets); break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write_float_t(s, b->orientation.offset.x); - io_write_float_t(s, b->orientation.offset.y); - io_write_float_t(s, b->orientation.offset.z); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - obj_classic_write_skin_block_constraint_up_vector(&b->position.up_vector, - s, strings, string_offsets); - obj_classic_write_skin_block_constraint_attach_point(&b->position.constrained_object, - s, strings, string_offsets); - obj_classic_write_skin_block_constraint_attach_point(&b->position.constraining_object, - s, strings, string_offsets); - break; } } @@ -2776,20 +2761,10 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets break; case OBJ_VERTEX_ATTRIB_BONE_INDEX: for (int32_t j = 0; j < vertex_count; j++) { - vec4i bone_index; - bone_index.x = (int32_t)io_read_float_t(s); - bone_index.y = (int32_t)io_read_float_t(s); - bone_index.z = (int32_t)io_read_float_t(s); - bone_index.w = (int32_t)io_read_float_t(s); - if (bone_index.x == 0xFF) - bone_index.x = -1; - if (bone_index.y == 0xFF) - bone_index.y = -1; - if (bone_index.z == 0xFF) - bone_index.z = -1; - if (bone_index.w == 0xFF) - bone_index.w = -1; - vec4i_to_vec4iu(bone_index, vtx[j].bone_index); + vtx[j].bone_index.x = (int32_t)io_read_float_t(s); + vtx[j].bone_index.y = (int32_t)io_read_float_t(s); + vtx[j].bone_index.z = (int32_t)io_read_float_t(s); + vtx[j].bone_index.w = (int32_t)io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_UNKNOWN: @@ -2936,12 +2911,10 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_BONE_INDEX) { attrib_offsets[11] = io_get_position(s) - base_offset; for (int32_t i = 0; i < _vertex_count; i++) { - vec4 bone_index; - vec4i16_to_vec4(vtx[i].bone_index, bone_index); - io_write_float_t(s, bone_index.x); - io_write_float_t(s, bone_index.y); - io_write_float_t(s, bone_index.z); - io_write_float_t(s, bone_index.w); + io_write_float_t(s, (float_t)vtx[i].bone_index.x); + io_write_float_t(s, (float_t)vtx[i].bone_index.y); + io_write_float_t(s, (float_t)vtx[i].bone_index.z); + io_write_float_t(s, (float_t)vtx[i].bone_index.w); } } @@ -3464,7 +3437,7 @@ static void obj_modern_write_index(obj* obj, stream* s, bool is_x, vector_enrs_entry* e = &oidx->enrs; enrs_entry ee; bool add_enrs = true; - if (e->end - e->begin > 0) { + if (vector_length(*e) > 0) { off = (uint32_t)((size_t)e->end[-1].size * e->end[-1].repeat_count); if (e->end[-1].count && e->end[-1].sub.begin[0].type == type) { e->end[-1].repeat_count += sub_mesh->indices_count; @@ -4275,14 +4248,15 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, for (int32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; - char* block_signature = io_read_utf8_string_null_terminated_offset(s, - bhs[i].block_signature_offset); - if (utf8_length(block_signature) != 3) { - free(block_signature); + string block_signature = string_empty; + io_read_string_null_terminated_offset(s, + bhs[i].block_signature_offset, &block_signature); + if (block_signature.length != 3) { + string_free(&block_signature); continue; } - uint32_t signature = load_reverse_endianness_uint32_t(block_signature); + uint32_t signature = load_reverse_endianness_uint32_t(string_data(&block_signature)); switch (signature) { case 'CLS\0': block->type = OBJ_SKIN_BLOCK_CLOTH; @@ -4317,7 +4291,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, default: break; } - free(block_signature); + string_free(&block_signature); } free(bhs); } @@ -4447,10 +4421,9 @@ static void obj_modern_write_skin(obj* obj, stream* s, for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_0.bone_name)); - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_1.bone_name)); - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_2.bone_name)); - obj_skin_strings_push_back_check(&strings, string_data(&sub->sub_data_3.bone_name)); + for (int32_t l = 0; l < 4; l++) + obj_skin_strings_push_back_check(&strings, + string_data(&sub->sub_data[l].bone_name)); } obj_skin_strings_push_back_check(&strings, "CLS"); } break; @@ -4461,20 +4434,23 @@ static void obj_modern_write_skin(obj* obj, stream* s, bone_names_ptr, constraint->name_index); obj_skin_strings_push_back_check(&strings, string_data(&constraint->source_node_name)); switch (constraint->type) { - case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - obj_skin_strings_push_back_check(&strings, "Direction"); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->direction.up_vector.name)); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - obj_skin_strings_push_back_check(&strings, "Distance"); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->distance.up_vector.name)); - break; case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: obj_skin_strings_push_back_check(&strings, "Orientation"); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: + obj_skin_strings_push_back_check(&strings, "Direction"); + obj_skin_strings_push_back_check(&strings, + string_data(&constraint->direction.up_vector.name)); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: obj_skin_strings_push_back_check(&strings, "Position"); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->position.up_vector.name)); + obj_skin_strings_push_back_check(&strings, + string_data(&constraint->position.up_vector.name)); + break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + obj_skin_strings_push_back_check(&strings, "Distance"); + obj_skin_strings_push_back_check(&strings, + string_data(&constraint->distance.up_vector.name)); break; } obj_skin_strings_push_back_check(&strings, "CNS"); @@ -4576,7 +4552,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, exh.osage_count++; } - exh.bone_names_count = (int32_t)(bone_names.end - bone_names.begin); + exh.bone_names_count = (int32_t)vector_length(bone_names); } if (sk->ex_data_init) { @@ -4740,25 +4716,34 @@ static void obj_modern_write_skin(obj* obj, stream* s, cns_type = block->constraint.type; if (!is_x) switch (cns_type) { - case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - ee = (enrs_entry){ off, 8, 144, 0, vector_empty(enrs_sub_entry) }; - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 29, ENRS_DWORD }); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - ee = (enrs_entry){ off, 8, 136, 0, vector_empty(enrs_sub_entry) }; - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 34, ENRS_DWORD }); - break; case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: ee = (enrs_entry){ off, 6, 68, 0, vector_empty(enrs_sub_entry) }; vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 17, ENRS_DWORD }); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: + ee = (enrs_entry){ off, 8, 144, 0, vector_empty(enrs_sub_entry) }; + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 29, ENRS_DWORD }); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: ee = (enrs_entry){ off, 8, 132, 0, vector_empty(enrs_sub_entry) }; vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 33, ENRS_DWORD }); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + ee = (enrs_entry){ off, 8, 136, 0, vector_empty(enrs_sub_entry) }; + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 34, ENRS_DWORD }); + break; } else switch (cns_type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + ee = (enrs_entry){ off, 6, 96, 0, vector_empty(enrs_sub_entry) }; + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 9, ENRS_DWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 2, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_DWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 1, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 3, ENRS_DWORD }); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: ee = (enrs_entry){ off, 8, 144, 0, vector_empty(enrs_sub_entry) }; vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); @@ -4770,26 +4755,6 @@ static void obj_modern_write_skin(obj* obj, stream* s, vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 6, ENRS_DWORD }); break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - ee = (enrs_entry){ off, 8, 168, 0, vector_empty(enrs_sub_entry) }; - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 9, ENRS_DWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 2, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_DWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 1, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 8, ENRS_DWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 11, ENRS_DWORD }); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - ee = (enrs_entry){ off, 6, 96, 0, vector_empty(enrs_sub_entry) }; - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 9, ENRS_DWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 2, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_DWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 1, ENRS_QWORD }); - vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 3, ENRS_DWORD }); - break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: ee = (enrs_entry){ off, 8, 160, 0, vector_empty(enrs_sub_entry) }; vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); @@ -4801,6 +4766,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 10, ENRS_DWORD }); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + ee = (enrs_entry){ off, 8, 168, 0, vector_empty(enrs_sub_entry) }; + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 9, ENRS_DWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 2, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_DWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 4, 1, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 8, ENRS_DWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 1, ENRS_QWORD }); + vector_enrs_sub_entry_push_back(&ee.sub, &(enrs_sub_entry){ 0, 11, ENRS_DWORD }); + break; } constraint_count = 1; } @@ -5258,11 +5234,20 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write(s, 0, 0x04); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); switch (block->constraint.type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + io_write(s, 0, 0x0C); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: io_write(s, 0, 0x20); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write(s, 0, 0x18); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + io_write(s, 0, 0x20); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write(s, 0, 0x14); + io_write(s, 0, 0x14); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: io_write(s, 0, 0x20); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); @@ -5270,15 +5255,6 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write(s, 0, 0x14); io_write(s, 0, 0x14); break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write(s, 0, 0x0C); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - io_write(s, 0, 0x20); - io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0, 0x14); - io_write(s, 0, 0x14); - break; } } else @@ -5295,11 +5271,21 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write(s, 0, 0x08); io_write_offset_x_pof_add(s, 0, &pof); switch (block->constraint.type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + io_write(s, 0, 0x0C); + io_write(s, 0, 0x04); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: io_write(s, 0, 0x20); io_write_offset_x_pof_add(s, 0, &pof); io_write(s, 0, 0x18); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + io_write(s, 0, 0x20); + io_write_offset_x_pof_add(s, 0, &pof); + io_write(s, 0, 0x14); + io_write(s, 0, 0x14); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: io_write(s, 0, 0x20); io_write_offset_x_pof_add(s, 0, &pof); @@ -5308,16 +5294,6 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write(s, 0, 0x14); io_write(s, 0, 0x04); break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write(s, 0, 0x0C); - io_write(s, 0, 0x04); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - io_write(s, 0, 0x20); - io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0, 0x14); - io_write(s, 0, 0x14); - break; } } io_align_write(s, 0x10); @@ -5461,7 +5437,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, } } - vector_ssize_t_reserve(&string_offsets, strings.end - strings.begin); + vector_ssize_t_reserve(&string_offsets, vector_length(strings)); for (string* i = strings.begin; i != strings.end; i++) { ssize_t off = io_get_position(s); @@ -5495,13 +5471,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, ssize_t constraint_type_name_offsets[4]; constraint_type_name_offsets[0] = obj_skin_strings_get_string_offset(&strings, - &string_offsets, "Direction"); - constraint_type_name_offsets[1] = obj_skin_strings_get_string_offset(&strings, - &string_offsets, "Distance"); - constraint_type_name_offsets[2] = obj_skin_strings_get_string_offset(&strings, &string_offsets, "Orientation"); - constraint_type_name_offsets[3] = obj_skin_strings_get_string_offset(&strings, + constraint_type_name_offsets[1] = obj_skin_strings_get_string_offset(&strings, + &string_offsets, "Direction"); + constraint_type_name_offsets[2] = obj_skin_strings_get_string_offset(&strings, &string_offsets, "Position"); + constraint_type_name_offsets[3] = obj_skin_strings_get_string_offset(&strings, + &string_offsets, "Distance"); char** bone_names_ptr = ex->bone_names; for (int32_t i = 0; i < ex->blocks_count; i++) { @@ -5691,7 +5667,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_int32_t(s, 0); io_position_pop(s); - exh.osage_count = (int32_t)(osage_names.end - osage_names.begin); + exh.osage_count = (int32_t)vector_length(osage_names); exh.osage_count -= exh.cloth_count; io_position_push(s, exh.osage_names_offset, SEEK_SET); if (!is_x) @@ -5840,10 +5816,10 @@ static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, f->field_1C = io_read_uint32_t_stream_reverse_endianness(s); f->field_20 = io_read_uint32_t_stream_reverse_endianness(s); f->field_24 = io_read_uint32_t_stream_reverse_endianness(s); - obj_modern_read_skin_block_cloth_field_1C_sub(&f->sub_data_0, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_1C_sub(&f->sub_data_1, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_1C_sub(&f->sub_data_2, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_1C_sub(&f->sub_data_3, s, header_length, str, is_x); + + for (int32_t j = 0; j < 4; j++) + obj_modern_read_skin_block_cloth_field_1C_sub(&f->sub_data[j], + s, header_length, str, is_x); } io_position_pop(s); } @@ -5853,16 +5829,9 @@ static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, b->field_20 = force_malloc_s(obj_skin_block_cloth_field_1C, b->count); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_0, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_1, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_2, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_3, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_4, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_5, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_6, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_7, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_8, s, header_length, str, is_x); - obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data_9, s, header_length, str, is_x); + for (int32_t j = 0; j < 10; j++) + obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data[j], + s, header_length, str, is_x); } io_position_pop(s); } @@ -5979,14 +5948,10 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, io_write_uint32_t(s, f->field_1C); io_write_uint32_t(s, f->field_20); io_write_uint32_t(s, f->field_24); - obj_modern_write_skin_block_cloth_field_1C_sub(&f->sub_data_0, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_1C_sub(&f->sub_data_1, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_1C_sub(&f->sub_data_2, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_1C_sub(&f->sub_data_3, - s, strings, string_offsets, is_x); + + for (int32_t j = 0; j < 4; j++) + obj_modern_write_skin_block_cloth_field_1C_sub(&f->sub_data[j], + s, strings, string_offsets, is_x); } io_position_pop(s); if (!is_x) @@ -6001,26 +5966,9 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, io_position_push(s, *field_20_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_0, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_1, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_2, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_3, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_4, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_5, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_6, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_7, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_8, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data_9, - s, strings, string_offsets, is_x); + for (int32_t j = 0; j < 10; j++) + obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data[j], + s, strings, string_offsets, is_x); } io_position_pop(s); *field_20_offset += 10 * (11 * sizeof(int32_t)) * b->count; @@ -6119,7 +6067,13 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, ssize_t source_node_name_offset = io_read_offset(s, header_length, is_x); io_read_string_null_terminated_offset(s, source_node_name_offset, &b->source_node_name); - if (!str_utils_compare(type, "Direction")) { + if (!str_utils_compare(type, "Orientation")) { + b->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; + b->orientation.offset.x = io_read_float_t_stream_reverse_endianness(s); + b->orientation.offset.y = io_read_float_t_stream_reverse_endianness(s); + b->orientation.offset.z = io_read_float_t_stream_reverse_endianness(s); + } + else if (!str_utils_compare(type, "Direction")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION; obj_modern_read_skin_block_constraint_up_vector(&b->direction.up_vector, s, header_length, str, is_x); @@ -6130,6 +6084,15 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, b->direction.target_offset.y = io_read_float_t_stream_reverse_endianness(s); b->direction.target_offset.z = io_read_float_t_stream_reverse_endianness(s); } + else if (!str_utils_compare(type, "Position")) { + b->type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; + obj_modern_read_skin_block_constraint_up_vector(&b->position.up_vector, + s, header_length, str, is_x); + obj_modern_read_skin_block_constraint_attach_point(&b->position.constrained_object, + s, header_length, str, is_x); + obj_modern_read_skin_block_constraint_attach_point(&b->position.constraining_object, + s, header_length, str, is_x); + } else if (!str_utils_compare(type, "Distance")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE; obj_modern_read_skin_block_constraint_up_vector(&b->distance.up_vector, @@ -6140,21 +6103,6 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, obj_modern_read_skin_block_constraint_attach_point(&b->distance.constraining_object, s, header_length, str, is_x); } - else if (!str_utils_compare(type, "Orientation")) { - b->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; - b->orientation.offset.x = io_read_float_t_stream_reverse_endianness(s); - b->orientation.offset.y = io_read_float_t_stream_reverse_endianness(s); - b->orientation.offset.z = io_read_float_t_stream_reverse_endianness(s); - } - else if (!str_utils_compare(type, "Position")) { - b->type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; - obj_modern_read_skin_block_constraint_up_vector(&b->position.up_vector, - s, header_length, str, is_x); - obj_modern_read_skin_block_constraint_attach_point(&b->position.constrained_object, - s, header_length, str, is_x); - obj_modern_read_skin_block_constraint_attach_point(&b->position.constraining_object, - s, header_length, str, is_x); - } else b->type = OBJ_SKIN_BLOCK_CONSTRAINT_NONE; free(type); @@ -6167,16 +6115,16 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, ssize_t type_offset = 0; switch (b->type) { - case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: type_offset = offsets[0]; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: + case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: type_offset = offsets[1]; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: type_offset = offsets[2]; break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: type_offset = offsets[3]; break; } @@ -6193,6 +6141,11 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, io_write_offset(s, source_node_name_offset, 0x20, is_x); switch (b->type) { + case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: + io_write_float_t(s, b->orientation.offset.x); + io_write_float_t(s, b->orientation.offset.y); + io_write_float_t(s, b->orientation.offset.z); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: obj_modern_write_skin_block_constraint_up_vector(&b->direction.up_vector, s, strings, string_offsets, is_x); @@ -6203,6 +6156,14 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, io_write_float_t(s, b->direction.target_offset.y); io_write_float_t(s, b->direction.target_offset.z); break; + case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: + obj_modern_write_skin_block_constraint_up_vector(&b->position.up_vector, + s, strings, string_offsets, is_x); + obj_modern_write_skin_block_constraint_attach_point(&b->position.constrained_object, + s, strings, string_offsets, is_x); + obj_modern_write_skin_block_constraint_attach_point(&b->position.constraining_object, + s, strings, string_offsets, is_x); + break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: obj_modern_write_skin_block_constraint_up_vector(&b->distance.up_vector, s, strings, string_offsets, is_x); @@ -6212,19 +6173,6 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, obj_modern_write_skin_block_constraint_attach_point(&b->distance.constraining_object, s, strings, string_offsets, is_x); break; - case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write_float_t(s, b->orientation.offset.x); - io_write_float_t(s, b->orientation.offset.y); - io_write_float_t(s, b->orientation.offset.z); - break; - case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - obj_modern_write_skin_block_constraint_up_vector(&b->position.up_vector, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_constraint_attach_point(&b->position.constrained_object, - s, strings, string_offsets, is_x); - obj_modern_write_skin_block_constraint_attach_point(&b->position.constraining_object, - s, strings, string_offsets, is_x); - break; } } @@ -6683,7 +6631,7 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, vector_enrs_entry* e = &ovtx->enrs; enrs_entry ee; bool add_enrs = true; - if (e->end - e->begin > 0) { + if (vector_length(*e) > 0) { off = (uint32_t)((size_t)e->end[-1].size * e->end[-1].repeat_count); if (e->end[-1].sub.begin[2].repeat_count == enrs_se3_rc) { e->end[-1].repeat_count += _vertex_count; diff --git a/src/KKdLib/obj.h b/src/KKdLib/obj.h index 41a4313b..5c09940b 100644 --- a/src/KKdLib/obj.h +++ b/src/KKdLib/obj.h @@ -122,10 +122,10 @@ typedef enum obj_primitive_type { typedef enum obj_skin_block_constraint_type { OBJ_SKIN_BLOCK_CONSTRAINT_NONE = 0, - OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION, - OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE, OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION, + OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION, OBJ_SKIN_BLOCK_CONSTRAINT_POSITION, + OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE, } obj_skin_block_constraint_type; typedef enum obj_skin_block_constraint_coupling { @@ -337,10 +337,7 @@ typedef struct obj_skin_block_cloth_field_1C { uint32_t field_1C; uint32_t field_20; uint32_t field_24; - obj_skin_block_cloth_field_1C_sub sub_data_0; - obj_skin_block_cloth_field_1C_sub sub_data_1; - obj_skin_block_cloth_field_1C_sub sub_data_2; - obj_skin_block_cloth_field_1C_sub sub_data_3; + obj_skin_block_cloth_field_1C_sub sub_data[4]; } obj_skin_block_cloth_field_1C; typedef struct obj_skin_block_cloth_field_20_sub { @@ -358,16 +355,7 @@ typedef struct obj_skin_block_cloth_field_20_sub { } obj_skin_block_cloth_field_20_sub; typedef struct obj_skin_block_cloth_field_20 { - obj_skin_block_cloth_field_20_sub sub_data_0; - obj_skin_block_cloth_field_20_sub sub_data_1; - obj_skin_block_cloth_field_20_sub sub_data_2; - obj_skin_block_cloth_field_20_sub sub_data_3; - obj_skin_block_cloth_field_20_sub sub_data_4; - obj_skin_block_cloth_field_20_sub sub_data_5; - obj_skin_block_cloth_field_20_sub sub_data_6; - obj_skin_block_cloth_field_20_sub sub_data_7; - obj_skin_block_cloth_field_20_sub sub_data_8; - obj_skin_block_cloth_field_20_sub sub_data_9; + obj_skin_block_cloth_field_20_sub sub_data[10]; } obj_skin_block_cloth_field_20; typedef struct obj_skin_block_node { @@ -488,6 +476,7 @@ typedef struct obj_skin_block_osage { typedef struct obj_skin_block { obj_skin_block_type type; union { + obj_skin_block_node base; obj_skin_block_cloth cloth; obj_skin_block_constraint constraint; obj_skin_block_expression expression; diff --git a/src/KKdLib/pvpp.c b/src/KKdLib/pvpp.c new file mode 100644 index 00000000..b227f534 --- /dev/null +++ b/src/KKdLib/pvpp.c @@ -0,0 +1,370 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "pvpp.h" +#include "f2/struct.h" +#include "io/path.h" +#include "io/stream.h" +#include "str_utils.h" + +vector_func(pvpp_a3da) +vector_func(pvpp_chara) +vector_func(pvpp_chara_item) +vector_func(pvpp_chara_effect) +vector_func(pvpp_chara_effect_a3da) +vector_func(pvpp_effect) +vector_func(pvpp_glitter) +vector_func(pvpp_motion) + +static void pvpp_a3da_init(pvpp_a3da* a3d); +static void pvpp_a3da_read(pvpp_a3da* a3d, stream* s); +static void pvpp_a3da_free(pvpp_a3da* a3d); +static void pvpp_chara_init(pvpp_chara* chr); +static void pvpp_chara_read(pvpp_chara* chr, stream* s); +static void pvpp_chara_free(pvpp_chara* chr); +static void pvpp_chara_effect_init(pvpp_chara_effect* chr_eff); +static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream* s); +static void pvpp_chara_effect_free(pvpp_chara_effect* chr_eff); +static void pvpp_chara_effect_a3da_init(pvpp_chara_effect_a3da* chr_pv_eff); +static void pvpp_chara_effect_a3da_read(pvpp_chara_effect_a3da* chr_pv_eff, stream* s); +static void pvpp_chara_effect_a3da_free(pvpp_chara_effect_a3da* chr_pv_eff); +static void pvpp_chara_item_init(pvpp_chara_item* chr_itm); +static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s); +static void pvpp_chara_item_free(pvpp_chara_item* chr_itm); +static void pvpp_effect_init(pvpp_effect* eff); +static void pvpp_effect_read(pvpp_effect* eff, stream* s); +static void pvpp_effect_free(pvpp_effect* eff); +static void pvpp_glitter_init(pvpp_glitter* glt); +static void pvpp_glitter_read(pvpp_glitter* glt, stream* s); +static void pvpp_glitter_free(pvpp_glitter* glt); +static void pvpp_motion_init(pvpp_motion* mot); +static void pvpp_motion_read(pvpp_motion* mot, stream* s); +static void pvpp_motion_free(pvpp_motion* mot); +static void pvpp_read_inner(pvpp* pp, stream* s); + +void pvpp_init(pvpp* pp) { + memset(pp, 0, sizeof(pvpp)); +} + +void pvpp_read(pvpp* pp, char* path) { + if (!pp || !path) + return; + + char* path_pvpp = str_utils_add(path, ".pvpp"); + if (path_check_file_exists(path_pvpp)) { + stream s; + io_open(&s, path_pvpp, "rb"); + if (s.io.stream) + pvpp_read_inner(pp, &s); + io_free(&s); + } + free(path_pvpp); +} + +void pvpp_wread(pvpp* pp, wchar_t* path) { + if (!pp || !path) + return; + + wchar_t* path_pvpp = str_utils_wadd(path, L".pvpp"); + if (path_wcheck_file_exists(path_pvpp)) { + stream s; + io_wopen(&s, path_pvpp, L"rb"); + if (s.io.stream) + pvpp_read_inner(pp, &s); + io_free(&s); + } + free(path_pvpp); +} + +bool pvpp_load_file(void* data, char* path, char* file, uint32_t hash) { + size_t file_len = utf8_length(file); + + char* t = strrchr(file, '.'); + if (t) + file_len = t - file; + + string s; + string_init(&s, path); + string_add_length(&s, file, file_len); + + pvpp* pp = data; + pvpp_read(pp, string_data(&s)); + + string_free(&s); + return pp->ready; +} + +void pvpp_free(pvpp* pp) { + vector_pvpp_chara_free(&pp->chara, pvpp_chara_free); + vector_pvpp_effect_free(&pp->effect, pvpp_effect_free); +} + +static void pvpp_a3da_init(pvpp_a3da* a3d) { + memset(a3d, 0, sizeof(pvpp_a3da)); +} + +static void pvpp_a3da_read(pvpp_a3da* a3d, stream* s) { + io_read_string_null_terminated_offset(s, io_read_offset_x(s), &a3d->name); + a3d->hash = io_read_uint32_t_stream_reverse_endianness(s); + io_align_read(s, 0x08); +} + +static void pvpp_a3da_free(pvpp_a3da* a3d) { + memset(a3d, 0, sizeof(pvpp_a3da)); +} + +static void pvpp_chara_init(pvpp_chara* chr) { + memset(chr, 0, sizeof(pvpp_chara)); +} + +static void pvpp_chara_read(pvpp_chara* chr, stream* s) { + uint8_t u00 = io_read_uint8_t(s); + uint8_t chr_eff_count = io_read_uint8_t(s); + uint8_t motion_count = io_read_uint8_t(s); + uint8_t a3da_count = io_read_uint8_t(s); + uint8_t item_count = io_read_uint8_t(s); + uint8_t u05 = io_read_uint8_t(s); + uint8_t glitter_count = io_read_uint8_t(s); + uint8_t u07 = io_read_uint8_t(s); + size_t chr_eff_offset = io_read_offset_x(s); + size_t motion_offset = io_read_offset_x(s); + size_t a3da_offset = io_read_offset_x(s); + size_t item_offset = io_read_offset_x(s); + size_t glitter_offset = io_read_offset_x(s); + size_t o30 = io_read_offset_x(s); + + vector_pvpp_chara_effect_reserve(&chr->chara_effect, chr_eff_count); + chr->chara_effect.end += chr_eff_count; + + io_position_push(s, chr_eff_offset, SEEK_SET); + for (int32_t j = 0; j < chr_eff_count; j++) + pvpp_chara_effect_read(&chr->chara_effect.begin[j], s); + io_position_pop(s); + + vector_pvpp_motion_reserve(&chr->motion, motion_count); + chr->motion.end += motion_count; + + io_position_push(s, motion_offset, SEEK_SET); + for (int32_t j = 0; j < motion_count; j++) { + io_position_push(s, io_read_offset_x(s), SEEK_SET); + pvpp_motion_read(&chr->motion.begin[j], s); + io_position_pop(s); + } + io_position_pop(s); + + vector_pvpp_a3da_reserve(&chr->a3da, a3da_count); + chr->a3da.end += a3da_count; + + io_position_push(s, a3da_offset, SEEK_SET); + for (int32_t j = 0; j < a3da_count; j++) + pvpp_a3da_read(&chr->a3da.begin[j], s); + io_position_pop(s); + + vector_pvpp_chara_item_reserve(&chr->item, item_count); + chr->item.end += item_count; + + io_position_push(s, item_offset, SEEK_SET); + for (int32_t j = 0; j < item_count; j++) + pvpp_chara_item_read(&chr->item.begin[j], s); + io_position_pop(s); + + vector_pvpp_glitter_reserve(&chr->glitter, glitter_count); + chr->glitter.end += glitter_count; + + io_position_push(s, glitter_offset, SEEK_SET); + for (int32_t j = 0; j < glitter_count; j++) + pvpp_glitter_read(&chr->glitter.begin[j], s); + io_position_pop(s); +} + +static void pvpp_chara_free(pvpp_chara* chr) { + vector_pvpp_a3da_free(&chr->a3da, pvpp_a3da_free); + vector_pvpp_chara_effect_free(&chr->chara_effect, pvpp_chara_effect_free); + vector_pvpp_chara_item_free(&chr->item, pvpp_chara_item_free); + vector_pvpp_glitter_free(&chr->glitter, pvpp_glitter_free); + vector_pvpp_motion_free(&chr->motion, pvpp_motion_free); +} + +static void pvpp_chara_effect_init(pvpp_chara_effect* chr_eff) { + memset(chr_eff, 0, sizeof(pvpp_chara_effect)); +} + +static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream* s) { + chr_eff->base_chara = io_read_uint8_t(s); + uint8_t pv_effects_count = io_read_uint8_t(s); + size_t pv_effects_offstet = io_read_offset_x(s); + + vector_pvpp_chara_effect_a3da_reserve(&chr_eff->effect_a3da, pv_effects_count); + chr_eff->effect_a3da.end += pv_effects_count; + + io_position_push(s, pv_effects_offstet, SEEK_SET); + for (int32_t k = 0; k < pv_effects_count; k++) + pvpp_chara_effect_a3da_read(&chr_eff->effect_a3da.begin[k], s); + io_position_pop(s); +} + +static void pvpp_chara_effect_free(pvpp_chara_effect* chr_eff) { + vector_pvpp_chara_effect_a3da_free(&chr_eff->effect_a3da, pvpp_chara_effect_a3da_free); +} + +static void pvpp_chara_effect_a3da_init(pvpp_chara_effect_a3da* chr_eff_a3da) { + memset(chr_eff_a3da, 0, sizeof(pvpp_chara_effect_a3da)); +} + +static void pvpp_chara_effect_a3da_read(pvpp_chara_effect_a3da* chr_eff_a3da, stream* s) { + chr_eff_a3da->u00 = io_read_uint8_t(s); + chr_eff_a3da->u01 = io_read_uint8_t(s); + chr_eff_a3da->u02 = io_read_uint8_t(s); + chr_eff_a3da->u03 = io_read_uint8_t(s); + chr_eff_a3da->u04 = io_read_uint8_t(s); + chr_eff_a3da->u05 = io_read_uint8_t(s); + chr_eff_a3da->u06 = io_read_uint8_t(s); + chr_eff_a3da->u07 = io_read_uint8_t(s); + size_t a3da_offset = io_read_offset_x(s); + size_t o10 = io_read_offset_x(s); + + io_position_push(s, a3da_offset, SEEK_SET); + pvpp_a3da_read(&chr_eff_a3da->a3da, s); + io_position_pop(s); +} + +static void pvpp_chara_effect_a3da_free(pvpp_chara_effect_a3da* chr_eff_a3da) { + pvpp_a3da_free(&chr_eff_a3da->a3da); +} + +static void pvpp_chara_item_init(pvpp_chara_item* chr_itm) { + memset(chr_itm, 0, sizeof(pvpp_chara_item)); +} + +static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s) { + uint8_t a3das_count = io_read_uint8_t(s); + size_t a3das_offset = io_read_offset_x(s); + size_t bone_offset = io_read_offset_x(s); + chr_itm->u18.x = io_read_float_t_stream_reverse_endianness(s); + chr_itm->u18.y = io_read_float_t_stream_reverse_endianness(s); + chr_itm->u18.z = io_read_float_t_stream_reverse_endianness(s); + chr_itm->u18.w = io_read_float_t_stream_reverse_endianness(s); + + vector_pvpp_a3da_reserve(&chr_itm->a3da, a3das_count); + chr_itm->a3da.end += a3das_count; + + io_position_push(s, a3das_offset, SEEK_SET); + for (int32_t k = 0; k < a3das_count; k++) + pvpp_a3da_read(&chr_itm->a3da.begin[k], s); + io_position_pop(s); + + io_read_string_null_terminated_offset(s, bone_offset, &chr_itm->bone); +} + +static void pvpp_chara_item_free(pvpp_chara_item* chr_itm) { + vector_pvpp_a3da_free(&chr_itm->a3da, pvpp_a3da_free); + string_free(&chr_itm->bone); +} + +static void pvpp_effect_init(pvpp_effect* eff) { + memset(eff, 0, sizeof(pvpp_effect)); +} + +static void pvpp_effect_read(pvpp_effect* eff, stream* s) { + uint8_t a3da_count = io_read_uint8_t(s); + uint8_t effect_count = io_read_uint8_t(s); + eff->chara_index = io_read_uint8_t(s); + ssize_t a3da_offset = io_read_offset_x(s); + ssize_t effect_offset = io_read_offset_x(s); + + vector_pvpp_a3da_reserve(&eff->a3da, a3da_count); + eff->a3da.end += a3da_count; + + io_position_push(s, a3da_offset, SEEK_SET); + for (int32_t j = 0; j < a3da_count; j++) + pvpp_a3da_read(&eff->a3da.begin[j], s); + io_position_pop(s); + + vector_pvpp_glitter_reserve(&eff->glitter, effect_count); + eff->glitter.end += effect_count; + + io_position_push(s, effect_offset, SEEK_SET); + for (int32_t j = 0; j < effect_count; j++) + pvpp_glitter_read(&eff->glitter.begin[j], s); + io_position_pop(s); +} + +static void pvpp_effect_free(pvpp_effect* eff) { + vector_pvpp_a3da_free(&eff->a3da, pvpp_a3da_free); + vector_pvpp_glitter_free(&eff->glitter, pvpp_glitter_free); +} + +static void pvpp_glitter_init(pvpp_glitter* glt) { + memset(glt, 0, sizeof(pvpp_glitter)); +} + +static void pvpp_glitter_read(pvpp_glitter* glt, stream* s) { + io_read_string_null_terminated_offset(s, io_read_offset_x(s), &glt->name); + io_read_string_null_terminated_offset(s, io_read_offset_x(s), &glt->unk1); + glt->unk2 = io_read_uint8_t(s) ? true : false; + io_align_read(s, 0x08); +} + +static void pvpp_glitter_free(pvpp_glitter* glt) { + string_free(&glt->name); + string_free(&glt->unk1); +} + +static void pvpp_motion_init(pvpp_motion* mot) { + memset(mot, 0, sizeof(pvpp_motion)); +} + +static void pvpp_motion_read(pvpp_motion* mot, stream* s) { + io_read_string_null_terminated_offset(s, io_read_offset_x(s), &mot->name); + mot->hash = io_read_uint32_t_stream_reverse_endianness(s); + io_align_read(s, 0x08); +} + +static void pvpp_motion_free(pvpp_motion* mot) { + string_free(&mot->name); +} + +static void pvpp_read_inner(pvpp* pp, stream* s) { + f2_struct st; + f2_struct_sread(&st, s); + if (st.header.signature == reverse_endianness_uint32_t('PVPP') && st.data) { + stream s_pvpp; + io_mopen(&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); + uint8_t chara_count = io_read_uint8_t(&s_pvpp); + ssize_t effect_offset = io_read_offset_x(&s_pvpp); + ssize_t chara_offset = io_read_offset_x(&s_pvpp); + io_read_offset_x(&s_pvpp); + + vector_pvpp_chara_reserve(&pp->chara, chara_count); + pp->chara.end += chara_count; + + io_position_push(&s_pvpp, chara_offset, SEEK_SET); + for (int32_t i = 0; i < chara_count; i++) + pvpp_chara_read(&pp->chara.begin[i], &s_pvpp); + io_position_pop(&s_pvpp); + + io_position_push(&s_pvpp, effect_offset, SEEK_SET); + io_read_uint8_t(&s_pvpp); + uint8_t efffect_count = io_read_uint8_t(&s_pvpp); + effect_offset = io_read_offset_x(&s_pvpp); + io_position_pop(&s_pvpp); + + vector_pvpp_effect_reserve(&pp->effect, efffect_count); + pp->effect.end += efffect_count; + + io_position_push(&s_pvpp, effect_offset, SEEK_SET); + for (int32_t i = 0; i < efffect_count; i++) + pvpp_effect_read(&pp->effect.begin[i], &s_pvpp); + io_position_pop(&s_pvpp); + + io_free(&s_pvpp); + + pp->ready = true; + } + f2_struct_free(&st); +} diff --git a/src/KKdLib/pvpp.h b/src/KKdLib/pvpp.h new file mode 100644 index 00000000..1e369e40 --- /dev/null +++ b/src/KKdLib/pvpp.h @@ -0,0 +1,105 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "default.h" +#include "string.h" +#include "vec.h" +#include "vector.h" + +typedef enum pvpp_chara_type { + PVPP_CHARA_MIKU = 0, + PVPP_CHARA_RIN = 1, + PVPP_CHARA_LEN = 2, + PVPP_CHARA_LUKA = 3, + PVPP_CHARA_NERU = 4, + PVPP_CHARA_HAKU = 5, + PVPP_CHARA_KAITO = 6, + PVPP_CHARA_MEIKO = 7, + PVPP_CHARA_SAKINE = 8, + PVPP_CHARA_TETO = 9, + PVPP_CHARA_EXTRA = 10, + PVPP_CHARA_STAGE = 255, +} pvpp_chara_type; + +typedef struct pvpp_a3da { + uint32_t hash; + string name; +} pvpp_a3da; + +typedef struct pvpp_chara_effect_a3da { + pvpp_a3da a3da; + uint8_t u00; + uint8_t u01; + uint8_t u02; + uint8_t u03; + uint8_t u04; + uint8_t u05; + uint8_t u06; + uint8_t u07; +} pvpp_chara_effect_a3da; + +vector(pvpp_chara_effect_a3da) + +typedef struct pvpp_chara_effect { + pvpp_chara_type base_chara; + vector_pvpp_chara_effect_a3da effect_a3da; +} pvpp_chara_effect; + +vector(pvpp_a3da) + +typedef struct pvpp_chara_item { + vector_pvpp_a3da a3da; + string bone; + vec4u u18; +} pvpp_chara_item; + +typedef struct pvpp_glitter { + string name; + string unk1; + bool unk2; +} pvpp_glitter; + +typedef struct pvpp_motion { + uint32_t hash; + string name; +} pvpp_motion; + +vector(pvpp_glitter) + +typedef struct pvpp_effect { + vector_pvpp_a3da a3da; + pvpp_chara_type chara_index; + vector_pvpp_glitter glitter; +} pvpp_effect; + +vector(pvpp_chara_effect) +vector(pvpp_motion) +vector(pvpp_chara_item) + +typedef struct pvpp_chara { + vector_pvpp_a3da a3da; + vector_pvpp_chara_item item; + vector_pvpp_chara_effect chara_effect; + vector_pvpp_glitter glitter; + vector_pvpp_motion motion; +} pvpp_chara; + +vector(pvpp_chara) +vector(pvpp_effect) + +typedef struct pvpp { + bool ready; + + vector_pvpp_chara chara; + vector_pvpp_effect effect; +} pvpp; + +extern void pvpp_init(pvpp* pp); +extern void pvpp_read(pvpp* pp, char* path); +extern void pvpp_wread(pvpp* pp, wchar_t* path); +extern bool pvpp_load_file(void* data, char* path, char* file, uint32_t hash); +extern void pvpp_free(pvpp* pp); diff --git a/src/KKdLib/pvsr.c b/src/KKdLib/pvsr.c new file mode 100644 index 00000000..483b6b19 --- /dev/null +++ b/src/KKdLib/pvsr.c @@ -0,0 +1,558 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "pvsr.h" + +/* +private struct PVSR +{ + public StageEffect[] StageEffects; + public Effect[] EffectList; + public string[] EMCSList; + public StageEffect?[] StageChangeEffects; + public AET[] AETs; + + public struct AET + { + public ushort U48; + public ushort U4A; + public ushort U4C; + public ushort U4E; + public ushort U50; + public ushort U52; + public ushort U54; + public ushort U56; + public ushort U58; + public ushort U5A; + public ushort U5C; + public ushort U5E; + public ushort U60; + + public string SetName; + public AETEntry[] FrontList; + public AETEntry[] FrontLowList; + public AETEntry[] BackList; + public Sub1? Sub1Data; + public Sub2? Sub2AData; + public Sub2? Sub2BData; + public Sub2? Sub2CData; + public Sub2? Sub2DData; + public AETEntry[] Unk03List; + public AETEntry[] Unk04List; + + public override string ToString() => + $"(Set Name: {SetName}; Front List Count: {(FrontList != null ? FrontList.Length : 0)}" + + $"; Front Low List Count: {(FrontLowList != null ? FrontLowList.Length : 0)}" + + $"; Back List Count: {(BackList != null ? BackList.Length : 0)}" + + $"; U48: {U48}; U4A: {U4A}; U4C: {U4C}; U4E: {U4E}; U4C: {U4C}; U50: {U50}; U52: {U52}" + + $"; U54: {U54}; U56: {U56}; U58: {U58}; U5A: {U5A}; U5E: {U5E}; U60: {U60}" + + $"; Unk 3 List Count: {(Unk03List != null ? Unk03List.Length : 0)}" + + $"; Unk 4 List Count: {(Unk04List != null ? Unk04List.Length : 0)}"; + + public struct Sub1 + { + public string Name; + public uint Hash; + public ushort Unk2; + + public override string ToString() => + $"(Name: {Name}; Hash: {Hash:X08}; Unk 2: {Unk2})"; + } + + public struct Sub2 + { + public ushort U00; + public ushort U02; + public ushort U04; + public ushort U06; + public ushort U08; + public ushort U0A; + public ushort U0C; + + public override string ToString() => + $"(U00: {U00}; U02: {U02}; U04: {U04}; U06: {U06}; U08: {U08}; U0A: {U0A})"; + } + } + + public struct AETEntry + { + public string Name; + public uint Hash; + public float BrightScale; + + public override string ToString() => + $"(Name: {Name}; Hash: {Hash:X08}; Bright Scale: {BrightScale})"; + } + + public struct A3DAEntry + { + public string Name; + public uint Hash; + + public override string ToString() => + $"(Name: {Name}; Hash: {Hash:X08})"; + } + + public struct Effect + { + public string Name; + public float Emission; + + public override string ToString() => + $"(Name: {Name}; Emission: {Emission})"; + } + + public struct Glitter + { + public string Name; + public byte Unk1; + + public override string ToString() => + $"(Name: {Name}; Unk 1: {Unk1})"; + } + + public struct StageEffect + { + public A3DAEntry[] A3DAs; + public Glitter[] Glitters; + + public override string ToString() => + $"A3DAs Count: {(A3DAs != null ? A3DAs.Length : 0)}" + + $"; Effects Count: {(Glitters != null ? Glitters.Length : 0)})"; + } +} + +private static PVSR PVSRReader(string file) +{ + int i, j; + KKdBaseLib.F2.Struct st = File.ReadAllBytes(file + ".pvsr").RSt(); + + PVSR pvsr = default; + Stream s = File.OpenReader(st.Data); + s.IsBE = st.Header.UseBigEndian; + s.IsX = true; + + int x00 = s.RI32E(); + byte x04 = s.RU8(); + byte x05 = s.RU8(); + byte x06 = s.RU8(); + byte x07 = s.RU8(); + byte stageEffectsCount = s.RU8(); + byte aetsCount = s.RU8(); + byte x0A = s.RU8(); + byte x0B = s.RU8(); + byte x0C = s.RU8(); + byte x0D = s.RU8(); + byte x0E = s.RU8(); + byte x0F = s.RU8(); + long x10 = s.RI64E(); + long stageEffectsOffset = s.RI64E(); + long stageEffectsListOffset = s.RI64E(); + long aetsOffset = s.RI64E(); + + s.PI64 = x10; + byte UnknownsCount = s.RU8(); + byte EffectsCount = s.RU8(); + byte EMCSsCount = s.RU8(); + s.A(0x08); + long UnknownOffset = s.RI64E(); + long EffectsOffset = s.RI64E(); + long EMCSsOffset = s.RI64E(); + + s.PI64 = EffectsOffset; + pvsr.EffectList = new PVSR.Effect[EffectsCount]; + for (i = 0; i < EffectsCount; i++) + { + ref PVSR.Effect effect = ref pvsr.EffectList[i]; + effect.Name = s.RSaO(); + effect.Emission = s.RF32E(); + s.A(0x08); + } + + s.PI64 = EMCSsOffset; + pvsr.EMCSList = new string[EMCSsCount]; + for (i = 0; i < EMCSsCount; i++) + pvsr.EMCSList[i] = s.RSaO(); + + s.PI64 = stageEffectsOffset; + pvsr.StageEffects = new PVSR.StageEffect[stageEffectsCount]; + for (i = 0; i < stageEffectsCount; i++) + pvsr.StageEffects[i] = readStageEffect(); + + s.PI64 = stageEffectsListOffset; + pvsr.StageChangeEffects = new PVSR.StageEffect?[0x100]; + for (i = 0; i < 0x100; i++) + { + long o = s.RI64E(); + if (o > 0) + pvsr.StageChangeEffects[i] = readStageEffect(o); + + } + + s.PI64 = aetsOffset; + pvsr.AETs = new PVSR.AET[aetsCount]; + for (i = 0; i < aetsCount; i++) + { + long offset = s.PI64; + ref PVSR.AET aet = ref pvsr.AETs[i]; + + long setNameOffset = s.RI64E(); + long frontOffset = s.RI64E(); + long frontLowOffset = s.RI64E(); + long backOffset = s.RI64E(); + long sub1Offset = s.RI64E(); + long sub2AOffset = s.RI64E(); + long sub2BOffset = s.RI64E(); + long sub2COffset = s.RI64E(); + long sub2DOffset = s.RI64E(); + aet.U48 = s.RU16E(); + aet.U4A = s.RU16E(); + aet.U4C = s.RU16E(); + aet.U4E = s.RU16E(); + aet.U50 = s.RU16E(); + aet.U52 = s.RU16E(); + aet.U54 = s.RU16E(); + aet.U56 = s.RU16E(); + aet.U58 = s.RU16E(); + aet.U5A = s.RU16E(); + aet.U5C = s.RU16E(); + aet.U5E = s.RU16E(); + aet.U60 = s.RU16E(); + byte frontCount = s.RU8(); + byte frontLowCount = s.RU8(); + byte backCount = s.RU8(); + s.A(0x08); + long O68 = 0; + long O70 = 0; + byte U78 = 0; + byte U79 = 0; + if ((x00 & 0x100) != 0) + { + O68 = s.RI64E(); + O70 = s.RI64E(); + U78 = s.RU8(); + U79 = s.RU8(); + s.A(0x08); + } + + aet.SetName = s.RSaO(setNameOffset); + + s.PI64 = frontOffset; + aet.FrontList = new PVSR.AETEntry[frontCount]; + for (j = 0; j < frontCount; j++) + aet.FrontList[j] = readAETEntry(); + + s.PI64 = frontLowOffset; + aet.FrontLowList = new PVSR.AETEntry[frontLowCount]; + for (j = 0; j < frontLowCount; j++) + aet.FrontLowList[j] = readAETEntry(); + + s.PI64 = backOffset; + aet.BackList = new PVSR.AETEntry[backCount]; + for (j = 0; j < backCount; j++) + aet.BackList[j] = readAETEntry(); + + aet.Sub1Data = readAETSub1(sub1Offset); + aet.Sub2AData = readAETSub2(sub2AOffset); + aet.Sub2BData = readAETSub2(sub2BOffset); + aet.Sub2CData = readAETSub2(sub2COffset); + aet.Sub2DData = readAETSub2(sub2DOffset); + + if (O68 > 0) + { + s.PI64 = O68; + aet.Unk03List = new PVSR.AETEntry[U78]; + for (j = 0; j < U78; j++) + aet.Unk03List[j] = readAETEntry(); + } + + if (O70 > 0) + { + s.PI64 = O70; + aet.Unk04List = new PVSR.AETEntry[U79]; + for (j = 0; j < U79; j++) + aet.Unk04List[j] = readAETEntry(); + } + s.PI64 = offset + ((x00 & 0x100) != 0 ? 0x80 : 0x68); + } + s.C(); + return pvsr; + + PVSR.StageEffect readStageEffect(long o = 0) + { + long offset = s.PI64; + if (o > 0) + s.PI64 = o; + PVSR.StageEffect eff = default; + byte U00 = s.RU8(); + byte U01 = s.RU8(); + byte U02 = s.RU8(); + byte U03 = s.RU8(); + byte U04 = s.RU8(); + s.A(0x08); + long A3DAsOffset = s.RI64E(); + long GlittersOffset = s.RI64E(); + + int a3dasCount; + int glittersCount; + if (U04 != 0xFF) + { + a3dasCount = U00; + glittersCount = U01; + } + else + { + a3dasCount = U01; + glittersCount = U02; + } + + if (A3DAsOffset > 0) + { + s.PI64 = A3DAsOffset; + eff.A3DAs = new PVSR.A3DAEntry[a3dasCount]; + for (int i = 0; i < a3dasCount; i++) + { + PVSR.A3DAEntry entry = default; + entry.Name = s.RSaO(); + entry.Hash = s.RU32E(); + s.A(0x08); + eff.A3DAs[i] = entry; + } + } + + if (GlittersOffset > 0) + { + s.PI64 = GlittersOffset; + eff.Glitters = new PVSR.Glitter[glittersCount]; + for (int i = 0; i < glittersCount; i++) + eff.Glitters[i] = readGlitter(); + } + + if (o > 0) + s.PI64 = offset; + else + s.PI64 = offset + 0x20; + return eff; + } + + PVSR.AETEntry readAETEntry() + { + PVSR.AETEntry entry = default; + entry.Name = s.RSaO(); + entry.Hash = s.RU32E(); + entry.BrightScale = s.RF32E(); + return entry; + } + + PVSR.AET.Sub1? readAETSub1(long offset) + { + if (offset <= 0) + return default; + + s.PI64 = offset; + PVSR.AET.Sub1 sub = default; + sub.Name = s.RSaO(); + sub.Hash = s.RU32E(); + sub.Unk2 = s.RU16E(); + s.A(0x08); + return sub; + } + + PVSR.AET.Sub2? readAETSub2(long offset) + { + if (offset <= 0) + return default; + + s.PI64 = offset; + PVSR.AET.Sub2 sub = default; + sub.U00 = s.RU16E(); + sub.U02 = s.RU16E(); + sub.U04 = s.RU16E(); + sub.U06 = s.RU16E(); + sub.U08 = s.RU16E(); + sub.U0A = s.RU16E(); + sub.U0C = s.RU16E(); + s.A(0x08); + return sub; + } + + PVSR.Glitter readGlitter() + { + PVSR.Glitter eff = default; + eff.Name = s.RSaO(); + eff.Unk1 = s.RU8(); + s.A(0x08); + return eff; + } +} + +private static void PVSRMsgPackWriter(string file, PVSR pvsr) +{ + int i, j; + MsgPack _PVSR = new MsgPack("PVSR"); + + int stageEffectsCount = pvsr.StageEffects != null ? pvsr.StageEffects.Length : 0; + MsgPack stgEffs = new MsgPack(stageEffectsCount, "StageEffects"); + for (i = 0; i < stageEffectsCount; i++) + stgEffs[i] = writeStageEffect(pvsr.StageEffects[i]); + if (stageEffectsCount > 0) + _PVSR.Add(stgEffs); + + int effectsCount = pvsr.EffectList != null ? pvsr.EffectList.Length : 0; + MsgPack effectList = new MsgPack(effectsCount, "EffectList"); + for (i = 0; i < effectsCount; i++) + { + ref PVSR.Effect effect = ref pvsr.EffectList[i]; + effectList[i] = MsgPack.New.Add("Name", effect.Name).Add("Emission", effect.Emission); + } + if (effectsCount > 0) + _PVSR.Add(effectList); + + int emcssCount = pvsr.EMCSList != null ? pvsr.EMCSList.Length : 0; + MsgPack emcsList = new MsgPack(emcssCount, "EMCSList"); + for (i = 0; i < emcssCount; i++) + emcsList[i] = pvsr.EMCSList[i]; + if (emcssCount > 0) + _PVSR.Add(emcsList); + + MsgPack stgChgEffs = new MsgPack(0x10, "StageChangeEffects"); + for (i = 0; i < 0x10; i++) + { + MsgPack stgChgEff = new MsgPack(0x10); + for (j = 0; j < 0x10; j++) + { + if (pvsr.StageChangeEffects[i * 0x10 + j].HasValue) + stgChgEff[j] = writeStageEffect(pvsr.StageChangeEffects[i * 0x10 + j].Value); + else + stgChgEff[j] = default; + } + stgChgEffs[i] = stgChgEff; + } + _PVSR.Add(stgChgEffs); + + int aetsCount = pvsr.AETs != null ? pvsr.AETs.Length : 0; + MsgPack aets = new MsgPack(aetsCount, "AETs"); + for (i = 0; i < aetsCount; i++) + { + ref PVSR.AET aet = ref pvsr.AETs[i]; + + MsgPack a = MsgPack.New.Add("SetName", aet.SetName); + int frontCount = aet.FrontList != null ? aet.FrontList.Length : 0; + MsgPack frontList = new MsgPack(frontCount, "FrontList"); + for (j = 0; j < frontCount; j++) + frontList[j] = writeAETEntry(aet.FrontList[j]); + if (frontCount > 0) + a.Add(frontList); + + int frontLowCount = aet.FrontLowList != null ? aet.FrontLowList.Length : 0; + MsgPack frontLowList = new MsgPack(frontLowCount, "FrontLowList"); + for (j = 0; j < frontLowCount; j++) + frontLowList[j] = writeAETEntry(aet.FrontLowList[j]); + if (frontLowCount > 0) + a.Add(frontLowList); + + int backCount = aet.BackList != null ? aet.BackList.Length : 0; + MsgPack backList = new MsgPack(backCount, "BackList"); + for (j = 0; j < backCount; j++) + backList[j] = writeAETEntry(aet.BackList[j]); + if (backCount > 0) + a.Add(backList); + + a.Add("U48", aet.U48); + a.Add("U4A", aet.U4A); + a.Add("U4C", aet.U4C); + a.Add("U4E", aet.U4E); + a.Add("U50", aet.U50); + a.Add("U52", aet.U52); + a.Add("U54", aet.U54); + a.Add("U56", aet.U56); + a.Add("U58", aet.U58); + a.Add("U5A", aet.U5A); + a.Add("U5C", aet.U5C); + a.Add("U5E", aet.U5E); + a.Add("U60", aet.U60); + + MsgPack temp; + if ((temp = writeAETSub1(aet.Sub1Data, "Sub1")).NotNull) + a.Add(temp); + if ((temp = writeAETSub2(aet.Sub2AData, "Sub2A")).NotNull) + a.Add(temp); + if ((temp = writeAETSub2(aet.Sub2BData, "Sub2B")).NotNull) + a.Add(temp); + if ((temp = writeAETSub2(aet.Sub2CData, "Sub2C")).NotNull) + a.Add(temp); + if ((temp = writeAETSub2(aet.Sub2DData, "Sub2D")).NotNull) + a.Add(temp); + + int unk03Count = aet.FrontList != null ? aet.FrontList.Length : 0; + MsgPack unk03List = new MsgPack(unk03Count, "Unk04List"); + for (j = 0; j < unk03Count; j++) + unk03List[j] = writeAETEntry(aet.Unk03List[j]); + if (unk03Count > 0) + _PVSR.Add(unk03List); + + int unk04Count = aet.Unk04List != null ? aet.Unk04List.Length : 0; + MsgPack unk04List = new MsgPack(unk04Count, "Unk04List"); + for (j = 0; j < unk04Count; j++) + unk04List[j] = writeAETEntry(aet.Unk04List[j]); + if (unk04Count > 0) + a.Add(unk04List); + aets[i] = a; + } + if (aetsCount > 0) + _PVSR.Add(aets); + + _PVSR.Write(false, true, file, json); + + MsgPack writeStageEffect(PVSR.StageEffect eff, string name = null) + { + MsgPack effect = new MsgPack(name); + int a3dasCount = eff.A3DAs != null ? eff.A3DAs.Length : 0; + MsgPack a3das = new MsgPack(a3dasCount, "A3DAs"); + for (int i = 0; i < a3dasCount; i++) + a3das[i] = eff.A3DAs[i].Name; + if (a3dasCount > 0) + effect.Add(a3das); + + int glittersCount = eff.Glitters != null ? eff.Glitters.Length : 0; + MsgPack glitters = new MsgPack(glittersCount, "Glitters"); + for (int i = 0; i < glittersCount; i++) + glitters[i] = writeGlitter(eff.Glitters[i]); + if (glittersCount > 0) + effect.Add(glitters); + + if (a3dasCount > 0 || glittersCount > 0) + return effect; + else + return default; + } + + MsgPack writeAETEntry(PVSR.AETEntry entry, string name = null) => + new MsgPack(name).Add("Name", entry.Name).Add("BrightScale", entry.BrightScale); + + MsgPack writeAETSub1(PVSR.AET.Sub1? sub, string name = null) + { + if (!sub.HasValue) + return default; + + PVSR.AET.Sub1 s = sub.Value; + return new MsgPack(name).Add("Name", s.Name).Add("Unk2", s.Unk2); + } + + MsgPack writeAETSub2(PVSR.AET.Sub2? sub, string name = null) + { + if (!sub.HasValue) + return default; + + PVSR.AET.Sub2 s = sub.Value; + return new MsgPack(name) + .Add("U00", s.U00).Add("U02", s.U02).Add("U04", s.U04).Add("U06", s.U06) + .Add("U08", s.U08).Add("U0A", s.U0A).Add("U0C", s.U0C); + } + + MsgPack writeGlitter(PVSR.Glitter eff, string name = null) => + new MsgPack(name).Add("Name", eff.Name).Add("Unk1", eff.Unk1); +} +*/ diff --git a/src/KKdLib/pvsr.h b/src/KKdLib/pvsr.h new file mode 100644 index 00000000..5aa1c6e9 --- /dev/null +++ b/src/KKdLib/pvsr.h @@ -0,0 +1,10 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "default.h" +#include "string.h" +#include "vector.h" diff --git a/src/KKdLib/sort_array.c b/src/KKdLib/sort_array.c index 8ec2dd4c..8a898d6c 100644 --- a/src/KKdLib/sort_array.c +++ b/src/KKdLib/sort_array.c @@ -8,7 +8,7 @@ void sort_array(size_t* array, size_t length) { size_t i, j, l, m; - if (length <= 0) + if (length < 1) return; else if (length == 1) { *array = 0; diff --git a/src/KKdLib/str_utils.c b/src/KKdLib/str_utils.c index d03a771a..b1c4e51e 100644 --- a/src/KKdLib/str_utils.c +++ b/src/KKdLib/str_utils.c @@ -589,13 +589,13 @@ bool str_utils_text_file_parse(void* data, size_t length, ch = 0; size_t buf_len = length; - for (size_t i = 0, l = 0; i < length; i++) { + for (size_t i = 0, l = 0, m = 0; i < length; i++) { ch = *t++; if (ch == '\r') { if (i + 1 < length && *t == '\n') { i++; t++; - buf_len--; + l++; } lf = true; } @@ -607,10 +607,13 @@ bool str_utils_text_file_parse(void* data, size_t length, buf_len--; c++; l = 0; + m = 0; lf = false; } - else + else { l++; + m++; + } } if (ch != '\r' && ch != '\n') @@ -622,12 +625,13 @@ bool str_utils_text_file_parse(void* data, size_t length, char** temp_lines = force_malloc_s(char*, c); char* b = temp_buf; - for (size_t i = 0, j = 0, l = 0; j < c; i++) { + for (size_t i = 0, j = 0, l = 0, m = 0; j < c; i++) { ch = *t++; if (ch == '\r') { if (i + 1 < length && *t == '\n') { i++; t++; + l++; } lf = true; } @@ -637,7 +641,7 @@ bool str_utils_text_file_parse(void* data, size_t length, if (i >= length || lf) { temp_lines[j] = b; if (l) { - memcpy(b, d + i - l, l); + memcpy(b, d + i - l, m); b[l] = 0; b += l + 1; } @@ -651,10 +655,13 @@ bool str_utils_text_file_parse(void* data, size_t length, break; l = 0; + m = 0; lf = false; } - else + else { l++; + m++; + } } *buf = temp_buf; diff --git a/src/KKdLib/string.c b/src/KKdLib/string.c index f5a0b407..802f6833 100644 --- a/src/KKdLib/string.c +++ b/src/KKdLib/string.c @@ -44,7 +44,10 @@ inline void string_init_length(string* s, char* str, size_t length) { return; string_reserve(s, length); - memmove(string_data(s), str, length); + if (str) + memmove(string_data(s), str, length); + else + memset(string_data(s), 0, length); s->length = length; string_data(s)[s->length] = 0; } @@ -68,11 +71,14 @@ inline void string_add(string* s, char* str) { } inline void string_add_length(string* s, char* str, size_t length) { - if (!s || !str || !length) + if (!s || !length) return; string_reserve(s, length); - memmove(string_data(s) + s->length, str, length); + if (str) + memmove(string_data(s) + s->length, str, length); + else + memset(string_data(s) + s->length, 0, length); s->length += length; string_data(s)[s->length] = 0; } @@ -98,12 +104,14 @@ inline void string_copy_wstring(wstring* src, string* dst) { inline void string_replace(string* src, string* dst) { string_free(dst); - string_copy(src, dst); + string_init_length(dst, string_data(src), src->length); } inline void string_replace_wstring(wstring* src, string* dst) { + char* temp = utf16_to_utf8(wstring_data(src)); string_free(dst); - string_copy_wstring(src, dst); + string_init(dst, temp); + free(temp); } inline bool string_compare(string* str0, string* str1) { @@ -137,11 +145,14 @@ inline void wstring_init(wstring* s, wchar_t* str) { inline void wstring_init_length(wstring* s, wchar_t* str, size_t length) { *s = wstring_empty; - if (!str || !length) + if (!length) return; wstring_reserve(s, length); - memmove(wstring_data(s), str, sizeof(wchar_t) * length); + if (str) + memmove(wstring_data(s), str, sizeof(wchar_t) * length); + else + memset(wstring_data(s), 0, sizeof(wchar_t) * length); s->length = length; wstring_data(s)[s->length] = 0; } @@ -161,11 +172,14 @@ inline void wstring_add(wstring* s, wchar_t* str) { } inline void wstring_add_length(wstring* s, wchar_t* str, size_t length) { - if (!s || !str || !length) + if (!s || !length) return; wstring_reserve(s, length); - memmove(wstring_data(s) + s->length, str, sizeof(wchar_t) * length); + if (str) + memmove(wstring_data(s) + s->length, str, sizeof(wchar_t) * length); + else + memset(wstring_data(s) + s->length, 0, sizeof(wchar_t) * length); s->length += length; wstring_data(s)[s->length] = 0; } @@ -191,12 +205,14 @@ inline void wstring_copy_string(string* src, wstring* dst) { inline void wstring_replace(wstring* src, wstring* dst) { wstring_free(dst); - wstring_copy(src, dst); + wstring_init_length(dst, wstring_data(src), src->length); } inline void wstring_replace_string(string* src, wstring* dst) { + wchar_t* temp = utf8_to_utf16(string_data(src)); wstring_free(dst); - wstring_copy_string(src, dst); + wstring_init(dst, temp); + free(temp); } inline bool wstring_compare(wstring* str0, wstring* str1) { diff --git a/src/KKdLib/txp.c b/src/KKdLib/txp.c index e267dd91..f2119b05 100644 --- a/src/KKdLib/txp.c +++ b/src/KKdLib/txp.c @@ -20,7 +20,7 @@ void txp_copy(txp* src, txp* dst) { dst->array_size = src->array_size; dst->mipmaps_count = src->mipmaps_count; dst->data = vector_empty(txp_mipmap); - vector_txp_mipmap_reserve(&dst->data, src->data.end - src->data.begin); + vector_txp_mipmap_reserve(&dst->data, vector_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++) { @@ -111,7 +111,7 @@ bool txp_set_pack_file(txp_set* ts, void** data, size_t* length, bool big_endian *data = 0; *length = 0; - size_t count = ts->end - ts->begin; + size_t count = vector_length(*ts); if (count < 1) return false; @@ -218,7 +218,7 @@ bool txp_set_produce_enrs(txp_set* ts, vector_enrs_entry* enrs) { *enrs = vector_empty(enrs_entry); l = 0; - size_t count = ts->end - ts->begin; + size_t count = vector_length(*ts); if (count < 1) return false; diff --git a/src/KKdLib/vec.h b/src/KKdLib/vec.h index a259bd2b..8d922551 100644 --- a/src/KKdLib/vec.h +++ b/src/KKdLib/vec.h @@ -699,28 +699,34 @@ vector_ptr(vec4i) #define vec2_lerp(x, y, z, blend) \ { \ - __m128 b; \ + __m128 b1; \ + __m128 b2; \ __m128 xt; \ __m128 yt; \ __m128 zt; \ *(vec2*)&xt = (x); \ *(vec2*)&yt = (y); \ - *(vec2*)&b = (blend); \ - zt = _mm_add_ps(xt, _mm_mul_ps(_mm_sub_ps(yt, xt), b)); \ + *(vec3*)&b1 = (blend); \ + *(vec3*)&b2 = vec3_identity; \ + b2 = _mm_sub_ps(b2, b1); \ + zt = _mm_add_ps(_mm_mul_ps(xt, b2), _mm_mul_ps(yt, b1)); \ (z) = *(vec2*)&zt; \ } #define vec2_lerp_scalar(x, y, z, blend) \ { \ - __m128 b; \ + __m128 b1; \ + __m128 b2; \ __m128 xt; \ __m128 yt; \ __m128 zt; \ *(vec2*)&xt = (x); \ *(vec2*)&yt = (y); \ - b = _mm_set_ss(blend); \ - b = _mm_shuffle_ps(b, b, 0); \ - zt = _mm_add_ps(xt, _mm_mul_ps(_mm_sub_ps(yt, xt), b)); \ + b1 = _mm_set_ss(blend); \ + b1 = _mm_shuffle_ps(b1, b1, 0); \ + *(vec2*)&b2 = vec2_identity; \ + b2 = _mm_sub_ps(b2, b1); \ + zt = _mm_add_ps(_mm_mul_ps(xt, b2), _mm_mul_ps(yt, b1)); \ (z) = *(vec2*)&zt; \ } @@ -1011,9 +1017,9 @@ vector_ptr(vec4i) __m128 yt; \ __m128 zt; \ *(vec3*)&xt = (x); \ - xt.m128_f32[3] = 0.0f; \ + xt = _mm_and_ps(xt, vec4_mask_vec3); \ *(vec3*)&yt = (y); \ - yt.m128_f32[3] = 0.0f; \ + yt = _mm_and_ps(yt, vec4_mask_vec3); \ zt = _mm_mul_ps(xt, yt); \ zt = _mm_hadd_ps(zt, zt); \ (z) = _mm_cvtss_f32(_mm_hadd_ps(zt, zt)); \ @@ -1024,7 +1030,7 @@ vector_ptr(vec4i) __m128 xt; \ __m128 zt; \ *(vec3*)&xt = (x); \ - xt.m128_f32[3] = 0.0f; \ + xt = _mm_and_ps(xt, vec4_mask_vec3); \ zt = _mm_mul_ps(xt, xt); \ zt = _mm_hadd_ps(zt, zt); \ (z) = _mm_cvtss_f32(_mm_sqrt_ss(_mm_hadd_ps(zt, zt))); \ @@ -1035,7 +1041,7 @@ vector_ptr(vec4i) __m128 xt; \ __m128 zt; \ *(vec3*)&xt = (x); \ - xt.m128_f32[3] = 0.0f; \ + xt = _mm_and_ps(xt, vec4_mask_vec3); \ zt = _mm_mul_ps(xt, xt); \ zt = _mm_hadd_ps(zt, zt); \ (z) = _mm_cvtss_f32(_mm_hadd_ps(zt, zt)); \ @@ -1047,9 +1053,9 @@ vector_ptr(vec4i) __m128 yt; \ __m128 zt; \ *(vec3*)&xt = (x); \ - xt.m128_f32[3] = 0.0f; \ + xt = _mm_and_ps(xt, vec4_mask_vec3); \ *(vec3*)&yt = (y); \ - yt.m128_f32[3] = 0.0f; \ + yt = _mm_and_ps(yt, vec4_mask_vec3); \ zt = _mm_sub_ps(xt, yt); \ zt = _mm_mul_ps(zt, zt); \ zt = _mm_hadd_ps(zt, zt); \ @@ -1062,9 +1068,9 @@ vector_ptr(vec4i) __m128 yt; \ __m128 zt; \ *(vec3*)&xt = (x); \ - xt.m128_f32[3] = 0.0f; \ + xt = _mm_and_ps(xt, vec4_mask_vec3); \ *(vec3*)&yt = (y); \ - yt.m128_f32[3] = 0.0f; \ + yt = _mm_and_ps(yt, vec4_mask_vec3); \ zt = _mm_sub_ps(xt, yt); \ zt = _mm_mul_ps(zt, zt); \ zt = _mm_hadd_ps(zt, zt); \ @@ -1073,28 +1079,34 @@ vector_ptr(vec4i) #define vec3_lerp(x, y, z, blend) \ { \ - __m128 b; \ + __m128 b1; \ + __m128 b2; \ __m128 xt; \ __m128 yt; \ __m128 zt; \ *(vec3*)&xt = (x); \ *(vec3*)&yt = (y); \ - *(vec3*)&b = (blend); \ - zt = _mm_add_ps(xt, _mm_mul_ps(_mm_sub_ps(yt, xt), b)); \ + *(vec3*)&b1 = (blend); \ + *(vec3*)&b2 = vec3_identity; \ + b2 = _mm_sub_ps(b2, b1); \ + zt = _mm_add_ps(_mm_mul_ps(xt, b2), _mm_mul_ps(yt, b1)); \ (z) = *(vec3*)&zt; \ } #define vec3_lerp_scalar(x, y, z, blend) \ { \ - __m128 b; \ + __m128 b1; \ + __m128 b2; \ __m128 xt; \ __m128 yt; \ __m128 zt; \ *(vec3*)&xt = (x); \ *(vec3*)&yt = (y); \ - b = _mm_set_ss(blend); \ - b = _mm_shuffle_ps(b, b, 0); \ - zt = _mm_add_ps(xt, _mm_mul_ps(_mm_sub_ps(yt, xt), b)); \ + b1 = _mm_set_ss(blend); \ + b1 = _mm_shuffle_ps(b1, b1, 0); \ + *(vec3*)&b2 = vec3_identity; \ + b2 = _mm_sub_ps(b2, b1); \ + zt = _mm_add_ps(_mm_mul_ps(xt, b2), _mm_mul_ps(yt, b1)); \ (z) = *(vec3*)&zt; \ } @@ -1103,7 +1115,7 @@ vector_ptr(vec4i) __m128 xt; \ __m128 zt; \ *(vec3*)&xt = (x); \ - xt.m128_f32[3] = 0.0f; \ + xt = _mm_and_ps(xt, vec4_mask_vec3); \ zt = _mm_mul_ps(xt, xt); \ zt = _mm_hadd_ps(zt, zt); \ zt = _mm_sqrt_ss(_mm_hadd_ps(zt, zt)); \ @@ -1380,15 +1392,21 @@ vector_ptr(vec4i) #define vec4_lerp(x, y, z, blend) \ { \ - (z).data = _mm_add_ps((x).data, _mm_mul_ps(_mm_sub_ps((y).data, (x).data), (blend).data)); \ + __m128 b1; \ + __m128 b2; \ + b1 = (blend).data; \ + b2 = _mm_sub_ps(vec4_identity.data, b1); \ + (z).data = _mm_add_ps(_mm_mul_ps((x).data, b2), _mm_mul_ps((y).data, b1)); \ } #define vec4_lerp_scalar(x, y, z, blend) \ { \ - __m128 b; \ - b = _mm_set_ss(blend); \ - b = _mm_shuffle_ps(b, b, 0); \ - (z).data = _mm_add_ps((x).data, _mm_mul_ps(_mm_sub_ps((y).data, (x).data), b)); \ + __m128 b1; \ + __m128 b2; \ + b1 = _mm_set_ss(blend); \ + b1 = _mm_shuffle_ps(b1, b1, 0); \ + b2 = _mm_sub_ps(vec4_identity.data, b1); \ + (z).data = _mm_add_ps(_mm_mul_ps((x).data, b2), _mm_mul_ps((y).data, b1)); \ } #define vec4_normalize(x, z) \ @@ -1759,15 +1777,21 @@ vector_ptr(vec4i) #define vec2d_lerp(x, y, z, blend) \ { \ - (z).data = _mm_add_pd((x).data, _mm_mul_pd(_mm_sub_pd((y).data, (z).data), (blend).data)); \ + __m128d b1; \ + __m128d b2; \ + b1 = (blend).data; \ + b2 = _mm_sub_pd(vec2d_identity.data, b1); \ + (z).data = _mm_add_pd(_mm_mul_pd((x).data, b2), _mm_mul_pd((y).data, b1)); \ } #define vec2d_lerp_scalar(x, y, z, blend) \ { \ - __m128d b; \ - b = _mm_set_sd(blend); \ - b = _mm_shuffle_pd(b, b, 0); \ - (z).data = _mm_add_pd((x).data, _mm_mul_pd(_mm_sub_pd((y).data, (z).data), b)); \ + __m128d b1; \ + __m128d b2; \ + b1 = _mm_set_sd(blend); \ + b1 = _mm_shuffle_pd(b1, b1, 0); \ + b2 = _mm_sub_pd(vec2d_identity.data, b1); \ + (z).data = _mm_add_pd(_mm_mul_pd((x).data, b2), _mm_mul_pd((y).data, b1)); \ } #define vec2d_normalize(x, z) \ diff --git a/src/KKdLib/vector.h b/src/KKdLib/vector.h index f5180bda..25ba8640 100644 --- a/src/KKdLib/vector.h +++ b/src/KKdLib/vector.h @@ -10,6 +10,8 @@ #define vector_dispose_func(t) void(* dispose_func)(t* data) #define vector_empty(t) (vector_##t){ 0, 0, 0 } #define vector_ptr_empty(t) (vector_ptr_##t){ 0, 0, 0 } +#define vector_length(vec) ((vec).end - (vec).begin) +#define vector_capacity(vec) ((vec).capacity_end - (vec).begin) #define vector(t) \ typedef struct vector_##t { \ @@ -21,6 +23,7 @@ typedef struct vector_##t { \ extern void vector_##t##_reserve(vector_##t* vec, ssize_t size); \ extern void vector_##t##_push_back(vector_##t* vec, t* val); \ extern t* vector_##t##_reserve_back(vector_##t* vec); \ +extern t* vector_##t##_reserve_back_range(vector_##t* vec, ssize_t count); \ extern void vector_##t##_pop_back(vector_##t* vec, vector_dispose_func(t)); \ extern void vector_##t##_insert(vector_##t* vec, ssize_t position, t* val); \ extern void vector_##t##_insert_range(vector_##t* vec, ssize_t position, t* first, t* last); \ @@ -42,6 +45,7 @@ typedef struct vector_ptr_##t { \ extern void vector_ptr_##t##_reserve(vector_ptr_##t* vec, ssize_t size); \ extern void vector_ptr_##t##_push_back(vector_ptr_##t* vec, t** val); \ extern t** vector_ptr_##t##_reserve_back(vector_ptr_##t* vec); \ +extern t** vector_ptr_##t##_reserve_back_range(vector_ptr_##t* vec, ssize_t count); \ extern void vector_ptr_##t##_pop_back(vector_ptr_##t* vec, vector_dispose_func(t)); \ extern void vector_ptr_##t##_insert(vector_ptr_##t* vec, ssize_t position, t** val); \ extern void vector_ptr_##t##_insert_range(vector_ptr_##t* vec, ssize_t position, t** first, t** last); \ @@ -85,7 +89,7 @@ void vector_##t##_push_back(vector_##t* vec, t* val) { \ return; \ \ if (vec->capacity_end - vec->end < 1) \ - vector_##t##_reserve(vec, vec->end - vec->capacity_end + 1); \ + vector_##t##_reserve(vec, 1); \ \ *vec->end = *val; \ vec->end++; \ @@ -96,13 +100,26 @@ t* vector_##t##_reserve_back(vector_##t* vec) { \ return 0; \ \ if (vec->capacity_end - vec->end < 1) \ - vector_##t##_reserve(vec, vec->end - vec->capacity_end + 1); \ + vector_##t##_reserve(vec, 1); \ \ t* val = vec->end++; \ memset(val, 0, sizeof(t)); \ return val; \ } \ \ +t* vector_##t##_reserve_back_range(vector_##t* vec, ssize_t count) { \ + if (!vec) \ + return 0; \ +\ + if (vec->capacity_end - vec->end < count) \ + vector_##t##_reserve(vec, count); \ +\ + t* val = vec->end; \ + vec->end += count; \ + memset(val, 0, sizeof(t) * count); \ + return val; \ +} \ +\ void vector_##t##_pop_back(vector_##t* vec, vector_dispose_func(t)) { \ if (!vec) \ return; \ @@ -119,7 +136,7 @@ void vector_##t##_insert(vector_##t* vec, ssize_t position, t* val) { \ return; \ \ if (vec->capacity_end - vec->end < 1) \ - vector_##t##_reserve(vec, vec->end - vec->capacity_end + 1); \ + vector_##t##_reserve(vec, 1); \ \ t* t0 = vec->begin + position; \ t* t1 = vec->begin + position + 1; \ @@ -139,7 +156,7 @@ void vector_##t##_insert_range(vector_##t* vec, ssize_t position, t* first, t* l if (vec->end - vec->begin == 0) \ vector_##t##_reserve(vec, s); \ else if (vec->capacity_end - vec->end < s) \ - vector_##t##_reserve(vec, vec->end - vec->capacity_end + s); \ + vector_##t##_reserve(vec, s); \ \ t* t0 = vec->begin + position; \ t* t1 = vec->begin + position + s; \ @@ -246,7 +263,7 @@ void vector_ptr_##t##_push_back(vector_ptr_##t* vec, t** val) { \ return; \ \ if (vec->capacity_end - vec->end < 1) \ - vector_ptr_##t##_reserve(vec, vec->end - vec->capacity_end + 1); \ + vector_ptr_##t##_reserve(vec, 1); \ \ *vec->end++ = *val; \ } \ @@ -256,13 +273,26 @@ t** vector_ptr_##t##_reserve_back(vector_ptr_##t* vec) { \ return 0; \ \ if (vec->capacity_end - vec->end < 1) \ - vector_ptr_##t##_reserve(vec, vec->end - vec->capacity_end + 1); \ + vector_ptr_##t##_reserve(vec, 1); \ \ t** val = vec->end++; \ memset(val, 0, sizeof(t*)); \ return val; \ } \ \ +t** vector_ptr_##t##_reserve_back_range(vector_ptr_##t* vec, ssize_t count) { \ + if (!vec) \ + return 0; \ +\ + if (vec->capacity_end - vec->end < count) \ + vector_ptr_##t##_reserve(vec, count); \ +\ + t** val = vec->end; \ + vec->end += count; \ + memset(val, 0, sizeof(t*) * count); \ + return val; \ +} \ +\ void vector_ptr_##t##_pop_back(vector_ptr_##t* vec, vector_dispose_func(t)) { \ if (!vec) \ return; \ @@ -281,7 +311,7 @@ void vector_ptr_##t##_insert(vector_ptr_##t* vec, ssize_t position, t** val) { \ return; \ \ if (vec->capacity_end - vec->end < 1) \ - vector_ptr_##t##_reserve(vec, vec->end - vec->capacity_end + 1); \ + vector_ptr_##t##_reserve(vec, 1); \ \ t** t0 = vec->begin + position; \ t** t1 = vec->begin + position + 1; \ @@ -301,7 +331,7 @@ void vector_ptr_##t##_insert_range(vector_ptr_##t* vec, ssize_t position, t** fi if (vec->end - vec->begin == 0) \ vector_ptr_##t##_reserve(vec, s); \ else if (vec->capacity_end - vec->end < s) \ - vector_ptr_##t##_reserve(vec, vec->end - vec->capacity_end + s); \ + vector_ptr_##t##_reserve(vec, s); \ \ t** t0 = vec->begin + position; \ t** t1 = vec->begin + position + s; \