diff --git a/src/CLOUD/classes.h b/src/CLOUD/classes.h index f82fb6f0..c8986cdb 100644 --- a/src/CLOUD/classes.h +++ b/src/CLOUD/classes.h @@ -7,8 +7,8 @@ #include "../KKdLib/default.h" #include "../CRE/lock.h" -#include "../CRE/render_context.h" -#include "../CRE/task.h" +#include "../CRE/render_context.hpp" +#include "../CRE/task.hpp" #define CLASS_DATA_NO_DATA (0) #define CLASSES_DATA_NO_FUNC (0) diff --git a/src/CLOUD/classes/data_test/auth_3d_test.c b/src/CLOUD/classes/data_test/auth_3d_test.c index c51c50a7..9dc58dce 100644 --- a/src/CLOUD/classes/data_test/auth_3d_test.c +++ b/src/CLOUD/classes/data_test/auth_3d_test.c @@ -5,13 +5,13 @@ #include "auth_3d_test.h" #include "../../../KKdLib/io/path.h" -#include "../../../KKdLib/hash.h" -#include "../../../KKdLib/sort.h" +#include "../../../KKdLib/hash.hpp" +#include "../../../KKdLib/sort.hpp" #include "../../../KKdLib/str_utils.h" #include "../../../KKdLib/vector.h" -#include "../../../CRE/data.h" -#include "../../../CRE/render_context.h" -#include "../../../CRE/stage.h" +#include "../../../CRE/data.hpp" +#include "../../../CRE/render_context.hpp" +#include "../../../CRE/stage.hpp" #include "../../input.hpp" #include "../imgui_helper.h" diff --git a/src/CLOUD/classes/data_test/glitter_test.c b/src/CLOUD/classes/data_test/glitter_test.c index 76464908..4df75c08 100644 --- a/src/CLOUD/classes/data_test/glitter_test.c +++ b/src/CLOUD/classes/data_test/glitter_test.c @@ -6,11 +6,10 @@ #include "glitter_test.h" #include "../../../KKdLib/io/path.h" #include "../../../KKdLib/str_utils.h" -#include "../../../KKdLib/vector.h" #include "../../../CRE/Glitter/glitter.hpp" -#include "../../../CRE/data.h" -#include "../../../CRE/render_context.h" -#include "../../../CRE/stage.h" +#include "../../../CRE/data.hpp" +#include "../../../CRE/render_context.hpp" +#include "../../../CRE/stage.hpp" #include "../../input.hpp" #include "../data_test.h" #include "../imgui_helper.h" @@ -95,7 +94,7 @@ bool TaskDataTestGlitterParticle::Init() { for (std::vector::iterator i = files.begin(); i != files.end();) if (str_utils_check_ends_with(i->name.c_str(), ".farc")) { char* temp = str_utils_get_without_extension(i->name.c_str()); - i->name = temp ? std::string(temp) : std::string(); + i->name = temp ? temp : 0; free(temp); i++; } @@ -148,9 +147,9 @@ bool TaskDataTestGlitterParticle::Ctrl() { if (rebuild_geff) { int32_t effects_count = (int32_t)Glitter::glt_particle_manager.GetEffectsCount(this->hash); geff.clear(); - geff.push_back(std::string("ALL")); + geff.push_back("ALL"); for (int32_t i = 0; i < effects_count; i++) - geff.push_back(std::string(Glitter::glt_particle_manager.GetEffectName(hash, i))); + geff.push_back(Glitter::glt_particle_manager.GetEffectName(hash, i)); rebuild_geff = false; } diff --git a/src/CLOUD/classes/data_test/stage_test.c b/src/CLOUD/classes/data_test/stage_test.c index 16d94333..e218e6b5 100644 --- a/src/CLOUD/classes/data_test/stage_test.c +++ b/src/CLOUD/classes/data_test/stage_test.c @@ -5,12 +5,11 @@ #include "stage_test.h" #include "../../../KKdLib/io/path.h" -#include "../../../KKdLib/sort.h" +#include "../../../KKdLib/sort.hpp" #include "../../../KKdLib/str_utils.h" -#include "../../../KKdLib/vector.h" -#include "../../../CRE/data.h" -#include "../../../CRE/render_context.h" -#include "../../../CRE/stage.h" +#include "../../../CRE/data.hpp" +#include "../../../CRE/render_context.hpp" +#include "../../../CRE/stage.hpp" #include "../../input.hpp" #include "../data_test.h" #include "../imgui_helper.h" diff --git a/src/CLOUD/classes/data_view/auth_3d.c b/src/CLOUD/classes/data_view/auth_3d.c index d88e415f..d6da1283 100644 --- a/src/CLOUD/classes/data_view/auth_3d.c +++ b/src/CLOUD/classes/data_view/auth_3d.c @@ -4,7 +4,7 @@ */ #include "auth_3d.h" -#include "../../../CRE/auth_3d.h" +#include "../../../CRE/auth_3d.hpp" #include "../../input.hpp" #include "../imgui_helper.h" @@ -697,7 +697,6 @@ static void data_view_auth_3d_imgui_auth_3d_object(auth_3d_object* o) { ImGui::TreePop(); } - tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; diff --git a/src/CLOUD/classes/data_view/draw_task.c b/src/CLOUD/classes/data_view/draw_task.c index 14d35ba4..68e4f57d 100644 --- a/src/CLOUD/classes/data_view/draw_task.c +++ b/src/CLOUD/classes/data_view/draw_task.c @@ -4,8 +4,8 @@ */ #include "draw_task.h" -#include "../../../CRE/render_context.h" -#include "../../../KKdLib/hash.h" +#include "../../../CRE/render_context.hpp" +#include "../../../KKdLib/hash.hpp" #include "../imgui_helper.h" static const char* draw_object_type_name[] = { diff --git a/src/CLOUD/classes/data_view/glitter.c b/src/CLOUD/classes/data_view/glitter.c index bfaf87d8..c2ac474e 100644 --- a/src/CLOUD/classes/data_view/glitter.c +++ b/src/CLOUD/classes/data_view/glitter.c @@ -5,7 +5,7 @@ #include "glitter.h" #include "../../../CRE/Glitter/glitter.hpp" -#include "../../../CRE/render_context.h" +#include "../../../CRE/render_context.hpp" #include "../imgui_helper.h" struct data_view_glitter { diff --git a/src/CLOUD/classes/data_view/object.c b/src/CLOUD/classes/data_view/object.c index 99df8364..0427cc90 100644 --- a/src/CLOUD/classes/data_view/object.c +++ b/src/CLOUD/classes/data_view/object.c @@ -4,7 +4,7 @@ */ #include "object.h" -#include "../../../CRE/render_context.h" +#include "../../../CRE/render_context.hpp" #include "../imgui_helper.h" struct data_view_object { diff --git a/src/CLOUD/classes/data_view/texture.c b/src/CLOUD/classes/data_view/texture.c index 6f0e0c2f..5b7b7fd1 100644 --- a/src/CLOUD/classes/data_view/texture.c +++ b/src/CLOUD/classes/data_view/texture.c @@ -4,7 +4,7 @@ */ #include "texture.h" -#include "../../../CRE/render_context.h" +#include "../../../CRE/render_context.hpp" #include "../imgui_helper.h" struct data_view_texture { diff --git a/src/CLOUD/classes/glitter_editor.c b/src/CLOUD/classes/glitter_editor.c index 80ef56a1..22424e5c 100644 --- a/src/CLOUD/classes/glitter_editor.c +++ b/src/CLOUD/classes/glitter_editor.c @@ -12,17 +12,16 @@ #include "../../KKdLib/dds.h" #include "../../KKdLib/interpolation.h" #include "../../KKdLib/str_utils.h" -#include "../../KKdLib/txp.h" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/txp.hpp" #include "../../KKdLib/vec.h" #include "../../CRE/Glitter/glitter.hpp" #include "../../CRE/camera.h" -#include "../../CRE/data.h" +#include "../../CRE/data.hpp" #include "../../CRE/draw_task.h" #include "../../CRE/gl_state.h" -#include "../../CRE/render_context.h" +#include "../../CRE/render_context.hpp" #include "../../CRE/shader_glsl.h" -#include "../../CRE/stage.h" +#include "../../CRE/stage.hpp" #include "../../CRE/static_var.h" #include "../input.hpp" #include @@ -711,7 +710,7 @@ void glitter_editor_ctrl(class_data* data) { char name[0x80]; sprintf_s(name, sizeof(name), "eff_%08x", (uint32_t)((eff_count + 1) * time.LowPart * hash_murmurhash_empty)); - e->name = std::string(name); + e->name = name; eg->effects.push_back(e); glt_edt->input_reload = true; } @@ -741,7 +740,7 @@ void glitter_editor_ctrl(class_data* data) { char name[0x80]; sprintf_s(name, sizeof(name), "eff_%08x", (uint32_t)((eff_count + 1)* time.LowPart* hash_murmurhash_empty)); - e->name = std::string(name); + e->name = name; eg->effects.push_back(e); glt_edt->input_reload = true; } @@ -1022,7 +1021,6 @@ void glitter_editor_ctrl(class_data* data) { else glt_edt->load_data = false; - if (!load_success && !glitter_editor_list_open_window(glt_edt->effect_group)) { glt_edt->load_error_list_popup = true; goto effect_unload; @@ -1689,8 +1687,7 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, const char* f.add_file(); farc_file& ff_drs = f.files.back(); st.write(&ff_drs.data, &ff_drs.size); - ff_drs.name = std::string(file); - ff_drs.name += ".drs"; + ff_drs.name = std::string(file) + ".drs"; } }*/ @@ -1700,8 +1697,7 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, const char* f.add_file(); farc_file& ff_dve = f.files.back(); st.write(&ff_dve.data, &ff_dve.size); - ff_dve.name = std::string(file); - ff_dve.name += ".dve"; + ff_dve.name = std::string(file) + ".dve"; } else return; @@ -1713,8 +1709,7 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, const char* f.add_file(); farc_file& ff_lst = f.files.back(); st.write(&ff_lst.data, &ff_lst.size); - ff_lst.name = std::string(file); - ff_lst.name += ".lst"; + ff_lst.name = std::string(file) + ".lst"; } else return; @@ -1814,7 +1809,7 @@ static bool glitter_editor_list_open_window(Glitter::EffectGroup* eg) { continue; } - e->name = std::string(lines[j]); + e->name = lines[j]; } free(buf); @@ -2137,7 +2132,6 @@ static void glitter_editor_effects(glitter_editor_struct* glt_edt) { else eff_str = "%s (%08X)"; - ImGui::PushID(effect); if (ImGui::TreeNodeEx("effect", tree_node_flags, eff_str, effect->name.c_str(), (uint32_t)((size_t)effect * hash_fnv1a64m_empty))) { @@ -4052,7 +4046,7 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla obj* obj = 0; if (handler && handler->obj_set) { obj_set* set = handler->obj_set; - for (int32_t i = 0; i < set->objects_count; i++) + for (uint32_t i = 0; i < set->objects_count; i++) if (set->objects[i].id == obj_id) { obj = &set->objects[i]; break; @@ -4064,7 +4058,7 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla if (set_id != -1 && handler && handler->set_id == set_id && handler->obj_set) { obj_set* set = handler->obj_set; ssize_t obj_index = -1; - for (int32_t i = 0; i < set->objects_count; i++) + for (uint32_t i = 0; i < set->objects_count; i++) if (set->objects[i].id == obj_id) { obj_index = i; break; @@ -4077,7 +4071,7 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla obj_index = -1; ImGui::PopID(); - for (int32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->objects_count; i++) { ImGui::PushID(i); ::obj* obj = &set->objects[i]; if (ImGui::Selectable(string_data(&obj->name), obj->id == obj_id) @@ -4249,7 +4243,6 @@ static bool glitter_editor_property_particle_texture(glitter_editor_struct* glt_ uv_max.y = uv.y + particle->data.split_uv.y; } - txp_mipmap* rtm = rt[n - 1].mipmaps.data(); float_t aspect1 = (float_t)rtm->width / (float_t)rtm->height; float_t aspect2 = aspect1; @@ -4660,7 +4653,6 @@ static void glitter_editor_file_load_model_popup(glitter_editor_struct* glt_edt, break; } - if (close) { glt_edt->load_data = true; ImGui::CloseCurrentPopup(); @@ -6877,14 +6869,14 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl int32_t ttc = 0; texture_transform_struct* tt = object_data->texture_transform_array; - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; if (object_data->object_culling && !object_bounding_sphere_check_visibility( &mesh->bounding_sphere, object_data, rctx->camera, &mat)) continue; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; if (sub_mesh->flags & OBJ_SUB_MESH_FLAG_8) diff --git a/src/CLOUD/classes/graphics/glitter.c b/src/CLOUD/classes/graphics/glitter.c index 23b5ad3d..4708e7ef 100644 --- a/src/CLOUD/classes/graphics/glitter.c +++ b/src/CLOUD/classes/graphics/glitter.c @@ -5,7 +5,7 @@ #include "glitter.h" #include "../../../CRE/Glitter/glitter.hpp" -#include "../../../CRE/render_context.h" +#include "../../../CRE/render_context.hpp" #include "../imgui_helper.h" extern int32_t width; diff --git a/src/CLOUD/classes/graphics/post_process.c b/src/CLOUD/classes/graphics/post_process.c index b2452ff5..914fe6f8 100644 --- a/src/CLOUD/classes/graphics/post_process.c +++ b/src/CLOUD/classes/graphics/post_process.c @@ -5,7 +5,7 @@ */ #include "post_process.h" -#include "../../../CRE/stage.h" +#include "../../../CRE/stage.hpp" #include "../imgui_helper.h" extern int32_t width; diff --git a/src/CLOUD/classes/imgui_helper.c b/src/CLOUD/classes/imgui_helper.c index 45712f3a..1dd1a2c0 100644 --- a/src/CLOUD/classes/imgui_helper.c +++ b/src/CLOUD/classes/imgui_helper.c @@ -5,7 +5,7 @@ #include "imgui_helper.h" #include "../../KKdLib/str_utils.h" -#include "../../CRE/data.h" +#include "../../CRE/data.hpp" const float_t imgui_alpha_disabled_scale = 0.5f; diff --git a/src/CLOUD/classes/information/task.c b/src/CLOUD/classes/information/task.c index d5d4d48b..252ebd35 100644 --- a/src/CLOUD/classes/information/task.c +++ b/src/CLOUD/classes/information/task.c @@ -4,9 +4,9 @@ */ #include "task.h" -#include "../../../KKdLib/sort.h" +#include "../../../KKdLib/sort.hpp" #include "../../../KKdLib/str_utils.h" -#include "../../../CRE/task.h" +#include "../../../CRE/task.hpp" #include "../imgui_helper.h" extern int32_t width; diff --git a/src/CLOUD/input.cpp b/src/CLOUD/input.cpp index c3a9de25..c6b933a1 100644 --- a/src/CLOUD/input.cpp +++ b/src/CLOUD/input.cpp @@ -59,15 +59,15 @@ namespace Input { bool IsKeyDown(int32_t key, int32_t mods) { auto elem = keys.find(key); if (elem != keys.end()) - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action != GLFW_RELEASE; return false; } - + bool IsKeyUp(int32_t key, int32_t mods) { auto elem = keys.find(key); if (elem != keys.end()) - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action == GLFW_RELEASE; return false; } @@ -75,13 +75,13 @@ namespace Input { bool IsKeyTapped(int32_t key, int32_t mods) { auto elem = keys.find(key); auto elem_prev = keys_prev.find(key); - if (elem != keys.end()) + if (elem != keys.end()) if (elem_prev != keys_prev.end()) { - if (!mods || (elem->second.mods == mods && elem_prev->second.mods == mods)) + if (elem->second.mods == mods && elem_prev->second.mods == mods) return elem->second.action != GLFW_RELEASE && elem_prev->second.action == GLFW_RELEASE; } else { - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action != GLFW_RELEASE; } return false; @@ -92,11 +92,11 @@ namespace Input { auto elem_prev = keys_prev.find(key); if (elem != keys.end()) if (elem_prev != keys_prev.end()) { - if (!mods || (elem->second.mods == mods && elem_prev->second.mods == mods)) + if (elem->second.mods == mods && elem_prev->second.mods == mods) return elem->second.action == GLFW_RELEASE && elem_prev->second.action != GLFW_RELEASE; } else { - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action == GLFW_RELEASE; } return false; @@ -105,15 +105,15 @@ namespace Input { bool IsMouseButtonDown(int32_t button, int32_t mods) { auto elem = mouse_buttons.find(button); if (elem != mouse_buttons.end()) - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action != GLFW_RELEASE; return false; } - + bool IsMouseButtonUp(int32_t button, int32_t mods) { auto elem = mouse_buttons.find(button); if (elem != mouse_buttons.end()) - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action == GLFW_RELEASE; return false; } @@ -123,11 +123,11 @@ namespace Input { auto elem_prev = mouse_buttons_prev.find(button); if (elem != mouse_buttons.end()) if (elem_prev != mouse_buttons_prev.end()) { - if (!mods || (elem->second.mods == mods && elem_prev->second.mods == mods)) + if (elem->second.mods == mods && elem_prev->second.mods == mods) return elem->second.action != GLFW_RELEASE && elem_prev->second.action == GLFW_RELEASE; } else { - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action != GLFW_RELEASE; } return false; @@ -138,11 +138,11 @@ namespace Input { auto elem_prev = mouse_buttons_prev.find(button); if (elem != mouse_buttons.end()) if (elem_prev != mouse_buttons_prev.end()) { - if (!mods || (elem->second.mods == mods && elem_prev->second.mods == mods)) + if (elem->second.mods == mods && elem_prev->second.mods == mods) return elem->second.action == GLFW_RELEASE && elem_prev->second.action != GLFW_RELEASE; } else { - if (!mods || elem->second.mods == mods) + if (elem->second.mods == mods) return elem->second.action == GLFW_RELEASE; } return true; @@ -151,7 +151,7 @@ namespace Input { bool WasKeyDown(int32_t key, int32_t mods) { auto elem_prev = keys_prev.find(key); if (elem_prev != keys_prev.end()) - if (!mods || elem_prev->second.mods == mods) + if (elem_prev->second.mods == mods) return elem_prev->second.action != GLFW_RELEASE; return false; } @@ -159,7 +159,7 @@ namespace Input { bool WasKeyUp(int32_t key, int32_t mods) { auto elem_prev = keys_prev.find(key); if (elem_prev != keys_prev.end()) - if (!mods || elem_prev->second.mods == mods) + if (elem_prev->second.mods == mods) return elem_prev->second.action == GLFW_RELEASE; return true; } @@ -167,7 +167,7 @@ namespace Input { bool WasMouseButtonDown(int32_t button, int32_t mods) { auto elem_prev = mouse_buttons_prev.find(button); if (elem_prev != mouse_buttons_prev.end()) - if (!mods || elem_prev->second.mods == mods) + if (elem_prev->second.mods == mods) return elem_prev->second.action != GLFW_RELEASE; return true; } @@ -175,7 +175,7 @@ namespace Input { bool WasMouseButtonUp(int32_t button, int32_t mods) { auto elem_prev = mouse_buttons_prev.find(button); if (elem_prev != mouse_buttons_prev.end()) - if (!mods || elem_prev->second.mods == mods) + if (elem_prev->second.mods == mods) return elem_prev->second.action == GLFW_RELEASE; return true; } @@ -212,54 +212,100 @@ namespace Input { classes_process_input(classes, classes_count); if (!input_locked) { - double_t speed; - if (IsKeyDown(GLFW_KEY_LEFT_SHIFT) || IsKeyDown(GLFW_KEY_RIGHT_SHIFT)) - speed = input_movement_speed * 10.0; - else if (IsKeyDown(GLFW_KEY_LEFT_CONTROL) || IsKeyDown(GLFW_KEY_RIGHT_CONTROL)) - speed = input_movement_speed / 10.0; - else - speed = input_movement_speed; + double_t speed = input_movement_speed; + double_t speed_fast = input_movement_speed * 10.0; + double_t speed_slow = input_movement_speed / 10.0; speed *= frame_speed; + speed_fast *= frame_speed; + speed_slow *= frame_speed; - if (IsKeyDown(GLFW_KEY_W)) + if (IsKeyDown(GLFW_KEY_W) || IsKeyDown(GLFW_KEY_W, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_move.x += speed; - if (IsKeyDown(GLFW_KEY_S)) + else if (IsKeyDown(GLFW_KEY_W, GLFW_MOD_SHIFT)) + input_move.x += speed_fast; + else if (IsKeyDown(GLFW_KEY_W, GLFW_MOD_CONTROL)) + input_move.x += speed_slow; + + if (IsKeyDown(GLFW_KEY_S) || IsKeyDown(GLFW_KEY_S, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_move.x -= speed; + else if (IsKeyDown(GLFW_KEY_S, GLFW_MOD_SHIFT)) + input_move.x -= speed_fast; + else if (IsKeyDown(GLFW_KEY_S, GLFW_MOD_CONTROL)) + input_move.x -= speed_slow; - if (IsKeyDown(GLFW_KEY_A)) + if (IsKeyDown(GLFW_KEY_A) || IsKeyDown(GLFW_KEY_A, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_move.y -= speed; - if (IsKeyDown(GLFW_KEY_D)) + else if (IsKeyDown(GLFW_KEY_A, GLFW_MOD_SHIFT)) + input_move.y -= speed_fast; + else if (IsKeyDown(GLFW_KEY_A, GLFW_MOD_CONTROL)) + input_move.y -= speed_slow; + + if (IsKeyDown(GLFW_KEY_D) || IsKeyDown(GLFW_KEY_D, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_move.y += speed; + else if (IsKeyDown(GLFW_KEY_D, GLFW_MOD_SHIFT)) + input_move.y += speed_fast; + else if (IsKeyDown(GLFW_KEY_D, GLFW_MOD_CONTROL)) + input_move.y += speed_slow; - if (IsKeyDown(GLFW_KEY_LEFT_SHIFT) || IsKeyDown(GLFW_KEY_RIGHT_SHIFT)) - speed = input_movement_speed * 2.0; - else if (IsKeyDown(GLFW_KEY_LEFT_CONTROL) || IsKeyDown(GLFW_KEY_RIGHT_CONTROL)) - speed = input_movement_speed / 2.0; - else - speed = input_movement_speed; + speed = input_movement_speed; + speed_fast = input_movement_speed * 2.0; + speed_slow = input_movement_speed / 2.0; + speed *= frame_speed; + speed_fast *= frame_speed; + speed_slow *= frame_speed; speed *= freq / freq_hist; + speed_fast *= freq / freq_hist; + speed_slow *= freq / freq_hist; speed *= 10.0; + speed_fast *= 10.0; + speed_slow *= 10.0; - if (IsKeyDown(GLFW_KEY_UP)) + if (IsKeyDown(GLFW_KEY_UP) || IsKeyDown(GLFW_KEY_UP, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_rotate.y += speed; - if (IsKeyDown(GLFW_KEY_DOWN)) + else if (IsKeyDown(GLFW_KEY_UP, GLFW_MOD_SHIFT)) + input_rotate.y += speed_fast; + else if (IsKeyDown(GLFW_KEY_UP, GLFW_MOD_CONTROL)) + input_rotate.y += speed_slow; + + if (IsKeyDown(GLFW_KEY_DOWN) || IsKeyDown(GLFW_KEY_DOWN, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_rotate.y -= speed; + else if (IsKeyDown(GLFW_KEY_DOWN, GLFW_MOD_SHIFT)) + input_rotate.y -= speed_fast; + else if (IsKeyDown(GLFW_KEY_DOWN, GLFW_MOD_CONTROL)) + input_rotate.y -= speed_slow; - if (IsKeyDown(GLFW_KEY_LEFT)) + if (IsKeyDown(GLFW_KEY_LEFT) || IsKeyDown(GLFW_KEY_LEFT, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_rotate.x -= speed; - if (IsKeyDown(GLFW_KEY_RIGHT)) + else if (IsKeyDown(GLFW_KEY_LEFT, GLFW_MOD_SHIFT)) + input_rotate.x -= speed_fast; + else if (IsKeyDown(GLFW_KEY_LEFT, GLFW_MOD_CONTROL)) + input_rotate.x -= speed_slow; + + if (IsKeyDown(GLFW_KEY_RIGHT) || IsKeyDown(GLFW_KEY_RIGHT, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_rotate.x += speed; + else if (IsKeyDown(GLFW_KEY_RIGHT, GLFW_MOD_SHIFT)) + input_rotate.x += speed_fast; + else if (IsKeyDown(GLFW_KEY_RIGHT, GLFW_MOD_CONTROL)) + input_rotate.x += speed_slow; - if (IsKeyDown(GLFW_KEY_Q)) - input_roll -= speed; - if (IsKeyDown(GLFW_KEY_E)) + if (IsKeyDown(GLFW_KEY_Q) || IsKeyDown(GLFW_KEY_Q, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) input_roll += speed; + else if (IsKeyDown(GLFW_KEY_Q, GLFW_MOD_SHIFT)) + input_roll += speed_fast; + else if (IsKeyDown(GLFW_KEY_Q, GLFW_MOD_CONTROL)) + input_roll += speed_slow; - if (IsKeyDown(GLFW_KEY_R)) - if (IsKeyDown(GLFW_KEY_LEFT_CONTROL) || IsKeyDown(GLFW_KEY_RIGHT_CONTROL)) - input_shaders_reload = true; - else - input_reset = true; + if (IsKeyDown(GLFW_KEY_E) || IsKeyDown(GLFW_KEY_E, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) + input_roll += speed; + else if (IsKeyDown(GLFW_KEY_E, GLFW_MOD_SHIFT)) + input_roll += speed_fast; + else if (IsKeyDown(GLFW_KEY_E, GLFW_MOD_CONTROL)) + input_roll += speed_slow; + + if (IsKeyDown(GLFW_KEY_R, GLFW_MOD_CONTROL)) + input_shaders_reload = true; + else if (IsKeyDown(GLFW_KEY_R)) + input_reset = true; } lock_lock(&imgui_context_lock); diff --git a/src/CLOUD/main.c b/src/CLOUD/main.c index e02903ea..13af634b 100644 --- a/src/CLOUD/main.c +++ b/src/CLOUD/main.c @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "../KKdLib/a3da.h" -#include "../KKdLib/dsc.h" -#include "../KKdLib/f2/struct.h" -#include "../CRE/auth_3d.h" +#include "../KKdLib/a3da.hpp" +#include "../KKdLib/dsc.hpp" +#include "../KKdLib/f2/struct.hpp" +#include "../CRE/auth_3d.hpp" #include "elf.h" #include "main.h" #include "shared.h" diff --git a/src/CLOUD/render.c b/src/CLOUD/render.c index 59d3c3cf..ba36d0fc 100644 --- a/src/CLOUD/render.c +++ b/src/CLOUD/render.c @@ -16,27 +16,26 @@ #include #include "../CRE/Glitter/glitter.hpp" #include "../CRE/camera.h" -#include "../CRE/data.h" -#include "../CRE/fbo.h" -#include "../CRE/file_handler.h" +#include "../CRE/data.hpp" +#include "../CRE/fbo.hpp" +#include "../CRE/file_handler.hpp" #include "../CRE/gl_state.h" -#include "../CRE/light_param.h" +#include "../CRE/light_param.hpp" #include "../CRE/lock.h" -#include "../CRE/object.h" -#include "../CRE/random.h" -#include "../CRE/rob.h" +#include "../CRE/object.hpp" +#include "../CRE/rob.hpp" #include "../CRE/shader.h" #include "../CRE/shader_ft.h" #include "../CRE/shader_glsl.h" -#include "../CRE/stage.h" +#include "../CRE/stage.hpp" #include "../CRE/static_var.h" -#include "../CRE/task.h" -#include "../CRE/texture.h" +#include "../CRE/task.hpp" +#include "../CRE/texture.hpp" #include "../CRE/timer.h" -#include "../CRE/post_process.h" +#include "../CRE/post_process.hpp" #include "../KKdLib/io/path.h" -#include "../KKdLib/database/item_table.h" -#include "../KKdLib/sort.h" +#include "../KKdLib/database/item_table.hpp" +#include "../KKdLib/sort.hpp" #include "../KKdLib/str_utils.h" #include "classes/imgui_helper.h" #include "input.hpp" @@ -388,6 +387,8 @@ static render_context* render_load() { render_texture_data_init(); motion_storage_init(); + mothead_storage_init(); + osage_setting_data_init(); Glitter::glt_particle_manager.rctx = rctx; @@ -407,7 +408,7 @@ static render_context* render_load() { object_storage_init(aft_obj_db); item_table_array_init(); task_work_init(); - rob_chara_array_init(); + rob_init(); auth_3d_data_init(); light_param_storage_data_init(); @@ -583,10 +584,8 @@ static render_context* render_load() { aft_data->load_file(aft_data, "rom/", "chritm_prop.farc", item_table_array_load_file); aft_data->load_file(aft_data, "rom/", "mdata_chritm_prop.farc", item_table_array_load_file); - - rob_mot_tbl_init(); - rob_thread_handler_init(); - pv_osage_manager_array_ptr_init(); + aft_data->load_file(aft_data, "rom/skin_param/", "osage_setting.txt", osage_setting_data_load_file); + aft_data->load_file(aft_data, "rom/skin_param/", "mdata_osage_setting.txt", osage_setting_data_load_file); light_param_data_storage::load(aft_data); auth_3d_data_load_auth_3d_db(aft_auth_3d_db); @@ -736,7 +735,22 @@ static render_context* render_load() { clear_color = { (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0) }; set_clear_color = true; - x_pv_game_data.Load(826, 26); + chara_index charas[6]; + charas[5] = CHARA_MIKU; + charas[1] = CHARA_RIN; + charas[2] = CHARA_LEN; + charas[3] = CHARA_LUKA; + charas[4] = CHARA_KAITO; + charas[0] = CHARA_MEIKO; + + int32_t modules[6]; + modules[5] = 186; + modules[1] = 46; + modules[2] = 39; + modules[3] = 41; + modules[4] = 40; + modules[0] = 31; + x_pv_game_data.Load(822, 22, charas, modules); shader_env_vert_set_ptr(&shaders_ft, 3, (vec4*)&vec4_identity); shader_env_vert_set_ptr(&shaders_ft, 4, (vec4*)&vec4_null); @@ -750,6 +764,8 @@ extern double_t input_roll; extern bool input_reset; extern bool input_shaders_reload; +int32_t global_ctrl_frames = 0; + static void render_ctrl(render_context* rctx) { camera* cam = rctx->camera; @@ -819,7 +835,10 @@ static void render_ctrl(render_context* rctx) { classes_process_ctrl(classes, classes_count); - rctx->ctrl(); + do { + rctx->ctrl(); + } while (--global_ctrl_frames >= 0); + global_ctrl_frames = 0; ImGui::Render(); @@ -890,6 +909,8 @@ static int cube_line_points_sort(void const* src1, void const* src2) { return d1 > d2 ? -1 : (d1 < d2 ? 1 : 0); } +static bool rob_draw = false; + static void render_draw(render_context* rctx) { static const GLfloat color_clear[] = { 0.0f, 0.0f, 0.0f, 0.0f }; static const GLfloat depth_clear = 1.0f; @@ -939,8 +960,6 @@ static void render_draw(render_context* rctx) { gl_state_bind_uniform_buffer_base(0, common_data_ubo); classes_process_draw(classes, classes_count); - static bool rob_draw = false; - gl_state_disable_cull_face(); vec4 bone_color = { 1.0f, 0.0f, 0.0f, 1.0f }; vec4 cns_color = { 1.0f, 1.0f, 0.0f, 1.0f }; @@ -951,9 +970,12 @@ static void render_draw(render_context* rctx) { if (rob_chara_pv_data_array[i].type == ROB_CHARA_TYPE_NONE) continue; + rob_chara* rob_chr = &rob_chara_array[i]; + if (~rob_chr->data.field_0 & 1) + continue; + gl_state_bind_vertex_array(cube_line_vao); gl_state_bind_array_buffer(cube_line_vbo); - rob_chara* rob_chr = &rob_chara_array[i]; rob_chara_bone_data* rob_bone_data = rob_chr->bone_data; size_t object_bone_count = rob_bone_data->object_bone_count; size_t total_bone_count = rob_bone_data->total_bone_count; @@ -970,79 +992,6 @@ static void render_draw(render_context* rctx) { if (memcmp(&trans[0], &trans[1], sizeof(vec3))) cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &bone_color); } - - rob_chara_item_equip* rob_item_equip = rob_chr->item_equip; - for (int32_t j = rob_item_equip->first_item_equip_object; - j < rob_item_equip->max_item_equip_object; j++) { - rob_chara_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[j]; - - for (ExExpressionBlock*& k : itm_eq_obj->expression_blocks) { - ExExpressionBlock* exp = k; - if (!exp || !exp->bone_node_ptr || !exp->parent_bone_node) - continue; - - vec3 trans[2]; - mat4_get_translation(exp->parent_bone_node->mat, &trans[0]); - mat4_get_translation(exp->bone_node_ptr->mat, &trans[1]); - - if (memcmp(&trans[0], &trans[1], sizeof(vec3))) - cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &cns_color); - } - - for (ExConstraintBlock*& k : itm_eq_obj->constraint_blocks) { - ExConstraintBlock* cns = k; - if (!cns || !cns->bone_node_ptr || !cns->parent_bone_node) - continue; - - vec3 trans[2]; - mat4_get_translation(cns->parent_bone_node->mat, &trans[0]); - mat4_get_translation(cns->bone_node_ptr->mat, &trans[1]); - - if (memcmp(&trans[0], &trans[1], sizeof(vec3))) - cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &exp_color); - } - - for (ExOsageBlock*& k : itm_eq_obj->osage_blocks) { - ExOsageBlock* osg = k; - if (!osg || !osg->bone_node_ptr || !osg->parent_bone_node) - continue; - - vec3 trans[2]; - mat4_get_translation(osg->parent_bone_node->mat, &trans[0]); - mat4_get_translation(osg->bone_node_ptr->mat, &trans[1]); - - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) { - mat4_get_translation(osg->parent_bone_node->parent->mat, &trans[0]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; - } - - cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &osg_color); - - rob_osage* rob_osg = &osg->rob; - rob_osage_node* parent_node = &osg->rob.node; - for (rob_osage_node& l : osg->rob.nodes) { - if (!l.bone_node_ptr || !parent_node->bone_node_ptr) { - parent_node = &l; - continue; - } - - vec3 trans[2]; - mat4_get_translation(parent_node->bone_node_ptr->mat, &trans[0]); - mat4_get_translation(l.bone_node_ptr->mat, &trans[1]); - - if (memcmp(&trans[0], &trans[1], sizeof(vec3))) - cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &osg_node_color); - else { - mat4_get_translation(parent_node->bone_node_ptr->parent->mat, &trans[0]); - if (!memcmp(&trans[0], &trans[1], sizeof(vec3))) - continue; - cube_line_draw(&cube_line_shader, cam, trans, CUBE_LINE_SIZE, &osg_node_color); - } - parent_node = &l; - } - } - } gl_state_bind_array_buffer(0); std::vector> cube_line_points; @@ -1052,54 +1001,12 @@ static void render_draw(render_context* rctx) { cube_line_points.push_back({ trans, 0.0f }); } - for (int32_t j = rob_item_equip->first_item_equip_object; - j < rob_item_equip->max_item_equip_object; j++) { - rob_chara_item_equip_object* itm_eq_obj = &rob_item_equip->item_equip_object[j]; - - for (ExExpressionBlock*& k : itm_eq_obj->expression_blocks) { - ExExpressionBlock* exp = k; - if (!exp || !exp->bone_node_ptr) - continue; - - vec3 trans; - mat4_get_translation(exp->bone_node_ptr->mat, &trans); - cube_line_points.push_back({ trans, 0.0f }); - } - - for (ExConstraintBlock*& k : itm_eq_obj->constraint_blocks) { - ExConstraintBlock* cns = k; - if (!cns || !cns->bone_node_ptr) - continue; - - vec3 trans; - mat4_get_translation(cns->bone_node_ptr->mat, &trans); - cube_line_points.push_back({ trans, 0.0f }); - } - - for (ExOsageBlock*& k : itm_eq_obj->osage_blocks) { - ExOsageBlock* osg = k; - if (!osg || !osg->bone_node_ptr) - continue; - - vec3 trans; - mat4_get_translation(osg->bone_node_ptr->mat, &trans); - cube_line_points.push_back({ trans, 0.0f }); - - rob_osage* rob_osg = &osg->rob; - rob_osage_node* parent_node = &osg->rob.node; - for (rob_osage_node& l : osg->rob.nodes) { - if (!l.bone_node_ptr) { - parent_node = &l; - continue; - } - - vec3 trans; - mat4_get_translation(l.bone_node_ptr->mat, &trans); - cube_line_points.push_back({ trans, 0.0f }); - parent_node = &l; - } - } - } + motion_blend_mot* mot = rob_chr->bone_data->motion_loaded.front(); + mot_key_set* key_set = mot->mot_key_data.mot.key_sets; + for (bone_data& j :mot->bone_data.bones) + if (j.type >= BONE_DATABASE_BONE_HEAD_IK_ROTATION + && j.type <= BONE_DATABASE_BONE_LEGS_IK_ROTATION) + cube_line_points.push_back({ j.ik_target, 0.0f }); for (std::pair& i : cube_line_points) { vec3 trans; @@ -1147,7 +1054,7 @@ static void render_draw(render_context* rctx) { gl_state_bind_framebuffer(0); if (rctx->draw_pass.enable[DRAW_PASS_POST_PROCESS]) - fbo_blit(rctx->post_process.screen_texture.fbos[0], 0, + fbo::blit(rctx->post_process.screen_texture.fbos[0], 0, 0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -1181,7 +1088,7 @@ static void render_dispose(render_context* rctx) { light_param_storage_data_free(); auth_3d_data_free(); - rob_chara_array_free(); + rob_free(); task_work_free(); item_table_array_free(); object_storage_free(); @@ -1200,11 +1107,9 @@ static void render_dispose(render_context* rctx) { glDeleteBuffers(1, &cube_line_vbo); glDeleteVertexArrays(1, &cube_line_vao); - pv_osage_manager_array_ptr_free(); - rob_thread_handler_free(); - rob_mot_tbl_free(); - motion_storage_free(); + mothead_storage_free(); + osage_setting_data_free(); render_texture_data_free(); delete rctx; diff --git a/src/CLOUD/x_pv_game.cpp b/src/CLOUD/x_pv_game.cpp index 267d7905..dd82a85f 100644 --- a/src/CLOUD/x_pv_game.cpp +++ b/src/CLOUD/x_pv_game.cpp @@ -10,11 +10,11 @@ #include "x_pv_game.hpp" #include "../CRE/Glitter/glitter.hpp" #include "../CRE/light_param/light.h" -#include "../CRE/data.h" -#include "../CRE/object.h" -#include "../CRE/stage_modern.h" -#include "../KKdLib/farc.h" -#include "../KKdLib/sort.h" +#include "../CRE/data.hpp" +#include "../CRE/object.hpp" +#include "../CRE/stage_modern.hpp" +#include "../KKdLib/farc.hpp" +#include "../KKdLib/sort.hpp" #include "input.hpp" #include "classes/imgui_helper.h" @@ -194,6 +194,7 @@ static int32_t hand_anim_id_to_mottbl_index(int32_t hand_anim_id); static int32_t look_anim_id_to_mottbl_index(int32_t look_anim_id); static int32_t mouth_anim_id_to_mottbl_index(int32_t mouth_anim_id); static bool x_pv_game_dsc_process(x_pv_game* xpvgm, int64_t curr_time); +static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm); static void x_pv_game_stage_effect_ctrl(x_pv_game* xpvgm); static void x_pv_game_stage_effect_start(x_pv_game* xpvgm, pvsr_stage_effect* stage_effect); static void x_pv_game_stage_effect_stop(x_pv_game* xpvgm, @@ -205,6 +206,44 @@ static dsc_data* sub_1401216D0(x_pv_game* a1, dsc_x_func func_name, static void sub_140121A80(x_pv_game* a1, int32_t chara_id); static void sub_140122770(x_pv_game* a1, int32_t chara_id); +x_pv_game_a3da_to_mot::x_pv_game_a3da_to_mot(int32_t auth_3d_id) { + this->auth_3d_id = auth_3d_id; + gblctr = -2; + n_hara = -2; + n_hara_y = -2; + j_hara_wj = -2; + n_kosi = -2; + j_mune_wj = -2; + n_mune_kl = -2; + j_mune_b_wj = -2; + j_kubi_wj = -2; + n_kao = -2; + j_kao_wj = -2; + j_eye_r_wj = -2; + j_eye_l_wj = -2; + n_waki_l = -2; + j_waki_l_wj = -2; + n_kata_l = -2; + j_kata_l_wj = -2; + j_ude_l_wj = -2; + j_te_l_wj = -2; + n_waki_r = -2; + j_waki_r_wj = -2; + n_kata_r = -2; + j_kata_r_wj = -2; + j_ude_r_wj = -2; + j_te_r_wj = -2; + j_kosi_wj = -2; + n_momo_l = -2; + j_momo_l_wj = -2; + j_sune_l_wj = -2; + j_asi_l_wj = -2; + n_momo_r = -2; + j_momo_r_wj = -2; + j_sune_r_wj = -2; + j_asi_r_wj = -2; +} + x_pv_game::x_pv_game() : pp(), sr(), state(), frame(), frame_float(), time(), rob_chara_ids(), pv_glitter(), stage_glitter(), dsc_time(), dsc_data_ptr(), dsc_data_ptr_end(), stage_effects_ptr(), stage_effects_ptr_end(), play(), success(), chara_id(), @@ -292,57 +331,22 @@ bool x_pv_game::Ctrl() { state = 4; } else if (state == 4) { - if (!object_storage_get_obj_set_handler(effpv_objset) - || !object_storage_load_obj_set_check_not_read( - effpv_objset, &obj_db, &tex_db)) - state = 6; - } - else if (state == 6) { - if (!object_storage_get_obj_set_handler(stgpv_objset) - || !object_storage_load_obj_set_check_not_read( - stgpv_objset, &obj_db, &tex_db)) - state = 7; - } - else if (state == 7) { - if (!object_storage_get_obj_set_handler(stgpvhrc_objset) - || !object_storage_load_obj_set_check_not_read( - stgpvhrc_objset, &obj_db, &tex_db)) - state = 8; + for (uint32_t& i : objset_load) + if (object_storage_get_obj_set_handler(i) + && object_storage_load_obj_set_check_not_read(i, &obj_db, &tex_db)) + return false; + + state = 8; } else if (state == 8) { - obj_set* effpv_objset = object_storage_get_obj_set(this->effpv_objset); - if (effpv_objset) - for (int32_t i = 0; i < effpv_objset->objects_count; i++) { - obj* obj = &effpv_objset->objects[i]; - for (int32_t j = 0; j < obj->materials_count; j++) { - obj_material* material = &obj->materials[j].material; - vec3 spec = { 0.5f, 0.5f, 0.5f }; - if (!memcmp(&material->specular, &spec, sizeof(vec3))) - *(vec3*)&material->specular = vec3_null; - else if (memcmp(&material->specular, &vec3_null, sizeof(vec3))) - *(vec3*)&material->specular = { 0.1f, 0.1f, 0.1f }; - } - } + for (uint32_t& i : objset_load) { + obj_set* set = object_storage_get_obj_set(i); + if (!set) + continue; - obj_set* stgpv_objset = object_storage_get_obj_set(this->stgpv_objset); - if (stgpv_objset) - for (int32_t i = 0; i < stgpv_objset->objects_count; i++) { - obj* obj = &stgpv_objset->objects[i]; - for (int32_t j = 0; j < obj->materials_count; j++) { - obj_material* material = &obj->materials[j].material; - vec3 spec = { 0.5f, 0.5f, 0.5f }; - if (!memcmp(&material->specular, &spec, sizeof(vec3))) - *(vec3*)&material->specular = vec3_null; - else if (memcmp(&material->specular, &vec3_null, sizeof(vec3))) - *(vec3*)&material->specular = { 0.1f, 0.1f, 0.1f }; - } - } - - obj_set* stgpvhrc_objset = object_storage_get_obj_set(this->stgpvhrc_objset); - if (stgpvhrc_objset) - for (int32_t i = 0; i < stgpvhrc_objset->objects_count; i++) { - obj* obj = &stgpvhrc_objset->objects[i]; - for (int32_t j = 0; j < obj->materials_count; j++) { + for (uint32_t i = 0; i < set->objects_count; i++) { + obj* obj = &set->objects[i]; + for (uint32_t j = 0; j < obj->materials_count; j++) { obj_material* material = &obj->materials[j].material; vec3 spec = { 0.5f, 0.5f, 0.5f }; if (!memcmp(&material->specular, &spec, sizeof(vec3))) @@ -351,23 +355,30 @@ bool x_pv_game::Ctrl() { *(vec3*)&material->specular = { 0.1f, 0.1f, 0.1f }; } } + } data_struct* x_data = &data_list[DATA_X]; task_stage_modern_set_data(x_data, &obj_db, &tex_db, &stage_data); task_stage_modern_set_stage_hashes(&stage_hashes, &stages_data); - auth_3d_data_load_category(x_data, pv_category.c_str(), pv_category_hash); - auth_3d_data_load_category(x_data, stage_category.c_str(), stage_category_hash); + for (std::pair& i : category_load) + auth_3d_data_load_category(x_data, i.first.c_str(), i.second); + auth_3d_data_load_category(light_category.c_str()); - auth_3d_data_load_category(x_data, camera_category.c_str(), camera_category_hash); + + for (pvpp_chara& i : pp->chara) + if (i.chara_effect_init) + for (pvpp_chara_effect_a3da& j : i.chara_effect.effect_a3da) + auth_3d_data_load_category(x_data, camera_category.c_str(), camera_category_hash); state = 9; } else if (state == 9) { - if (!auth_3d_data_check_category_loaded(pv_category_hash) - || !auth_3d_data_check_category_loaded(stage_category_hash) - || !auth_3d_data_check_category_loaded(light_category.c_str()) - || !auth_3d_data_check_category_loaded(camera_category_hash)) + for (std::pair& i : category_load) + if (!auth_3d_data_check_category_loaded(i.second)) + return false; + + if (!auth_3d_data_check_category_loaded(light_category.c_str())) return false; data_struct* x_data = &data_list[DATA_X]; @@ -377,6 +388,7 @@ bool x_pv_game::Ctrl() { int32_t id = auth_3d_data_load_hash(hash, pv_category_hash, pv_category.c_str(), x_data, &obj_db, &tex_db); auth_3d_data_read_file_modern(&id); + auth_3d_data_set_enable(&id, false); auth_3d_data_set_visibility(&id, false); pv_auth_3d_ids.insert({ hash, id }); } @@ -386,6 +398,7 @@ bool x_pv_game::Ctrl() { int32_t id = auth_3d_data_load_hash(hash, stage_category_hash, stage_category.c_str(), x_data, &obj_db, &tex_db); auth_3d_data_read_file_modern(&id); + auth_3d_data_set_enable(&id, false); auth_3d_data_set_visibility(&id, false); stage_auth_3d_ids.insert({ hash, id }); } @@ -405,8 +418,6 @@ bool x_pv_game::Ctrl() { auth_3d_data_read_file(&light_auth_3d_id, auth_3d_db); auth_3d_data_set_camera_root_update(&light_auth_3d_id, false); auth_3d_data_set_enable(&light_auth_3d_id, true); - auth_3d_data_set_req_frame(&light_auth_3d_id, 0.0f); - auth_3d_data_set_max_frame(&light_auth_3d_id, -1.0f); auth_3d_data_set_paused(&light_auth_3d_id, false); auth_3d_data_set_visibility(&light_auth_3d_id, true); break; @@ -426,12 +437,30 @@ bool x_pv_game::Ctrl() { auth_3d_data_read_file_modern(&camera_auth_3d_id); auth_3d_data_set_repeat(&camera_auth_3d_id, false); auth_3d_data_set_enable(&camera_auth_3d_id, true); - auth_3d_data_set_req_frame(&camera_auth_3d_id, 0.0f); - auth_3d_data_set_max_frame(&camera_auth_3d_id, -1.0f); auth_3d_data_set_paused(&camera_auth_3d_id, false); auth_3d_data_set_visibility(&camera_auth_3d_id, true); } + for (auto i : effchrpv_auth_3d_names) { + uint32_t hash = hash_string_murmurhash(&i.first); + int32_t id = auth_3d_data_load_hash(hash, i.second.first, + i.second.second.c_str(), x_data, &obj_db, &tex_db); + auth_3d_data_read_file_modern(&id); + auth_3d_data_set_enable(&id, false); + auth_3d_data_set_visibility(&id, false); + effchrpv_auth_3d_ids.insert({ hash, id }); + } + + for (auto i : effchrpv_auth_3d_mot_names) { + uint32_t hash = hash_string_murmurhash(&i.first); + int32_t id = auth_3d_data_load_hash(hash, i.second.first, + i.second.second.c_str(), x_data, &obj_db, &tex_db); + auth_3d_data_read_file_modern(&id); + auth_3d_data_set_enable(&id, false); + auth_3d_data_set_visibility(&id, false); + effchrpv_auth_3d_mot_ids.insert({ hash, id }); + } + { dsc dsc_mouth; dsc dsc_scene; @@ -664,7 +693,59 @@ bool x_pv_game::Ctrl() { x_pv_game_stage_effect_ctrl(this); - pause = true; + if (pv_id == 826) { + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + for (int32_t& i : effchrpv_rob_mot_ids) { + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "PV826_OST_P%d_00", i + 1); + int32_t motion_id = aft_mot_db->get_motion_id(buf); + rob_chara* rob_chr = rob_chara_array_get(rob_chara_ids[i]); + rob_chr->set_motion_id(motion_id, 0.0f, + 0.0f, false, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chr->set_motion_reset_data(motion_id, 0.0f); + rob_chr->set_motion_skin_param(motion_id, 0.0f); + + sprintf_s(buf, sizeof(buf), "A3D_EFFCHRPV%03dMIK%03d", pv_id, i); + uint32_t hash = hash_utf8_murmurhash(buf); + bool found = false; + for (auto j : effchrpv_auth_3d_names) + if (j.second.first == hash) { + uint32_t hash = hash_string_murmurhash(&j.first); + effchrpv_auth_3d_rob_mot_ids.insert({ i, { effchrpv_auth_3d_ids[hash] } }); + found = true; + break; + } + + if (found) + continue; + + for (auto j : effchrpv_auth_3d_mot_names) + if (j.second.first == hash) { + uint32_t hash = hash_string_murmurhash(&j.first); + effchrpv_auth_3d_rob_mot_ids.insert({ i, { effchrpv_auth_3d_mot_ids[hash] } }); + break; + } + } + + for (auto& i : effchrpv_auth_3d_mot_ids) { + int32_t& id = i.second; + auth_3d_data_set_repeat(&id, false); + auth_3d_data_set_camera_root_update(&id, false); + auth_3d_data_set_enable(&id, true); + auth_3d_data_set_paused(&id, false); + auth_3d_data_set_visibility(&id, false); + auth_3d_data_set_frame_rate(&id, &diva_pv_frame_rate); + } + } + + if (pv_id == 826) { + extern int32_t global_ctrl_frames; + global_ctrl_frames = 10; + } + else + pause = true; } else if (state == 10) { if (step_frame) @@ -683,6 +764,9 @@ bool x_pv_game::Ctrl() { frame = (int32_t)frame_float; time = (int64_t)round(frame_float * (100000.0 / 60.0) * 10000.0); + if (pv_id == 826 && frame == 10) + pause = true; + while (dsc_data_ptr != dsc_data_ptr_end && x_pv_game_dsc_process(this, time)) dsc_data_ptr++; @@ -694,6 +778,9 @@ bool x_pv_game::Ctrl() { stage_effect.frame += diva_stage_frame_rate.GetDeltaFrame(); x_pv_game_stage_effect_ctrl(this); + if (pv_id == 826) + x_pv_game_map_auth_3d_to_mot(this); + if (!play || pv_end) state = 11; } @@ -796,7 +883,7 @@ void x_pv_game::Window() { ImGui::End(); } -void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { +void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int32_t modules[6]) { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; @@ -816,7 +903,9 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { stgpvhrc_objset = hash_utf8_murmurhash(buf); sprintf_s(buf, sizeof(buf), "PV%03d", pv_id); - motion_set_load_motion(aft_mot_db->get_motion_set_id(buf), 0, aft_mot_db); + uint32_t mot_set = aft_mot_db->get_motion_set_id(buf); + motion_set_load_motion(mot_set, 0, aft_mot_db); + motion_set_load_mothead(mot_set, 0, aft_mot_db); char file_buf[0x200]; sprintf_s(file_buf, sizeof(file_buf), "pv%03d.pvpp", pv_id); @@ -838,19 +927,9 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { stage_glitter = new x_pv_game_glitter(file_buf); sprintf_s(buf, sizeof(buf), "A3D_EFFPV%03d", pv_id); - pv_category = std::string(buf); + pv_category = buf; pv_category_hash = hash_string_murmurhash(&pv_category); - - sprintf_s(buf, sizeof(buf), "EFFSTGPV%03d", stage_id); - stage_category = std::string(buf); - stage_category_hash = hash_string_murmurhash(&stage_category); - - sprintf_s(buf, sizeof(buf), "EFFSTGPV%03d", 800 + stage_id); - light_category = std::string(buf); - - sprintf_s(buf, sizeof(buf), "CAMPV%03d", pv_id); - camera_category = std::string(buf); - camera_category_hash = hash_string_murmurhash(&camera_category); + category_load.push_back({ pv_category, pv_category_hash }); pv_auth_3d_names.clear(); for (pvpp_effect i : pp->effect) @@ -859,6 +938,11 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { pv_auth_3d_names.insert(j.name); } + sprintf_s(buf, sizeof(buf), "EFFSTGPV%03d", stage_id); + stage_category = buf; + stage_category_hash = hash_string_murmurhash(&stage_category); + category_load.push_back({ stage_category, stage_category_hash }); + stage_auth_3d_names.clear(); for (pvsr_stage_effect i : sr->stage_effect) for (pvsr_a3da j : i.a3da) @@ -876,6 +960,64 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { stage_auth_3d_names.insert(k.name); } + sprintf_s(buf, sizeof(buf), "EFFSTGPV%03d", 800 + stage_id); + light_category = buf; + + sprintf_s(buf, sizeof(buf), "CAMPV%03d", pv_id); + camera_category = buf; + camera_category_hash = hash_string_murmurhash(&camera_category); + category_load.push_back({ camera_category, camera_category_hash }); + + int32_t chara_index = 0; + effchrpv_auth_3d_names.clear(); + if (pv_id == 826) + effchrpv_auth_3d_mot_names.clear(); + + for (pvpp_chara& i : pp->chara) { + if (!i.chara_effect_init) { + chara_index++; + continue; + } + + const char* src_name = chara_index_get_auth_3d_name((::chara_index)i.chara_effect.base_chara); + const char* dst_name = chara_index_get_auth_3d_name(charas[chara_index++]); + const char* mik_name = chara_index_get_auth_3d_name(CHARA_MIKU); + + for (pvpp_chara_effect_a3da& j : i.chara_effect.effect_a3da) { + std::string name = j.a3da.name; + if (name.find(src_name) == std::string::npos) { + size_t pos = name.find(dst_name); + if (pos != std::string::npos) + name.replace(pos, utf8_length(dst_name), src_name, utf8_length(src_name)); + } + + if (pv_id != 826) { + std::string category = "A3D_" + name; + uint32_t category_hash = hash_string_murmurhash(&category); + category_load.push_back({ category, category_hash }); + + if (effchrpv_auth_3d_names.find(name) == effchrpv_auth_3d_names.end()) + effchrpv_auth_3d_names.insert({ name, { category_hash, category } }); + + effchrpv_auth_3d_hashes.insert({ j.a3da.hash, hash_string_murmurhash(&name) }); + } + else { + sprintf_s(buf, sizeof(buf), "EFFCHRPV%03d", pv_id); + if (j.a3da.name.find(buf) == std::string::npos) + continue; + + name = j.a3da.name; + name.replace(utf8_length(buf), utf8_length(mik_name), mik_name, utf8_length(mik_name)); + + std::string category = "A3D_" + name; + uint32_t category_hash = hash_string_murmurhash(&category); + + category_load.push_back({ category, category_hash }); + effchrpv_auth_3d_mot_names.insert({ name, { category_hash, category } }); + } + } + } + stage_hashes.clear(); stages_data.clear(); for (stage_data_modern& i : stage_data.stage_modern) { @@ -904,15 +1046,12 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { for (int32_t& i : rob_chara_ids) i = -1; - int32_t chara_index = 0; + chara_index = 0; for (pvpp_chara& i : pp->chara) { if (i.motion.size()) { - ::chara_index chr_idx = CHARA_MIKU; - if (i.chara_effect.size()) - chr_idx = (::chara_index)i.chara_effect.front().base_chara; - rob_chara_pv_data pv_data; - int32_t chara_id = rob_chara_array_init_chara_index(chr_idx, &pv_data, 0, true); + int32_t chara_id = rob_chara_array_init_chara_index( + charas[chara_index], &pv_data, modules[chara_index], true); if (chara_id >= 0 && chara_id < ROB_CHARA_COUNT) rob_chara_ids[chara_index] = chara_id; } @@ -921,9 +1060,50 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id) { break; } - object_storage_load_set_hash(x_data, effpv_objset); - object_storage_load_set_hash(x_data, stgpv_objset); - object_storage_load_set_hash(x_data, stgpvhrc_objset); + if (pv_id == 826) + for (int32_t i = (int32_t)pp->chara.size(); i < ROB_CHARA_COUNT; i++) { + rob_chara_pv_data pv_data; + int32_t chara_id = rob_chara_array_init_chara_index(charas[i], &pv_data, modules[i], true); + if (chara_id >= 0 && chara_id < ROB_CHARA_COUNT) + rob_chara_ids[i] = chara_id; + effchrpv_rob_mot_ids.push_back(chara_id); + } + + objset_load.push_back(effpv_objset); + objset_load.push_back(stgpv_objset); + objset_load.push_back(stgpvhrc_objset); + + if (pv_id != 826) { + int32_t chara_index = 0; + for (pvpp_chara& i : pp->chara) { + if (!i.chara_effect_init) { + chara_index++; + continue; + } + + const char* src_name = chara_index_get_auth_3d_name((::chara_index)i.chara_effect.base_chara); + const char* dst_name = chara_index_get_auth_3d_name(charas[chara_index++]); + + for (pvpp_chara_effect_a3da& j : i.chara_effect.effect_a3da) { + std::string name = j.has_object_set ? j.object_set.name : j.a3da.name; + if (name.find(src_name) == std::string::npos) { + size_t pos = name.find(dst_name); + if (pos != std::string::npos) + name.replace(pos, utf8_length(dst_name), src_name, utf8_length(src_name)); + } + + objset_load.push_back(hash_string_murmurhash(&name)); + + std::string nam = j.has_object_set ? j.object_set.name : j.a3da.name; + nam.replace(utf8_length(buf), utf8_length(dst_name), dst_name, utf8_length(dst_name)); + if (nam != name) + objset_load.push_back(hash_string_murmurhash(&nam)); + } + } + } + + for (uint32_t& i : objset_load) + object_storage_load_set_hash(x_data, i); state = 1; this->frame = 0; @@ -970,14 +1150,12 @@ void x_pv_game::Unload() { char buf[0x200]; sprintf_s(buf, sizeof(buf), "PV%03d", pv_id); - motion_set_unload_motion(aft_mot_db->get_motion_set_id(buf)); + uint32_t mot_set = aft_mot_db->get_motion_set_id(buf); + motion_set_unload_motion(mot_set); + motion_set_unload_mothead(mot_set); pv_id = -1; stage_id = -1; - delete pp; - delete sr; - pp = 0; - sr = 0; state = 0; frame = 0; @@ -1022,24 +1200,43 @@ void x_pv_game::Unload() { stage_auth_3d_names.clear(); pv_auth_3d_names.clear(); - for (std::pair i : pv_auth_3d_ids) + for (auto& i : pv_auth_3d_ids) auth_3d_data_unload_id(i.second, rctx_ptr); - for (std::pair i : stage_auth_3d_ids) + for (auto& i : stage_auth_3d_ids) auth_3d_data_unload_id(i.second, rctx_ptr); auth_3d_data_unload_id(light_auth_3d_id, rctx_ptr); auth_3d_data_unload_id(camera_auth_3d_id, rctx_ptr); + for (auto& i : effchrpv_auth_3d_ids) + auth_3d_data_unload_id(i.second, rctx_ptr); + + for (auto& i : effchrpv_auth_3d_mot_ids) + auth_3d_data_unload_id(i.second, rctx_ptr); + pv_auth_3d_ids.clear(); stage_auth_3d_ids.clear(); light_auth_3d_id = -1; camera_auth_3d_id = -1; + effchrpv_auth_3d_ids.clear(); + effchrpv_auth_3d_mot_ids.clear(); + + effchrpv_rob_mot_ids.clear(); + effchrpv_rob_mot_ids.shrink_to_fit(); + effchrpv_auth_3d_rob_mot_ids.clear(); + effchrpv_auth_3d_names.clear(); + effchrpv_auth_3d_mot_names.clear(); + + effchrpv_auth_3d_hashes.clear(); + + for (std::pair& i : category_load) + auth_3d_data_unload_category(i.second); - auth_3d_data_unload_category(pv_category_hash); - auth_3d_data_unload_category(stage_category_hash); auth_3d_data_unload_category(light_category.c_str()); - auth_3d_data_unload_category(camera_category_hash); + + category_load.clear(); + category_load.shrink_to_fit(); pv_category_hash = hash_murmurhash_empty; stage_category_hash = hash_murmurhash_empty; @@ -1054,14 +1251,21 @@ void x_pv_game::Unload() { camera_category.clear(); camera_category.shrink_to_fit(); - object_storage_unload_set(effpv_objset); - object_storage_unload_set(stgpv_objset); - object_storage_unload_set(stgpvhrc_objset); + for (uint32_t& i : objset_load) + object_storage_unload_set(i); effpv_objset = hash_murmurhash_empty; stgpv_objset = hash_murmurhash_empty; stgpvhrc_objset = hash_murmurhash_empty; + objset_load.clear(); + objset_load.shrink_to_fit(); + + delete pp; + delete sr; + pp = 0; + sr = 0; + dsc_m.type = DSC_NONE; dsc_m.signature = 0; dsc_m.id = 0; @@ -1097,7 +1301,7 @@ void x_pv_game::Unload() { } x_pv_game_glitter::x_pv_game_glitter(const char* name) { - this->name = std::string(name); + this->name = name; hash = (uint32_t)Glitter::glt_particle_manager .LoadFile(Glitter::X, &data_list[DATA_X], name, 0, -1.0f, false, 0); } @@ -1274,7 +1478,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { mat4 scene_rot_mat = a1->scene_rot_mat; mat4_mult_vec3_trans(&scene_rot_mat, &trans, &trans); rob_chr->data.miku_rot.position = trans; - rob_chara_set_osage_reset(rob_chr); + rob_chr->set_osage_reset(); } break; case DSC_X_MIKU_ROT: { a1->chara_id = (int32_t)data[0]; @@ -1288,7 +1492,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { int16_t rot_y_int16 = (int32_t)((rot_y + a1->scene_rot_y) * 32768.0f * (float_t)(1.0 / 180.0)); rob_chr->data.miku_rot.rot_y_int16 = rot_y_int16; - rob_chara_set_osage_reset(rob_chr); + rob_chr->set_osage_reset(); } break; case DSC_X_MIKU_DISP: { data_struct* aft_data = &data_list[DATA_AFT]; @@ -1307,18 +1511,17 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { break; if (disp == 1) { - rob_chara_set_visibility(rob_chr, true); - /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, - rob_chr->module_index)) { - sub_1405430F0(rob_chr->chara_id, 1); - sub_1405430F0(rob_chr->chara_id, 2); + rob_chr->set_visibility(true); + /*if (rob_chara::check_for_ageageagain_module(chara_index, module_index)) { + sub_1405430F0(chara_id, 1); + sub_1405430F0(chara_id, 2); }*/ //pv_game::set_data_itmpv_visibility(a1->pv_game, a1->chara_id, true); for (pv_play_data_set_motion& i : playdata->set_motion) { - bool v45 = rob_chara_set_motion_id(rob_chr, i.motion_id, i.frame, + bool v45 = rob_chr->set_motion_id(i.motion_id, i.frame, i.duration, i.field_10, 0, i.blend_type, aft_bone_data, aft_mot_db); - rob_chara_set_motion_reset_data(rob_chr, i.motion_id, i.dsc_frame); + rob_chr->set_motion_reset_data(i.motion_id, i.dsc_frame); rob_chr->bone_data->field_758 = i.field_18; rob_chr->data.adjust.step_data.step = i.frame_speed; //if (v45) @@ -1329,7 +1532,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { playdata->set_motion.clear(); } else { - rob_chara_set_visibility(rob_chr, false); + rob_chr->set_visibility(false); //pv_game::set_data_itmpv_visibility(a1->pv_game, a1->chara_id, false); } } break; @@ -1436,12 +1639,12 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (motion_index) { if (motion_id == -1) - motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 0); + motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); } else if (motion_id == -1) { - motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 5); + motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(5); if (motion_id == -1) - motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 0); + motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); } duration /= a1->anim_frame_speed; @@ -1463,10 +1666,10 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //a1->field_2C560[a1->chara_id] = true; //a1->field_2C568[a1->chara_id] = v519; if (playdata->disp) { - bool v84 = rob_chara_set_motion_id(rob_chr, motion_id, frame, - duration, v11, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); - rob_chara_set_motion_reset_data(rob_chr, motion_id, dsc_frame); - rob_chara_set_motion_skin_param(rob_chr, motion_id, dsc_frame); + bool v84 = rob_chr->set_motion_id(motion_id, frame, duration, + v11, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chr->set_motion_reset_data(motion_id, dsc_frame); + rob_chr->set_motion_skin_param(motion_id, dsc_frame); rob_chr->bone_data->field_758 = true; rob_chr->data.adjust.step_data.step = v519.frame_speed; //if (v84) @@ -1563,8 +1766,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.pv->is_old_pv) // offset = 1.0f; - rob_chara_set_eyelid_mottbl_motion_from_face(rob_chr, - v115, duration, -1.0f, offset, aft_mot_db); + rob_chr->set_eyelid_mottbl_motion_from_face(v115, duration, -1.0f, offset, aft_mot_db); } break; case DSC_X_MOUTH_ANIM: { data_struct* aft_data = &data_list[DATA_AFT]; @@ -1641,8 +1843,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.pv->is_old_pv) // offset = 1.0f; - rob_chara_set_mouth_mottbl_motion(rob_chr, 0, mottbl_index, - value, 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); } break; case DSC_X_HAND_ANIM: { data_struct* aft_data = &data_list[DATA_AFT]; @@ -1687,12 +1889,12 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { switch (hand_index) { case 0: - rob_chara_set_hand_l_mottbl_motion(rob_chr, 0, mottbl_index, - value, 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + rob_chr->set_hand_l_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); break; case 1: - rob_chara_set_hand_r_mottbl_motion(rob_chr, 0, mottbl_index, - value, 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + rob_chr->set_hand_r_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); break; } } break; @@ -1736,8 +1938,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.pv->is_old_pv) // offset = 1.0f; - rob_chara_set_eyes_mottbl_motion(rob_chr, 0, mottbl_index, - value, mottbl_index == 224 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + rob_chr->set_eyes_mottbl_motion(0, mottbl_index, value, + mottbl_index == 224 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); return 1; } break; case DSC_X_EXPRESSION: { @@ -1784,8 +1986,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.pv->is_old_pv) // offset = 1.0f; - rob_chara_set_face_mottbl_motion(rob_chr, 0, mottbl_index, value, - mottbl_index >= 214 && mottbl_index <= 223 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, v168, aft_mot_db); + rob_chr->set_face_mottbl_motion(0, mottbl_index, value, mottbl_index >= 214 + && mottbl_index <= 223 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, v168, aft_mot_db); } break; case DSC_X_LOOK_CAMERA: { @@ -1833,7 +2035,6 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (!rob_chr) break; - int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); duration /= a1->anim_frame_speed; @@ -1845,8 +2046,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.pv->is_old_pv) // offset = 1.0f; - rob_chara_set_face_mottbl_motion(rob_chr, 0, mottbl_index, 1.0f, - mottbl_index >= 214 && mottbl_index <= 223 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, v237, aft_mot_db); + rob_chr->set_face_mottbl_motion(0, mottbl_index, 1.0f, mottbl_index >= 214 + && mottbl_index <= 223 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, v237, aft_mot_db); /*if (!a1->has_perf_id) { int32_t mottbl_index = mouth_anim_id_to_mottbl_index(v234); @@ -1855,8 +2056,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.field_2D090 && mottbl_index != 144) // value = 0.0f; - rob_chara_set_mouth_mottbl_motion(rob_chr, 0, mottbl_index, - value, 0, a1->target_anim_fps * 0.1f, 0.0f, 1.0f, -1, offset, aft_mot_db); + rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, 0, + a1->target_anim_fps * 0.1f, 0.0f, 1.0f, -1, offset, aft_mot_db); }*/ } break; case DSC_X_DUMMY: { @@ -1902,8 +2103,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { //if (a1->pv_game->data.pv->is_old_pv) // offset = 1.0f; - rob_chara_set_mouth_mottbl_motion(rob_chr, 0, mottbl_index, - value, 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); } break; case DSC_X_SET_CHARA: { a1->chara_id = (int32_t)data[0]; @@ -1933,7 +2134,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_AIM: { - + a1->chara_id = (int32_t)data[0]; } break; case DSC_X_HAND_ITEM: { @@ -1951,7 +2152,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { a1->chara_id = (int32_t)data[0]; pv_play_data* playdata = &a1->playdata[a1->chara_id]; - float_t value = (float_t)(int32_t)data[0] * 0.001f; + float_t value = (float_t)(int32_t)data[1] * 0.001f; rob_chara* rob_chr = playdata->rob_chr; if (!rob_chr) @@ -1966,13 +2167,24 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_TONE_TRANS: { - + vec3 start; + vec3 end; + start.x = (float_t)(int32_t)data[0] * 0.001f; + start.y = (float_t)(int32_t)data[1] * 0.001f; + start.z = (float_t)(int32_t)data[2] * 0.001f; + end.x = (float_t)(int32_t)data[3] * 0.001f; + end.y = (float_t)(int32_t)data[4] * 0.001f; + end.z = (float_t)(int32_t)data[5] * 0.001f; + post_process_tone_map_set_tone_trans_start(rctx_ptr->post_process.tone_map, &start); + post_process_tone_map_set_tone_trans_start(rctx_ptr->post_process.tone_map, &end); } break; case DSC_X_SATURATE: { - + float_t value = (float_t)(int32_t)data[0] * 0.001f; + post_process_tone_map_set_saturate_coeff(rctx_ptr->post_process.tone_map, value); } break; case DSC_X_FADE_MODE: { - + int32_t value = data[0]; + post_process_tone_map_set_scene_fade_blend_func(rctx_ptr->post_process.tone_map, value); } break; case DSC_X_AUTO_BLINK: { @@ -1991,22 +2203,76 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (!rob_chr) break; - rob_chara_set_parts_disp(rob_chr, id, disp == 1); + rob_chr->set_parts_disp(id, disp == 1); } break; case DSC_X_TARGET_FLYING_TIME: { } break; case DSC_X_CHARA_SIZE: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + int32_t chara_size = (int32_t)data[1]; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + return 1; + + int32_t chara_size_index; + if (chara_size == 0) + chara_size_index = chara_init_data_get_chara_size_index(rob_chr->chara_index); + else if (chara_size == 1) + chara_size_index = chara_init_data_get_chara_size_index(rob_chr->chara_index + /*pv_db_pv_get_performer_chara(a1->pv_game->data.pv, a1->chara_id)*/); + else if (chara_size == 2) + chara_size_index = 1; + else if (chara_size == 3) + chara_size_index = rob_chr->pv_data.chara_size_index; + else { + rob_chr->set_chara_size((float_t)chara_size / 1000.0f/*a1->field_2C54C*/); + break; + } + + if (chara_size_index < 0 || chara_size_index > 4) + break; + + rob_chr->set_chara_size(chara_size_table_get_value(chara_size_index)); + rob_chr->set_chara_pos_adjust_y(chara_pos_adjust_y_table_get_value(chara_size_index)); } break; case DSC_X_CHARA_HEIGHT_ADJUST: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + int32_t height_adjust = (int32_t)data[1]; + + rob_chara* rob_chr = playdata->rob_chr; + if (rob_chr) + rob_chr->set_chara_height_adjust(height_adjust != 0); } break; case DSC_X_ITEM_ANIM: { } break; case DSC_X_CHARA_POS_ADJUST: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + vec3 pos; + pos.x = (float_t)(int32_t)data[2] * 0.001f; + pos.y = (float_t)(int32_t)data[3] * 0.001f; + pos.z = (float_t)(int32_t)data[4] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + mat4 scene_rot_mat = a1->scene_rot_mat; + mat4_mult_vec3_trans(&scene_rot_mat, &pos, &pos); + rob_chr->set_chara_pos_adjust(&pos); + + /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { + sub_1405430F0(rob_chr->chara_id, 1); + sub_1405430F0(rob_chr->chara_id, 2); + }*/ } break; case DSC_X_SCENE_ROT: { float_t scene_rot_y = (float_t)(int32_t)data[0] * 0.001f; @@ -2064,7 +2330,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (!rob_chr) break; - rob_chara_set_osage_step(rob_chr, osage_step_outer); + rob_chr->set_osage_step(osage_step_outer); } break; case DSC_X_OSAGE_MV_CCL: { data_struct* aft_data = &data_list[DATA_AFT]; @@ -2080,8 +2346,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (!rob_chr) break; - rob_chara_set_osage_move_cancel(rob_chr, 1, osage_mv_ccl_kami); - rob_chara_set_osage_move_cancel(rob_chr, 2, osage_mv_ccl_outer); + rob_chr->set_osage_move_cancel(1, osage_mv_ccl_kami); + rob_chr->set_osage_move_cancel(2, osage_mv_ccl_outer); } break; case DSC_X_CHARA_COLOR: { @@ -2330,7 +2596,41 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_CHARA_EFFECT: { + return true; + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + bool enable = data[1] ? true : false; + int32_t chara_effect_id = (int32_t)data[2]; + + pvpp_chara& chara = a1->pp->chara[a1->chara_id]; + if (!chara.chara_effect_init) + break; + else if (chara_effect_id < 0 || chara_effect_id >= chara.chara_effect.effect_a3da.size()) + break; + + uint32_t hash = chara.chara_effect.effect_a3da[chara_effect_id].a3da.hash; + hash = a1->effchrpv_auth_3d_hashes[hash]; + if (enable) { + int32_t& id = a1->effchrpv_auth_3d_ids[hash]; + auth_3d_data_set_repeat(&id, false); + auth_3d_data_set_camera_root_update(&id, false); + auth_3d_data_set_enable(&id, true); + auth_3d_data_set_req_frame(&id, (float_t)a1->frame_float); + auth_3d_data_set_max_frame(&id, -1.0f); + auth_3d_data_set_paused(&id, false); + auth_3d_data_set_visibility(&id, true); + auth_3d_data_set_frame_rate(&id, &diva_pv_frame_rate); + auth_3d_data_set_chara_id(&id, a1->chara_id); + } + else { + int32_t& id = a1->effchrpv_auth_3d_ids[hash]; + auth_3d_data_set_visibility(&id, false); + auth_3d_data_set_enable(&id, false); + } } break; case DSC_X_MARKER: { @@ -2450,6 +2750,260 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { return true; } +static int32_t get_bone_index(auth_3d_object_hrc* oh, const char* name) { + uint32_t name_hash = hash_utf8_murmurhash(name); + for (auth_3d_object_node& i : oh->node) + if (hash_string_murmurhash(&i.name) == name_hash) + return (int32_t)(&i - oh->node.data()); + return -1; +} + +static void set_bone_key_set_data(bone_data* bone_data, + motion_bone_index motion_bone_index, mot_key_set* key_set, vec3* data, int32_t count = 1) { + bone_data += motion_bone_index; + key_set += bone_data->key_set_offset; + while (count > 0) { + if (key_set[0].type == MOT_KEY_SET_STATIC && key_set[0].values) + *(float_t*)&key_set[0].values[0] = data->x; + if (key_set[1].type == MOT_KEY_SET_STATIC && key_set[1].values) + *(float_t*)&key_set[1].values[0] = data->y; + if (key_set[2].type == MOT_KEY_SET_STATIC && key_set[2].values) + *(float_t*)&key_set[2].values[0] = data->z; + key_set += 3; + data++; + count--; + } +} + +static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { + for (auto& i : xpvgm->effchrpv_auth_3d_rob_mot_ids) { + rob_chara* rob_chr = rob_chara_array_get(xpvgm->rob_chara_ids[i.first]); + x_pv_game_a3da_to_mot& a2m = i.second; + auth_3d* auth = auth_3d_data_get_auth_3d(a2m.auth_3d_id); + auth_3d_object_hrc* oh = &auth->object_hrc[0]; + + if (a2m.gblctr == -2) + a2m.gblctr = get_bone_index(oh, "gblctr"); + if (a2m.n_hara == -2) + a2m.n_hara = get_bone_index(oh, "n_hara"); + if (a2m.n_hara_y == -2) + a2m.n_hara_y = get_bone_index(oh, "n_hara_y"); + if (a2m.j_hara_wj == -2) + a2m.j_hara_wj = get_bone_index(oh, "j_hara_wj"); + if (a2m.n_kosi == -2) + a2m.n_kosi = get_bone_index(oh, "n_kosi"); + if (a2m.j_mune_wj == -2) + a2m.j_mune_wj = get_bone_index(oh, "j_mune_wj"); + if (a2m.n_mune_kl == -2) + a2m.n_mune_kl = get_bone_index(oh, "n_mune_kl"); + if (a2m.j_mune_b_wj == -2) + a2m.j_mune_b_wj = get_bone_index(oh, "j_mune_b_wj"); + if (a2m.j_kubi_wj == -2) + a2m.j_kubi_wj = get_bone_index(oh, "j_kubi_wj"); + if (a2m.n_kao == -2) + a2m.n_kao = get_bone_index(oh, "n_kao"); + if (a2m.j_kao_wj == -2) + a2m.j_kao_wj = get_bone_index(oh, "j_kao_wj"); + if (a2m.j_eye_r_wj == -2) + a2m.j_eye_r_wj = get_bone_index(oh, "j_eye_r_wj"); + if (a2m.j_eye_l_wj == -2) + a2m.j_eye_l_wj = get_bone_index(oh, "j_eye_l_wj"); + if (a2m.n_waki_l == -2) + a2m.n_waki_l = get_bone_index(oh, "n_waki_l"); + if (a2m.j_waki_l_wj == -2) + a2m.j_waki_l_wj = get_bone_index(oh, "j_waki_l_wj"); + if (a2m.n_kata_l == -2) + a2m.n_kata_l = get_bone_index(oh, "n_kata_l"); + if (a2m.j_kata_l_wj == -2) + a2m.j_kata_l_wj = get_bone_index(oh, "j_kata_l_wj"); + if (a2m.j_ude_l_wj == -2) + a2m.j_ude_l_wj = get_bone_index(oh, "j_ude_l_wj"); + if (a2m.j_te_l_wj == -2) + a2m.j_te_l_wj = get_bone_index(oh, "j_te_l_wj"); + if (a2m.n_waki_r == -2) + a2m.n_waki_r = get_bone_index(oh, "n_waki_r"); + if (a2m.j_waki_r_wj == -2) + a2m.j_waki_r_wj = get_bone_index(oh, "j_waki_r_wj"); + if (a2m.n_kata_r == -2) + a2m.n_kata_r = get_bone_index(oh, "n_kata_r"); + if (a2m.j_kata_r_wj == -2) + a2m.j_kata_r_wj = get_bone_index(oh, "j_kata_r_wj"); + if (a2m.j_ude_r_wj == -2) + a2m.j_ude_r_wj = get_bone_index(oh, "j_ude_r_wj"); + if (a2m.j_te_r_wj == -2) + a2m.j_te_r_wj = get_bone_index(oh, "j_te_r_wj"); + if (a2m.j_kosi_wj == -2) + a2m.j_kosi_wj = get_bone_index(oh, "j_kosi_wj"); + if (a2m.n_momo_l == -2) + a2m.n_momo_l = get_bone_index(oh, "n_momo_l"); + if (a2m.j_momo_l_wj == -2) + a2m.j_momo_l_wj = get_bone_index(oh, "j_momo_l_wj"); + if (a2m.j_sune_l_wj == -2) + a2m.j_sune_l_wj = get_bone_index(oh, "j_sune_l_wj"); + if (a2m.j_asi_l_wj == -2) + a2m.j_asi_l_wj = get_bone_index(oh, "j_asi_l_wj"); + if (a2m.n_momo_r == -2) + a2m.n_momo_r = get_bone_index(oh, "n_momo_r"); + if (a2m.j_momo_r_wj == -2) + a2m.j_momo_r_wj = get_bone_index(oh, "j_momo_r_wj"); + if (a2m.j_sune_r_wj == -2) + a2m.j_sune_r_wj = get_bone_index(oh, "j_sune_r_wj"); + if (a2m.j_asi_r_wj == -2) + a2m.j_asi_r_wj = get_bone_index(oh, "j_asi_r_wj"); + + rob_chr->set_visibility(oh->node[0].model_transform.visible); + + motion_blend_mot* mot = rob_chr->bone_data->motion_loaded.front(); + ::bone_data* bone_data = mot->bone_data.bones.data(); + mot_key_set* key_set = mot->mot_key_data.mot.key_sets; + + vec3 data[2]; + mat4 mat; + data[0].x = oh->node[a2m.gblctr].model_transform.translation_value.x; + data[0].y = oh->node[a2m.n_hara].model_transform.translation_value.y; + data[0].z = oh->node[a2m.gblctr].model_transform.translation_value.z; + data[1] = vec3_null; + set_bone_key_set_data(bone_data, MOTION_BONE_N_HARA_CP, key_set, data, 2); + + data[0] = oh->node[a2m.n_hara_y].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KG_HARA_Y, key_set, data); + + data[0] = oh->node[a2m.j_hara_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_HARA_XZ, key_set, data); + + data[0] = oh->node[a2m.n_kosi].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_N_HARA, key_set, data); + + mat = oh->node[a2m.j_mune_wj].model_transform.mat; + data[0] = { 0.0f, 0.945f, 0.0f }; + mat4_mult_vec3(&mat, &data[0], &data[1]); + mat4_get_translation(&mat, &data[0]); + vec3_add(data[0], data[1], data[0]); + data[1] = vec3_null; + set_bone_key_set_data(bone_data, MOTION_BONE_CL_MUNE, key_set, data, 2); + + data[0] = oh->node[a2m.j_mune_b_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_MUNE_B_WJ, key_set, data); + + data[0] = oh->node[a2m.j_kubi_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_KUBI, key_set, data); + + data[0] = oh->node[a2m.n_kao].model_transform.rotation_value; + data[0].z -= (float_t)M_PI; + set_bone_key_set_data(bone_data, MOTION_BONE_N_KAO, key_set, data); + + mat = oh->node[a2m.j_kao_wj].model_transform.mat; + data[0] = { 0.0f, 0.40f, 0.0f }; + mat4_mult_vec3(&mat, &data[0], &data[1]); + mat4_get_translation(&mat, &data[0]); + vec3_add(data[0], data[1], data[0]); + data[1] = vec3_null; + data[1].z = (float_t)M_PI; + set_bone_key_set_data(bone_data, MOTION_BONE_CL_KAO, key_set, data, 2); + + data[0] = oh->node[a2m.n_waki_l].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_N_WAKI_L, key_set, data); + + data[0] = oh->node[a2m.j_waki_l_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_WAKI_L_WJ, key_set, data); + + { + vec3 pos_j_kata_l_wj; + vec3 pos_j_ude_l_wj; + vec3 pos_j_te_l_wj; + mat4_get_translation(&oh->node[a2m.j_kata_l_wj].model_transform.mat, &pos_j_kata_l_wj); + mat4_get_translation(&oh->node[a2m.j_ude_l_wj].model_transform.mat, &pos_j_ude_l_wj); + mat4_get_translation(&oh->node[a2m.j_te_l_wj].model_transform.mat, &pos_j_te_l_wj); + + vec3 pos_middle; + vec3_lerp_scalar(pos_j_kata_l_wj, pos_j_te_l_wj, pos_middle, 0.5f); + + vec3 tl_up_kata_dir; + vec3_sub(pos_j_ude_l_wj, pos_middle, tl_up_kata_dir); + + float_t pos_middle_dist; + vec3_length(tl_up_kata_dir, pos_middle_dist); + if (pos_middle_dist == 0.0f) { + mat = oh->node[a2m.j_kata_l_wj].model_transform.mat; + data[0] = { 0.0f, 0.3f, 0.0f }; + mat4_mult_vec3(&mat, &data[0], &tl_up_kata_dir); + } + else + vec3_mult_scalar(tl_up_kata_dir, 0.3f / pos_middle_dist, tl_up_kata_dir); + + vec3 tl_up_kata_pos; + vec3_add(tl_up_kata_dir, pos_j_ude_l_wj, tl_up_kata_pos); + + mat = oh->node[a2m.j_mune_b_wj].model_transform.mat; + mat4_mult_vec3_inv_trans(&mat, &tl_up_kata_pos, &data[0]); + set_bone_key_set_data(bone_data, MOTION_BONE_TL_UP_KATA_L, key_set, data); + } + + mat4_get_translation(&oh->node[a2m.j_te_l_wj].model_transform.mat, &data[0]); + mat4_get_rotation(&oh->node[a2m.j_kata_l_wj].model_transform.mat, &data[1]); + set_bone_key_set_data(bone_data, MOTION_BONE_C_KATA_L, key_set, data, 2); + + data[0] = oh->node[a2m.j_te_l_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_TE_L_WJ, key_set, data); + + data[0] = oh->node[a2m.n_waki_r].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_N_WAKI_R, key_set, data); + + data[0] = oh->node[a2m.j_waki_r_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_WAKI_R_WJ, key_set, data); + + { + vec3 pos_j_kata_r_wj; + vec3 pos_j_ude_r_wj; + vec3 pos_j_te_r_wj; + mat4_get_translation(&oh->node[a2m.j_kata_r_wj].model_transform.mat, &pos_j_kata_r_wj); + mat4_get_translation(&oh->node[a2m.j_ude_r_wj].model_transform.mat, &pos_j_ude_r_wj); + mat4_get_translation(&oh->node[a2m.j_te_r_wj].model_transform.mat, &pos_j_te_r_wj); + + vec3 pos_middle; + vec3_lerp_scalar(pos_j_kata_r_wj, pos_j_te_r_wj, pos_middle, 0.5f); + + vec3 tl_up_kata_dir; + vec3_sub(pos_j_ude_r_wj, pos_middle, tl_up_kata_dir); + + float_t pos_middle_dist; + vec3_length(tl_up_kata_dir, pos_middle_dist); + if (pos_middle_dist == 0.0f) { + mat = oh->node[a2m.j_kata_r_wj].model_transform.mat; + data[0] = { 0.0f, 0.3f, 0.0f }; + mat4_mult_vec3(&mat, &data[0], &tl_up_kata_dir); + } + else + vec3_mult_scalar(tl_up_kata_dir, 0.3f / pos_middle_dist, tl_up_kata_dir); + + vec3 tl_up_kata_pos; + vec3_add(tl_up_kata_dir, pos_j_ude_r_wj, tl_up_kata_pos); + + mat = oh->node[a2m.j_mune_b_wj].model_transform.mat; + mat4_mult_vec3_inv_trans(&mat, &tl_up_kata_pos, &data[0]); + set_bone_key_set_data(bone_data, MOTION_BONE_TL_UP_KATA_R, key_set, data); + } + + mat4_get_translation(&oh->node[a2m.j_te_r_wj].model_transform.mat, &data[0]); + data[1] = vec3_null; + mat4_get_rotation(&oh->node[a2m.j_kata_r_wj].model_transform.mat, &data[1]); + set_bone_key_set_data(bone_data, MOTION_BONE_C_KATA_R, key_set, data, 2); + + data[0] = oh->node[a2m.j_te_r_wj].model_transform.rotation_value; + set_bone_key_set_data(bone_data, MOTION_BONE_KL_TE_R_WJ, key_set, data); + + mat4_get_translation(&oh->node[a2m.j_asi_l_wj].model_transform.mat, &data[0]); + data[1] = vec3_null; + set_bone_key_set_data(bone_data, MOTION_BONE_CL_MOMO_L, key_set, data, 2); + + mat4_get_translation(&oh->node[a2m.j_asi_r_wj].model_transform.mat, &data[0]); + data[1] = vec3_null; + set_bone_key_set_data(bone_data, MOTION_BONE_CL_MOMO_R, key_set, data, 2); + + printf(""); + } +} + static void x_pv_game_stage_effect_ctrl(x_pv_game* xpvgm) { x_pv_game_stage_effect& stage_effect = xpvgm->stage_effect; @@ -2524,6 +3078,7 @@ static void x_pv_game_stage_effect_start(x_pv_game* xpvgm, pvsr_stage_effect* st int32_t& id = xpvgm->stage_auth_3d_ids[i.hash]; auth_3d_data_set_camera_root_update(&id, false); auth_3d_data_set_enable(&id, true); + auth_3d_data_set_repeat(&id, true); auth_3d_data_set_req_frame(&id, 0.0f); auth_3d_data_set_max_frame(&id, -1.0f); auth_3d_data_set_paused(&id, false); @@ -2559,7 +3114,7 @@ static bool x_pv_game_stage_effects_process(x_pv_game* xpvgm, int32_t frame) { return false; else if (xpvgm->stage_effects_ptr->frame < xpvgm->frame) return true; - + xpvgm->stage_effect.next_stage_effect = xpvgm->stage_effects_ptr->effect_id; return true; } diff --git a/src/CLOUD/x_pv_game.hpp b/src/CLOUD/x_pv_game.hpp index db010c21..e849c858 100644 --- a/src/CLOUD/x_pv_game.hpp +++ b/src/CLOUD/x_pv_game.hpp @@ -10,13 +10,14 @@ #include #include #include +#include #include -#include "../KKdLib/dsc.h" -#include "../KKdLib/pvpp.h" -#include "../KKdLib/pvsr.h" -#include "../CRE/auth_3d.h" -#include "../CRE/rob.h" -#include "../CRE/task.h" +#include "../KKdLib/dsc.hpp" +#include "../KKdLib/pvpp.hpp" +#include "../KKdLib/pvsr.hpp" +#include "../CRE/auth_3d.hpp" +#include "../CRE/rob.hpp" +#include "../CRE/task.hpp" #include "classes.h" struct x_pv_game_glitter { @@ -104,6 +105,46 @@ struct x_pv_game_stage_effect_init { int32_t bar; }; +struct x_pv_game_a3da_to_mot { + int32_t auth_3d_id; + int32_t gblctr; + int32_t n_hara; + int32_t n_hara_y; + int32_t j_hara_wj; + int32_t n_kosi; + int32_t j_mune_wj; + int32_t n_mune_kl; + int32_t j_mune_b_wj; + int32_t j_kubi_wj; + int32_t n_kao; + int32_t j_kao_wj; + int32_t j_eye_r_wj; + int32_t j_eye_l_wj; + int32_t n_waki_l; + int32_t j_waki_l_wj; + int32_t n_kata_l; + int32_t j_kata_l_wj; + int32_t j_ude_l_wj; + int32_t j_te_l_wj; + int32_t n_waki_r; + int32_t j_waki_r_wj; + int32_t n_kata_r; + int32_t j_kata_r_wj; + int32_t j_ude_r_wj; + int32_t j_te_r_wj; + int32_t j_kosi_wj; + int32_t n_momo_l; + int32_t j_momo_l_wj; + int32_t j_sune_l_wj; + int32_t j_asi_l_wj; + int32_t n_momo_r; + int32_t j_momo_r_wj; + int32_t j_sune_r_wj; + int32_t j_asi_r_wj; + + x_pv_game_a3da_to_mot(int32_t auth_3d_id); +}; + class x_pv_game : public TaskWindow { public: int32_t pv_id; @@ -115,6 +156,8 @@ public: uint32_t stgpv_objset; uint32_t stgpvhrc_objset; + std::vector objset_load; + int32_t state; int32_t frame; double_t frame_float; @@ -140,13 +183,24 @@ public: uint32_t stage_category_hash; uint32_t camera_category_hash; + std::vector> category_load; + std::set pv_auth_3d_names; std::set stage_auth_3d_names; + std::unordered_map> effchrpv_auth_3d_names; + std::unordered_map> effchrpv_auth_3d_mot_names; std::map pv_auth_3d_ids; std::map stage_auth_3d_ids; int32_t light_auth_3d_id; int32_t camera_auth_3d_id; + std::map effchrpv_auth_3d_ids; + std::map effchrpv_auth_3d_mot_ids; + + std::vector effchrpv_rob_mot_ids; + std::map effchrpv_auth_3d_rob_mot_ids; + + std::map effchrpv_auth_3d_hashes; dsc dsc_m; dsc_data* dsc_data_ptr; @@ -184,7 +238,7 @@ public: virtual void Disp() override; virtual void Window() override; - void Load(int32_t pv_id, int32_t stage_id); + void Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int32_t modules[6]); void Unload(); }; diff --git a/src/CRE/Glitter/curve.cpp b/src/CRE/Glitter/curve.cpp index c5bee274..b2b0e270 100644 --- a/src/CRE/Glitter/curve.cpp +++ b/src/CRE/Glitter/curve.cpp @@ -161,7 +161,6 @@ namespace Glitter { return rand + key->value; } - void Curve::GetKeyIndices(std::vector* keys, float_t frame, size_t* curr, size_t* next) { size_t count = keys->size(); diff --git a/src/CRE/Glitter/effect_group.cpp b/src/CRE/Glitter/effect_group.cpp index d4e27ed6..cdfaa4b5 100644 --- a/src/CRE/Glitter/effect_group.cpp +++ b/src/CRE/Glitter/effect_group.cpp @@ -4,8 +4,8 @@ */ #include "glitter.hpp" -#include "../object.h" -#include "../texture.h" +#include "../object.hpp" +#include "../texture.hpp" namespace Glitter { EffectGroup::EffectGroup(GLT) : effects(), load_count(), hash(), scene(), @@ -55,9 +55,9 @@ namespace Glitter { if (!set) continue; - for (int32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->objects_count; i++) { obj* obj = &set->objects[i]; - for (int32_t j = 0; j < obj->materials_count; j++) { + for (uint32_t j = 0; j < obj->materials_count; j++) { obj_material* mat = &obj->materials[j].material; if (!memcmp(&mat->emission, &vec3_null, sizeof(vec3)) && mat->emission.w == 1.0f) mat->emission = vec4u_identity; diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index 8ca2771d..0ce881f0 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -5,8 +5,8 @@ #include "glitter.hpp" #include "../../KKdLib/str_utils.h" -#include "../auth_3d.h" -#include "../rob.h" +#include "../auth_3d.hpp" +#include "../rob.hpp" namespace Glitter { EffectInst::EffectInst(GPM, GLT, Effect* eff, @@ -336,7 +336,7 @@ namespace Glitter { ext_anim->mat = mat; } else { - mat4* bone_mat = rob_chara_get_bone_data_mat(rob_chr, bone_index); + mat4* bone_mat = rob_chr->get_bone_data_mat(bone_index); if (!bone_mat) return; @@ -854,7 +854,7 @@ namespace Glitter { int32_t bone_index = ext_anim->bone_index; if (bone_index != -1) { - mat4* bone_mat = rob_chara_get_bone_data_mat(rob_chr, bone_index); + mat4* bone_mat = rob_chr->get_bone_data_mat(bone_index); if (bone_mat) SetExtAnim(&temp, bone_mat, 0, set_flags); } diff --git a/src/CRE/Glitter/emitter_inst.cpp b/src/CRE/Glitter/emitter_inst.cpp index 88809c00..b014811a 100644 --- a/src/CRE/Glitter/emitter_inst.cpp +++ b/src/CRE/Glitter/emitter_inst.cpp @@ -364,7 +364,7 @@ namespace Glitter { } break; } } - + void F2EmitterInst::Reset() { loop = data.flags & EMITTER_LOOP ? true : false; frame = -(float_t)data.start_time; @@ -433,8 +433,8 @@ namespace Glitter { } break; case EMITTER_POLYGON: { float_t radius = data.polygon.size * scale->x; - float_t angle = (float_t)index * 360.0f - / (float_t)data.polygon.count * DEG_TO_RAD_FLOAT + (float_t)M_PI_2; + float_t angle = ((float_t)index * 360.0f + / (float_t)data.polygon.count + 90.0f) * DEG_TO_RAD_FLOAT; vec3 dir; dir.x = cosf(angle); @@ -450,7 +450,6 @@ namespace Glitter { } } - XEmitterInst::XEmitterInst(Emitter* emit, XEffectInst* eff_inst, float_t emission) : EmitterInst(emit, &eff_inst->random_shared) { counter = 0; diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index 11bc206b..72e96007 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -6,9 +6,9 @@ #include "glitter.hpp" #include "../../KKdLib/io/path.h" #include "../../KKdLib/interpolation.h" -#include "../../KKdLib/farc.h" +#include "../../KKdLib/farc.hpp" #include "../../KKdLib/str_utils.h" -#include "../data.h" +#include "../data.hpp" namespace Glitter { #if defined(CRE_DEV) @@ -27,9 +27,9 @@ namespace Glitter { FileReader::FileReader(GLT, const char* path, const char* file, float_t emission) : effect_group(), load_count() { - this->path = std::string(path ? path - : (GLT_VAL != Glitter::FT ? "root+/particle/" : "rom/particle/")); - this->file = std::string(file); + this->path = path ? path + : (GLT_VAL != Glitter::FT ? "root+/particle/" : "rom/particle/"); + this->file = file; this->emission = emission; this->type = GLT_VAL; this->hash = GLT_VAL != Glitter::FT @@ -41,9 +41,9 @@ namespace Glitter { : effect_group(), load_count() { char* path_temp = utf16_to_utf8(path); char* file_temp = utf16_to_utf8(file); - this->path = std::string(path_temp ? path_temp - : (GLT_VAL != Glitter::FT ? "root+/particle/" : "rom/particle/")); - this->file = std::string(file_temp); + this->path = path_temp ? path_temp + : (GLT_VAL != Glitter::FT ? "root+/particle/" : "rom/particle/"); + this->file = file_temp; this->emission = emission; this->type = GLT_VAL; this->hash = GLT_VAL != Glitter::FT @@ -65,8 +65,8 @@ namespace Glitter { || type != Glitter::FT && this->hash != hash_murmurhash_empty) return false; - this->path = std::string(path); - this->file = std::string(file); + this->path = path; + this->file = file; std::string file_temp = this->file + ".farc"; @@ -79,7 +79,7 @@ namespace Glitter { } return false; } - + void FileReader::ParseAnimation(f2_struct* st, Animation* anim) { if (!st || !st->header.data_size || st->header.signature != reverse_endianness_uint32_t('ANIM')) @@ -489,7 +489,7 @@ namespace Glitter { delete emit; return false; } - + ParseAnimation(st->sub_structs.size() ? st->sub_structs.data() : 0, &emit->animation); for (f2_struct& i : st->sub_structs) @@ -1334,7 +1334,7 @@ namespace Glitter { memcpy(buf, (void*)d, 0x80); buf[0x7F] = 0; - i->name = std::string(buf); + i->name = buf; } d += 0x80; } diff --git a/src/CRE/Glitter/glitter.cpp b/src/CRE/Glitter/glitter.cpp index 7e3f4ffa..6093dd98 100644 --- a/src/CRE/Glitter/glitter.cpp +++ b/src/CRE/Glitter/glitter.cpp @@ -118,7 +118,7 @@ namespace Glitter { PIVOT_TOP_CENTER, PIVOT_TOP_LEFT, }; - + const char* effect_ext_anim_index_name[] = { "P1", "P2", diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 2b2fae9e..948e1a42 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -8,21 +8,21 @@ #include #include #include -#include "../../KKdLib/database/object.h" +#include "../../KKdLib/database/object.hpp" #include "../../KKdLib/f2/header.h" -#include "../../KKdLib/f2/struct.h" +#include "../../KKdLib/f2/struct.hpp" #include "../../KKdLib/default.h" -#include "../../KKdLib/farc.h" -#include "../../KKdLib/hash.h" +#include "../../KKdLib/farc.hpp" +#include "../../KKdLib/hash.hpp" #include "../../KKdLib/mat.h" -#include "../../KKdLib/txp.h" +#include "../../KKdLib/txp.hpp" #include "../../KKdLib/vec.h" #include "../../KKdLib/vector.h" -#include "../file_handler.h" -#include "../frame_rate_control.h" +#include "../file_handler.hpp" +#include "../frame_rate_control.hpp" #include "../static_var.h" -#include "../task.h" -#include "../texture.h" +#include "../task.hpp" +#include "../texture.hpp" namespace Glitter { enum CurveFlag { @@ -524,7 +524,6 @@ namespace Glitter { virtual ~ItemBase(); }; - class Node : public ItemBase { public: vec3 translation; @@ -685,7 +684,7 @@ namespace Glitter { RenderGroup(); virtual ~RenderGroup(); - + RenderElement* AddElement(RenderElement* rend_elem); }; @@ -1079,7 +1078,6 @@ namespace Glitter { void Append(RenderElement* rend_elem, XParticleInst* ptcl_inst); }; - class Particle : public ItemBase { public: struct Mesh { diff --git a/src/CRE/Glitter/particle_inst.cpp b/src/CRE/Glitter/particle_inst.cpp index e844febc..7f66c19d 100644 --- a/src/CRE/Glitter/particle_inst.cpp +++ b/src/CRE/Glitter/particle_inst.cpp @@ -279,7 +279,7 @@ namespace Glitter { rend_elem->InitLocusHistory(GLT_VAL, this, random); random->F2StepValue(); } - + void F2ParticleInst::Free(bool free) { enum_or(data.flags, PARTICLE_INST_ENDED); if (free && data.render_group) diff --git a/src/CRE/Glitter/particle_manager.cpp b/src/CRE/Glitter/particle_manager.cpp index 1801397d..a4e85478 100644 --- a/src/CRE/Glitter/particle_manager.cpp +++ b/src/CRE/Glitter/particle_manager.cpp @@ -125,7 +125,7 @@ namespace Glitter { int32_t GltParticleManager::CounterGet() { return counter; } - + void GltParticleManager::CounterIncrement() { counter++; } @@ -703,7 +703,7 @@ namespace Glitter { for (SceneEffect& j : i->effects) if (j.disp && j.ptr && j.ptr->data.name_hash == effect_hash) { - j.ptr->name = std::string(name); + j.ptr->name = name; return; } } @@ -714,7 +714,7 @@ namespace Glitter { for (SceneEffect& j : i->effects) if (j.disp && j.ptr && j.ptr->data.name_hash == effect_hash) { - j.ptr->name = std::string(name); + j.ptr->name = name; return; } } @@ -729,13 +729,13 @@ namespace Glitter { void GltParticleManager::SetSceneName(uint64_t hash, const char* name) { std::map::iterator elem = effect_groups.find(hash); if (elem != effect_groups.end()) - elem->second->name = std::string(name); + elem->second->name = name; for (Scene*& i : scenes) { if (!i || i->hash != hash) continue; - i->name = std::string(name); + i->name = name; break; } } @@ -760,7 +760,7 @@ namespace Glitter { //if (a2 <= 0.0) // field_D4 = -1.0; } - + GltParticleManager glt_particle_manager; } diff --git a/src/CRE/Glitter/random.cpp b/src/CRE/Glitter/random.cpp index 239e29fa..49bfd924 100644 --- a/src/CRE/Glitter/random.cpp +++ b/src/CRE/Glitter/random.cpp @@ -1395,7 +1395,7 @@ namespace Glitter { return 0x100; } } - + int32_t Random::XGetMax() { return 0x169; } diff --git a/src/CRE/Glitter/render_group.cpp b/src/CRE/Glitter/render_group.cpp index bba2fd18..7e4d7576 100644 --- a/src/CRE/Glitter/render_group.cpp +++ b/src/CRE/Glitter/render_group.cpp @@ -120,7 +120,7 @@ namespace Glitter { return (particle->data.effect->flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT) != 0; return true; } - + void F2RenderGroup::Copy(F2RenderGroup* dst) { dst->flags = flags; dst->type = type; @@ -232,7 +232,7 @@ namespace Glitter { if (particle->data.data.flags & PARTICLE_LOOP && rend_elem->frame >= rend_elem->life_time) rend_elem->frame -= rend_elem->life_time; } - + void F2RenderGroup::DeleteBuffers(bool free) { if (particle) { if (!free) @@ -257,7 +257,7 @@ namespace Glitter { } } - void F2RenderGroup::Emit(GPM, GLT, F2ParticleInst::Data* ptcl_inst, + void F2RenderGroup::Emit(GPM, GLT, F2ParticleInst::Data* ptcl_inst_data, F2EmitterInst* emit_inst, int32_t dup_count, int32_t count) { RenderElement* element = 0; for (int32_t i = 0; i < dup_count; i++) @@ -267,10 +267,10 @@ namespace Glitter { break; particle->EmitParticle(GPM_VAL, GLT_VAL, - element, emit_inst, ptcl_inst, index, random_ptr); + element, emit_inst, ptcl_inst_data, index, random_ptr); } } - + void F2RenderGroup::Free() { if (count <= 0) { ctrl = 0; @@ -287,11 +287,11 @@ namespace Glitter { } ctrl = 0; } - + void F2RenderGroup::FreeData() { DeleteBuffers(true); } - + bool F2RenderGroup::GetExtAnimScale(vec3* ext_anim_scale) { if (!particle) return false; diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 2ba022c3..bae281a1 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -6,7 +6,7 @@ #include "glitter.hpp" #include "../draw_task.h" #include "../gl_state.h" -#include "../render_context.h" +#include "../render_context.hpp" #include "../shader.h" #include "../shader_ft.h" #include "../static_var.h" @@ -233,7 +233,6 @@ namespace Glitter { gl_state_bind_array_buffer(0); } - void F2RenderScene::Ctrl(GLT, float_t delta_frame) { ctrl_quad = 0; ctrl_line = 0; @@ -1123,7 +1122,6 @@ namespace Glitter { if (rend_group->particle == particle) CalcDisp(GPM_VAL, rend_group); - for (XParticleInst*& j : particle->data.children) if (j && rend_group->particle == j) CalcDisp(GPM_VAL, rend_group); @@ -1131,7 +1129,7 @@ namespace Glitter { #endif } } - + void XRenderScene::CalcDisp(GPM, XRenderGroup* rend_group) { disp_mesh = 0; @@ -1516,14 +1514,15 @@ namespace Glitter { object_data->texture_pattern_count = 0; int32_t ttc = 0; texture_transform_struct* tt = object_data->texture_transform_array; - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; obj_material* material = &obj->materials[sub_mesh->material_index].material; - for (int32_t k = 0, l = 0; k < 8; k++) { - obj_material_texture* texture = &material->textures[k]; + int32_t l = 0; + for (obj_material_texture& k : material->textures) { + obj_material_texture* texture = &k; if (texture->texture_flags.type != OBJ_MATERIAL_TEXTURE_COLOR) continue; diff --git a/src/CRE/auth_3d.c b/src/CRE/auth_3d.cpp similarity index 98% rename from src/CRE/auth_3d.c rename to src/CRE/auth_3d.cpp index 7ea05dac..45481395 100644 --- a/src/CRE/auth_3d.c +++ b/src/CRE/auth_3d.cpp @@ -3,12 +3,12 @@ GitHub/GitLab: korenkonder */ -#include "auth_3d.h" -#include "../KKdLib/hash.h" +#include "auth_3d.hpp" +#include "../KKdLib/hash.hpp" #include "../KKdLib/interpolation.h" #include "../KKdLib/str_utils.h" #include "draw_task.h" -#include "object.h" +#include "object.hpp" namespace auth_3d_detail { class TaskAuth3d : public Task { @@ -216,6 +216,7 @@ void auth_3d::ctrl(render_context* rctx) { a3da a; a.read(ff->data, ff->size); load(&a, &data->data_ft.obj_db, &data->data_ft.tex_db); + frame = 0.0f; } } } @@ -239,10 +240,11 @@ void auth_3d::ctrl(render_context* rctx) { if (t) l_len = t - l_str; - uid_file->name = std::string(l_str, l_len); + uid_file->name = ff->name.substr(0, l_len); uid_file->file_name = ff->name; load(&a, uid_file->obj_db, uid_file->tex_db); hash = uid_file->hash; + frame = 0.0f; } } } @@ -396,23 +398,9 @@ void auth_3d::load(a3da* auth_file, hash = hash_murmurhash_empty; auth_3d_play_control_load(this, &auth_file->play_control); - camera_root_update = true; - visible = true; - repeat = true; - ended = false; - left_right_reverse = false; - once = false; - alpha = 1.0f; - draw_task_flags = DRAW_TASK_10000; - chara_id = -1; - shadow = false; - frame = 0.0f; - req_frame = 0.0f; - max_frame = play_control.size; - frame_changed = false; frame_offset = 0.0f; + max_frame = play_control.size; last_frame = play_control.size; - paused = false; this->obj_db = obj_db; this->tex_db = tex_db; @@ -423,105 +411,105 @@ void auth_3d::load(a3da* auth_file, if (auth_file->ambient.size() > 0) { size_t ambient_index = 0; - ambient = std::vector(auth_file->ambient.size()); + ambient.resize(auth_file->ambient.size()); for (auth_3d_ambient_file& i : auth_file->ambient) auth_3d_ambient_load(this, &ambient[ambient_index++], &i); } if (auth_file->auth_2d.size() > 0) { size_t auth_2d_index = 0; - auth_2d = std::vector(auth_file->auth_2d.size()); + auth_2d.resize(auth_file->auth_2d.size()); for (std::string& i : auth_file->auth_2d) auth_2d[auth_2d_index++] = i; } if (auth_file->camera_root.size() > 0) { size_t camera_root_index = 0; - camera_root = std::vector(auth_file->camera_root.size()); + camera_root.resize(auth_file->camera_root.size()); for (auth_3d_camera_root_file& i : auth_file->camera_root) auth_3d_camera_root_load(this, &camera_root[camera_root_index++], &i); } if (auth_file->chara.size() > 0) { size_t chara_index = 0; - chara = std::vector(auth_file->chara.size()); + chara.resize(auth_file->chara.size()); for (auth_3d_chara_file& i : auth_file->chara) auth_3d_chara_load(this, &chara[chara_index++], &i); } if (auth_file->curve.size() > 0) { size_t curve_index = 0; - curve = std::vector(auth_file->curve.size()); + curve.resize(auth_file->curve.size()); for (auth_3d_curve_file& i : auth_file->curve) auth_3d_curve_load(this, &curve[curve_index++], &i); } if (auth_file->event.size() > 0) { size_t event_index = 0; - event = std::vector(auth_file->event.size()); + event.resize(auth_file->event.size()); for (auth_3d_event_file& i : auth_file->event) auth_3d_event_load(this, &event[event_index++], &i); } if (auth_file->fog.size() > 0) { size_t fog_index = 0; - fog = std::vector(auth_file->fog.size()); + fog.resize(auth_file->fog.size()); for (auth_3d_fog_file& i : auth_file->fog) auth_3d_fog_load(this, &fog[fog_index++], &i); } if (auth_file->light.size() > 0) { size_t light_index = 0; - light = std::vector(auth_file->light.size()); + light.resize(auth_file->light.size()); for (auth_3d_light_file& i : auth_file->light) auth_3d_light_load(this, &light[light_index++], &i); } if (auth_file->m_object_hrc.size() > 0) { size_t m_object_hrc_index = 0; - m_object_hrc = std::vector(auth_file->m_object_hrc.size()); + m_object_hrc.resize(auth_file->m_object_hrc.size()); for (auth_3d_m_object_hrc_file& i : auth_file->m_object_hrc) auth_3d_m_object_hrc_load(this, &m_object_hrc[m_object_hrc_index++], &i, obj_db); } if (auth_file->material_list.size() > 0) { size_t material_list_index = 0; - material_list = std::vector(auth_file->material_list.size()); + material_list.resize(auth_file->material_list.size()); for (auth_3d_material_list_file& i : auth_file->material_list) auth_3d_material_list_load(this, &material_list[material_list_index++], &i); } if (auth_file->motion.size() > 0) { size_t motion_index = 0; - motion = std::vector(auth_file->motion.size()); + motion.resize(auth_file->motion.size()); for (std::string& i : auth_file->motion) motion[motion_index++] = i; } if (auth_file->object.size() > 0) { size_t object_index = 0; - object = std::vector(auth_file->object.size()); + object.resize(auth_file->object.size()); for (auth_3d_object_file& i : auth_file->object) auth_3d_object_load(this, &object[object_index++], &i, obj_db, tex_db); } if (auth_file->object_hrc.size() > 0) { size_t object_hrc_index = 0; - object_hrc = std::vector(auth_file->object_hrc.size()); + object_hrc.resize(auth_file->object_hrc.size()); for (auth_3d_object_hrc_file& i : auth_file->object_hrc) auth_3d_object_hrc_load(this, &object_hrc[object_hrc_index++], &i, obj_db); } if (auth_file->point.size() > 0) { size_t point_index = 0; - point = std::vector(auth_file->point.size()); + point.resize(auth_file->point.size()); for (auth_3d_point_file& i : auth_file->point) auth_3d_point_load(this, &point[point_index++], &i); } if (auth_file->m_object_hrc_list.size() > 0) { size_t m_object_hrc_list_index = 0; - m_object_hrc_list = std::vector(auth_file->m_object_hrc_list.size()); + m_object_hrc_list.resize(auth_file->m_object_hrc_list.size()); for (std::string& i : auth_file->m_object_hrc_list) for (auth_3d_m_object_hrc& j : m_object_hrc) if (!i.compare(j.name)) { @@ -533,7 +521,7 @@ void auth_3d::load(a3da* auth_file, if (auth_file->object_list.size() > 0) { size_t object_list_index = 0; - object_list = std::vector(auth_file->object_list.size()); + object_list.resize(auth_file->object_list.size()); for (std::string& i : auth_file->object_list) for (auth_3d_object& j : object) if (!i.compare(j.name)) { @@ -545,7 +533,7 @@ void auth_3d::load(a3da* auth_file, if (auth_file->object_hrc_list.size() > 0) { size_t object_hrc_list_index = 0; - object_hrc_list = std::vector(auth_file->object_hrc_list.size()); + object_hrc_list.resize(auth_file->object_hrc_list.size()); for (std::string& i : auth_file->object_hrc_list) for (auth_3d_object_hrc& j : object_hrc) if (!i.compare(j.name)) { @@ -654,6 +642,7 @@ void auth_3d::reset() { ended = false; left_right_reverse = false; once = false; + mat = mat4_identity; alpha = 1.0f; draw_task_flags = DRAW_TASK_10000; chara_id = -1; @@ -2041,8 +2030,8 @@ int32_t auth_3d_data_get_uid(int32_t* id) { return -1; } -void auth_3d_data_load_category(const char* category_name) { - auth_3d_data_struct_load_category(auth_3d_data, category_name, 0); +void auth_3d_data_load_category(const char* category_name, const char* mdata_dir) { + auth_3d_data_struct_load_category(auth_3d_data, category_name, mdata_dir); } void auth_3d_data_load_category(void* data, const char* category_name, uint32_t category_hash) { @@ -2252,7 +2241,6 @@ void auth_3d_data_unload_id(int32_t id, render_context* rctx) { if (!auth || auth->id != id) return; - for (auto i = auth_3d_data->loaded_ids.begin(); i != auth_3d_data->loaded_ids.end();) { if (*i != id) { i++; @@ -2827,7 +2815,7 @@ static void auth_3d_dof_restore_prev_value(auth_3d_dof* d, render_context* rctx) if (!d->has_dof) return; - post_process_dof_set_dof_pv(rctx->post_process.dof, 0); + rctx->post_process.dof->set_dof_pv(0); } static void auth_3d_dof_set(auth_3d_dof* d, render_context* rctx) { @@ -2846,7 +2834,7 @@ static void auth_3d_dof_set(auth_3d_dof* d, render_context* rctx) { pv.f2.focus_range = d->model_transform.scale_value.y; pv.f2.fuzzing_range = d->model_transform.rotation_value.y; pv.f2.ratio = d->model_transform.rotation_value.z; - post_process_dof_set_dof_pv(rctx->post_process.dof, &pv); + rctx->post_process.dof->set_dof_pv(&pv); } static void auth_3d_event_load(auth_3d* auth, auth_3d_event* e, auth_3d_event_file* ef) { @@ -3193,7 +3181,7 @@ static void auth_3d_m_object_hrc_ctrl(auth_3d_m_object_hrc* moh, float_t frame) static void auth_3d_m_object_hrc_load(auth_3d* auth, auth_3d_m_object_hrc* moh, auth_3d_m_object_hrc_file* mohf, object_database* obj_db) { size_t node_index = 0; - moh->node = std::vector(mohf->node.size()); + moh->node.resize(mohf->node.size()); for (auth_3d_object_node_file& i : mohf->node) auth_3d_object_node_load(auth, &moh->node[node_index++], &i); @@ -3202,7 +3190,7 @@ static void auth_3d_m_object_hrc_load(auth_3d* auth, auth_3d_m_object_hrc* moh, moh->name = mohf->name; size_t instance_index = 0; - moh->instance = std::vector(mohf->instance.size()); + moh->instance.resize(mohf->instance.size()); for (auth_3d_object_instance_file& i : mohf->instance) auth_3d_object_instance_load(auth, &moh->instance[instance_index++], &i, moh, obj_db); @@ -3409,13 +3397,13 @@ static void auth_3d_object_load(auth_3d* auth, auth_3d_object* o, auth_3d_object_curve_load(auth, &o->pattern, of->pattern, of->pattern_offset); size_t texture_pattern_index = 0; - o->texture_pattern = std::vector(of->texture_pattern.size()); + o->texture_pattern.resize(of->texture_pattern.size()); for (auth_3d_object_texture_pattern_file& i : of->texture_pattern) auth_3d_object_texture_pattern_load(auth, &o->texture_pattern[texture_pattern_index++], &i, tex_db); size_t texture_transform_index = 0; - o->texture_transform = std::vector(of->texture_transform.size()); + o->texture_transform.resize(of->texture_transform.size()); for (auth_3d_object_texture_transform_file& i : of->texture_transform) auth_3d_object_texture_transform_load(auth, &o->texture_transform[texture_transform_index++], &i, tex_db); @@ -3599,7 +3587,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh, oh->name = ohf->name; size_t node_index = 0; - oh->node = std::vector(ohf->node.size()); + oh->node.resize(ohf->node.size()); for (auth_3d_object_node_file& i : ohf->node) auth_3d_object_node_load(auth, &oh->node[node_index++], &i); @@ -3619,13 +3607,13 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh, if (!skin) return; - oh->mats = std::vector(skin->bones_count); + oh->mats.resize(skin->bones_count); mat4* mats = oh->mats.data(); for (auth_3d_object_node& i : oh->node) { i.bone_id = -1; uint64_t name_hash = hash_string_fnv1a64m(&i.name); - for (int32_t j = 0; j < skin->bones_count; j++) + for (uint32_t j = 0; j < skin->bones_count; j++) if (hash_utf8_fnv1a64m(string_data(&skin->bones[j].name)) == name_hash) { i.bone_id = skin->bones[j].id; break; @@ -3652,7 +3640,7 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende if (oh->refract) enum_or(flags, DRAW_TASK_NO_TRANSLUCENCY | DRAW_TASK_REFRACT); if (auth->alpha < 1.0f) - enum_or(flags, DRAW_TASK_10000); + enum_or(flags, auth->draw_task_flags); object_data->set_draw_task_flags((draw_task_flags)flags); object_data->set_shadow_type(SHADOW_CHARA); @@ -3743,13 +3731,13 @@ static void auth_3d_object_instance_load(auth_3d* auth, auth_3d_object_instance* if (!skin) return; - oi->object_bone_indices = std::vector(skin->bones_count); + oi->object_bone_indices.resize(skin->bones_count); int32_t* object_bone_indices = oi->object_bone_indices.data(); - oi->mats = std::vector(skin->bones_count); + oi->mats.resize(skin->bones_count); mat4* mats = oi->mats.data(); - for (int32_t i = 0; i < skin->bones_count; i++) { + for (uint32_t i = 0; i < skin->bones_count; i++) { uint64_t name_hash = hash_utf8_fnv1a64m(string_data(&skin->bones[i].name)); for (auth_3d_object_node& j : moh->node) if (hash_string_fnv1a64m(&j.name) == name_hash) { @@ -4260,7 +4248,7 @@ static void auth_3d_data_struct_load_category(auth_3d_data_struct* auth_3d_data, if (elem == auth_3d_data->farcs_modern.end()) { elem = auth_3d_data->farcs_modern.insert({ category_hash, {} }).first; auth_3d_farc* a3da_farc = &elem->second; - a3da_farc->name = std::string(category_name); + a3da_farc->name = category_name; } auth_3d_farc* a3da_farc = &elem->second; @@ -4336,11 +4324,10 @@ static void auth_3d_farc_read_file(auth_3d_farc* a3da_farc, const char* mdata_di } a3da_farc->state = 1; - a3da_farc->path = std::string("rom/auth_3d/"); + a3da_farc->path = "rom/auth_3d/"; if (mdata_dir && *mdata_dir) a3da_farc->path += mdata_dir; - a3da_farc->file = std::string(a3da_farc->name) + ".farc"; - + a3da_farc->file = a3da_farc->name + ".farc"; if (a3da_farc->file_handler.read_file(rctx_ptr->data, a3da_farc->path.c_str(), a3da_farc->file.c_str())) a3da_farc->file_handler.set_read_free_func_data(0, @@ -4356,9 +4343,8 @@ static void auth_3d_farc_read_file_modern(auth_3d_farc* a3da_farc, void* data) { } a3da_farc->state = 1; - a3da_farc->path = std::string("root+/auth_3d/"); - a3da_farc->file = std::string(a3da_farc->name) + ".farc"; - + a3da_farc->path = "root+/auth_3d/"; + a3da_farc->file = a3da_farc->name + ".farc"; if (a3da_farc->file_handler.read_file(data, a3da_farc->path.c_str(), a3da_farc->file.c_str())) a3da_farc->file_handler.set_read_free_func_data(0, diff --git a/src/CRE/auth_3d.h b/src/CRE/auth_3d.hpp similarity index 98% rename from src/CRE/auth_3d.h rename to src/CRE/auth_3d.hpp index 6c9fc2f2..3fcea882 100644 --- a/src/CRE/auth_3d.h +++ b/src/CRE/auth_3d.hpp @@ -8,13 +8,13 @@ #include #include #include "../KKdLib/default.h" -#include "../KKdLib/database/object.h" -#include "../KKdLib/database/texture.h" -#include "../KKdLib/a3da.h" +#include "../KKdLib/database/object.hpp" +#include "../KKdLib/database/texture.hpp" +#include "../KKdLib/a3da.hpp" #include "../KKdLib/kf.h" -#include "frame_rate_control.h" -#include "render_context.h" -#include "task.h" +#include "frame_rate_control.hpp" +#include "render_context.hpp" +#include "task.hpp" enum auth_3d_ambient_flags { AUTH_3D_AMBIENT_LIGHT_DIFFUSE = 0x01, @@ -813,7 +813,7 @@ extern float_t auth_3d_data_get_play_control_size(int32_t* id); extern bool auth_3d_data_get_repeat(int32_t* id); extern int32_t auth_3d_data_get_uid(int32_t* id); extern void auth_3d_data_load_auth_3d_db(auth_3d_database* auth_3d_db); -extern void auth_3d_data_load_category(const char* category_name); +extern void auth_3d_data_load_category(const char* category_name, const char* mdata_dir = 0); extern void auth_3d_data_load_category(void* data, const char* category_name, uint32_t category_hash); extern int32_t auth_3d_data_load_hash(uint32_t hash, uint32_t category_hash, const char* category_name, void* data, object_database* obj_db, texture_database* tex_db); diff --git a/src/CRE/data.c b/src/CRE/data.cpp similarity index 99% rename from src/CRE/data.c rename to src/CRE/data.cpp index 1a6490c7..5333612d 100644 --- a/src/CRE/data.c +++ b/src/CRE/data.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "data.h" +#include "data.hpp" #include "../KKdLib/io/path.h" #include "../KKdLib/io/stream.h" -#include "../KKdLib/hash.h" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" data_struct* data_list; @@ -328,7 +328,7 @@ void data_struct::get_directory_files(const char* dir, std::vectorpush_back(f); } @@ -880,7 +880,7 @@ static void data_load_inner(stream* s) { } data_struct_directory data_dir; - data_dir.path = std::string(data_dir_path_temp); + data_dir.path = data_dir_path_temp; data_dir.name = *k; j.data.push_back(data_dir); } @@ -890,8 +890,8 @@ static void data_load_inner(stream* s) { free(data_dir_path_temp); data_struct_directory data_dir; - data_dir.path = std::string(main_rom_path); - data_dir.name = std::string(); + data_dir.path = main_rom_path; + data_dir.name = {}; j.data.push_back(data_dir); free(data_dir_path_temp); } diff --git a/src/CRE/data.h b/src/CRE/data.hpp similarity index 92% rename from src/CRE/data.h rename to src/CRE/data.hpp index 56fe7913..d5e6cf5b 100644 --- a/src/CRE/data.h +++ b/src/CRE/data.hpp @@ -8,12 +8,12 @@ #include #include #include "../KKdLib/default.h" -#include "../KKdLib/database/auth_3d.h" -#include "../KKdLib/database/bone.h" -#include "../KKdLib/database/motion.h" -#include "../KKdLib/database/object.h" -#include "../KKdLib/database/stage.h" -#include "../KKdLib/database/texture.h" +#include "../KKdLib/database/auth_3d.hpp" +#include "../KKdLib/database/bone.hpp" +#include "../KKdLib/database/motion.hpp" +#include "../KKdLib/database/object.hpp" +#include "../KKdLib/database/stage.hpp" +#include "../KKdLib/database/texture.hpp" #include "../KKdLib/vec.h" enum data_type { diff --git a/src/CRE/draw_object.c b/src/CRE/draw_object.c index e5dc3b4b..a5523c99 100644 --- a/src/CRE/draw_object.c +++ b/src/CRE/draw_object.c @@ -7,7 +7,7 @@ #include "light_param/light.h" #include "shader_ft.h" #include "static_var.h" -#include "texture.h" +#include "texture.hpp" #define enable_vertex_attrib_array(index) \ glEnableVertexAttribArray(index); \ diff --git a/src/CRE/draw_object.h b/src/CRE/draw_object.h index 2c625d6c..fa6c1e8d 100644 --- a/src/CRE/draw_object.h +++ b/src/CRE/draw_object.h @@ -9,8 +9,8 @@ #include "../KKdLib/mat.h" #include "../KKdLib/vec.h" #include "../KKdLib/vector.h" -#include "object.h" -#include "render_context.h" +#include "object.hpp" +#include "render_context.hpp" struct texture_data_struct { int32_t field_0; diff --git a/src/CRE/draw_pass.c b/src/CRE/draw_pass.c index 2a6bc601..5135a29f 100644 --- a/src/CRE/draw_pass.c +++ b/src/CRE/draw_pass.c @@ -8,13 +8,13 @@ #include "light_param/fog.h" #include "light_param/light.h" #include "gl_state.h" -#include "post_process.h" -#include "rob.h" +#include "post_process.hpp" +#include "rob.hpp" #include "render_texture.h" #include "shader_ft.h" #include "shader_glsl.h" #include "static_var.h" -#include "texture.h" +#include "texture.hpp" struct draw_preprocess { int32_t field_0; @@ -701,7 +701,6 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* a1) { gl_state_bind_texture_2d(0); } - static void draw_pass_reflect(render_context* rctx, draw_pass* a1) { render_texture* reflect_texture = &rctx->draw_pass.reflect_texture; render_texture_bind(reflect_texture, 0); diff --git a/src/CRE/draw_task.c b/src/CRE/draw_task.c index a4bf8652..1dca348a 100644 --- a/src/CRE/draw_task.c +++ b/src/CRE/draw_task.c @@ -4,10 +4,10 @@ */ #include "draw_task.h" -#include "../KKdLib/sort.h" +#include "../KKdLib/sort.hpp" #include "camera.h" -#include "fbo.h" -#include "post_process.h" +#include "fbo.hpp" +#include "post_process.hpp" #include "shader_ft.h" static void draw_task_add(render_context* rctx, draw_object_type type, draw_task* task); @@ -236,7 +236,7 @@ void draw_task_draw_objects_by_type_translucent(render_context* rctx, bool opaqu alpha_array, opaque, transparent, translucent); for (int32_t i = 0; i < count; i++) { int32_t alpha = alpha_array[i]; - fbo_blit(rctx->post_process.rend_texture.fbos[0], + fbo::blit(rctx->post_process.rend_texture.fbos[0], rctx->post_process.alpha_layer_texture.fbos[0], 0, 0, rctx->post_process.render_width, rctx->post_process.render_height, 0, 0, rctx->post_process.render_width, rctx->post_process.render_height, @@ -259,7 +259,7 @@ void draw_task_draw_objects_by_type_translucent(render_context* rctx, bool opaqu glUniform1f(0, (float_t)(alpha * (1.0 / 255.0))); render_texture_draw_custom_glsl(); - fbo_blit(rctx->post_process.buf_texture.fbos[0], + fbo::blit(rctx->post_process.buf_texture.fbos[0], rctx->post_process.rend_texture.fbos[0], 0, 0, rctx->post_process.render_width, rctx->post_process.render_height, 0, 0, rctx->post_process.render_width, rctx->post_process.render_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -285,7 +285,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, } object_data->passed.objects++; - for (int32_t i = 0; i < object->meshes_count; i++) { + for (uint32_t i = 0; i < object->meshes_count; i++) { obj_mesh* mesh = &object->meshes[i]; obj_mesh* mesh_morph = 0; if (obj_vertex_buf && obj_morph_vertex_buf) { @@ -309,7 +309,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, draw_object* translucent_priority[40]; int32_t translucent_priority_count = 0; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; obj_sub_mesh* sub_mesh_morph = 0; if (sub_mesh->flags & OBJ_SUB_MESH_FLAG_8) @@ -693,7 +693,7 @@ void draw_task_sort(render_context* rctx, draw_object_type type, int32_t compare mat4_mult_vec3_trans(&mat, &sub_mesh->bounding_sphere.center, ¢er); else { vec3 center_sum = vec3_null; - for (int32_t j = 0; j < sub_mesh->bone_indices_count; j++) { + for (uint32_t j = 0; j < sub_mesh->bone_indices_count; j++) { center = sub_mesh->bounding_sphere.center; mat = task->data.object.mats[j]; mat4_mult_vec3_trans(&mat, ¢er, ¢er); diff --git a/src/CRE/fbo.c b/src/CRE/fbo.cpp similarity index 53% rename from src/CRE/fbo.c rename to src/CRE/fbo.cpp index 4fa7530d..dbd708bc 100644 --- a/src/CRE/fbo.c +++ b/src/CRE/fbo.cpp @@ -3,40 +3,46 @@ GitHub/GitLab: korenkonder */ -#include "fbo.h" +#include "fbo.hpp" #include "gl_state.h" -void fbo_init(fbo_struct* fbo, int32_t width, int32_t height, - GLuint* color_textures, int32_t count, GLuint depth_texture) { - if (fbo->fbo) - glDeleteFramebuffers(1, &fbo->fbo); - free(fbo->textures); +fbo::fbo() { + +} + +fbo::fbo(int32_t width, int32_t height, + GLuint* color_textures, int32_t count, GLuint depth_texture) : fbo() { + if (buffer) { + glDeleteFramebuffers(1, &buffer); + buffer = 0; + } + free(textures); count = min(count, 8); - fbo->width = width; - fbo->height = height; - fbo->count = count; - fbo->flags = (fbo_flags)0; + this->width = width; + this->height = height; + this->count = count; + flags = (fbo_flags)0; if (depth_texture) { - fbo->flags = FBO_DEPTH_ATTACHMENT; - fbo->count = count + 1; + this->flags = FBO_DEPTH_ATTACHMENT; + this->count++; } - fbo->textures = force_malloc_s(GLuint, fbo->count); + textures = force_malloc_s(GLuint, this->count); for (int32_t i = 0; i < count; i++) - fbo->textures[i] = color_textures[i]; + textures[i] = color_textures[i]; - if (fbo->flags & FBO_DEPTH_ATTACHMENT) - fbo->textures[count] = depth_texture; + if (flags & FBO_DEPTH_ATTACHMENT) + textures[count] = depth_texture; - glGenFramebuffers(1, &fbo->fbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo->fbo); + glGenFramebuffers(1, &buffer); + glBindFramebuffer(GL_FRAMEBUFFER, buffer); for (int32_t i = 0; i < count; i++) - glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, fbo->textures[i], 0); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); - if (fbo->flags & FBO_DEPTH_ATTACHMENT) - glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, fbo->textures[fbo->count - 1], 0); + if (flags & FBO_DEPTH_ATTACHMENT) + glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, textures[count], 0); GLenum color_attachments[8]; for (int32_t i = 0; i < count; i++) @@ -45,13 +51,16 @@ void fbo_init(fbo_struct* fbo, int32_t width, int32_t height, glCheckFramebufferStatus(GL_FRAMEBUFFER); } -void fbo_free(fbo_struct* fbo) { - if (fbo->fbo) - glDeleteFramebuffers(1, &fbo->fbo); - free(fbo->textures); +fbo::~fbo() { + if (buffer) { + glDeleteFramebuffers(1, &buffer); + buffer = 0; + } + free(textures); + textures = 0; } -inline void fbo_blit(GLuint src_fbo, GLuint dst_fbo, +void fbo::blit(GLuint src_fbo, GLuint dst_fbo, GLint src_x0, GLint src_y0, GLint src_x1, GLint src_y1, GLint dst_x0, GLint dst_y0, GLint dst_x1, GLint dst_y1, GLbitfield mask, GLenum filter) { gl_state_bind_framebuffer(dst_fbo); diff --git a/src/CRE/fbo.h b/src/CRE/fbo.h deleted file mode 100644 index be4a64aa..00000000 --- a/src/CRE/fbo.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "shared.h" - -enum fbo_flags { - FBO_DEPTH_ATTACHMENT = 0x01, -}; - -struct fbo_struct { - fbo_flags flags; - int32_t width; - int32_t height; - GLuint fbo; - int32_t count; - GLuint* textures; -}; - -extern void fbo_init(fbo_struct* fbo, int32_t width, int32_t height, - GLuint* color_textures, int32_t count, GLuint depth_texture); -extern void fbo_free(fbo_struct* fbo); -extern void fbo_blit(GLuint src_fbo, GLuint dst_fbo, - GLint src_x0, GLint src_y0, GLint src_x1, GLint src_y1, - GLint dst_x0, GLint dst_y0, GLint dst_x1, GLint dst_y1, GLbitfield mask, GLenum filter); diff --git a/src/CRE/fbo.hpp b/src/CRE/fbo.hpp new file mode 100644 index 00000000..ff472e95 --- /dev/null +++ b/src/CRE/fbo.hpp @@ -0,0 +1,30 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "shared.h" + +enum fbo_flags { + FBO_DEPTH_ATTACHMENT = 0x01, +}; + +struct fbo { + fbo_flags flags; + int32_t width; + int32_t height; + GLuint buffer; + int32_t count; + GLuint* textures; + + fbo(); + fbo(int32_t width, int32_t height, + GLuint* color_textures, int32_t count, GLuint depth_texture); + ~fbo(); + + static void blit(GLuint src_fbo, GLuint dst_fbo, + GLint src_x0, GLint src_y0, GLint src_x1, GLint src_y1, + GLint dst_x0, GLint dst_y0, GLint dst_x1, GLint dst_y1, GLbitfield mask, GLenum filter); +}; diff --git a/src/CRE/file_handler.c b/src/CRE/file_handler.cpp similarity index 97% rename from src/CRE/file_handler.c rename to src/CRE/file_handler.cpp index 405e1214..8d168947 100644 --- a/src/CRE/file_handler.c +++ b/src/CRE/file_handler.cpp @@ -4,9 +4,9 @@ */ #include -#include "../KKdLib/hash.h" -#include "file_handler.h" -#include "data.h" +#include "../KKdLib/hash.hpp" +#include "file_handler.hpp" +#include "data.hpp" #include struct farc_read_handler { @@ -77,20 +77,20 @@ void file_handler::call_read_free_func(int32_t index) { void file_handler::set_file(const char* file) { std::unique_lock u_lock(mtx); - this->file = std::string(file); + this->file = file; u_lock.unlock(); } void file_handler::set_farc_file(const char* farc_file, bool cache) { std::unique_lock u_lock(mtx); - this->farc_file = std::string(farc_file); + this->farc_file = farc_file; this->cache = cache; u_lock.unlock(); } void file_handler::set_path(const char* path) { std::unique_lock u_lock(mtx); - this->path = std::string(path); + this->path = path; u_lock.unlock(); } @@ -220,7 +220,7 @@ void file_handler_storage_free() { } static bool file_handler_load_file(void* data, const char* path, const char* file, uint32_t hash) { - std::string file_path = std::string(path); + std::string file_path = path; file_path += file; struct stat st; @@ -243,7 +243,7 @@ static bool file_handler_load_file(void* data, const char* path, const char* fil } static bool file_handler_load_farc_file(void* data, const char* path, const char* file, uint32_t hash) { - std::string file_path = std::string(path); + std::string file_path = path; file_path += file; file_handler* fhndl = (file_handler*)data; diff --git a/src/CRE/file_handler.h b/src/CRE/file_handler.hpp similarity index 98% rename from src/CRE/file_handler.h rename to src/CRE/file_handler.hpp index 8d124cb3..735ad730 100644 --- a/src/CRE/file_handler.h +++ b/src/CRE/file_handler.hpp @@ -11,7 +11,7 @@ #include #include #include "../KKdLib/default.h" -#include "../KKdLib/farc.h" +#include "../KKdLib/farc.hpp" struct file_handler_read_func_data { void(*func)(void*, void*, size_t); diff --git a/src/CRE/frame_rate_control.c b/src/CRE/frame_rate_control.cpp similarity index 96% rename from src/CRE/frame_rate_control.c rename to src/CRE/frame_rate_control.cpp index bb5cd61f..417df13d 100644 --- a/src/CRE/frame_rate_control.c +++ b/src/CRE/frame_rate_control.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "frame_rate_control.h" +#include "frame_rate_control.hpp" #include "static_var.h" SysFrameRate sys_frame_rate; diff --git a/src/CRE/frame_rate_control.h b/src/CRE/frame_rate_control.hpp similarity index 100% rename from src/CRE/frame_rate_control.h rename to src/CRE/frame_rate_control.hpp diff --git a/src/CRE/item_table.c b/src/CRE/item_table.cpp similarity index 99% rename from src/CRE/item_table.c rename to src/CRE/item_table.cpp index e944c5c1..0853e38a 100644 --- a/src/CRE/item_table.c +++ b/src/CRE/item_table.cpp @@ -5,8 +5,8 @@ #include "../KKdLib/io/path.h" #include "../KKdLib/str_utils.h" -#include "data.h" -#include "item_table.h" +#include "data.hpp" +#include "item_table.hpp" static bool item_table_array_read(data_struct* data, const char* path); static item_table_item* item_table_get_item(item_table* itm_tbl, int32_t item_no); diff --git a/src/CRE/item_table.h b/src/CRE/item_table.hpp similarity index 95% rename from src/CRE/item_table.h rename to src/CRE/item_table.hpp index 40a01b5d..fc4cb3fb 100644 --- a/src/CRE/item_table.h +++ b/src/CRE/item_table.hpp @@ -5,11 +5,11 @@ #pragma once -#include "../KKdLib/database/item_table.h" +#include "../KKdLib/database/item_table.hpp" #include "../KKdLib/default.h" -#include "file_handler.h" -#include "object.h" -#include "texture.h" +#include "file_handler.hpp" +#include "object.hpp" +#include "texture.hpp" struct item_table_item_data_obj { object_info obj_info; diff --git a/src/CRE/light_param.c b/src/CRE/light_param.cpp similarity index 92% rename from src/CRE/light_param.c rename to src/CRE/light_param.cpp index 24196a97..e0ab9c22 100644 --- a/src/CRE/light_param.c +++ b/src/CRE/light_param.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "light_param.h" -#include "../KKdLib/hash.h" +#include "light_param.hpp" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" -#include "render_context.h" +#include "render_context.hpp" static void light_param_data_get_stage_name_string(std::string* str, int32_t stage_index); static int32_t light_param_data_load_file(light_param_data* a1, p_file_handler* a2); @@ -286,7 +286,7 @@ static void light_param_data_load_file_pv_cut(std::mapfiles) { const char* name = i.name.c_str(); @@ -417,31 +417,31 @@ static void light_param_data_load_pv_cut_file_names(light_param_data* light_para char buf[0x100]; sprintf_s(buf, sizeof(buf), "%s_c%03d", name->c_str(), cut_id); - light_param->name = std::string(buf); + light_param->name = buf; sprintf_s(buf, sizeof(buf), "%s.ibl", light_param->name.c_str()); - light_param->paths[0] = std::string("rom/ibl/"); - light_param->files[0] = std::string(buf); + light_param->paths[0] = "rom/ibl/"; + light_param->files[0] = buf; sprintf_s(buf, sizeof(buf), "light_%s.txt", light_param->name.c_str()); - light_param->paths[1] = std::string("rom/light_param/"); - light_param->files[1] = std::string(buf); + light_param->paths[1] = "rom/light_param/"; + light_param->files[1] = buf; sprintf_s(buf, sizeof(buf), "fog_%s.txt", light_param->name.c_str()); - light_param->paths[2] = std::string("rom/light_param/"); - light_param->files[2] = std::string(buf); + light_param->paths[2] = "rom/light_param/"; + light_param->files[2] = buf; sprintf_s(buf, sizeof(buf), "glow_%s.txt", light_param->name.c_str()); - light_param->paths[3] = std::string("rom/light_param/"); - light_param->files[3] = std::string(buf); + light_param->paths[3] = "rom/light_param/"; + light_param->files[3] = buf; sprintf_s(buf, sizeof(buf), "wind_%s.txt", light_param->name.c_str()); - light_param->paths[4] = std::string("rom/light_param/"); - light_param->files[4] = std::string(buf); + light_param->paths[4] = "rom/light_param/"; + light_param->files[4] = buf; sprintf_s(buf, sizeof(buf), "face_%s.txt", light_param->name.c_str()); - light_param->paths[5] = std::string("rom/light_param/"); - light_param->files[5] = std::string(buf); + light_param->paths[5] = "rom/light_param/"; + light_param->files[5] = buf; } void light_param_data_load_stage_file_names(light_param_data* light_param, std::string* name) { @@ -450,28 +450,28 @@ void light_param_data_load_stage_file_names(light_param_data* light_param, std:: light_param->name = *name; sprintf_s(buf, sizeof(buf), "%s.ibl", light_param->name.c_str()); - light_param->paths[0] = std::string("rom/ibl/"); - light_param->files[0] = std::string(buf); + light_param->paths[0] = "rom/ibl/"; + light_param->files[0] = buf; sprintf_s(buf, sizeof(buf), "light_%s.txt", light_param->name.c_str()); - light_param->paths[1] = std::string("rom/light_param/"); - light_param->files[1] = std::string(buf); + light_param->paths[1] = "rom/light_param/"; + light_param->files[1] = buf; sprintf_s(buf, sizeof(buf), "fog_%s.txt", light_param->name.c_str()); - light_param->paths[2] = std::string("rom/light_param/"); - light_param->files[2] = std::string(buf); + light_param->paths[2] = "rom/light_param/"; + light_param->files[2] = buf; sprintf_s(buf, sizeof(buf), "glow_%s.txt", light_param->name.c_str()); - light_param->paths[3] = std::string("rom/light_param/"); - light_param->files[3] = std::string(buf); + light_param->paths[3] = "rom/light_param/"; + light_param->files[3] = buf; sprintf_s(buf, sizeof(buf), "wind_%s.txt", light_param->name.c_str()); - light_param->paths[4] = std::string("rom/light_param/"); - light_param->files[4] = std::string(buf); + light_param->paths[4] = "rom/light_param/"; + light_param->files[4] = buf; sprintf_s(buf, sizeof(buf), "face_%s.txt", light_param->name.c_str()); - light_param->paths[5] = std::string("rom/light_param/"); - light_param->files[5] = std::string(buf); + light_param->paths[5] = "rom/light_param/"; + light_param->files[5] = buf; } static void light_param_storage_free_file_handlers(light_param_data_storage* a1) { diff --git a/src/CRE/light_param.h b/src/CRE/light_param.hpp similarity index 85% rename from src/CRE/light_param.h rename to src/CRE/light_param.hpp index a9ae6179..1c60cce7 100644 --- a/src/CRE/light_param.h +++ b/src/CRE/light_param.hpp @@ -8,17 +8,17 @@ #include #include #include "../KKdLib/default.h" -#include "../KKdLib/farc.h" +#include "../KKdLib/farc.hpp" #include "../KKdLib/mat.h" #include "../KKdLib/vector.h" -#include "../KKdLib/light_param/face.h" -#include "../KKdLib/light_param/fog.h" -#include "../KKdLib/light_param/glow.h" -#include "../KKdLib/light_param/ibl.h" -#include "../KKdLib/light_param/light.h" -#include "../KKdLib/light_param/wind.h" -#include "data.h" -#include "file_handler.h" +#include "../KKdLib/light_param/face.hpp" +#include "../KKdLib/light_param/fog.hpp" +#include "../KKdLib/light_param/glow.hpp" +#include "../KKdLib/light_param/ibl.hpp" +#include "../KKdLib/light_param/light.hpp" +#include "../KKdLib/light_param/wind.hpp" +#include "data.hpp" +#include "file_handler.hpp" #include struct light_param_data { diff --git a/src/CRE/light_param/face.h b/src/CRE/light_param/face.h index 129cd8c6..0a26daff 100644 --- a/src/CRE/light_param/face.h +++ b/src/CRE/light_param/face.h @@ -6,7 +6,7 @@ #pragma once #include "../../KKdLib/default.h" -#include "../../KKdLib/light_param/face.h" +#include "../../KKdLib/light_param/face.hpp" #include "../../KKdLib/vec.h" #include "../static_var.h" diff --git a/src/CRE/light_param/fog.h b/src/CRE/light_param/fog.h index ad121de6..d3510c21 100644 --- a/src/CRE/light_param/fog.h +++ b/src/CRE/light_param/fog.h @@ -6,7 +6,7 @@ #pragma once #include "../../KKdLib/default.h" -#include "../../KKdLib/light_param/fog.h" +#include "../../KKdLib/light_param/fog.hpp" #include "../../KKdLib/vec.h" #include "../static_var.h" diff --git a/src/CRE/light_param/light.h b/src/CRE/light_param/light.h index 6e5a7764..c0f1ff83 100644 --- a/src/CRE/light_param/light.h +++ b/src/CRE/light_param/light.h @@ -6,7 +6,7 @@ #pragma once #include "../../KKdLib/default.h" -#include "../../KKdLib/light_param/light.h" +#include "../../KKdLib/light_param/light.hpp" #include "../../KKdLib/vec.h" #include "../static_var.h" #include "face.h" diff --git a/src/CRE/light_param/wind.c b/src/CRE/light_param/wind.cpp similarity index 99% rename from src/CRE/light_param/wind.c rename to src/CRE/light_param/wind.cpp index 0970c3a3..6068a80b 100644 --- a/src/CRE/light_param/wind.c +++ b/src/CRE/light_param/wind.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "wind.h" +#include "wind.hpp" static float_t wind_apply_spc(wind* w, float_t frame); static void wind_ctrl(wind* w); diff --git a/src/CRE/light_param/wind.h b/src/CRE/light_param/wind.hpp similarity index 94% rename from src/CRE/light_param/wind.h rename to src/CRE/light_param/wind.hpp index dcec9c97..18c34165 100644 --- a/src/CRE/light_param/wind.h +++ b/src/CRE/light_param/wind.hpp @@ -6,10 +6,10 @@ #pragma once #include "../../KKdLib/default.h" -#include "../../KKdLib/light_param/wind.h" +#include "../../KKdLib/light_param/wind.hpp" #include "../../KKdLib/vec.h" #include "../static_var.h" -#include "../task.h" +#include "../task.hpp" struct wind_spc { float_t cos; diff --git a/src/CRE/object.c b/src/CRE/object.cpp similarity index 91% rename from src/CRE/object.c rename to src/CRE/object.cpp index 55c7672b..3f22a34b 100644 --- a/src/CRE/object.c +++ b/src/CRE/object.cpp @@ -6,11 +6,11 @@ #include #include #include -#include "object.h" -#include "data.h" +#include "object.hpp" +#include "data.hpp" #include "gl_state.h" #include "shader_ft.h" -#include "../KKdLib/hash.h" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" struct material_change_handler { @@ -135,7 +135,7 @@ void obj_skin_set_matrix_buffer(obj_skin* s, mat4* matrices, return; if (mat) - for (int32_t i = 0; i < s->bones_count; i++) { + for (uint32_t i = 0; i < s->bones_count; i++) { mat4 temp; int32_t bone_id = s->bones[i].id; if (bone_id & 0x8000) @@ -152,7 +152,7 @@ void obj_skin_set_matrix_buffer(obj_skin* s, mat4* matrices, mat4_mult(&inv_bind_pose_mat, &temp, &matrix_buffer[i]); } else - for (int32_t i = 0; i < s->bones_count; i++) { + for (uint32_t i = 0; i < s->bones_count; i++) { mat4 temp; int32_t bone_id = s->bones[i].id; if (bone_id & 0x8000) @@ -226,7 +226,7 @@ inline obj* object_storage_get_obj(object_info obj_info) { if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) return &set->objects[j]; return 0; @@ -238,7 +238,7 @@ inline obj* object_storage_get_obj(object_info obj_info) { if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) return &set->objects[j]; return 0; @@ -277,9 +277,9 @@ inline obj_material* object_storage_get_material(const char* name) { if (!set) continue; - for (int32_t j = 0; j < set->objects_count; j++) { + for (uint32_t j = 0; j < set->objects_count; j++) { obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->materials_count; k++) + for (uint32_t k = 0; k < obj->materials_count; k++) if (hash_utf8_murmurhash(obj->materials[k].material.name) == name_hash) return &obj->materials[k].material; } @@ -290,9 +290,9 @@ inline obj_material* object_storage_get_material(const char* name) { if (!set) continue; - for (int32_t j = 0; j < set->objects_count; j++) { + for (uint32_t j = 0; j < set->objects_count; j++) { obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->materials_count; k++) + for (uint32_t k = 0; k < obj->materials_count; k++) if (hash_utf8_murmurhash(obj->materials[k].material.name) == name_hash) return &obj->materials[k].material; } @@ -309,11 +309,11 @@ inline obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* m if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return &obj->meshes[k]; return 0; @@ -329,11 +329,11 @@ inline obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* m if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return &obj->meshes[k]; return 0; @@ -343,7 +343,7 @@ inline obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* m return 0; } -inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, int32_t index) { +inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint32_t index) { for (obj_set_handler& i : object_storage_data) { if (i.set_id != obj_info.set_id) continue; @@ -352,10 +352,10 @@ inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, int3 if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) { obj* obj = &set->objects[j]; - if (index > -1 && index < obj->meshes_count) + if (index >= 0 && index < obj->meshes_count) return &obj->meshes[index]; return 0; } @@ -370,10 +370,10 @@ inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, int3 if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) { obj* obj = &set->objects[j]; - if (index > -1 && index < obj->meshes_count) + if (index >= 0 && index < obj->meshes_count) return &obj->meshes[index]; return 0; } @@ -388,11 +388,11 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return &obj->meshes[k]; return 0; @@ -405,11 +405,11 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return &obj->meshes[k]; return 0; @@ -419,16 +419,16 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const return 0; } -inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, int32_t index) { +inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, uint32_t index) { for (obj_set_handler& i : object_storage_data) { obj_set* set = i.obj_set; if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].hash == hash) { obj* obj = &set->objects[j]; - if (index > -1 && index < obj->meshes_count) + if (index >= 0 && index < obj->meshes_count) return &obj->meshes[index]; return 0; } @@ -439,10 +439,10 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].hash == hash) { obj* obj = &set->objects[j]; - if (index > -1 && index < obj->meshes_count) + if (index >= 0 && index < obj->meshes_count) return &obj->meshes[index]; return 0; } @@ -450,7 +450,7 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, return 0; } -inline int32_t object_storage_get_obj_mesh_index(object_info obj_info, const char* mesh_name) { +inline uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const char* mesh_name) { for (obj_set_handler& i : object_storage_data) { if (i.set_id != obj_info.set_id) continue; @@ -459,11 +459,11 @@ inline int32_t object_storage_get_obj_mesh_index(object_info obj_info, const cha if (!set) return -1; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return k; return -1; @@ -479,11 +479,11 @@ inline int32_t object_storage_get_obj_mesh_index(object_info obj_info, const cha if (!set) return -1; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return k; return -1; @@ -493,17 +493,17 @@ inline int32_t object_storage_get_obj_mesh_index(object_info obj_info, const cha return -1; } -inline int32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const char* mesh_name) { +inline uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const char* mesh_name) { for (obj_set_handler& i : object_storage_data) { obj_set* set = i.obj_set; if (!set) return -1; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return k; return -1; @@ -515,11 +515,11 @@ inline int32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const ch if (!set) return -1; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); obj* obj = &set->objects[j]; - for (int32_t k = 0; k < obj->meshes_count; k++) + for (uint32_t k = 0; k < obj->meshes_count; k++) if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) return k; return -1; @@ -603,7 +603,7 @@ inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) return set->objects[j].skin_init ? &set->objects[j].skin : 0; return 0; @@ -617,7 +617,7 @@ inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { if (!set) return 0; - for (int32_t j = 0; j < set->objects_count; j++) + for (uint32_t j = 0; j < set->objects_count; j++) if (set->objects[j].id == obj_info.id) return set->objects[j].skin_init ? &set->objects[j].skin : 0; return 0; @@ -636,7 +636,7 @@ inline obj_mesh_index_buffer* object_storage_get_obj_mesh_index_buffer(object_in obj_set_handler* handler = object_storage_get_obj_set_handler(obj_info.set_id); if (handler && handler->obj_set && handler->index_buffers) { obj_set* set = handler->obj_set; - for (int32_t i = 0; i < set->objects_count; i++) + for (uint32_t i = 0; i < set->objects_count; i++) if (set->objects[i].id == obj_info.id) return handler->index_buffers[i].meshes; } @@ -654,7 +654,7 @@ inline obj_mesh_vertex_buffer* object_storage_get_obj_mesh_vertex_buffer(object_ obj_set_handler* handler = object_storage_get_obj_set_handler(obj_info.set_id); if (handler && handler->obj_set && handler->vertex_buffers) { obj_set* set = handler->obj_set; - for (int32_t i = 0; i < set->objects_count; i++) + for (uint32_t i = 0; i < set->objects_count; i++) if (set->objects[i].id == obj_info.id) return handler->vertex_buffers[i].meshes; } @@ -820,7 +820,7 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id, handler->obj_file_handler.free_data(); handler->object_ids.reserve(set->objects_count); - for (int32_t i = 0; i < set->objects_count; i++) + for (uint32_t i = 0; i < set->objects_count; i++) handler->object_ids.push_back({ set->objects[i].id, i }); if (!obj_set_handler_vertex_buffer_load(handler) @@ -923,7 +923,7 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id, handler->obj_file_handler.free_data(); handler->object_ids.reserve(set->objects_count); - for (int32_t i = 0; i < set->objects_count; i++) + for (uint32_t i = 0; i < set->objects_count; i++) handler->object_ids.push_back({ set->objects[i].id, i }); if (!obj_set_handler_vertex_buffer_load(handler) @@ -993,7 +993,7 @@ inline void object_storage_free() { static bool obj_mesh_index_buffer_load(obj_mesh_index_buffer* buffer, obj_mesh* mesh) { int32_t indices_count = 0; - for (int32_t i = 0; i < mesh->sub_meshes_count; i++) + for (uint32_t i = 0; i < mesh->sub_meshes_count; i++) indices_count += mesh->sub_meshes[i].indices_count; if (!indices_count) { @@ -1003,7 +1003,7 @@ static bool obj_mesh_index_buffer_load(obj_mesh_index_buffer* buffer, obj_mesh* uint16_t* indices = force_malloc_s(uint16_t, indices_count); uint16_t* _indices = indices; - for (int32_t k = 0; k < mesh->sub_meshes_count; k++) { + for (uint32_t k = 0; k < mesh->sub_meshes_count; k++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[k]; int32_t indices_count = sub_mesh->indices_count; uint32_t* sub_mesh_indices = sub_mesh->indices; @@ -1012,7 +1012,7 @@ static bool obj_mesh_index_buffer_load(obj_mesh_index_buffer* buffer, obj_mesh* } _indices = indices; - for (int32_t i = 0, offset = 0; i < mesh->sub_meshes_count; i++) { + for (uint32_t i = 0, offset = 0; i < mesh->sub_meshes_count; i++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[i]; sub_mesh->first_index = 0; @@ -1021,7 +1021,6 @@ static bool obj_mesh_index_buffer_load(obj_mesh_index_buffer* buffer, obj_mesh* if (sub_mesh->index_format != OBJ_INDEX_U16) continue; - uint16_t first_index = 0xFFFF; uint16_t last_index = 0; int32_t indices_count = sub_mesh->indices_count; @@ -1236,20 +1235,20 @@ static void obj_mesh_vertex_buffer_free(obj_mesh_vertex_buffer* buffer) { static void obj_set_handler_calc_axis_aligned_bounding_box(obj_set_handler* handler) { obj_set* set = handler->obj_set; - for (int32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->objects_count; i++) { obj* obj = &set->objects[i]; - for (int32_t j = 0; j < obj->meshes_count; j++) { + for (uint32_t j = 0; j < obj->meshes_count; j++) { obj_mesh* mesh = &obj->meshes[j]; - for (int32_t k = 0; k < mesh->sub_meshes_count; k++) { + for (uint32_t k = 0; k < mesh->sub_meshes_count; k++) { vec3 _min = { 9999999.0f, 9999999.0f, 9999999.0f }; vec3 _max = { -100000000.0f, -100000000.0f, -100000000.0f }; obj_sub_mesh* sub_mesh = &mesh->sub_meshes[k]; uint32_t* indices = (uint32_t*)sub_mesh->indices; - int32_t indices_count = sub_mesh->indices_count; + uint32_t indices_count = sub_mesh->indices_count; obj_vertex_data* vertex = mesh->vertex; if (sub_mesh->index_format == OBJ_INDEX_U16) - for (int32_t l = 0; l < indices_count; l++) { + for (uint32_t l = 0; l < indices_count; l++) { if (indices[l] == 0xFFFFFFFF) continue; @@ -1258,7 +1257,7 @@ static void obj_set_handler_calc_axis_aligned_bounding_box(obj_set_handler* hand vec3_max(_max, pos, _max); } else - for (int32_t l = 0; l < indices_count; l++) { + for (uint32_t l = 0; l < indices_count; l++) { vec3 pos = vertex[indices[l]].position; vec3_min(_min, pos, _min); vec3_max(_max, pos, _max); @@ -1278,28 +1277,28 @@ static void obj_set_handler_calc_axis_aligned_bounding_box(obj_set_handler* hand static void obj_set_handler_get_shader_index_texture_index(obj_set_handler* handler) { obj_set* set = handler->obj_set; - for (int32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->objects_count; i++) { obj* obj = &set->objects[i]; - int32_t materials_count = obj->materials_count; - for (int32_t j = 0; j < materials_count; j++) { + uint32_t materials_count = obj->materials_count; + for (uint32_t j = 0; j < materials_count; j++) { obj_material_data* material_data = &obj->materials[j]; obj_material* material = &material_data->material; - int32_t textures_count = material_data->textures_count; + uint32_t textures_count = material_data->textures_count; if (*(int32_t*)&material->shader.name[4] != 0xDEADFF) { material->shader.index = shader_get_index_by_name(&shaders_ft, material->shader.name); *(int32_t*)&material->shader.name[4] = 0xDEADFF; } - for (int32_t k = 0; k < 8; k++) { - obj_material_texture* texture = &material->textures[k]; + for (obj_material_texture& k : material->textures) { + obj_material_texture* texture = &k; uint32_t texture_id = texture->texture_id; texture->texture_id = 0; texture->texture_index = 0; std::pair* texture_ids = handler->texture_ids.data(); - int32_t texture_ids_count = (int32_t)handler->texture_ids.size(); - for (int32_t l = texture_ids_count; l; l--, texture_ids++) + uint32_t texture_ids_count = (uint32_t)handler->texture_ids.size(); + for (uint32_t l = texture_ids_count; l; l--, texture_ids++) if (texture_ids->first == texture_id) { texture->texture_id = texture_id; texture->texture_index = texture_ids->second; @@ -1317,7 +1316,7 @@ static bool obj_set_handler_index_buffer_load(obj_set_handler* handler) { if (!handler->index_buffers) return true; - for (int32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->objects_count; i++) { obj* obj = &set->objects[i]; obj_index_buffer* buffer = &handler->index_buffers[i]; @@ -1326,7 +1325,7 @@ static bool obj_set_handler_index_buffer_load(obj_set_handler* handler) { if (!buffer->meshes) return false; - for (int32_t j = 0; j < buffer->meshes_count; j++) + for (uint32_t j = 0; j < buffer->meshes_count; j++) if (!obj_mesh_index_buffer_load(&buffer->meshes[j], &obj->meshes[j])) return false; } @@ -1337,10 +1336,10 @@ static void obj_set_handler_index_buffer_free(obj_set_handler* handler) { if (!handler->index_buffers) return; - for (int32_t i = 0; i < handler->index_buffers_count; i++) { + for (uint32_t i = 0; i < handler->index_buffers_count; i++) { obj_index_buffer* buffer = &handler->index_buffers[i]; if (buffer->meshes) - for (int32_t j = 0; j < buffer->meshes_count; j++) + for (uint32_t j = 0; j < buffer->meshes_count; j++) obj_mesh_index_buffer_free(&buffer->meshes[j]); free(buffer->meshes); } @@ -1394,9 +1393,9 @@ static bool obj_set_handler_load_textures_modern(obj_set_handler* handler, void* } uint32_t* texture_ids = set->texture_ids; - int32_t textures_count = handler->textures_count; + uint32_t textures_count = handler->textures_count; texture** texture_data = handler->texture_data; - for (int32_t i = 0; i < textures_count; i++) { + for (uint32_t i = 0; i < textures_count; i++) { handler->texture_ids.push_back({ texture_ids[i], i }); handler->textures.push_back(texture_data[i]->tex); } @@ -1410,7 +1409,7 @@ static bool obj_set_handler_vertex_buffer_load(obj_set_handler* handler) { if (!handler->vertex_buffers) return true; - for (int32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->objects_count; i++) { obj* obj = &set->objects[i]; obj_vertex_buffer* buffer = &handler->vertex_buffers[i]; @@ -1419,7 +1418,7 @@ static bool obj_set_handler_vertex_buffer_load(obj_set_handler* handler) { if (!buffer->meshes) return false; - for (int32_t j = 0; j < buffer->meshes_count; j++) + for (uint32_t j = 0; j < buffer->meshes_count; j++) if (!obj_mesh_vertex_buffer_load(&buffer->meshes[j], &obj->meshes[j])) return false; } @@ -1430,10 +1429,10 @@ static void obj_set_handler_vertex_buffer_free(obj_set_handler* handler) { if (!handler->vertex_buffers) return; - for (int32_t i = 0; i < handler->vertex_buffers_count; i++) { + for (uint32_t i = 0; i < handler->vertex_buffers_count; i++) { obj_vertex_buffer* buffer = &handler->vertex_buffers[i]; if (buffer->meshes) - for (int32_t j = 0; j < buffer->meshes_count; j++) + for (uint32_t j = 0; j < buffer->meshes_count; j++) obj_mesh_vertex_buffer_free(&buffer->meshes[j]); free(buffer->meshes); } @@ -1459,7 +1458,6 @@ inline static void obj_skin_block_constraint_up_vector_load( string_copy(&up_vector_file->name, &up_vector->name); } - inline static void obj_skin_block_node_load(obj_skin_block_node* node, obj_skin_block_node* node_file) { string_copy(&node_file->parent_name, &node->parent_name); @@ -1531,7 +1529,7 @@ index_buffers_count(), index_buffers(), load_count(), modern() { } obj_set_handler::~obj_set_handler() { - for (int32_t i = 0; i < textures_count; i++) + for (uint32_t i = 0; i < textures_count; i++) texture_free(texture_data[i]); free(texture_data); diff --git a/src/CRE/object.h b/src/CRE/object.hpp similarity index 86% rename from src/CRE/object.h rename to src/CRE/object.hpp index 2f06dcff..ce88b4dd 100644 --- a/src/CRE/object.h +++ b/src/CRE/object.hpp @@ -6,15 +6,15 @@ #pragma once #include "../KKdLib/default.h" -#include "../KKdLib/database/object.h" -#include "../KKdLib/database/texture.h" +#include "../KKdLib/database/object.hpp" +#include "../KKdLib/database/texture.hpp" #include "../KKdLib/mat.h" -#include "../KKdLib/obj.h" -#include "../KKdLib/txp.h" +#include "../KKdLib/obj.hpp" +#include "../KKdLib/txp.hpp" #include "../KKdLib/vec.h" -#include "file_handler.h" +#include "file_handler.hpp" #include "static_var.h" -#include "texture.h" +#include "texture.hpp" struct material_change { vec4u blend_color; @@ -27,18 +27,18 @@ struct obj_mesh_index_buffer { }; struct obj_mesh_vertex_buffer { - int32_t count; + uint32_t count; GLuint buffers[3]; - int32_t index; + uint32_t index; }; struct obj_index_buffer { - int32_t meshes_count; + uint32_t meshes_count; obj_mesh_index_buffer* meshes; }; struct obj_vertex_buffer { - int32_t meshes_count; + uint32_t meshes_count; obj_mesh_vertex_buffer* meshes; }; @@ -49,16 +49,16 @@ struct obj_set_handler { bool tex_loaded; obj_set* obj_set; std::vector> object_ids; - int32_t textures_count; + uint32_t textures_count; std::vector textures; std::vector> texture_ids; texture** texture_data; int32_t set_id; - int32_t vertex_buffers_count; + uint32_t vertex_buffers_count; obj_vertex_buffer* vertex_buffers; - int32_t index_buffers_count; + uint32_t index_buffers_count; obj_index_buffer* index_buffers; - int32_t load_count; + uint32_t load_count; std::string name; p_file_handler farc_file_handler; bool modern; @@ -89,11 +89,11 @@ extern obj_set_handler* object_storage_get_obj_set_handler(uint32_t set_id); extern obj_set_handler* object_storage_get_obj_set_handler_by_index(size_t index); extern obj_material* object_storage_get_material(const char* name); extern obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* mesh_name); -extern obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, int32_t index); +extern obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint32_t index); extern obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const char* mesh_name); -extern obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, int32_t index); -extern int32_t object_storage_get_obj_mesh_index(object_info obj_info, const char* mesh_name); -extern int32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const char* mesh_name); +extern obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, uint32_t index); +extern uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const char* mesh_name); +extern uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const char* mesh_name); extern obj_set* object_storage_get_obj_set(uint32_t set_id); extern size_t object_storage_get_obj_set_count(); extern int32_t object_storage_get_obj_storage_load_count(uint32_t set_id); diff --git a/src/CRE/post_process.c b/src/CRE/post_process.cpp similarity index 96% rename from src/CRE/post_process.c rename to src/CRE/post_process.cpp index 0b3739af..b9799e54 100644 --- a/src/CRE/post_process.c +++ b/src/CRE/post_process.cpp @@ -3,13 +3,13 @@ GitHub/GitLab: korenkonder */ -#include "post_process.h" -#include "fbo.h" +#include "post_process.hpp" +#include "fbo.hpp" #include "gl_state.h" #include "render_texture.h" #include "shader_ft.h" #include "static_var.h" -#include "texture.h" +#include "texture.hpp" extern int32_t stage_index; @@ -54,7 +54,7 @@ sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_he aa = post_process_aa_init(); blur = post_process_blur_init(); - dof = post_process_dof_init(); + dof = new post_process_dof(); exposure = post_process_exposure_init(); tone_map = post_process_tone_map_init(); stage_index = -1; @@ -81,7 +81,12 @@ sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_he post_process::~post_process() { post_process_aa_dispose(aa); post_process_blur_dispose(blur); - post_process_dof_dispose(dof); + + if (dof) { + delete dof; + dof = 0; + } + post_process_exposure_dispose(exposure); post_process_tone_map_dispose(tone_map); ::render_texture_free(&rend_texture); @@ -101,15 +106,14 @@ post_process::~post_process() { } void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param) { - fbo_blit(rend_texture.fbos[0], - pre_texture.fbos[0], + fbo::blit(rend_texture.fbos[0], pre_texture.fbos[0], 0, 0, render_width, render_height, 0, 0, render_width, render_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); for (int32_t i = 0; i < 8; i++) gl_state_bind_sampler(i, 0); - post_process_apply_dof(dof, &rend_texture, samplers, cam); + dof->apply(&rend_texture, samplers, cam); shader_state_matrix_set_mvp_separate(&shaders_ft, &mat4_identity, &mat4_identity, &mat4_identity); @@ -145,8 +149,7 @@ void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param render_height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - fbo_blit(rend_texture.fbos[0], - post_texture.fbos[0], + fbo::blit(rend_texture.fbos[0], post_texture.fbos[0], 0, 0, render_width, render_height, 0, 0, render_width, render_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -192,7 +195,7 @@ void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param for (int32_t i = 0; i < 8; i++) gl_state_bind_sampler(i, 0); - fbo_blit(screen_texture.fbos[0], fbo_texture.fbos[0], + fbo::blit(screen_texture.fbos[0], fbo_texture.fbos[0], screen_x_offset, screen_y_offset, sprite_width, sprite_height, 0, 0, render_width, render_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); } @@ -240,7 +243,7 @@ void post_process::init_fbo(int32_t render_width, int32_t render_height, if (this->render_width != render_width || this->render_height != render_height) { post_process_aa_init_fbo(aa, render_width, render_height); post_process_blur_init_fbo(blur, render_width, render_height); - post_process_dof_init_fbo(dof, render_width, render_height); + dof->init_fbo(render_width, render_height); post_process_exposure_init_fbo(exposure); post_process_tone_map_init_fbo(tone_map); render_texture_init(&rend_texture, render_width, @@ -346,7 +349,7 @@ void post_process::render_texture_free(texture* render_texture, bool task_photo) void post_process::reset() { mlaa = true; mag_filter = POST_PROCESS_MAG_FILTER_BILINEAR; - post_process_dof_initialize_data(dof, 0, 0); + dof->initialize_data(0, 0); vec3 radius = { 2.0f, 2.0f, 2.0f }; vec3 intensity = { 1.0f, 1.0f, 1.0f }; post_process_blur_initialize_data(blur, &radius, &intensity); diff --git a/src/CRE/post_process.h b/src/CRE/post_process.hpp similarity index 98% rename from src/CRE/post_process.h rename to src/CRE/post_process.hpp index dc386f4d..9eb721f7 100644 --- a/src/CRE/post_process.h +++ b/src/CRE/post_process.hpp @@ -9,7 +9,7 @@ #include "../KKdLib/vec.h" #include "post_process/aa.h" #include "post_process/blur.h" -#include "post_process/dof.h" +#include "post_process/dof.hpp" #include "post_process/exposure.h" #include "post_process/tone_map.h" #include "camera.h" diff --git a/src/CRE/post_process/aa.c b/src/CRE/post_process/aa.c index c9ee2705..e45231d6 100644 --- a/src/CRE/post_process/aa.c +++ b/src/CRE/post_process/aa.c @@ -4,9 +4,9 @@ */ #include "aa.h" -#include "../fbo.h" +#include "../fbo.hpp" #include "../gl_state.h" -#include "../post_process.h" +#include "../post_process.hpp" #include "../shader_ft.h" static void post_process_aa_free_fbo(post_process_aa* exp); @@ -53,7 +53,7 @@ void post_process_apply_mlaa(post_process_aa* aa, render_texture* rt, gl_state_active_bind_texture_2d(0, 0); gl_state_active_bind_texture_2d(1, 0); - fbo_blit(buf_rt->fbos[0], rt->fbos[0], + fbo::blit(buf_rt->fbos[0], rt->fbos[0], 0, 0, buf_rt->color_texture->width, buf_rt->color_texture->height, 0, 0, rt->color_texture->width, rt->color_texture->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); } diff --git a/src/CRE/post_process/blur.c b/src/CRE/post_process/blur.c index fb13d426..7bf03981 100644 --- a/src/CRE/post_process/blur.c +++ b/src/CRE/post_process/blur.c @@ -4,9 +4,9 @@ */ #include "blur.h" -#include "../fbo.h" +#include "../fbo.hpp" #include "../gl_state.h" -#include "../post_process.h" +#include "../post_process.hpp" #include "../shader_ft.h" static void post_process_blur_free_fbo(post_process_blur* blur); @@ -110,7 +110,7 @@ void post_process_get_blur(post_process_blur* blur, render_texture* rt) { render_texture_bind(&blur->tex[0], 0); gl_state_active_bind_texture_2d(0, blur->tex[1].color_texture->tex); render_texture_draw_params(&shaders_ft, 128, 72, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo_blit(blur->tex[0].fbos[0], blur->tex[1].fbos[0], + fbo::blit(blur->tex[0].fbos[0], blur->tex[1].fbos[0], 0, 0, 128, 72, 0, 0, 128, 72, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -118,7 +118,7 @@ void post_process_get_blur(post_process_blur* blur, render_texture* rt) { render_texture_bind(&blur->tex[0], 0); gl_state_active_bind_texture_2d(0, blur->tex[2].color_texture->tex); render_texture_draw_params(&shaders_ft, 64, 36, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo_blit(blur->tex[0].fbos[0], blur->tex[2].fbos[0], + fbo::blit(blur->tex[0].fbos[0], blur->tex[2].fbos[0], 0, 0, 64, 36, 0, 0, 64, 36, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -126,7 +126,7 @@ void post_process_get_blur(post_process_blur* blur, render_texture* rt) { render_texture_bind(&blur->tex[0], 0); gl_state_active_bind_texture_2d(0, blur->tex[3].color_texture->tex); render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo_blit(blur->tex[0].fbos[0], blur->tex[3].fbos[0], + fbo::blit(blur->tex[0].fbos[0], blur->tex[3].fbos[0], 0, 0, 32, 18, 0, 0, 32, 18, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -136,16 +136,15 @@ void post_process_get_blur(post_process_blur* blur, render_texture* rt) { render_texture_bind(&blur->tex[0], 0); gl_state_active_bind_texture_2d(0, blur->tex[1].color_texture->tex); render_texture_draw_params(&shaders_ft, 128, 72, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo_blit(blur->tex[0].fbos[0], blur->tex[1].fbos[0], + fbo::blit(blur->tex[0].fbos[0], blur->tex[1].fbos[0], 0, 0, 128, 72, 0, 0, 128, 72, GL_COLOR_BUFFER_BIT, GL_LINEAR); - glViewport(0, 0, 64, 36); render_texture_bind(&blur->tex[0], 0); gl_state_active_bind_texture_2d(0, blur->tex[2].color_texture->tex); render_texture_draw_params(&shaders_ft, 64, 36, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo_blit(blur->tex[0].fbos[0], blur->tex[2].fbos[0], + fbo::blit(blur->tex[0].fbos[0], blur->tex[2].fbos[0], 0, 0, 64, 36, 0, 0, 64, 36, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -153,7 +152,7 @@ void post_process_get_blur(post_process_blur* blur, render_texture* rt) { render_texture_bind(&blur->tex[0], 0); gl_state_active_bind_texture_2d(0, blur->tex[3].color_texture->tex); render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo_blit(blur->tex[0].fbos[0], blur->tex[3].fbos[0], + fbo::blit(blur->tex[0].fbos[0], blur->tex[3].fbos[0], 0, 0, 32, 18, 0, 0, 32, 18, GL_COLOR_BUFFER_BIT, GL_LINEAR); diff --git a/src/CRE/post_process/dof.c b/src/CRE/post_process/dof.cpp similarity index 90% rename from src/CRE/post_process/dof.c rename to src/CRE/post_process/dof.cpp index 45e5eadb..c012394b 100644 --- a/src/CRE/post_process/dof.c +++ b/src/CRE/post_process/dof.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "dof.h" +#include "dof.hpp" #include "../../KKdLib/str_utils.h" #include "../gl_state.h" -#include "../rob.h" +#include "../rob.hpp" struct post_process_dof_shader_data { vec4 g_depth_params; @@ -619,23 +619,33 @@ static void post_process_dof_update_data(post_process_dof* dof, float_t min_dist static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat); -post_process_dof* post_process_dof_init() { - post_process_dof* dof = force_malloc_s(post_process_dof, 1); - post_process_dof_load_shaders(dof); - return dof; + +post_process_dof::post_process_dof() { + post_process_dof_load_shaders(this); } -void post_process_apply_dof(post_process_dof* dof, - render_texture* rt, GLuint* samplers, camera* cam) { - if (!dof) +post_process_dof::~post_process_dof() { + if (!this) + return; + + post_process_dof_free_fbo(this); + + for (int32_t i = 0; i < 9; i++) { + glDeleteProgram(program[i]); + program[i] = 0; + } +} + +void post_process_dof::apply(render_texture* rt, GLuint* samplers, camera* cam) { + if (!this) return; bool use_dof_f2 = false; - if (dof->data.debug.flags & DOF_DEBUG_USE_UI_PARAMS) { - if (dof->data.debug.flags & DOF_DEBUG_ENABLE_DOF) { - if (dof->data.debug.flags & DOF_DEBUG_ENABLE_PHYS_DOF) { - float_t dist_to_focus = dof->data.debug.distance_to_focus; - if (dof->data.debug.flags & DOF_DEBUG_AUTO_FOCUS) { + if (data.debug.flags & DOF_DEBUG_USE_UI_PARAMS) { + if (data.debug.flags & DOF_DEBUG_ENABLE_DOF) { + if (data.debug.flags & DOF_DEBUG_ENABLE_PHYS_DOF) { + float_t dist_to_focus = data.debug.distance_to_focus; + if (data.debug.flags & DOF_DEBUG_AUTO_FOCUS) { rob_chara* rob_chr = 0; for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { rob_chara* rob_chr = rob_chara_array_get(i); @@ -657,91 +667,119 @@ void post_process_apply_dof(post_process_dof* dof, } dist_to_focus = max(dist_to_focus, (float_t)cam->min_distance); - post_process_apply_dof_physical(dof, rt, samplers, + post_process_apply_dof_physical(this, rt, samplers, rt->color_texture->tex, rt->depth_texture->tex, (float_t)cam->min_distance, (float_t)cam->max_distance, dist_to_focus, - dof->data.debug.focal_length, (float_t)cam->fov_rad, dof->data.debug.f_number); + data.debug.focal_length, (float_t)cam->fov_rad, data.debug.f_number); } else { - float_t fuzzing_range = max(dof->data.debug.f2.fuzzing_range, 0.01f); - post_process_apply_dof_f2(dof, rt, samplers, + float_t fuzzing_range = max(data.debug.f2.fuzzing_range, 0.01f); + post_process_apply_dof_f2(this, rt, samplers, rt->color_texture->tex, rt->depth_texture->tex, (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov_rad, - dof->data.debug.f2.distance_to_focus, dof->data.debug.f2.focus_range, - fuzzing_range, dof->data.debug.f2.ratio); + data.debug.f2.distance_to_focus, data.debug.f2.focus_range, + fuzzing_range, data.debug.f2.ratio); use_dof_f2 = true; } } } - else if (dof->data.pv.enable && dof->data.pv.f2.ratio > 0.0f) { - float_t fuzzing_range = max(dof->data.pv.f2.fuzzing_range, 0.01f); - post_process_apply_dof_f2(dof, rt, samplers, + else if (data.pv.enable && data.pv.f2.ratio > 0.0f) { + float_t fuzzing_range = max(data.pv.f2.fuzzing_range, 0.01f); + post_process_apply_dof_f2(this, rt, samplers, rt->color_texture->tex, rt->depth_texture->tex, (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov_rad, - dof->data.pv.f2.distance_to_focus, dof->data.pv.f2.focus_range, - fuzzing_range, dof->data.pv.f2.ratio); - enum_or(dof->data.debug.flags, DOF_DEBUG_ENABLE_DOF); - dof->data.debug.f2.distance_to_focus = dof->data.pv.f2.distance_to_focus; - dof->data.debug.f2.focus_range = dof->data.pv.f2.focus_range; - dof->data.debug.f2.fuzzing_range = dof->data.pv.f2.fuzzing_range; - dof->data.debug.f2.ratio = dof->data.pv.f2.ratio; - use_dof_f2 = true; ; + data.pv.f2.distance_to_focus, data.pv.f2.focus_range, + fuzzing_range, data.pv.f2.ratio); + enum_or(data.debug.flags, DOF_DEBUG_ENABLE_DOF); + data.debug.f2 = data.pv.f2; + use_dof_f2 = true; } else - enum_and(dof->data.debug.flags, ~DOF_DEBUG_ENABLE_DOF); + enum_and(data.debug.flags, ~DOF_DEBUG_ENABLE_DOF); } -void post_process_dof_init_fbo(post_process_dof* dof, int32_t width, int32_t height) { - if (!dof || (dof->width == width && dof->height == height)) +void post_process_dof::init_fbo(int32_t width, int32_t height) { + if (!this || (width == width && height == height)) return; - dof->width = width; - dof->height = height; + if (textures[0]) { + glDeleteTextures(6, textures); + textures[0] = 0; + } + + if (ubo[0]) { + glDeleteBuffers(2, ubo); + ubo[0] = 0; + } + + if (vao) { + glDeleteVertexArrays(1, &vao); + vao = 0; + } + + this->width = width; + this->height = height; int32_t w20 = max(width / 20, 1); int32_t h20 = max(height / 20, 1); int32_t w2 = max(width / 2, 1); int32_t h2 = max(height / 2, 1); - glGenTextures(6, dof->textures); - gl_state_bind_texture_2d(dof->textures[0]); + glGenTextures(6, textures); + gl_state_bind_texture_2d(textures[0]); glTexStorage2D(GL_TEXTURE_2D, 1, GL_RG16F, w20, h20); - fbo_init(&dof->fbo[0], w20, h20, &dof->textures[0], 1, 0); - gl_state_bind_texture_2d(dof->textures[1]); + fbo[0] = ::fbo(w20, h20, &textures[0], 1, 0); + gl_state_bind_texture_2d(textures[1]); glTexStorage2D(GL_TEXTURE_2D, 1, GL_RG16F, w20, h20); - fbo_init(&dof->fbo[1], w20, h20, &dof->textures[1], 1, 0); - gl_state_bind_texture_2d(dof->textures[2]); + fbo[1] = ::fbo(w20, h20, &textures[1], 1, 0); + gl_state_bind_texture_2d(textures[2]); glTexStorage2D(GL_TEXTURE_2D, 1, GL_R11F_G11F_B10F, w2, h2); - gl_state_bind_texture_2d(dof->textures[3]); + gl_state_bind_texture_2d(textures[3]); glTexStorage2D(GL_TEXTURE_2D, 1, GL_R11F_G11F_B10F, w2, h2); - fbo_init(&dof->fbo[2], w2, h2, &dof->textures[2], 2, 0); - gl_state_bind_texture_2d(dof->textures[4]); + fbo[2] = ::fbo(w2, h2, &textures[2], 2, 0); + gl_state_bind_texture_2d(textures[4]); glTexStorage2D(GL_TEXTURE_2D, 1, GL_R11F_G11F_B10F, w2, h2); - gl_state_bind_texture_2d(dof->textures[5]); + gl_state_bind_texture_2d(textures[5]); glTexStorage2D(GL_TEXTURE_2D, 1, GL_R8, w2, h2); - fbo_init(&dof->fbo[3], w2, h2, &dof->textures[4], 2, 0); + fbo[3] = ::fbo(w2, h2, &textures[4], 2, 0); - glGenBuffers(2, dof->ubo); - gl_state_bind_uniform_buffer(dof->ubo[0]); + glGenBuffers(2, ubo); + gl_state_bind_uniform_buffer(ubo[0]); glBufferData(GL_UNIFORM_BUFFER, sizeof(post_process_dof_shader_data), 0, GL_STREAM_DRAW); uint8_t data[align_val(sizeof(vec2[49]), sizeof(vec4))]; memset(data, 0, sizeof(data)); post_process_dof_calculate_texcoords((vec2*)data, 3.0); - gl_state_bind_uniform_buffer(dof->ubo[1]); + gl_state_bind_uniform_buffer(ubo[1]); glBufferData(GL_UNIFORM_BUFFER, sizeof(data), data, GL_STATIC_DRAW); - glGenVertexArrays(1, &dof->vao); + glGenVertexArrays(1, &vao); } -void post_process_dof_dispose(post_process_dof* dof) { - if (!dof) - return; +void post_process_dof::initialize_data(dof_debug* debug, dof_pv* pv) { + set_dof_debug(debug); + set_dof_pv(pv); +} - post_process_dof_free_fbo(dof); +void post_process_dof::get_dof_debug(dof_debug* debug) { + if (debug) + *debug = data.debug; +} - for (int32_t i = 0; i < 9; i++) { - glDeleteProgram(dof->program[i]); - dof->program[i] = 0; - } - free(dof); +void post_process_dof::set_dof_debug(dof_debug* debug) { + if (debug) + data.debug = *debug; + else + data.debug = dof_debug_default; +} + +void post_process_dof::get_dof_pv(dof_pv* pv) { + if (pv) + *pv = data.pv; +} + +void post_process_dof::set_dof_pv(dof_pv* pv) { + if (pv) + data.pv = *pv; + else + data.pv = dof_pv_default; } static void post_process_apply_dof_f2(post_process_dof* dof, render_texture* rt, @@ -794,7 +832,7 @@ static void post_process_apply_dof_physical(post_process_dof* dof, render_textur static void post_process_apply_dof_steps_1_2(post_process_dof* dof, GLuint* samplers, GLuint depth_texture, bool f2) { - gl_state_bind_framebuffer(dof->fbo[0].fbo); + gl_state_bind_framebuffer(dof->fbo[0].buffer); glViewport(0, 0, dof->fbo[0].width, dof->fbo[0].height); if (f2) gl_state_use_program(dof->program[5]); @@ -805,7 +843,7 @@ static void post_process_apply_dof_steps_1_2(post_process_dof* dof, gl_state_bind_sampler(0, samplers[1]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); - gl_state_bind_framebuffer(dof->fbo[1].fbo); + gl_state_bind_framebuffer(dof->fbo[1].buffer); glViewport(0, 0, dof->fbo[1].width, dof->fbo[1].height); gl_state_use_program(dof->program[0]); gl_state_active_bind_texture_2d(0, dof->textures[0]); @@ -815,7 +853,7 @@ static void post_process_apply_dof_steps_1_2(post_process_dof* dof, static void post_process_apply_dof_step_3(post_process_dof* dof, GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { - gl_state_bind_framebuffer(dof->fbo[2].fbo); + gl_state_bind_framebuffer(dof->fbo[2].buffer); glViewport(0, 0, dof->fbo[2].width, dof->fbo[2].height); if (f2) gl_state_use_program(dof->program[6]); @@ -832,7 +870,7 @@ static void post_process_apply_dof_step_3(post_process_dof* dof, } static void post_process_apply_dof_step_4(post_process_dof* dof, GLuint* samplers, bool f2) { - gl_state_bind_framebuffer(dof->fbo[3].fbo); + gl_state_bind_framebuffer(dof->fbo[3].buffer); glViewport(0, 0, dof->fbo[3].width, dof->fbo[3].height); if (f2) gl_state_use_program(dof->program[7]); @@ -921,10 +959,10 @@ static void post_process_dof_calculate_texcoords(vec2* data, float_t size) { } static void post_process_dof_free_fbo(post_process_dof* dof) { - fbo_free(&dof->fbo[0]); - fbo_free(&dof->fbo[1]); - fbo_free(&dof->fbo[2]); - fbo_free(&dof->fbo[3]); + dof->fbo[0]; + dof->fbo[1]; + dof->fbo[2]; + dof->fbo[3]; if (dof->vao) { glDeleteVertexArrays(1, &dof->vao); @@ -1062,31 +1100,3 @@ static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat) { *mat = rob_chr->data.field_1E68.field_78[a2]; } -void post_process_dof_initialize_data(post_process_dof* dof, dof_debug* debug, dof_pv* pv) { - post_process_dof_set_dof_debug(dof, debug); - post_process_dof_set_dof_pv(dof, pv); -} - -inline void post_process_dof_get_dof_debug(post_process_dof* dof, dof_debug* debug) { - if (debug) - *debug = dof->data.debug; -} - -inline void post_process_dof_set_dof_debug(post_process_dof* dof, dof_debug* debug) { - if (debug) - dof->data.debug = *debug; - else - dof->data.debug = dof_debug_default; -} - -inline void post_process_dof_get_dof_pv(post_process_dof* dof, dof_pv* pv) { - if (pv) - *pv = dof->data.pv; -} - -inline void post_process_dof_set_dof_pv(post_process_dof* dof, dof_pv* pv) { - if (pv) - dof->data.pv = *pv; - else - dof->data.pv = dof_pv_default; -} diff --git a/src/CRE/post_process/dof.h b/src/CRE/post_process/dof.hpp similarity index 55% rename from src/CRE/post_process/dof.h rename to src/CRE/post_process/dof.hpp index 90f25ff5..d3c8ab1d 100644 --- a/src/CRE/post_process/dof.h +++ b/src/CRE/post_process/dof.hpp @@ -8,7 +8,7 @@ #include "../../KKdLib/default.h" #include "../../KKdLib/vec.h" #include "../camera.h" -#include "../fbo.h" +#include "../fbo.hpp" #include "../render_texture.h" #include "../shared.h" @@ -49,21 +49,19 @@ struct post_process_dof { int32_t width; int32_t height; GLuint textures[6]; - fbo_struct fbo[4]; + fbo fbo[4]; GLuint vao; GLuint program[9]; GLuint ubo[2]; + + post_process_dof(); + virtual ~post_process_dof(); + + void apply(render_texture* rt, GLuint* samplers, camera* cam); + void init_fbo(int32_t width, int32_t height); + void initialize_data(dof_debug* debug, dof_pv* pv); + void get_dof_debug(dof_debug* debug); + void set_dof_debug(dof_debug* debug); + void get_dof_pv(dof_pv* pv); + void set_dof_pv(dof_pv* pv); }; - -extern post_process_dof* post_process_dof_init(); -extern void post_process_apply_dof(post_process_dof* dof, - render_texture* rt, GLuint* samplers, camera* cam); -extern void post_process_dof_init_fbo(post_process_dof* dof, - int32_t width, int32_t height); -extern void post_process_dof_dispose(post_process_dof* dof); - -extern void post_process_dof_initialize_data(post_process_dof* dof, dof_debug* debug, dof_pv* pv); -extern void post_process_dof_get_dof_debug(post_process_dof* dof, dof_debug* debug); -extern void post_process_dof_set_dof_debug(post_process_dof* dof, dof_debug* debug); -extern void post_process_dof_get_dof_pv(post_process_dof* dof, dof_pv* pv); -extern void post_process_dof_set_dof_pv(post_process_dof* dof, dof_pv* pv); diff --git a/src/CRE/post_process/exposure.c b/src/CRE/post_process/exposure.c index 14dd614e..f62b1166 100644 --- a/src/CRE/post_process/exposure.c +++ b/src/CRE/post_process/exposure.c @@ -4,10 +4,10 @@ */ #include "exposure.h" -#include "../fbo.h" +#include "../fbo.hpp" #include "../gl_state.h" -#include "../post_process.h" -#include "../rob.h" +#include "../post_process.hpp" +#include "../rob.hpp" #include "../shader_ft.h" struct struc_188 { diff --git a/src/CRE/post_process/tone_map.c b/src/CRE/post_process/tone_map.c index e1bb844e..8d5015cb 100644 --- a/src/CRE/post_process/tone_map.c +++ b/src/CRE/post_process/tone_map.c @@ -4,9 +4,9 @@ */ #include "tone_map.h" -#include "../fbo.h" +#include "../fbo.hpp" #include "../gl_state.h" -#include "../post_process.h" +#include "../post_process.hpp" #include "../shader_ft.h" static void post_process_tone_map_free_fbo(post_process_tone_map* tm); @@ -100,7 +100,7 @@ void post_process_apply_tone_map(post_process_tone_map* tm, glBindTexture(GL_TEXTURE_1D, 0); uniform_value[U16] = 1; - fbo_blit(buf_rt->fbos[0], rt->fbos[0], + fbo::blit(buf_rt->fbos[0], rt->fbos[0], 0, 0, buf_rt->color_texture->width, buf_rt->color_texture->height, 0, 0, rt->color_texture->width, rt->color_texture->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); } diff --git a/src/CRE/post_process/tone_map.h b/src/CRE/post_process/tone_map.h index f97fa579..7aa33f7d 100644 --- a/src/CRE/post_process/tone_map.h +++ b/src/CRE/post_process/tone_map.h @@ -6,7 +6,7 @@ #pragma once #include "../../KKdLib/default.h" -#include "../../KKdLib/light_param/glow.h" +#include "../../KKdLib/light_param/glow.hpp" #include "../../KKdLib/vec.h" #include "../shared.h" #include "../render_texture.h" diff --git a/src/CRE/random.c b/src/CRE/random.c deleted file mode 100644 index 38537d08..00000000 --- a/src/CRE/random.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "random.h" - -const int32_t MSEED = 0x09A4EC86; - -random* random_init(int32_t seed) { - random* r = force_malloc_s(random, 1); - - int32_t ii; - int32_t mj, mk; - - int32_t subtraction = (seed == INT32_MIN) ? INT32_MAX : (int32_t)abs(seed); - mj = MSEED - subtraction; - r->seed_array[55] = mj; - mk = 1; - for (int32_t i = 1; i < 55; i++) { - ii = (21 * i) % 55; - r->seed_array[ii] = mk; - mk = mj - mk; - if (mk < 0) - mk += INT32_MAX; - mj = r->seed_array[ii]; - } - - for (int32_t k = 1; k < 5; k++) - for (int32_t i = 1; i < 56; i++) { - r->seed_array[i] -= r->seed_array[1 + (i + 30) % 55]; - if (r->seed_array[i] < 0) - r->seed_array[i] += INT32_MAX; - } - - r->inext = 0; - r->inextp = 21; - seed = 1; - return r; -} - -int32_t random_next(random* r) { - int32_t ret_val; - int32_t temp_inext = r->inext; - int32_t temp_inextp = r->inextp; - - if (++temp_inext >= 56) - temp_inext = 1; - if (++temp_inextp >= 56) - temp_inextp = 1; - - ret_val = r->seed_array[temp_inext] - r->seed_array[temp_inextp]; - - if (ret_val == INT32_MAX) - ret_val--; - if (ret_val < 0) - ret_val += INT32_MAX; - - r->seed_array[temp_inext] = ret_val; - - r->inext = temp_inext; - r->inextp = temp_inextp; - - return ret_val; -} - -double_t random_next_double(random* r) { - return (double_t)random_next(r) / (double_t)INT32_MAX; -} - -void random_dispose(random* r) { - free(r); -} diff --git a/src/CRE/random.cpp b/src/CRE/random.cpp new file mode 100644 index 00000000..fd26cc80 --- /dev/null +++ b/src/CRE/random.cpp @@ -0,0 +1,59 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "random.hpp" + +static RandState* rand_state_array; + +RandState::RandState() { + +} + +RandState::~RandState() { + +} + +inline void rand_state_array_init() { + rand_state_array = new RandState[5]; +} + +inline RandState* rand_state_array_get(int32_t id) { + if (id > -1 && id < 5) + return &rand_state_array[id]; + return 0; +} + +inline float_t rand_state_array_get_float(int32_t id) { + RandState* rand_state = rand_state_array_get(id); + if (rand_state) { + std::uniform_int_distribution dis; + return (float_t)(dis(rand_state->mt) >> 8) * (float_t)(1.0 / (double_t)0x1000000); + } + return 0.0f; +} + +inline uint32_t rand_state_array_get_int(int32_t id) { + RandState* rand_state = rand_state_array_get(id); + if (rand_state) { + std::uniform_int_distribution dis; + return dis(rand_state->mt); + } + return 0; +} + +inline uint32_t rand_state_array_get_int(uint32_t min, uint32_t max, int32_t id) { + uint64_t _min = min; + uint64_t _max = max; + RandState* rand_state = rand_state_array_get(id); + if (rand_state && min <= max) { + std::uniform_int_distribution dis; + return (uint32_t)(_min + (((_max - _min + 1) * (uint64_t)dis(rand_state->mt)) >> 32)); + } + return 0; +} + +inline void rand_state_array_free() { + delete[] rand_state_array; +} diff --git a/src/CRE/random.h b/src/CRE/random.h deleted file mode 100644 index ca934d26..00000000 --- a/src/CRE/random.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../KKdLib/default.h" - -struct random { - int32_t inext; - int32_t inextp; - int32_t seed_array[56]; -}; - -random* random_init(int32_t seed); -int32_t random_next(random* r); -double_t random_next_double(random* r); -void random_dispose(random* r); diff --git a/src/CRE/random.hpp b/src/CRE/random.hpp new file mode 100644 index 00000000..e6067805 --- /dev/null +++ b/src/CRE/random.hpp @@ -0,0 +1,23 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../KKdLib/default.h" +#include + +struct RandState { + std::mt19937 mt; + + RandState(); + virtual ~RandState(); +}; + +extern void rand_state_array_init(); +extern RandState* rand_state_array_get(int32_t id); +extern float_t rand_state_array_get_float(int32_t id); +extern uint32_t rand_state_array_get_int(int32_t id); +extern uint32_t rand_state_array_get_int(uint32_t min, uint32_t max, int32_t id); +extern void rand_state_array_free(); diff --git a/src/CRE/render_context.c b/src/CRE/render_context.cpp similarity index 99% rename from src/CRE/render_context.c rename to src/CRE/render_context.cpp index 03d0360a..7010db23 100644 --- a/src/CRE/render_context.c +++ b/src/CRE/render_context.cpp @@ -3,14 +3,14 @@ GitHub/GitLab: korenkonder */ -#include "render_context.h" +#include "render_context.hpp" #include "Glitter/glitter.hpp" #include "draw_pass.h" #include "draw_task.h" -#include "file_handler.h" -#include "rob.h" +#include "file_handler.hpp" +#include "rob.hpp" #include "shader_ft.h" -#include "stage.h" +#include "stage.hpp" float_t delta_frame_history = 0; int32_t delta_frame_history_int = 0; diff --git a/src/CRE/render_context.h b/src/CRE/render_context.hpp similarity index 98% rename from src/CRE/render_context.h rename to src/CRE/render_context.hpp index 7171d93e..28adca80 100644 --- a/src/CRE/render_context.h +++ b/src/CRE/render_context.hpp @@ -11,16 +11,16 @@ #include "light_param/face.h" #include "light_param/fog.h" #include "light_param/light.h" -#include "light_param/wind.h" -#include "light_param.h" +#include "light_param/wind.hpp" +#include "light_param.hpp" #include "camera.h" -#include "data.h" +#include "data.hpp" #include "gl_state.h" -#include "light_param.h" -#include "object.h" -#include "post_process.h" +#include "light_param.hpp" +#include "object.hpp" +#include "post_process.hpp" #include "render_texture.h" -#include "task.h" +#include "task.hpp" #include "time.h" #include "timer.h" #include "static_var.h" diff --git a/src/CRE/render_texture.c b/src/CRE/render_texture.c index d8b1e36d..60a9fbfa 100644 --- a/src/CRE/render_texture.c +++ b/src/CRE/render_texture.c @@ -5,7 +5,7 @@ #include "render_texture.h" #include "gl_state.h" -#include "texture.h" +#include "texture.hpp" static shader_glsl render_texture_shader; static GLuint render_texture_vao, render_texture_vbo; diff --git a/src/CRE/render_texture.h b/src/CRE/render_texture.h index 3bad323a..2069f998 100644 --- a/src/CRE/render_texture.h +++ b/src/CRE/render_texture.h @@ -8,7 +8,7 @@ #include "shared.h" #include "shader.h" #include "shader_glsl.h" -#include "texture.h" +#include "texture.hpp" struct render_texture { texture* color_texture; diff --git a/src/CRE/rob.c b/src/CRE/rob.cpp similarity index 76% rename from src/CRE/rob.c rename to src/CRE/rob.cpp index ba38ed30..6e54ae4b 100644 --- a/src/CRE/rob.c +++ b/src/CRE/rob.cpp @@ -3,25 +3,70 @@ GitHub/GitLab: korenkonder */ -#include "rob.h" -#include "data.h" +#include "rob.hpp" +#include "data.hpp" #include "draw_task.h" -#include "../KKdLib/key_val.h" +#include "../KKdLib/key_val.hpp" #include "../KKdLib/str_utils.h" +#include "random.hpp" -vector_old_func(bone_data) -vector_old_func(ex_data_name_bone_index) -vector_old_func(mot_key_set) - +#define OSG_SET_TEXT_BUF_SIZE 0x400 #define SKP_TEXT_BUF_SIZE 0x400 -struct motion_storage { - uint32_t set_id; - int32_t count; - mot_set set; +struct MotFile { + motion_set_info* mot_set_info; + mot_set* mot_set; + p_file_handler file_handler; + int32_t load_count; - motion_storage(); - ~motion_storage(); + MotFile(); + virtual ~MotFile(); + + bool CheckNotReady(); + void FreeData(); + void LoadFile(std::string* mdata_dir, uint32_t set); + void ParseFile(void* data, size_t size); + bool Unload(); + + static void ParseFileParent(void* data, void* file_data, size_t size); +}; + +struct MhdFile { + mothead* data; + uint32_t set; + std::string file_path; + p_file_handler file_handler; + int32_t load_count; + + MhdFile(); + virtual ~MhdFile(); + + bool CheckNotReady(); + void FreeData(); + void LoadFile(const char* path, const char* file, uint32_t set); + void ParseFile(void* data); + mothead* ParseMothead(mothead_file* mhdsf, size_t data); + mothead_mot* ParseMotheadMot(mothead_mot_file* mhdsf, size_t data); + bool Unload(); + + static void ParseFileParent(void* data, void* file_data, size_t size); +}; + +struct osage_setting { + std::map, osage_setting_osg_cat> cat; + std::map obj; + + osage_setting(); + ~osage_setting(); + + void parse(key_val* kv); + rob_osage_parts parse_parts_string(std::string* s); +}; + +struct struc_380 { + rob_chara* rob_chara; + rob_chara_data* rob_chara_data; + struc_223* field_10; }; struct exp_func_op1 { @@ -39,6 +84,22 @@ struct exp_func_op3 { float_t(*func)(float_t v1, float_t v2, float_t v3); }; +struct mothead_func_data { + rob_chara* rob_chr; + rob_chara_data* rob_chr_data; + rob_chara_data* field_10; + rob_chara* field_18; + rob_chara_data* field_20; + struc_223* field_28; +}; + +typedef void(*mothead_func)(mothead_func_data*, void*, const mothead_data*, int32_t, motion_database*); + +struct mothead_func_struct { + mothead_func func; + int32_t flags; +}; + struct rob_cmn_mottbl_sub_header { int32_t data_offset; int32_t field_4; @@ -164,6 +225,47 @@ struct RobThreadHandler { void sub_14054E3F0(); }; +struct struc_461 { + p_file_handler* file_handler; + item_id id; + int32_t field_C; + std::vector* field_10; + rob_chara* rob_chr; +}; + +struct struc_462 { + rob_chara* rob_chr; + int32_t pv_id; + int32_t motion_id; + std::string name; + int32_t frame; + + struc_462(); + ~struc_462(); +}; + +struct SkinParamManager : public Task { + int32_t state; + uint8_t index; + std::vector field_70; + std::map>, std::vector*> field_88; + std::map>, std::vector*> field_98; + std::map>, std::vector*> field_A8; + std::list field_B8; + + SkinParamManager(); + virtual ~SkinParamManager() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + + void Reset(); + + void sub_14060FBD0(); + bool sub_1406112F0(); +}; + class TaskRobLoad : public Task { public: bool field_68; @@ -385,8 +487,6 @@ static void bone_data_parent_data_init(bone_data_parent* bone, static void bone_data_parent_load_bone_database(bone_data_parent* bone, std::vector* bones, vec3* common_translation, vec3* translation); static void bone_data_parent_load_rob_chara(bone_data_parent* bone); -static void bone_data_parent_reset(bone_data_parent* bone); -static void bone_data_parent_free(bone_data_parent* bone); static void bone_node_expression_data_mat_set(bone_node_expression_data* data, vec3* parent_scale, mat4* ex_data_mat, mat4* mat); @@ -441,8 +541,8 @@ static float_t exp_tan(float_t v1); static const float_t get_osage_gravity_const(); -static void mot_blend_interpolate(mot_blend* a1, vector_old_bone_data* bones, - vector_old_uint16_t* bone_indices, bone_database_skeleton_type skeleton_type); +static void mot_blend_interpolate(mot_blend* a1, std::vector* bones, + std::vector* bone_indices, bone_database_skeleton_type skeleton_type); static void mot_blend_load_motion(mot_blend* a1, int32_t motion_id, motion_database* mot_db); static void mot_blend_reset(mot_blend* a1); static void mot_blend_set_duration(mot_blend* a1, float_t duration, float_t step, float_t offset); @@ -451,7 +551,7 @@ static void mot_blend_set_frame(mot_blend* a1, float_t frame); static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, mot_key_set* a4, uint32_t key_set_count, struc_369* a6); static uint32_t mot_load_last_key_calc(uint16_t keys_count); -static bool mot_data_load_file(mot* a1, mot_data* a2); +static bool mot_data_load_file(mot* a1, const mot_data* a2); static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, std::vector* a2); @@ -460,15 +560,176 @@ static void mot_key_data_init_key_sets(mot_key_data* a1, bone_database_skeleton_ size_t motion_bone_count, size_t ik_bone_count); static void mot_key_data_interpolate(mot_key_data* a1, float_t frame, uint32_t key_set_offset, uint32_t key_set_count); -static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, motion_database* mot_db); +static const mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, motion_database* mot_db); static void mot_key_data_reserve_key_sets(mot_key_data* a1); -static void mot_key_data_reset(mot_key_data* key_data); -static void mot_key_data_free(mot_key_data* a1); static void mot_play_data_reset(mot_play_data* play_data); static void mot_play_frame_data_reset(mot_play_frame_data* frame_data); static void mot_play_frame_data_set_frame(mot_play_frame_data* a1, float_t frame); +static void mothead_func_0(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_1(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_2(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_3(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_4(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_5(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_6(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_7(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_8(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_9(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_10(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_11(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_12(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_13(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_14(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_15(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_16(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_17(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_18(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_19(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_20(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_21(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_22(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_23(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_24(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_25(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_26(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_27(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_28(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_29(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_30(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_31(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_32(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_33(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_34(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_35(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_36(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_37(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_38(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_39(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_40(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_41(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_42(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_43(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_44(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_45(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_46(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_47(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_48(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_49(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_50_set_face_motion_id(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_51(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_52(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_53_set_face_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_54_set_hand_r_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_55_set_hand_l_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_56_set_mouth_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_57_set_eyes_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_58_set_eyelid_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_59_set_rob_chara_head_object(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_60(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_61_set_eyelid_motion_from_face(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_62_rob_parts_adjust(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_63(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_64_osage_reset(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_65_motion_skin_param(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_66_osage_step(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_67(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_68(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_69(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_70(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_71_osage_move_cancel(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_72(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_73_hand_adjust(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_74(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_75(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_76(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_77(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_78(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_79_rob_chara_coli_ring(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); +static void mothead_func_80_adjust_get_global_trans(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db); + static void motion_blend_mot_interpolate(motion_blend_mot* a1); static void motion_blend_mot_load_bone_data(motion_blend_mot* a1, rob_chara_bone_data* a2, bool(*bone_check_func)(motion_bone_index), bone_database* bone_data); @@ -477,6 +738,8 @@ static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, MotionBlendType blend_type, float_t blend, bone_database* bone_data, motion_database* mot_db); static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* mat); static void motion_blend_mot_reset(motion_blend_mot* mot_blend_mot); +static void motion_blend_mot_set_blend(motion_blend_mot* a1, + MotionBlendType blend_type, float_t blend); static void motion_blend_mot_set_duration(motion_blend_mot* mot, float_t duration, float_t step, float_t offset); @@ -488,6 +751,10 @@ static void osage_coli_ring_set(osage_coli* osg_coli, static void osage_play_data_manager_get_opd_file_data(object_info obj_info, int32_t motion_id, float_t** data, uint32_t* count); +static const osage_setting_osg_cat* osage_setting_data_get_cat_value( + object_info* obj_info, const char* root_node); +static bool osage_setting_data_obj_has_key(object_info key); + static bool pv_osage_manager_array_get_disp(int32_t* chara_id); static PvOsageManager* pv_osage_manager_array_ptr_get(int32_t chara_id); static void pv_osage_manager_array_ptr_set_not_reset_true(); @@ -516,7 +783,7 @@ static void rob_chara_bone_data_get_ik_scale( 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_old_bone_data* vec_bone_data, + rob_chara_bone_data_ik_scale* ik_scale, std::vector* vec_bone_data, bone_database_skeleton_type base_skeleton_type, bone_database_skeleton_type skeleton_type, bone_database* bone_data); static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, @@ -633,7 +900,7 @@ static bone_node* rob_chara_item_equip_object_get_bone_node_by_name( 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_ex_data_bone_nodes( - rob_chara_item_equip_object* itm_eq_obj, obj_skin_ex_data* a2); + rob_chara_item_equip_object* itm_eq_obj, obj_skin_ex_data* ex_data); static void rob_chara_item_equip_object_init_members(rob_chara_item_equip_object* itm_eq_obj, size_t index = 0xDEADBEEF); static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object* itm_eq_obj, obj_skin_ex_data* ex_data, bone_database* bone_data, void* data, object_database* obj_db); @@ -689,6 +956,9 @@ static void rob_chara_load_default_motion(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db); static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skeleton_select, int32_t motion_id, bone_database* bone_data, motion_database* mot_db); + +static void rob_chara_set_parts_adjust(rob_chara* rob_chr, rob_chara_data_parts_adjust* parts_adjust_new, + rob_chara_data_parts_adjust* parts_adjust, rob_chara_data_parts_adjust* parts_adjust_prev); static void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, chara_index chara_index, int32_t module_index, rob_chara_pv_data* pv_data); @@ -720,8 +990,6 @@ static void rob_osage_set_skp_osg_nodes(rob_osage* rob_osg, static void rob_osage_set_yz_order(rob_osage* rob_osg, int32_t yz_order); static void rob_osage_free(rob_osage* rob_osg); -static bool skin_param_file_read(void* data, const char* path, const char* file, uint32_t hash); - static void skin_param_osage_node_parse(key_val* kv, const char* name, std::vector* a3, skin_param_osage_root* skp_root); @@ -730,7 +998,9 @@ static void skin_param_osage_root_parse(key_val* kv, const char* name, static bool task_rob_load_check_load_req_data(); -std::vector motion_storage_data; +std::map motion_storage_data; +std::map mothead_storage_data; +osage_setting osage_setting_data; rob_chara* rob_chara_array; rob_chara_pv_data* rob_chara_pv_data_array; @@ -742,9 +1012,12 @@ static bool rob_manager_rob_impls2_init = false; static PvOsageManager* pv_osage_manager_array_ptr; static rob_cmn_mottbl_header* rob_cmn_mottbl_data; static RobThreadHandler* rob_thread_handler; +static SkinParamManager* skin_param_manager; static TaskRobManager task_rob_manager; static TaskRobLoad task_rob_load; +static const mothead_mot mothead_mot_null; + static const exp_func_op1 exp_func_op1_array[] = { { "neg" , exp_neg }, { "sin" , exp_sin }, @@ -792,6 +1065,90 @@ static const exp_func_op3 exp_func_op3_array[] = { { 0 , 0 }, }; +static const mothead_func_struct mothead_func_array[] = { + { mothead_func_0 , 1 }, + { mothead_func_1 , 1 }, + { mothead_func_2 , 0 }, + { mothead_func_3 , 0 }, + { mothead_func_4 , 0 }, + { mothead_func_5 , 0 }, + { mothead_func_6 , 0 }, + { mothead_func_7 , 0 }, + { mothead_func_8 , 1 }, + { mothead_func_9 , 0 }, + { mothead_func_10, 0 }, + { mothead_func_11, 0 }, + { mothead_func_12, 0 }, + { mothead_func_13, 0 }, + { mothead_func_14, 0 }, + { mothead_func_15, 0 }, + { mothead_func_16, 0 }, + { mothead_func_17, 0 }, + { mothead_func_18, 0 }, + { mothead_func_19, 0 }, + { mothead_func_20, 0 }, + { mothead_func_21, 0 }, + { mothead_func_22, 0 }, + { mothead_func_23, 0 }, + { mothead_func_24, 0 }, + { mothead_func_25, 1 }, + { mothead_func_26, 0 }, + { mothead_func_27, 0 }, + { mothead_func_28, 0 }, + { mothead_func_29, 0 }, + { mothead_func_30, 0 }, + { mothead_func_31, 1 }, + { mothead_func_32, 0 }, + { mothead_func_33, 0 }, + { mothead_func_34, 0 }, + { mothead_func_35, 0 }, + { mothead_func_36, 0 }, + { mothead_func_37, 0 }, + { mothead_func_38, 0 }, + { mothead_func_39, 0 }, + { mothead_func_40, 0 }, + { mothead_func_41, 0 }, + { mothead_func_42, 0 }, + { mothead_func_43, 0 }, + { mothead_func_44, 0 }, + { mothead_func_45, 0 }, + { mothead_func_46, 0 }, + { mothead_func_47, 0 }, + { mothead_func_48, 0 }, + { mothead_func_49, 0 }, + { mothead_func_50_set_face_motion_id, 0 }, + { mothead_func_51, 0 }, + { mothead_func_52, 0 }, + { mothead_func_53_set_face_mottbl_motion, 0 }, + { mothead_func_54_set_hand_r_mottbl_motion, 0 }, + { mothead_func_55_set_hand_l_mottbl_motion, 0 }, + { mothead_func_56_set_mouth_mottbl_motion, 0 }, + { mothead_func_57_set_eyes_mottbl_motion, 0 }, + { mothead_func_58_set_eyelid_mottbl_motion, 0 }, + { mothead_func_59_set_rob_chara_head_object, 0 }, + { mothead_func_60, 0 }, + { mothead_func_61_set_eyelid_motion_from_face, 0 }, + { mothead_func_62_rob_parts_adjust, 0 }, + { mothead_func_63, 0 }, + { mothead_func_64_osage_reset, 0 }, + { mothead_func_65_motion_skin_param, 0 }, + { mothead_func_66_osage_step, 0 }, + { mothead_func_67, 0 }, + { mothead_func_68, 0 }, + { mothead_func_69, 0 }, + { mothead_func_70, 0 }, + { mothead_func_71_osage_move_cancel, 0 }, + { mothead_func_72, 0 }, + { mothead_func_73_hand_adjust, 0 }, + { mothead_func_74, 0 }, + { mothead_func_75, 0 }, + { mothead_func_76, 0 }, + { mothead_func_77, 0 }, + { mothead_func_78, 0 }, + { mothead_func_79_rob_chara_coli_ring, 0 }, + { mothead_func_80_adjust_get_global_trans, 0 }, +}; + static const struc_218 stru_140A24B50[] = { { { 0.02f , -0.005f, 0.0f }, 0.09f , 0xAB, 0 }, { { 0.17f , -0.02f , 0.03f }, 0.09f , 0x05, 1 }, @@ -1691,57 +2048,142 @@ static const skeleton_rotation_offset skeleton_rotation_offset_array[] = { extern render_context* rctx_ptr; -chara_init_data* chara_init_data_get(chara_index chara_index) { +const chara_init_data* chara_init_data_get(chara_index chara_index) { if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) - return (chara_init_data*)&chara_init_data_array[chara_index]; + return &chara_init_data_array[chara_index]; return 0; } -void motion_set_load_motion(uint32_t set, std::string* motion_name, motion_database* mot_db) { - if (motion_storage_get_motion_set(set)) { - motion_storage_append_mot_set(set); - return; - } +int32_t chara_init_data_get_chara_size_index(chara_index chara_index) { + const chara_init_data* chara_init_data = chara_init_data_get(chara_index); + if (chara_init_data) + return chara_init_data->field_848.chara_size_index; + return 1; +} +float_t chara_size_table_get_value(uint32_t a1) { + static const float_t chara_size_table[] = { + 1.07f, 1.0f, 0.96f, 0.987f, 1.025f, 1.045f + }; + + if (a1 > 4) + return 1.0f; + else + return chara_size_table[a1]; +} + +float_t chara_pos_adjust_y_table_get_value(uint32_t a1) { + static const float_t chara_pos_adjust_y_table[] = { + 0.071732f, 0.0f, -0.03859f, 0.0f, 0.0f + }; + + if (a1 > 4) + return 0.0f; + else + return chara_pos_adjust_y_table[a1]; +} + +void motion_set_load_mothead(uint32_t set, std::string* mdata_dir, motion_database* mot_db) { motion_set_info* set_info = mot_db->get_motion_set_by_id(set); if (!set_info) return; - if (!motion_name) - motion_name = &set_info->name; + std::string file = "mothead_"; + file += set_info->name; + file += ".bin"; - string file; - string_init_length(&file, "mot_", 4); - string_add_length(&file, motion_name->c_str(), motion_name->size()); - string_add_length(&file, ".farc", 5); + std::string path = "rom/rob/"; + if (mdata_dir && rctx_ptr->data->check_file_exists(mdata_dir->c_str(), file.c_str())) + path = *mdata_dir; - mot_set_farc msf; - data_list[DATA_AFT].load_file(&msf, - "rom/rob/", string_data(&file), mot_set_farc::load_file); - if (msf.ready && msf.vec.size() > 0) - motion_storage_insert_motion_set(&msf.vec[0], set); + auto elem = mothead_storage_data.find(set); + if (elem == mothead_storage_data.end()) + elem = mothead_storage_data.insert({ set, {} }).first; - string_free(&file); + elem->second.LoadFile(path.c_str(), file.c_str(), set); +} + +void motion_set_load_motion(uint32_t set, std::string* mdata_dir, motion_database* mot_db) { + motion_set_info* set_info = mot_db->get_motion_set_by_id(set); + if (!set_info) + return; + + auto elem = motion_storage_data.find(set); + if (elem == motion_storage_data.end()) + elem = motion_storage_data.insert({ set, {} }).first; + + elem->second.mot_set_info = set_info; + elem->second.LoadFile(mdata_dir, set); } void motion_set_unload_motion(uint32_t set) { - motion_storage_delete_motion_set(set); + auto elem = motion_storage_data.find(set); + if (elem != motion_storage_data.end() && elem->second.Unload()) + motion_storage_data.erase(elem); +} + +void motion_set_unload_mothead(uint32_t set) { + auto elem = mothead_storage_data.find(set); + if (elem != mothead_storage_data.end() && elem->second.Unload()) + mothead_storage_data.erase(elem); } void pv_osage_manager_array_reset(int32_t chara_id) { pv_osage_manager_array_ptr_get(chara_id)->Reset(); } -void pv_osage_manager_array_ptr_init() { +void rob_init() { if (!pv_osage_manager_array_ptr) pv_osage_manager_array_ptr = new PvOsageManager[CHARA_MAX]; + + if (!rob_chara_array) + rob_chara_array = new rob_chara[ROB_CHARA_COUNT]; + + if (!rob_chara_pv_data_array) + rob_chara_pv_data_array = new rob_chara_pv_data[ROB_CHARA_COUNT]; + + { + p_file_handler rob_mot_tbl_file_handler; + rob_mot_tbl_file_handler.read_file(rctx_ptr->data, "rom/rob/", "rob_mot_tbl.bin"); + rob_mot_tbl_file_handler.set_read_free_func_data(0, rob_cmn_mottbl_read, 0); + rob_mot_tbl_file_handler.read_now(); + rob_mot_tbl_file_handler.free_data(); + } + + if (!rob_thread_handler) + rob_thread_handler = new RobThreadHandler; + + if (!skin_param_manager) + skin_param_manager = new SkinParamManager[ROB_CHARA_COUNT]; } -void pv_osage_manager_array_ptr_free() { +void rob_free() { if (pv_osage_manager_array_ptr) { delete[] pv_osage_manager_array_ptr; pv_osage_manager_array_ptr = 0; } + + if (rob_chara_array) { + delete[] rob_chara_array; + rob_chara_array = 0; + } + + if (rob_chara_pv_data_array) { + delete[] rob_chara_pv_data_array; + rob_chara_pv_data_array = 0; + } + + free(rob_cmn_mottbl_data); + + if (rob_thread_handler) { + delete rob_thread_handler; + rob_thread_handler = 0; + } + + if (skin_param_manager) { + delete[] skin_param_manager; + skin_param_manager = 0; + } } static void sub_1405EE878(ExNodeBlock* node) { @@ -1898,16 +2340,16 @@ static void sub_140509D30(rob_chara* rob_chr) { } } -mat4* rob_chara_get_bone_data_mat(rob_chara* chara, size_t index) { - return rob_chara_bone_data_get_mat(chara->bone_data, index); +mat4* rob_chara::get_bone_data_mat(size_t index) { + return rob_chara_bone_data_get_mat(bone_data, index); } -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::get_frame() { + return rob_chara_bone_data_get_frame(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); +float_t rob_chara::get_frame_count() { + return rob_chara_bone_data_get_frame_count(bone_data); } static int16_t sub_14054FE90(rob_chara* rob_chr, bool a3) { @@ -1918,54 +2360,11 @@ static int16_t sub_14054FE90(rob_chara* rob_chr, bool a3) { return v3 + v4; } - if (rob_chr->data.field_1588.field_20.field_0 & 0x100) - return v3 + rob_chr->data.field_1588.field_274; + if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x100) + return v3 + rob_chr->data.field_1588.field_0.field_274; return v3; } -inline static void rob_chara_data_parts_adjust_reset(rob_chara_data_parts_adjust* parts_adjust) { - parts_adjust->enable = false; - parts_adjust->frame = 0.0f; - parts_adjust->transition_frame = 0.0f; - parts_adjust->curr_external_force = vec3_null; - parts_adjust->curr_force = 1.0f; - parts_adjust->curr_strength = 1.0f; - parts_adjust->motion_id = -1; - parts_adjust->set_frame = 0; - parts_adjust->force_duration = 0.0f; - parts_adjust->type = 6; - parts_adjust->cycle_type = 0; - parts_adjust->ignore_gravity = true; - parts_adjust->external_force_min = vec3_null; - parts_adjust->external_force_strength = vec3_null; - parts_adjust->external_force = vec3_null; - parts_adjust->cycle = 1.0f; - parts_adjust->phase = 0.0f; - parts_adjust->force = 1.0f; - parts_adjust->strength = 1.0f; - parts_adjust->strength_transition = 0.0f; -} - -inline static void rob_chara_data_hand_adjust_reset(rob_chara_data_hand_adjust* hand_adjust) { - hand_adjust->enable = false; - hand_adjust->scale_select = 0; - hand_adjust->type = ROB_CHARA_DATA_HAND_ADJUST_NONE; - hand_adjust->current_scale = 1.0f; - hand_adjust->scale = 1.0f; - hand_adjust->transition_time = 0.0f; - hand_adjust->current_time = 0.0f; - hand_adjust->rotation_blend = 1.0f; - hand_adjust->offset_blend = 1.0f; - hand_adjust->enable_scale = false; - hand_adjust->disable_x = false; - hand_adjust->disable_y = false; - hand_adjust->disable_z = false; - hand_adjust->offset = vec3_null; - hand_adjust->field_30 = vec3_null; - hand_adjust->field_3C = 0.0f; - hand_adjust->field_40 = 0; -} - static motion_bone_index rob_motion_c_kata_bone_get(int32_t index) { if (index == 0) return MOTION_BONE_C_KATA_L; @@ -1977,7 +2376,7 @@ static motion_bone_index rob_motion_c_kata_bone_get(int32_t index) { static void sub_14041C4F0(rob_chara_bone_data* rob_bone_data, int32_t a2, float_t a3) { motion_blend_mot* v3 = rob_bone_data->motion_loaded.front(); - v3->bone_data.bones.begin[a2].field_2E0 = a3; + v3->bone_data.bones.data()[a2].field_2E0 = a3; } static void sub_14041BB70(rob_chara_bone_data* rob_bone_data, bool a2) { @@ -2065,31 +2464,31 @@ static void sub_14041D720(rob_chara_bone_data* a1, bool a2) { } static float_t sub_14054FDE0(rob_chara* rob_chr) { - if (rob_chr->data.field_1588.field_2C0 >= 0.0f) - return rob_chr->data.field_1588.field_2C0; + if (rob_chr->data.field_1588.field_0.field_2C0 >= 0.0f) + return rob_chr->data.field_1588.field_0.field_2C0; else if (rob_chr->data.field_0 & 0x04) return 10.0; - else if ((rob_chr->data.field_1588.field_10.field_0 & 0x4000) - || (rob_chr->data.field_1588.field_20.field_8 & 0x08)) + else if ((rob_chr->data.field_1588.field_0.field_10.field_0 & 0x4000) + || (rob_chr->data.field_1588.field_0.field_20.field_8 & 0x08)) return 5.0f; else if (rob_chr->data.adjust.motion_id == rob_chr->data.adjust.prev_motion_id) return 4.0f; - else if (rob_chr->data.field_1588.field_20.field_0 & 0x200) { + else if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x200) { if (~rob_chr->data.field_0 & 0x80 || rob_chr->data.field_0 & 0x40) return 1.0f; } else { - if (~rob_chr->data.field_1588.field_20.field_0 & 0x8000 - || ~rob_chr->data.field_1588.field_20.field_0 & 0x01) + if (~rob_chr->data.field_1588.field_0.field_20.field_0 & 0x8000 + || ~rob_chr->data.field_1588.field_0.field_20.field_0 & 0x01) return 7.0f; } return 3.0f; } static float_t sub_14054FEE0(rob_chara* a1) { - if (a1->data.field_1588.field_2C4 >= 0.0f) - return a1->data.field_1588.field_2C4; - else if (a1->data.field_1588.field_20.field_0 & 0x200) + if (a1->data.field_1588.field_0.field_2C4 >= 0.0f) + return a1->data.field_1588.field_0.field_2C4; + else if (a1->data.field_1588.field_0.field_20.field_0 & 0x200) return 14.0f; else return 7.0f; @@ -2170,18 +2569,18 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { else if (rob_chr->data.adjust.prev_motion_id == -1) v3 = 0; else { - v3 = ~rob_chr->data.field_1588.field_20.field_0 & 0x400 - || ~rob_chr->data.field_1588.field_10.field_0 & 0x40 - || rob_chr->data.field_1588.field_20.field_0 & 0x100000; + v3 = ~rob_chr->data.field_1588.field_0.field_20.field_0 & 0x400 + || ~rob_chr->data.field_1588.field_0.field_10.field_0 & 0x40 + || rob_chr->data.field_1588.field_0.field_20.field_0 & 0x100000; } bool v6; int32_t v7; - if (rob_chr->data.field_1588.field_52) { + if (rob_chr->data.field_1588.field_0.field_52) { v6 = 0; v7 = 2; } - else if (rob_chr->data.field_1588.field_20.field_0 & 0x8000) { + else if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x8000) { v6 = 0; v7 = 2; } @@ -2190,7 +2589,7 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { v7 = 1; } - if (rob_chr->data.field_1588.field_52 != 3 && rob_chr->data.field_8.field_1A4) { + if (rob_chr->data.field_1588.field_0.field_52 != 3 && rob_chr->data.field_8.field_1A4) { v6 = 0; v7 = 2; } @@ -2205,10 +2604,10 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { if (v6) v9 = sub_14054FEE0(rob_chr); - float_t v12 = rob_chr->data.field_1588.field_8; + float_t v12 = rob_chr->data.field_1588.field_0.field_8; float_t v13 = v12 - v9; if (v3 && v6 && (v13 < v11 || v13 <= v8)) { - float_t v14 = rob_chr->data.field_1588.field_8; + float_t v14 = rob_chr->data.field_1588.field_0.field_8; v14 = (v12 - v8) * 0.5f; int32_t v15 = (int32_t)v14; if (v14 != -0.0f && (float_t)v15 != v14) @@ -2223,7 +2622,7 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { v9 = v12 - v16; } else - v17 = rob_chr->data.field_1588.field_8 - v9; + v17 = rob_chr->data.field_1588.field_0.field_8 - v9; v10 = v17 - v8; } else { @@ -2234,69 +2633,281 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, v9, 1.0f, 1.0f); sub_14041D310(rob_chr->bone_data, v9, v13, v7); - sub_14041D340(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_54 & 0x40)); - sub_14041D6C0(rob_chr->bone_data, (rob_chr->data.field_1588.field_40.field_0 & 0x10) - && (rob_chr->data.field_1588.field_20.field_0 & 0x08)); - sub_14041D6F0(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_10.field_8 & 0x18000000)); - sub_14041D720(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_30.field_8 & 0x18000000)); + sub_14041D340(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_0.field_54 & 0x40)); + sub_14041D6C0(rob_chr->bone_data, (rob_chr->data.field_1588.field_0.field_40.field_0 & 0x10) + && (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x08)); + sub_14041D6F0(rob_chr->bone_data, + !!(rob_chr->data.field_1588.field_0.field_10.field_8 & 0x18000000)); + sub_14041D720(rob_chr->bone_data, + !!(rob_chr->data.field_1588.field_0.field_30.field_8 & 0x18000000)); sub_14041D2A0(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.field_1588.field_276 * M_PI * (1.0 / 32768.0))); + (float_t)((double_t)rob_chr->data.field_1588.field_0.field_276 * M_PI * (1.0 / 32768.0))); sub_14041D270(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.field_1588.field_274 * M_PI * (1.0 / 32768.0))); + (float_t)((double_t)rob_chr->data.field_1588.field_0.field_274 * M_PI * (1.0 / 32768.0))); } -static void sub_14053A9C0(struc_223* a1, rob_chara* rob_chr, uint32_t a3, float_t frame_count) { - a1->field_0 = a3; - a1->field_78 = 0.0; - a1->frame_count = frame_count; - a1->field_7C = frame_count - 1.0f; - a1->field_80 = frame_count - 1.0f; - a1->field_1F0 = frame_count - 1.0f; - a1->field_1F4 = frame_count - 1.0f; +static void mothead_apply2_inner(struc_380* a1, int32_t type, const mothead_data2* a3) { + struc_223* v19 = a1->field_10; + void* v35 = a3->data; + switch (type) { + case 0: { + if (a1->field_10->field_0.field_58 != -1) + break; + + uint32_t v8 = 0; + if (!a3 || a3->type < 0) + break; + + std::list> v31; + while (a3->type != 0) + if ((a3++)->type < 0) + return; + + if (!a3->data) + break; + + do { + if (a3->type == 0) { + void* v10 = a3->data; + if (!v10) + break; + + v8 += ((uint16_t*)v10)[11]; + v31.push_back({ v10, v8 }); + } + a3++; + } while (a3->type >= 0); + + if (!v8 || !v31.size()) + break; + + if (v31.size() > 1) { + uint32_t v15 = rand_state_array_get_int(1) % v8; + for (std::pair& i : v31) + if (v15 < i.second) { + v35 = i.first; + break; + } + } + + v19->field_0.field_58 = ((int16_t*)v35)[0]; + v19->field_0.field_5C = ((int32_t*)v35)[1]; + v19->field_0.field_60 = ((int32_t*)v35)[2]; + v19->field_0.field_64 = ((int32_t*)v35)[3]; + v19->field_0.field_68 = ((int32_t*)v35)[4]; + v19->field_0.field_6C = ((int16_t*)v35)[5]; + v19->field_0.field_70 = (float_t)((int16_t*)v35)[12]; + v19->field_0.field_74 = (float_t)((int16_t*)v35)[13]; + } break; + case 1: { + v19->field_0.field_78 = (float_t)((int16_t*)v35)[0]; + if (((int16_t*)v35)[1] >= 0) + v19->field_0.field_7C = (float_t)((int16_t*)v35)[1]; + if (((int16_t*)v35)[2] >= 0) + v19->field_0.field_80 = (float_t)((int16_t*)v35)[2]; + v19->field_0.field_20.field_0 |= 2; + a1->rob_chara_data->adjust.field_24 = 0; + } break; + case 2: { + v19->field_0.field_1E8 = ((int32_t*)v35)[0]; + v19->field_0.field_1EC = (float_t)((int16_t*)v35)[2]; + v19->field_0.field_1F0 = (float_t)((int16_t*)v35)[3]; + v19->field_0.field_1F4 = (float_t)((int16_t*)v35)[4]; + v19->field_0.field_1F8 = (float_t)((int16_t*)v35)[5]; + v19->field_0.field_1FC = ((float_t*)v35)[3]; + v19->field_0.field_200 += ((float_t*)v35)[4]; + a1->rob_chara_data->field_8.field_B8.field_10.y = -get_osage_gravity_const() * ((float_t*)v35)[4]; + if (v19->field_0.field_1F4 < v19->field_0.field_1F0) + v19->field_0.field_1F4 = v19->field_0.field_1F0; + } break; + case 40: { + v19->field_0.field_238 = ((int16_t*)v35)[0]; + if ((a1->rob_chara_data->adjust.field_28 & 8) != 0) + v19->field_0.field_23C = -((float_t*)v35)[1]; + else + v19->field_0.field_23C = ((float_t*)v35)[1]; + v19->field_0.field_240 = ((int32_t*)v35)[2]; + a1->rob_chara_data->field_8.field_B8.field_10.y = -get_osage_gravity_const() * ((float_t*)v35)[3]; + } break; + case 41: { + if (v19->field_0.field_244 <= 0) + v19->field_0.field_248 = a3; + v19->field_0.field_244++; + } break; + case 46: { + if (v19->field_0.field_10.field_0 & 0x100) { + if (a1->rob_chara_data->adjust.field_28 & 8) + v19->field_0.field_274 = -((int16_t*)v35)[0]; + else + v19->field_0.field_274 = ((int16_t*)v35)[0]; + } + } break; + case 51: { + if (a1->rob_chara_data->adjust.field_28 & 8) + v19->field_0.field_2B8 = -((int16_t*)v35)[0]; + else + v19->field_0.field_2B8 = ((int16_t*)v35)[0]; + } break; + case 55: { + v19->field_0.field_2BC = ((int32_t*)v35)[0]; + v19->field_0.field_2C0 = ((float_t*)v35)[1]; + v19->field_0.field_2C4 = ((float_t*)v35)[2]; + } break; + case 64: { + float_t v31 = ((float_t*)v35)[0]; + if (a1->rob_chara_data->adjust.field_28 & 8) + v31 = -v31; + v19->field_0.field_318.x = v31; + v19->field_0.field_318.y = ((float_t*)v35)[1]; + v19->field_0.field_318.z = ((float_t*)v35)[2]; + } break; + case 66: { + v19->field_0.field_324 = ((float_t*)v35)[0]; + if (v19->field_0.field_324 < 0.0f) + v19->field_0.field_324 = -v19->field_0.field_324; + } break; + case 68: { + if (((int32_t*)v35)[0] > 0) + v19->field_0.iterations = ((int32_t*)v35)[0]; + } break; + } } -void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, bool a3, float_t frame, - MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db) { - rob_chr->data.miku_rot.rot_y_int16 = sub_14054FE90(rob_chr, false); - if (~rob_chr->data.field_1588.field_20.field_0 & 0x10) { - //rob_chr->data.miku_rot.position.x = rob_chr->data.miku_rot.field_24.x; - //rob_chr->data.miku_rot.position.z = rob_chr->data.miku_rot.field_24.z; +static void mothead_apply2(struc_223* a1, rob_chara* rob_chr, const mothead_data2* a3) { + if (!a3 || !a3->data) + return; + + struc_380 v5; + v5.rob_chara = rob_chr; + v5.rob_chara_data = &rob_chr->data; + v5.field_10 = &rob_chr->data.field_1588; + + while (a3->data && a3->type >= 0) { + mothead_apply2_inner(&v5, a3->type, a3); + a3++; + } +} + +static void sub_14053A9C0(struc_223* a1, rob_chara* rob_chr, + uint32_t motion_id, float_t frame_count, motion_database* mot_db) { + a1->field_0.motion_id = motion_id; + a1->field_0.field_78 = 0.0f; + a1->field_0.frame_count = frame_count; + a1->field_0.field_7C = frame_count - 1.0f; + a1->field_0.field_80 = frame_count - 1.0f; + a1->field_0.field_1F0 = frame_count - 1.0f; + a1->field_0.field_1F4 = frame_count - 1.0f; + + const mothead_mot* v7 = mothead_storage_get_mot_by_motion_id(motion_id, mot_db); + if (!v7) + return; + + a1->field_330.field_0.field_0 = v7->data.data(); + a1->field_330.field_0.field_8 = v7->data.data(); + a1->field_7A0 = v7->field_28.data(); + a1->motion_set_id = mot_db->get_motion_set_id_by_motion_id(motion_id); + a1->field_0.field_10 = v7->field_0; + a1->field_0.field_20 = v7->field_0; + a1->field_0.field_20.field_0 &= ~0x4000; + if (a1->field_0.field_10.field_0 & 0x100) + a1->field_0.field_274 = 0x8000; + if (a1->field_0.field_10.field_0 & 0x200000) + a1->field_0.field_2B8 = (int16_t)0x8000; + + a1->field_0.field_50 = v7->field_10; + a1->field_0.field_52 = v7->field_12; + if (v7->field_12 & 0x40) { + a1->field_0.field_52 = v7->field_12 & ~0x40; + a1->field_0.field_54 |= 0x40; } - //if (rob_chr->data.field_1588.field_20.field_8 & 0x8000000) - // rob_chr->data.miku_rot.position.y = rob_chr->data.miku_rot.field_24.y; + mothead_apply2(a1, rob_chr, v7->field_18.data()); + + if (a1->field_0.field_58 == 1) + a1->field_0.field_8 = frame_count - 1.0f; + else + a1->field_0.field_8 = a1->field_0.frame_count; + + if (a1->field_0.field_20.field_0 & 0x200000) + a1->field_0.field_20.field_0 |= 0x100; + if (a1->field_0.field_20.field_C & 0x20000 && ~rob_chr->data.field_3D9D & 0x04) + a1->field_0.field_20.field_C |= 0x400; + + a1->field_0.field_C = 0; + a1->field_0.field_274 += a1->field_0.field_2B8; + a1->field_0.field_A0 += a1->field_0.field_2B8; + + const mothead_data* v11 = v7->data.data(); + if (!v11) + return; + + mothead_data_type v12 = v11->type; + if (v11->type < 0) + return; + + while (v12 != MOTHEAD_DATA_TYPE_11) + if ((v12 = (v11++)->type) < 0) + return; + + void* d = v11->data; + while (d) { + a1->field_0.field_C += *(int16_t*)d; + + mothead_data_type v17 = (v11++)->type; + if (v17 < 0) + break; + + while (v17 != MOTHEAD_DATA_TYPE_11) + if ((v17 = (v11++)->type) < 0) + return; + d = v11->data; + } +} + +static void sub_140539750(struc_223* a1); + +void rob_chara::load_motion(int32_t motion_id, bool a3, float_t frame, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db) { + data.miku_rot.rot_y_int16 = sub_14054FE90(this, false); + if (~data.field_1588.field_0.field_20.field_0 & 0x10) { + data.miku_rot.position.x = data.miku_rot.field_24.x; + data.miku_rot.position.z = data.miku_rot.field_24.z; + } + + if (data.field_1588.field_0.field_20.field_8 & 0x8000000) + data.miku_rot.position.y = data.miku_rot.field_24.y; if (a3) - rob_chr->data.adjust.field_28 ^= (rob_chr->data.adjust.field_28 ^ ~rob_chr->data.adjust.field_28) & 0x04; + data.adjust.field_28 ^= (data.adjust.field_28 ^ ~data.adjust.field_28) & 0x04; - if (rob_chr->data.adjust.field_28 & 0x04) - rob_chr->data.adjust.field_28 |= 0x08; + if (data.adjust.field_28 & 0x04) + data.adjust.field_28 |= 0x08; else - rob_chr->data.adjust.field_28 &= ~0x08; + data.adjust.field_28 &= ~0x08; - rob_chr->data.adjust.field_28 &= 0x2F; - rob_chr->data.adjust.field_28 |= 0x10; - rob_chr->data.adjust.field_2C = 0; - rob_chr->data.adjust.field_30 = 0; + data.adjust.field_28 &= 0x2F; + data.adjust.field_28 |= 0x10; + data.adjust.field_2C = 0; + data.adjust.field_30 = 0; - rob_chara_data_parts_adjust* parts_adjust = rob_chr->data.adjust.parts_adjust; + rob_chara_data_parts_adjust* parts_adjust = data.adjust.parts_adjust; for (int32_t i = 0; i < 13; i++, parts_adjust++) - rob_chara_data_parts_adjust_reset(parts_adjust); + parts_adjust->reset(); - rob_chara_data_parts_adjust_reset(&rob_chr->data.adjust.field_10D8[0]); + data.adjust.field_10D8[0].reset(); - rob_chr->data.adjust_data.offset = vec3_null; - rob_chr->data.adjust_data.offset_x = true; - rob_chr->data.adjust_data.offset_y = false; - rob_chr->data.adjust_data.offset_z = true; - rob_chr->data.adjust_data.get_global_trans = false; + data.adjust_data.offset = vec3_null; + data.adjust_data.offset_x = true; + data.adjust_data.offset_y = false; + data.adjust_data.offset_z = true; + data.adjust_data.get_global_trans = false; - struc_222* v13 = rob_chr->data.adjust.field_12C8; - rob_chara_data_hand_adjust* hand_adjust = rob_chr->data.adjust.hand_adjust; - rob_chara_data_hand_adjust* hand_adjust_prev = rob_chr->data.adjust.hand_adjust_prev; + struc_222* v13 = data.adjust.field_12C8; + rob_chara_data_hand_adjust* hand_adjust = data.adjust.hand_adjust; + rob_chara_data_hand_adjust* hand_adjust_prev = data.adjust.hand_adjust_prev; for (int32_t i = 0; i < 2; i++, v13++, hand_adjust++, hand_adjust_prev++) { - rob_chara_data_hand_adjust_reset(hand_adjust); - rob_chara_data_hand_adjust_reset(hand_adjust_prev); + hand_adjust->reset(); + hand_adjust_prev->reset(); v13->field_0 = 0; v13->field_4 = 0.0f; @@ -2304,89 +2915,68 @@ void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, bool a3, float v13->field_C = 0.0f; v13->duration = 0.0f; v13->frame = 0.0f; - sub_14041C4F0(rob_chr->bone_data, rob_motion_c_kata_bone_get(i), 0.0f); + sub_14041C4F0(this->bone_data, rob_motion_c_kata_bone_get(i), 0.0f); } - sub_14041BB70(rob_chr->bone_data, 0); + sub_14041BB70(this->bone_data, 0); - rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; - rob_chara_item_equip_set_osage_move_cancel(rob_itm_equip, 0, 0.0f); + rob_chara_item_equip_set_osage_move_cancel(item_equip, 0, 0.0f); for (int32_t i = 0; i < 13; i++) - sub_140513EE0(rob_itm_equip, i, false); - rob_chr->data.field_1588.field_30 = rob_chr->data.field_1588.field_10; - rob_chr->data.field_1588.field_40 = rob_chr->data.field_1588.field_20; - rob_chr->data.field_1588.field_276 = rob_chr->data.field_1588.field_274; - //sub_140539750(&rob_chr->data.field_1588); - sub_14053A9C0(&rob_chr->data.field_1588, rob_chr, motion_id, - motion_storage_get_mot_data_frame_count(motion_id, mot_db)); - if (rob_chr->data.field_1588.field_40.field_C & 0x20) - rob_chr->data.field_1588.field_20.field_0 &= ~0x08; - if (rob_chr->data.field_1588.field_40.field_C & 0x40) - rob_chr->data.field_1588.field_20.field_8 |= 0x10000000; - if (~rob_chr->data.field_1588.field_20.field_0 & 0x10 && frame > 0.0f) - rob_chr->data.field_1588.field_20.field_0 &= ~0x08; + sub_140513EE0(item_equip, i, false); + data.field_1588.field_0.field_30 = data.field_1588.field_0.field_10; + data.field_1588.field_0.field_40 = data.field_1588.field_0.field_20; + data.field_1588.field_0.field_276 = data.field_1588.field_0.field_274; + sub_140539750(&data.field_1588); + sub_14053A9C0(&data.field_1588, this, motion_id, + motion_storage_get_mot_data_frame_count(motion_id, mot_db), mot_db); + if (data.field_1588.field_0.field_40.field_C & 0x20) + data.field_1588.field_0.field_20.field_0 &= ~0x08; + if (data.field_1588.field_0.field_40.field_C & 0x40) + data.field_1588.field_0.field_20.field_8 |= 0x10000000; + if (~data.field_1588.field_0.field_20.field_0 & 0x10 && frame > 0.0f) + data.field_1588.field_0.field_20.field_0 &= ~0x08; - rob_chr->data.adjust.prev_motion_id = rob_chr->data.adjust.motion_id; - rob_chr->data.adjust.frame_data.frame = frame; - rob_chr->data.adjust.field_24 = 0; - rob_chr->data.adjust.motion_id = motion_id; - if (rob_chr->data.adjust.step_data.step < 0.0f) - rob_chr->data.adjust.step_data.frame = 1.0f; + data.adjust.prev_motion_id = data.adjust.motion_id; + data.adjust.frame_data.frame = frame; + data.adjust.field_24 = 0; + data.adjust.motion_id = motion_id; + if (data.adjust.step_data.step < 0.0f) + data.adjust.step_data.frame = 1.0f; else - rob_chr->data.adjust.step_data.frame = rob_chr->data.adjust.step_data.step; + data.adjust.step_data.frame = data.adjust.step_data.step; - float_t step = rob_chr->data.adjust.step; + float_t step = data.adjust.step; if (step < 0.0f) - step = rob_chr->data.adjust.step_data.frame; - rob_chara_item_equip_set_osage_step(rob_chr->item_equip, step); - rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, blend_type, bone_data, mot_db); - sub_140419D30(rob_chr->bone_data, rob_chr->data.adjust.step_data.frame, - rob_chr->data.adjust.step_data.frame, rob_chr->data.field_1588.frame_count); - sub_14041C650(rob_chr->bone_data, 1); - if (rob_chr->data.field_1588.field_58 == 1) { - sub_14041BB50(rob_chr->bone_data, 1); - sub_14041C990(rob_chr->bone_data, rob_chr->data.field_1588.field_70, rob_chr->data.field_1588.field_6C, -1.0f); + step = data.adjust.step_data.frame; + rob_chara_item_equip_set_osage_step(item_equip, step); + rob_chara_bone_data_motion_load(this->bone_data, motion_id, blend_type, bone_data, mot_db); + sub_140419D30(this->bone_data, data.adjust.step_data.frame, + data.adjust.step_data.frame, data.field_1588.field_0.frame_count); + sub_14041C650(this->bone_data, 1); + if (data.field_1588.field_0.field_58 == 1) { + sub_14041BB50(this->bone_data, 1); + sub_14041C990(this->bone_data, data.field_1588.field_0.field_70, + data.field_1588.field_0.field_6C, -1.0f); } - rob_chara_bone_data_set_rotation_y( - rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.field_1588.field_2B8 * M_PI * (1.0 / 32768.0))); - sub_14041BC40(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_20.field_8 & 0x20000000)); - sub_14041B9D0(rob_chr->bone_data); - if (rob_chr->type == ROB_CHARA_TYPE_2) { - sub_14041D340(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_54 & 0x40)); - sub_14041D6C0(rob_chr->bone_data, (rob_chr->data.field_1588.field_40.field_0 & 0x10) - && (rob_chr->data.field_1588.field_20.field_0 & 0x08)); - sub_14041D6F0(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_10.field_8 & 0x18000000)); - sub_14041D720(rob_chr->bone_data, !!(rob_chr->data.field_1588.field_30.field_8 & 0x18000000)); - sub_14041D2A0(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.field_1588.field_276 * M_PI * (1.0 / 32768.0))); - sub_14041D270(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.field_1588.field_274 * M_PI * (1.0 / 32768.0))); + rob_chara_bone_data_set_rotation_y(this->bone_data, + (float_t)((double_t)data.field_1588.field_0.field_2B8 * M_PI * (1.0 / 32768.0))); + sub_14041BC40(this->bone_data, !!(data.field_1588.field_0.field_20.field_8 & 0x20000000)); + sub_14041B9D0(this->bone_data); + if (type == ROB_CHARA_TYPE_2) { + sub_14041D340(this->bone_data, !!(data.field_1588.field_0.field_54 & 0x40)); + sub_14041D6C0(this->bone_data, (data.field_1588.field_0.field_40.field_0 & 0x10) + && (data.field_1588.field_0.field_20.field_0 & 0x08)); + sub_14041D6F0(this->bone_data, + !!(data.field_1588.field_0.field_10.field_8 & 0x18000000)); + sub_14041D720(this->bone_data, + !!(data.field_1588.field_0.field_30.field_8 & 0x18000000)); + sub_14041D2A0(this->bone_data, + (float_t)((double_t)data.field_1588.field_0.field_276 * M_PI * (1.0 / 32768.0))); + sub_14041D270(this->bone_data, + (float_t)((double_t)data.field_1588.field_0.field_274 * M_PI * (1.0 / 32768.0))); } else - sub_140555B00(rob_chr, blend_type >= MOTION_BLEND_FREEZE && blend_type <= MOTION_BLEND_CROSS); - rob_chr->data.field_3DE0 = 0; -} - -static float_t chara_size_table_get_value(uint32_t a1) { - static const float_t chara_size_table[] = { - 1.07f, 1.0f, 0.96f, 0.987f, 1.025f - }; - - if (a1 > 4) - return 1.0f; - else - return chara_size_table[a1]; -} - -static float_t chara_pos_adjust_y_table_get_value(uint32_t a1) { - static const float_t chara_pos_adjust_y_table[] = { - 0.071732f, 0.0f, -0.03859f, 0.0f, 0.0f - }; - - if (a1 > 4) - return 0.0f; - else - return chara_pos_adjust_y_table[a1]; + sub_140555B00(this, blend_type >= MOTION_BLEND_FREEZE && blend_type <= MOTION_BLEND_CROSS); + data.field_3DE0 = 0; } static void sub_140514130(rob_chara_item_equip* rob_itm_equip, item_id id, bool a3) { @@ -2410,40 +3000,62 @@ static void sub_140513C60(rob_chara_item_equip* rob_itm_equip, item_id id, bool rob_itm_equip->field_18[id] |= 0x04; } -void rob_chara_reset_data(rob_chara* rob_chr, rob_chara_pv_data* pv_data, +void rob_chara::reset_data(rob_chara_pv_data* pv_data, bone_database* bone_data, motion_database* mot_db) { - rob_chara_bone_data_reset(rob_chr->bone_data); - rob_chara_bone_data_init_data(rob_chr->bone_data, - BONE_DATABASE_SKELETON_COMMON, rob_chr->chara_init_data->skeleton_type, bone_data); - rob_chara_data_reset(&rob_chr->data); - rob_chara_data_reset(&rob_chr->data_prev); - rob_chara_item_equip_get_parent_bone_nodes(rob_chr->item_equip, - rob_chara_bone_data_get_node(rob_chr->bone_data, 0), bone_data); - rob_chr->type = pv_data->type; - rob_chara_data* chr_data = &rob_chr->data; + rob_chara_bone_data_reset(this->bone_data); + rob_chara_bone_data_init_data(this->bone_data, + BONE_DATABASE_SKELETON_COMMON, chara_init_data->skeleton_type, bone_data); + rob_chara_data_reset(&data); + rob_chara_data_reset(&data_prev); + rob_chara_item_equip_get_parent_bone_nodes(item_equip, + rob_chara_bone_data_get_node(this->bone_data, 0), bone_data); + type = pv_data->type; + rob_chara_data* chr_data = &data; chr_data->miku_rot.rot_y_int16 = pv_data->rot_y_int16; chr_data->miku_rot.field_6 = pv_data->rot_y_int16; - chr_data->adjust_data.scale = chara_size_table_get_value(rob_chr->pv_data.chara_size_index); - chr_data->adjust_data.height_adjust = rob_chr->pv_data.height_adjust; - chr_data->adjust_data.pos_adjust_y = chara_pos_adjust_y_table_get_value(rob_chr->pv_data.chara_size_index); - rob_chara_bone_data_eyes_xrot_adjust(rob_chr->bone_data, chara_some_data_array, &pv_data->eyes_adjust); - rob_chara_bone_data_get_ik_scale(rob_chr->bone_data, bone_data); - rob_chara_load_default_motion(rob_chr, bone_data, mot_db); + chr_data->adjust_data.scale = chara_size_table_get_value(this->pv_data.chara_size_index); + chr_data->adjust_data.height_adjust = this->pv_data.height_adjust; + chr_data->adjust_data.pos_adjust_y = chara_pos_adjust_y_table_get_value(this->pv_data.chara_size_index); + rob_chara_bone_data_eyes_xrot_adjust(this->bone_data, chara_some_data_array, &pv_data->eyes_adjust); + rob_chara_bone_data_get_ik_scale(this->bone_data, bone_data); + rob_chara_load_default_motion(this, bone_data, mot_db); chr_data->field_8.field_4.field_0 = 1; - chr_data->field_8.field_4.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 0); + chr_data->field_8.field_4.motion_id = get_rob_cmn_mottbl_motion_id(0); chr_data->field_8.field_0 = 0; chr_data->field_8.field_4.field_10 = pv_data->field_5; - rob_chara_load_motion(rob_chr, chr_data->field_8.field_4.motion_id, + load_motion(chr_data->field_8.field_4.motion_id, pv_data->field_5, 0.0f, MOTION_BLEND, bone_data, mot_db); - rob_chara_set_parts_disp(rob_chr, ITEM_MAX, true); - rob_chr->item_equip->field_DC = 0; - sub_140513C60(rob_chr->item_equip, ITEM_ATAMA, 0); - sub_140513C60(rob_chr->item_equip, ITEM_TE_R, 0); - sub_140513C60(rob_chr->item_equip, ITEM_TE_L, 0); - object_info head_obj = rob_chara_get_head_object(rob_chr, 0); + set_parts_disp(ITEM_MAX, true); + item_equip->field_DC = 0; + sub_140513C60(item_equip, ITEM_ATAMA, false); + sub_140513C60(item_equip, ITEM_TE_R, false); + sub_140513C60(item_equip, ITEM_TE_L, false); + object_info head_obj = rob_chara_get_head_object(this, 0); chr_data->adjust.field_150.head_object = head_obj; chr_data->adjust.field_3B0.head_object = head_obj; - rob_chara_set_parts_disp(rob_chr, ITEM_MAX, 1); + set_parts_disp(ITEM_MAX, true); +} + +void rob_chara::set_bone_data_frame(float_t frame) { + rob_chara_bone_data_set_frame(bone_data, frame); + rob_chara_bone_data_interpolate(bone_data); + rob_chara_bone_data_update(bone_data, 0); +} + +void rob_chara::set_chara_height_adjust(bool value) { + data.adjust_data.height_adjust = value; +} + +void rob_chara::set_chara_pos_adjust(vec3* value) { + data.adjust_data.pos_adjust = *value; +} + +void rob_chara::set_chara_pos_adjust_y(float_t value) { + data.adjust_data.pos_adjust_y = value; +} + +void rob_chara::set_chara_size(float_t value) { + data.adjust_data.scale = value; } static bool sub_14053F290(RobPartialMotion* a1); @@ -2626,21 +3238,21 @@ static void sub_1405500F0(rob_chara* rob_chr) { } } -void rob_chara_set_eyelid_mottbl_motion_from_face(rob_chara* rob_chr, - int32_t a2, float_t duration, float_t value, float_t offset, motion_database* mot_db) { +void rob_chara::set_eyelid_mottbl_motion_from_face(int32_t a2, + float_t duration, float_t value, float_t offset, motion_database* mot_db) { if (!a2) - a2 = rob_chr->data.adjust.field_150.field_1C0; + a2 = data.adjust.field_150.field_1C0; RobEyelidMotion v13; switch (a2) { case 0: case 2: - v13.data = rob_chr->data.adjust.field_150.face.data; + v13.data = data.adjust.field_150.face.data; break; case 1: value = 1.0f; case 3: { - int32_t mottbl_index = rob_chr->data.adjust.field_150.face.data.mottbl_index; + int32_t mottbl_index = data.adjust.field_150.face.data.mottbl_index; switch (mottbl_index) { case 0x07: case 0x09: @@ -2705,16 +3317,16 @@ void rob_chara_set_eyelid_mottbl_motion_from_face(rob_chara* rob_chr, break; } - int32_t motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + int32_t motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); v13.data.motion_id = motion_id; if (motion_id == -1) { duration = 0.0f; a2 = 0; - v13.data = rob_chr->data.adjust.field_150.face.data; + v13.data = data.adjust.field_150.face.data; } else if (value <= 0.0f) { a2 = 0; - v13.data = rob_chr->data.adjust.field_150.face.data; + v13.data = data.adjust.field_150.face.data; } else { v13.data.state = 0; @@ -2726,18 +3338,18 @@ void rob_chara_set_eyelid_mottbl_motion_from_face(rob_chara* rob_chr, v13.data.offset = offset; v13.data.duration = duration; - rob_chr->data.adjust.field_150.field_1C0 = a2; - sub_1405500F0(rob_chr); - rob_chr->data.adjust.field_29 &= ~0x02; - rob_chr->data.adjust.field_150.time = 0.0f; - rob_chara_set_eyelid_motion(rob_chr, &v13, 0, mot_db); + data.adjust.field_150.field_1C0 = a2; + sub_1405500F0(this); + data.adjust.field_29 &= ~0x02; + data.adjust.field_150.time = 0.0f; + rob_chara_set_eyelid_motion(this, &v13, 0, mot_db); } -void rob_chara_set_eyes_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, +void rob_chara::set_eyelid_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { - RobEyesMotion v13; - v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + RobEyelidMotion v13; + v13.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); v13.data.mottbl_index = mottbl_index; v13.data.state = state; v13.data.play_frame_step = step; @@ -2745,15 +3357,43 @@ void rob_chara_set_eyes_mottbl_motion(rob_chara* rob_chr, v13.data.offset = offset; v13.data.field_24 = a7; if (sub_14053F290(&v13)) { - v13.data.frame_data = &rob_chr->data.adjust.frame_data; - v13.data.step_data = &rob_chr->data.adjust.step_data; + v13.data.frame_data = &data.adjust.frame_data; + v13.data.step_data = &data.adjust.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); v13.data.frame = (v13.data.frame_count - 1.0f) * value; } - rob_chara_set_eyes_motion(rob_chr, &v13, type, mot_db); + + if (!type) { + data.adjust.field_29 &= ~2; + data.adjust.field_150.time = 0.0f; + } + rob_chara_set_eyelid_motion(this, &v13, type, mot_db); +} + +void rob_chara::set_eyes_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { + RobEyesMotion v13; + v13.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); + v13.data.mottbl_index = mottbl_index; + v13.data.state = state; + v13.data.play_frame_step = step; + v13.data.duration = duration; + v13.data.offset = offset; + v13.data.field_24 = a7; + if (sub_14053F290(&v13)) { + v13.data.frame_data = &data.adjust.frame_data; + v13.data.step_data = &data.adjust.step_data; + } + v13.data.field_38 = a9; + if (v13.data.motion_id != -1) { + v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); + v13.data.frame = (v13.data.frame_count - 1.0f) * value; + } + rob_chara_set_eyes_motion(this, &v13, type, mot_db); } static void sub_140553970(rob_chara* rob_chr, object_info a2, int32_t type) { @@ -2763,11 +3403,11 @@ static void sub_140553970(rob_chara* rob_chr, object_info a2, int32_t type) { rob_chr->data.adjust.field_3B0.head_object = a2; } -void rob_chara_set_face_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, +void rob_chara::set_face_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, float_t a7, float_t step, int32_t a9, float_t offset, bool a11, motion_database* mot_db) { RobFaceMotion v27; - v27.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v27.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); v27.data.mottbl_index = mottbl_index; v27.data.state = state; v27.data.play_frame_step = step; @@ -2775,15 +3415,15 @@ void rob_chara_set_face_mottbl_motion(rob_chara* rob_chr, v27.data.offset = offset; v27.data.field_24 = a7; if (sub_14053F290(&v27)) { - v27.data.frame_data = &rob_chr->data.adjust.frame_data; - v27.data.step_data = &rob_chr->data.adjust.step_data; + v27.data.frame_data = &data.adjust.frame_data; + v27.data.step_data = &data.adjust.step_data; } v27.data.field_38 = a9; if (v27.data.motion_id != -1) { v27.data.frame_count = motion_storage_get_mot_data_frame_count(v27.data.motion_id, mot_db); v27.data.frame = (v27.data.frame_count - 1.0f) * value; } - rob_chara_set_face_motion(rob_chr, &v27, type, mot_db); + rob_chara_set_face_motion(this, &v27, type, mot_db); int32_t head_object_id = 0; switch (mottbl_index) { @@ -2810,48 +3450,48 @@ void rob_chara_set_face_mottbl_motion(rob_chara* rob_chr, break; } - object_info v17 = rob_chara_get_head_object(rob_chr, head_object_id); + object_info v17 = rob_chara_get_head_object(this, head_object_id); if (head_object_id) { - sub_140553970(rob_chr, v17, type); + sub_140553970(this, v17, type); duration = 0.0f; } else if (type == 2) { - if (rob_chara_get_object_info(rob_chr, ITEM_ATAMA) != v17) { - sub_140553970(rob_chr, v17, 2); + if (rob_chara_get_object_info(this, ITEM_ATAMA) != v17) { + sub_140553970(this, v17, 2); duration = 0.0f; } } - else if (rob_chr->data.adjust.field_150.head_object != v17) { - sub_140553970(rob_chr, v17, type); - rob_chr->data.adjust.field_150.eye.data.duration = 0.0f; - rob_chara_set_eyes_motion(rob_chr, &rob_chr->data.adjust.field_150.eye, 0, mot_db); + else if (data.adjust.field_150.head_object != v17) { + sub_140553970(this, v17, type); + data.adjust.field_150.eye.data.duration = 0.0f; + rob_chara_set_eyes_motion(this, &data.adjust.field_150.eye, 0, mot_db); duration = 0.0f; } if (type == 1 || type == 2) { if (a11) - rob_chara_set_eyelid_mottbl_motion_from_face(rob_chr, 2, duration, -1.0f, offset, mot_db); - else if (rob_chr->data.adjust.field_29 & 0x02) { - rob_chara_set_eyelid_mottbl_motion_from_face(rob_chr, - rob_chr->data.adjust.field_150.field_1C0, 3.0f, -1.0f, 0.0f, mot_db); - rob_chr->data.adjust.field_29 |= 0x02; + set_eyelid_mottbl_motion_from_face(2, duration, -1.0f, offset, mot_db); + else if (data.adjust.field_29 & 0x02) { + set_eyelid_mottbl_motion_from_face( + data.adjust.field_150.field_1C0, 3.0f, -1.0f, 0.0f, mot_db); + data.adjust.field_29 |= 0x02; } else { float_t v21 = -1.0f; - if (rob_chr->data.adjust.field_150.field_1C0 == 3) { - float_t v23 = rob_chr->data.adjust.field_150.eyelid.data.frame_count - 1.0f; + if (data.adjust.field_150.field_1C0 == 3) { + float_t v23 = data.adjust.field_150.eyelid.data.frame_count - 1.0f; if (v23 > 0.0f) - v21 = rob_chr->data.adjust.field_150.eyelid.data.frame / v23; + v21 = data.adjust.field_150.eyelid.data.frame / v23; - float_t v25 = rob_chr->bone_data->eyelid.blend.duration; - float_t v26 = rob_chr->bone_data->eyelid.blend.frame; + float_t v25 = bone_data->eyelid.blend.duration; + float_t v26 = bone_data->eyelid.blend.frame; if (v25 > v26) { duration = v25 - v26; offset = 1.0f; } } - rob_chara_set_eyelid_mottbl_motion_from_face(rob_chr, 0, duration, v21, offset, mot_db); + set_eyelid_mottbl_motion_from_face(0, duration, v21, offset, mot_db); } } else { @@ -2859,29 +3499,23 @@ void rob_chara_set_face_mottbl_motion(rob_chara* rob_chr, v28.data = v27.data; v28.data.duration = duration; v28.data.offset = offset; - rob_chr->data.adjust.field_29 |= 0x80; - rob_chara_set_eyelid_motion(rob_chr, &v28, 2, mot_db); + data.adjust.field_29 |= 0x80; + rob_chara_set_eyelid_motion(this, &v28, 2, mot_db); } } -void rob_chara_set_bone_data_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::set_frame(float_t frame) { + rob_chara_bone_data_set_frame(bone_data, frame); + rob_chara_bone_data_interpolate(bone_data); + rob_chara_bone_data_update(bone_data, 0); + sub_140509D30(this); } -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); - sub_140509D30(rob_chr); -} - -void rob_chara_set_hand_l_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, +void rob_chara::set_hand_l_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { RobHandMotion v13; - v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); v13.data.mottbl_index = mottbl_index; v13.data.state = state; v13.data.play_frame_step = step; @@ -2889,22 +3523,22 @@ void rob_chara_set_hand_l_mottbl_motion(rob_chara* rob_chr, v13.data.offset = offset; v13.data.field_24 = a7; if (sub_14053F290(&v13)) { - v13.data.frame_data = &rob_chr->data.adjust.frame_data; - v13.data.step_data = &rob_chr->data.adjust.step_data; + v13.data.frame_data = &data.adjust.frame_data; + v13.data.step_data = &data.adjust.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); v13.data.frame = (v13.data.frame_count - 1.0f) * value; } - rob_chara_set_hand_l_motion(rob_chr, &v13, type, mot_db); + rob_chara_set_hand_l_motion(this, &v13, type, mot_db); } -void rob_chara_set_hand_r_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, +void rob_chara::set_hand_r_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { RobHandMotion v13; - v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); v13.data.mottbl_index = mottbl_index; v13.data.state = state; v13.data.play_frame_step = step; @@ -2912,39 +3546,38 @@ void rob_chara_set_hand_r_mottbl_motion(rob_chara* rob_chr, v13.data.offset = offset; v13.data.field_24 = a7; if (sub_14053F290(&v13)) { - v13.data.frame_data = &rob_chr->data.adjust.frame_data; - v13.data.step_data = &rob_chr->data.adjust.step_data; + v13.data.frame_data = &data.adjust.frame_data; + v13.data.step_data = &data.adjust.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); v13.data.frame = (v13.data.frame_count - 1.0f) * value; } - rob_chara_set_hand_r_motion(rob_chr, &v13, type, mot_db); + rob_chara_set_hand_r_motion(this, &v13, type, mot_db); } -bool rob_chara_set_motion_id(rob_chara* rob_chr, int32_t motion_id, +bool rob_chara::set_motion_id(int32_t motion_id, float_t frame, float_t duration, bool a5, bool set_motion_reset_data, MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db) { - if (!a5 && rob_chr->data.adjust.motion_id == motion_id) + if (!a5 && data.adjust.motion_id == motion_id) return false; if (duration <= 0.0f) blend_type = MOTION_BLEND; - rob_chara_load_motion(rob_chr, motion_id, 0, frame, blend_type, bone_data, mot_db); - rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, duration, 1.0f, 0.0f); - rob_chr->data.adjust.field_28 |= 0x80; - rob_chr->data.adjust.frame_data.last_set_frame = frame; - rob_chara_set_motion_skin_param(rob_chr, motion_id, (float_t)(int32_t)frame); + load_motion(motion_id, 0, frame, blend_type, bone_data, mot_db); + rob_chara_bone_data_set_motion_duration(this->bone_data, duration, 1.0f, 0.0f); + data.adjust.field_28 |= 0x80; + data.adjust.frame_data.last_set_frame = frame; + set_motion_skin_param(motion_id, (float_t)(int32_t)frame); if (duration == 0.0f) { if (set_motion_reset_data) - rob_chara_set_motion_reset_data(rob_chr, motion_id, frame); + this->set_motion_reset_data(motion_id, frame); - rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; - rob_itm_equip->item_equip_object[ITEM_TE_L].osage_iterations = 60; - rob_itm_equip->item_equip_object[ITEM_TE_R].osage_iterations = 60; + item_equip->item_equip_object[ITEM_TE_L].osage_iterations = 60; + item_equip->item_equip_object[ITEM_TE_R].osage_iterations = 60; - /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { + /*if (rob_chara_check_for_ageageagain_module(chara_index, module_index)) { sub_1405430F0(rob_chr->chara_id, 1); sub_1405430F0(rob_chr->chara_id, 2); }*/ @@ -2952,20 +3585,20 @@ bool rob_chara_set_motion_id(rob_chara* rob_chr, int32_t motion_id, return true; } -void rob_chara_set_motion_reset_data(rob_chara* rob_chr, int32_t motion_id, float_t frame) { - rob_chara_item_equip_set_motion_reset_data(rob_chr->item_equip, motion_id, frame); +void rob_chara::set_motion_reset_data(int32_t motion_id, float_t frame) { + rob_chara_item_equip_set_motion_reset_data(item_equip, motion_id, frame); } -void rob_chara_set_motion_skin_param(rob_chara* rob_chr, int32_t motion_id, float_t frame) { - rob_chara_item_equip_set_motion_skin_param(rob_chr->item_equip, - rob_chr->chara_id, motion_id, (int32_t)roundf(frame)); +void rob_chara::set_motion_skin_param(int32_t motion_id, float_t frame) { + rob_chara_item_equip_set_motion_skin_param(item_equip, + chara_id, motion_id, (int32_t)roundf(frame)); } -void rob_chara_set_mouth_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, +void rob_chara::set_mouth_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db) { RobMouthMotion v13; - v13.data.motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, mottbl_index); + v13.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); v13.data.mottbl_index = mottbl_index; v13.data.state = state; v13.data.play_frame_step = step; @@ -2973,72 +3606,65 @@ void rob_chara_set_mouth_mottbl_motion(rob_chara* rob_chr, v13.data.offset = offset; v13.data.field_24 = a7; if (sub_14053F290(&v13)) { - v13.data.frame_data = &rob_chr->data.adjust.frame_data; - v13.data.step_data = &rob_chr->data.adjust.step_data; + v13.data.frame_data = &data.adjust.frame_data; + v13.data.step_data = &data.adjust.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { v13.data.frame_count = motion_storage_get_mot_data_frame_count(v13.data.motion_id, mot_db); v13.data.frame = (v13.data.frame_count - 1.0f) * value; } - rob_chara_set_mouth_motion(rob_chr, &v13, type, mot_db); + rob_chara_set_mouth_motion(this, &v13, type, mot_db); } -void rob_chara_set_osage_move_cancel(rob_chara* rob_chr, uint8_t id, float_t value) { - rob_chara_item_equip_set_osage_move_cancel(rob_chr->item_equip, id, value); +void rob_chara::set_osage_move_cancel(uint8_t id, float_t value) { + rob_chara_item_equip_set_osage_move_cancel(item_equip, id, value); /*if (id <= 1) { - sub_1405436A0(rob_chr->chara_id, 1, *value); - sub_1405436A0(rob_chr->chara_id, 2, *value); + sub_1405436A0(chara_id, 1, value); + sub_1405436A0(chara_id, 2, value); }*/ } -void rob_chara_set_osage_reset(rob_chara* rob_chr) { - rob_chara_item_equip_set_osage_reset(rob_chr->item_equip); +void rob_chara::set_osage_reset() { + rob_chara_item_equip_set_osage_reset(item_equip); } -void rob_chara_set_osage_step(rob_chara* rob_chr, float_t value) { - rob_chr->data.adjust.step = value; - if (value < 0.0) - value = rob_chr->data.adjust.step_data.frame; - rob_chara_item_equip_set_osage_step(rob_chr->item_equip, value); +void rob_chara::set_osage_step(float_t value) { + data.adjust.step = value; + if (value < 0.0f) + value = data.adjust.step_data.frame; + rob_chara_item_equip_set_osage_step(item_equip, value); } -void rob_chara_set_parts_disp(rob_chara* rob_chr, item_id id, bool disp) { +void rob_chara::set_parts_disp(item_id id, bool disp) { if (id < ITEM_BODY) return; else if (id < ITEM_ITEM16) - rob_chr->item_equip->item_equip_object[id].disp = disp; + item_equip->item_equip_object[id].disp = disp; else if (id == ITEM_MAX) for (int32_t i = ITEM_ATAMA; i <= ITEM_ITEM16; i++) { - rob_chr->item_equip->item_equip_object[i].disp = disp; - /*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, disp); - sub_140543780(rob_chr->chara_id, 2, disp); - sub_1405430F0(rob_chr->chara_id, 1); - sub_1405430F0(rob_chr->chara_id, 2); + item_equip->item_equip_object[i].disp = disp; + /*if (index == ITEM_ATAMA + && rob_chara_check_for_ageageagain_module(chara_index, module_index)) { + sub_140543780(chara_id, 1, disp); + sub_140543780(chara_id, 2, disp); + sub_1405430F0(chara_id, 1); + sub_1405430F0(chara_id, 2); }*/ } } -void rob_chara_set_visibility(rob_chara* rob_chr, bool value) { - rob_chr->data.field_0 &= ~0x01; - rob_chr->data.field_3 &= ~0x01; - rob_chr->data.field_0 |= value & 0x01; - rob_chr->data.field_3 |= value & 0x01; - /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { - sub_140543780(rob_chr->chara_id, 1, value); - sub_140543780(rob_chr->chara_id, 2, value); +void rob_chara::set_visibility(bool value) { + data.field_0 &= ~0x01; + data.field_3 &= ~0x01; + data.field_0 |= value ? 0x01 : 0x00; + data.field_3 |= value ? 0x01 : 0x00; + /*if (rob_chara_check_for_ageageagain_module(chara_index, module_index)) { + sub_140543780(chara_id, 1, value); + sub_140543780(chara_id, 2, value); }*/ } -static bone_data* bone_data_init(bone_data* bone) { - memset(bone, 0, sizeof(bone_data)); - bone->eyes_xrot_adjust_neg = 1.0f; - bone->eyes_xrot_adjust_pos = 1.0f; - return bone; -} - static float_t bone_data_limit_angle(float_t angle) { bool neg; if (angle < 0.0f) { @@ -3630,7 +4256,7 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, size_t total_bone_count = 0; size_t ik_bone_count = 0; - bone_data* bone_node = bone->bones.begin; + bone_data* bone_node = bone->bones.data(); for (bone_database_bone& i : *bones ) { bone_node->motion_bone_index = (motion_bone_index)(&i - bones->data()); bone_node->type = i.type; @@ -3693,14 +4319,14 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, } static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, - mot_data* a2, bone_database* bone_data, motion_database* mot_db) { + const mot_data* a2, bone_database* bone_data, motion_database* mot_db) { if (!a2) return; - vector_old_uint16_t* bone_indices = &a1->bone_indices; - vector_old_uint16_t_clear(bone_indices, 0); + std::vector& bone_indices = a1->bone_indices; + bone_indices.clear(); - uint16_t key_set_count = (a2->info & 0x3FFF) - 1; + uint16_t key_set_count = a2->key_set_count - 1; if (!key_set_count) return; @@ -3708,7 +4334,7 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, const char* skeleton_type_string = bone_database_skeleton_type_to_string(skeleton_type); std::string* bone_names = mot_db->bone_name.data(); - mot_bone_info* bone_info = a2->bone_info.data(); + const mot_bone_info* bone_info = a2->bone_info.data(); for (size_t key_set_offset = 0, i = 0; key_set_offset < key_set_count; i++) { int32_t bone_index = bone_data->get_skeleton_bone_index(skeleton_type_string, bone_names[bone_info[i].index].c_str()); @@ -3718,9 +4344,9 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, if (bone_index == -1) break; } - *vector_old_uint16_t_reserve_back(bone_indices) = (uint16_t)bone_index; + bone_indices.push_back((uint16_t)bone_index); - ::bone_data* bone_node = &a1->bones.begin[bone_index]; + ::bone_data* bone_node = &a1->bones.data()[bone_index]; bone_node->key_set_offset = (int32_t)key_set_offset; bone_node->frame = -1.0f; if (bone_node->type >= BONE_DATABASE_BONE_POSITION_ROTATION) @@ -3738,14 +4364,8 @@ static void bone_data_parent_load_rob_chara(bone_data_parent* bone) { bone->motion_bone_count = rob_bone_data->motion_bone_count; bone->ik_bone_count = rob_bone_data->ik_bone_count; bone->chain_pos = rob_bone_data->chain_pos; - - size_t bones_size = rob_bone_data->motion_bone_count; - vector_old_bone_data_reserve(&bone->bones, bones_size); - bone->bones.end += bones_size; - - for (bone_data* i = bone->bones.begin; i != bone->bones.end; i++) - bone_data_init(i); - + bone->bones.clear(); + bone->bones.resize(rob_bone_data->motion_bone_count); bone->global_key_set_count = 6; bone->bone_key_set_count = (uint32_t)((bone->motion_bone_count + bone->ik_bone_count) * 3); } @@ -3785,25 +4405,6 @@ static float_t* bone_node_get_exp_data_component(bone_node* a1, } } -static void bone_data_parent_reset(bone_data_parent* bone) { - bone->rob_bone_data = 0; - bone->motion_bone_count = 0; - bone->global_trans = vec3_null; - bone->global_rotation = vec3_null; - bone->ik_bone_count = 0; - bone->chain_pos = 0; - bone->bone_key_set_count = 0; - bone->global_key_set_count = 0; - bone->rotation_y = 0; - bone->bones.end = bone->bones.begin; - bone->bone_indices.end = bone->bone_indices.begin; -} - -static void bone_data_parent_free(bone_data_parent* bone) { - vector_old_uint16_t_free(&bone->bone_indices, 0); - vector_old_bone_data_free(&bone->bones, 0); -} - static void bone_node_expression_data_mat_set(bone_node_expression_data* data, vec3* parent_scale, mat4* ex_data_mat, mat4* mat) { vec3 position; @@ -3942,7 +4543,7 @@ static bool sub_140482FF0(mat4* mat, vec3* trans, skin_param_hinge* hinge, vec3* return clipped; } -static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, bool a4) { +static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, bool has_children_node) { mat4 v47 = *mat; vec3 v45; vec3_mult(rob_osg->exp_data.position, *parent_scale, v45); @@ -3978,7 +4579,7 @@ static void sub_1404803B0(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, boo } } - if (a4) { + if (has_children_node) { sub_14047F110(rob_osg, &v47, parent_scale, 0); *rob_osg->nodes[0].bone_node_mat = v47; rob_osage_node* v29 = rob_osg->nodes.data(); @@ -4073,13 +4674,13 @@ static void sub_140482180(rob_osage_node* node, float_t a2) { node->field_C8 += 1.0f; } -static void sub_14047C800(rob_osage* rob_osg, mat4* mat, - vec3* parent_scale, float_t step, bool disable_wind, bool ring_coli, bool a7) { +static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, + float_t step, bool disable_wind, bool ring_coli, bool has_children_node) { if (!rob_osg->nodes.size()) return; const float_t osage_gravity_const = get_osage_gravity_const(); - sub_1404803B0(rob_osg, mat, parent_scale, 0); + sub_1404803B0(rob_osg, mat, parent_scale, false); rob_osage_node* v17 = &rob_osg->nodes[0]; v17->trans_orig = v17->trans; @@ -4196,10 +4797,12 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, vec3_add(v82->trans_diff, v82->trans, v82->trans); } - rob_osage_node* v90_begin = rob_osg->nodes.data() + rob_osg->nodes.size() - 2; - rob_osage_node* v90_end = rob_osg->nodes.data(); - for (rob_osage_node* v90 = v90_begin; v90 != v90_end; v90--) - sub_140482F30(&v90[0].trans, &v90[1].trans, v25 * v90->child_length); + if (rob_osg->nodes.size() > 1) { + rob_osage_node* v90_begin = rob_osg->nodes.data() + rob_osg->nodes.size() - 2; + rob_osage_node* v90_end = rob_osg->nodes.data(); + for (rob_osage_node* v90 = v90_begin; v90 != v90_end; v90--) + sub_140482F30(&v90[0].trans, &v90[1].trans, v25 * v90->child_length); + } if (ring_coli) { rob_osage_node* v91 = &rob_osg->nodes.data()[0]; @@ -4222,7 +4825,7 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, } } - if (a7) { + if (has_children_node) { rob_osage_node* v100 = rob_osg->nodes.data(); rob_osage_node* v99_begin = rob_osg->nodes.data() + 1; rob_osage_node* v99_end = rob_osg->nodes.data() + rob_osg->nodes.size(); @@ -4235,11 +4838,11 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, *v99->bone_node_ptr->ex_data_mat = v130; float_t v104; - vec3_distance(v99->trans, v100->trans, v104); + vec3_distance_squared(v99->trans, v100->trans, v104); float_t v105 = v25 * v99->length; bool v106; - if (v104 >= fabs(v105)) { + if (v104 >= v105 * v105) { v105 = sqrtf(v104); v106 = false; } @@ -4647,7 +5250,6 @@ static void rob_osage_set_nodes_external_force(rob_osage* rob_osg, vec3* externa for (size_t v12 = exf - v8; v12; v12--) vec3_mult_scalar(v4, strength, v4); - rob_osage_node* i_begin = rob_osg->nodes.data() + 1; rob_osage_node* i_end = rob_osg->nodes.data() + rob_osg->nodes.size(); for (rob_osage_node* i = i_begin; i != i_end; i++) { @@ -4712,10 +5314,9 @@ static void sub_14047ECA0(rob_osage* rob_osg, float_t step) { if (v11) continue; - for (std::vector::iterator 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); + for (rob_osage_node*& j : data->boc) { + j->field_C8 += (float_t)sub_140485180(coli_ring, &j->trans, &data->skp_osg_node); + j->field_C8 += (float_t)sub_140485180(coli, &j->trans, &data->skp_osg_node); } i->field_C8 += (float_t)sub_140485180(coli_ring, &i->trans, &data->skp_osg_node); @@ -4848,13 +5449,13 @@ static int32_t sub_140485000(vec3* a1, vec3* a2, skin_param_osage_node* a3, osag int32_t type = a4->type; vec3 v21 = vec3_null; switch (a4->type) { - case 1: { + case SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_BALL: v8 += sub_140484450(&v21, a1, a2, &a4->bone0_pos, a3->coli_r + a4->radius); - } break; - case 2: + break; + case SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_CYLINDER: v8 += sub_1404844A0(&v21, a1, a2, a4, a3->coli_r + a4->radius); break; - case 4: + case SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_ELLIPSE: v8 += sub_1404844F0(&v21, a1, a2, a4, a3->coli_r + a4->radius); break; } @@ -4876,25 +5477,24 @@ static void sub_14047D620(rob_osage* rob_osg, float_t step) { 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; - rob_osage_node* v10_begin = rob_osg->nodes.data() + 1; - rob_osage_node* v10_end = rob_osg->nodes.data() + rob_osg->nodes.size(); - for (rob_osage_node* v10 = v10_begin; v10 != v10_end; v10++) { - rob_osage_node_data* v11 = v10->data_ptr; - for (std::vector::iterator j = v11->boc.begin(); j != v11->boc.end(); j++) { - rob_osage_node* v15 = *j; + rob_osage_node* i_begin = rob_osg->nodes.data() + 1; + rob_osage_node* i_end = rob_osg->nodes.data() + rob_osg->nodes.size(); + for (rob_osage_node* i = i_begin; i != i_end; i++) { + rob_osage_node_data* data = i->data_ptr; + for (rob_osage_node*& j : data->boc) { 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; + sub_140485000(&i->trans, &j->trans, &data->skp_osg_node, coli) + + sub_140485000(&i->trans, &j->trans, &data->skp_osg_node, coli_ring)); + i->field_C8 += v17; + j->field_C8 += v17; } - if (coli_type && (coli_type != 1 || v10 != v10_begin)) { + if (coli_type && (coli_type != 1 || i != i_begin)) { 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; + sub_140485000(&i[0].trans, &i[-1].trans, &data->skp_osg_node, coli) + + sub_140485000(&i[0].trans, &i[-1].trans, &data->skp_osg_node, coli_ring)); + i[0].field_C8 += v20; + i[-1].field_C8 += v20; } } rob_osg->nodes.data()[0].trans = v7; @@ -5254,7 +5854,7 @@ static void rob_osage_init_data(rob_osage* rob_osg, external->sibling_node = 0; bone_node* parent_bone_node = external->bone_node_ptr; - for (int32_t i = 0; i < osg_data->count; i++) { + for (uint32_t i = 0; i < osg_data->count; i++) { obj_skin_osage_node* v14 = &osg_nodes[i]; rob_osage_node* node = &nodes[i + 1LL]; node->reset(); @@ -5299,12 +5899,12 @@ static void rob_osage_init_data(rob_osage* rob_osg, obj_skin_osage_node* v23 = osg_data->nodes; rob_osage_node* v26 = &nodes[1]; size_t v33 = 0; - for (int32_t i = 0; i < osg_data->count; i++) { + for (uint32_t i = 0; i < osg_data->count; i++) { v26[i].mat = mat4_null; obj_skin_bone* v36 = skin->bones; - for (int32_t j = 0; j < skin->bones_count; j++) - if ((v36++)->id == osg_nodes->name_index) { + for (uint32_t j = 0; j < skin->bones_count; j++, v36++) + if (v36->id == osg_nodes->name_index) { mat4 mat = skin->bones[j].inv_bind_pose_mat; mat4_inverse_normalized(&mat, &mat); v26[i].mat = mat; @@ -5537,16 +6137,16 @@ static bool sub_140410250(struc_313* a1, size_t a2) { return !!(a1->bitfield.data()[a2 >> 5] & (1 << (a2 & 0x1F))); } -static void mot_blend_interpolate(mot_blend* a1, vector_old_bone_data* bones, - vector_old_uint16_t* bone_indices, bone_database_skeleton_type skeleton_type) { +static void mot_blend_interpolate(mot_blend* a1, std::vector* bones, + std::vector* bone_indices, bone_database_skeleton_type skeleton_type) { if (!a1->mot_key_data.key_sets_ready || !a1->mot_key_data.mot_data || a1->field_30) return; float_t frame = a1->mot_play_data.frame_data.frame; - vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.begin; - bone_data* bones_data = bones->begin; - for (uint16_t* i = bone_indices->begin; i != bone_indices->end; i++) { - bone_data* data = &bones_data[*i]; + vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.data(); + bone_data* bones_data = bones->data(); + for (uint16_t& i : *bone_indices) { + bone_data* data = &bones_data[i]; bool get_data = sub_140410250(&a1->field_0.field_8, data->motion_bone_index); if (get_data) { mot_key_data_interpolate(&a1->mot_key_data, frame, data->key_set_offset, data->key_set_count); @@ -5657,7 +6257,6 @@ static void sub_1404119A0(struc_313* a1) { } static void mot_blend_reset(mot_blend* a1) { - mot_key_data_reset(&a1->mot_key_data); mot_play_data_reset(&a1->mot_play_data); a1->blend.Reset(); a1->field_0.bone_check_func = 0; @@ -5687,7 +6286,7 @@ 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; + const float_t* values = a4->values; if (type == MOT_KEY_SET_NONE) { *value = 0.0f; continue; @@ -5703,13 +6302,13 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, int32_t current_key = a4->current_key; int32_t keys_count = a4->keys_count; - uint16_t* frames = a4->frames; + const uint16_t* frames = a4->frames; int32_t frame_int = (int32_t)frame; size_t key_index; if (current_key > keys_count || (frame_int > a4->last_key + frames[current_key]) || current_key > 0 && frame_int < frames[current_key - 1]) { - uint16_t* key = a4->frames; + const uint16_t* key = frames; size_t length = keys_count; size_t temp; while (length > 0) @@ -5722,8 +6321,8 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, key_index = key - frames; } else { - uint16_t* key = &frames[current_key]; - for (uint16_t* v17 = &frames[keys_count]; key != v17; key++) + const uint16_t* key = &frames[current_key]; + for (const uint16_t* v17 = &frames[keys_count]; key != v17; key++) if (frame_int < *key) break; key_index = key - frames; @@ -5795,20 +6394,19 @@ static uint32_t mot_load_last_key_calc(uint16_t keys_count) { return v3 - keys_count; } -static bool mot_data_load_file(mot* a1, mot_data* a2) { +static bool mot_data_load_file(mot* a1, const mot_data* a2) { a1->frame_count = 0; if (!a2) return 0; - uint16_t info = a2->info; a1->frame_count = a2->frame_count; - int32_t key_set_count = info & 0x3FFF; - bool skeleton_select = (info & 0x4000) != 0; + int32_t key_set_count = a2->key_set_count; + bool skeleton_select = a2->skeleton_select != 0; a1->key_set_count = key_set_count; a1->field_4 = a2->info & 0x8000; - mot_key_set_data* key_set_file = a2->key_set.data(); + const mot_key_set_data* key_set_file = a2->key_set.data(); mot_key_set* key_set = a1->key_sets; for (int32_t i = 0; i < key_set_count; i++, key_set++, key_set_file++) { @@ -5861,13 +6459,13 @@ static void mot_key_data_init_key_sets(mot_key_data* a1, bone_database_skeleton_ static void mot_key_data_interpolate(mot_key_data* a1, float_t frame, uint32_t key_set_offset, uint32_t key_set_count) { mot_key_frame_interpolate(&a1->mot, frame, - &a1->key_set_data.begin[key_set_offset], - &a1->key_set.begin[key_set_offset], key_set_count, &a1->field_68); + &a1->key_set_data.data()[key_set_offset], + &a1->key_set.data()[key_set_offset], key_set_count, &a1->field_68); } -static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, motion_database* mot_db) { +static const mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, motion_database* mot_db) { if (a1->motion_id != motion_id) { - mot_data* mot_data = motion_storage_get_mot_data(motion_id, mot_db); + const mot_data* mot_data = motion_storage_get_mot_data(motion_id, mot_db); a1->mot_data = mot_data; if (mot_data) { a1->skeleton_select = mot_data_load_file(&a1->mot, mot_data); @@ -5885,37 +6483,15 @@ static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id, mot } static void mot_key_data_reserve_key_sets(mot_key_data* a1) { - vector_old_mot_key_set_reserve(&a1->key_set, a1->key_set_count); - a1->key_set.end += a1->key_set_count; - memset(a1->key_set.begin, 0, sizeof(mot_key_set) * a1->key_set_count); + a1->key_set.clear(); + a1->key_set.resize(a1->key_set_count); + a1->key_set_data.clear(); + a1->key_set_data.resize(a1->key_set_count); - vector_old_float_t_reserve(&a1->key_set_data, a1->key_set_count); - a1->key_set_data.end += a1->key_set_count; - memset(a1->key_set_data.begin, 0, sizeof(float_t) * a1->key_set_count); - - a1->mot.key_sets = a1->key_set.begin; + a1->mot.key_sets = a1->key_set.data(); a1->key_sets_ready = true; } -static void mot_key_data_reset(mot_key_data* key_data) { - key_data->key_sets_ready = 0; - key_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; - key_data->frame = -1.0f; - key_data->key_set_count = 0; - key_data->mot_data = 0; - key_data->skeleton_select = 0; - key_data->field_68.field_0 = 0; - key_data->field_68.field_4 = 0.0f; - vector_old_mot_key_set_clear(&key_data->key_set, 0); - vector_old_float_t_clear(&key_data->key_set_data, 0); - key_data->motion_id = -1; -} - -static void mot_key_data_free(mot_key_data* a1) { - vector_old_mot_key_set_free(&a1->key_set, 0); - vector_old_float_t_free(&a1->key_set_data, 0); -} - static void mot_play_data_reset(mot_play_data* play_data) { mot_play_frame_data_reset(&play_data->frame_data); play_data->field_30 = 0; @@ -5948,16 +6524,1090 @@ static void mot_play_frame_data_set_frame(mot_play_frame_data* a1, float_t frame a1->field_14 = -1.0f; } +static void mothead_func_0(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_1(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_2(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr_data->field_1588.field_0.field_20.field_0 |= 0x100; + rob_chara_data* rob_chr_data = func_data->rob_chr_data; + if (rob_chr_data->adjust.field_28 & 8) + rob_chr_data->field_1588.field_0.field_274 -= ((int16_t*)data)[0]; + else + rob_chr_data->field_1588.field_0.field_274 += ((int16_t*)data)[0]; +} + +static void mothead_func_3(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + int32_t v4 = ((int32_t*)data)[0]; + rob_chara_data* rob_chr_data = func_data->rob_chr_data; + (&rob_chr_data->field_1588.field_0.field_20.field_0)[v4 >> 5] |= 1 << (v4 & 0x1F); +} + +static void mothead_func_4(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + int32_t v4 = ((int32_t*)data)[0]; + rob_chara_data* rob_chr_data = func_data->rob_chr_data; + (&rob_chr_data->field_1588.field_0.field_20.field_0)[v4 >> 5] &= ~(1 << (v4 & 0x1F)); +} + +static void mothead_func_5(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara_data* rob_chr_data = func_data->rob_chr_data; + rob_chr_data->adjust.field_28 ^= (rob_chr_data->adjust.field_28 ^ ~rob_chr_data->adjust.field_28) & 0x04; +} + +static void mothead_func_6(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr_data->field_8.field_1B4 = 0; + func_data->rob_chr_data->field_1588.field_0.field_20.field_0 |= 0x400; + func_data->rob_chr_data->field_1588.field_0.field_20.field_0 |= 0x800; +} + +static void sub_140551AF0(rob_chara* rob_chr) { + if (~rob_chr->data.field_0 & 0x02) { + rob_chr->data.miku_rot.position.y = rob_chr->data.miku_rot.field_24.y; + rob_chr->data.field_0 |= 0x02; + if (~(rob_chr->data.field_1588.field_0.field_1E8 & 0x01)) { + rob_chr->data.miku_rot.position.x = rob_chr->data.miku_rot.field_24.x; + rob_chr->data.miku_rot.position.z = rob_chr->data.miku_rot.field_24.z; + } + } + rob_chr->data.field_1588.field_0.field_20.field_0 |= 0x40; +} + +static void mothead_func_7(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + int16_t v4 = ((int16_t*)data)[0]; + rob_chara_data* rob_chr_data = func_data->rob_chr_data; + if (rob_chr_data->adjust.field_28 & 0x08) + v4 = -v4; + float_t v8 = (float_t)((double_t)(int16_t)(v4 + rob_chr_data->field_1588.field_0.field_2B8 + + rob_chr_data->miku_rot.rot_y_int16) * M_PI * (1.0 / 32768.0)); + float_t v9 = sinf(v8) * ((float_t*)data)[1]; + float_t v10 = get_osage_gravity_const() * ((float_t*)data)[2]; + float_t v11 = cosf(v8) * ((float_t*)data)[1]; + rob_chr_data->miku_rot.field_30.x = v9; + rob_chr_data->miku_rot.field_30.y = v10; + rob_chr_data->miku_rot.field_30.z = v11; + sub_140551AF0(func_data->rob_chr); +} + +static void mothead_func_8(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + //sub_14036D130(0, &((int16_t*)data)[2]); +} + +static void mothead_func_9(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_10(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_11(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_12(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_13(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + /*rob_chara* rob_chr; // r8 + rob_chara_data* v5; // r9 + int32_t v6; // ecx + int32_t v7; // eax + char* v8; // rax + char v9; // al + int64_t v10; // [rsp+20h] [rbp-28h] BYREF + int32_t v11; // [rsp+28h] [rbp-20h] + __int16 v12; // [rsp+2Ch] [rbp-1Ch] + bool v13; // [rsp+2Eh] [rbp-1Ah] + int32_t v14; // [rsp+30h] [rbp-18h] + + rob_chr = func_data->rob_chr; + v5 = func_data->rob_chr_data; + v6 = *((int32_t*)data + 1); + v10 = -1i64; + v11 = -1; + v12 = 0; + v13 = 0; + v14 = 0; + LODWORD(v10) = rob_chr->chara_id; + v11 = *(int32_t*)data; + v12 = (v5->adjust.field_28 & 8) != 0; + if (v6 & 0x01) { + v8 = (char*)rob_chr->field_20; + if (!v8) + return; + v7 = *v8; + } + else + v7 = rob_chr->chara_id; + HIDWORD(v10) = v7; + v9 = v5->field_8.field_150; + HIBYTE(v12) = v9; + if ((v6 & 2) != 0) + HIBYTE(v12) = v9 == 0; + v14 = *((int32_t*)data + 2); + v13 = (v6 & 4) != 0; + sub_1401FCE40((int64_t)&v10);*/ +} + +static void mothead_func_14(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_15(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_16(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_17(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + /*__int16 v4; // r14 + rob_chara_data* v5; // rsi + float_t v8; // xmm3_4 + float_t v9; // xmm3_4 + float_t v10; // xmm0_4 + float_t* v11; // rbx + float_t v12; // xmm3_4 + float_t v13; // xmm0_4 + float_t v14; // xmm0_4 + float_t v15; // xmm4_4 + float_t v16; // xmm6_4 + float_t v17; // xmm5_4 + float_t v18; // xmm6_4 + int32_t v19; // eax + __int16* v20; // rcx + float_t v21; // xmm2_4 + float_t v22; // xmm0_4 + rob_chara_data* v23; // rax + float_t v24; // xmm1_4 + float_t v25; // xmm3_4 + rob_chara_data* v26; // rax + float_t v27; // xmm3_4 + float_t v28; // xmm0_4 + __m128 v29; // xmm2 + float_t v30; // xmm0_4 + float_t v31; // xmm1_4 + rob_chara_data* v32; // rax + float_t v33; // xmm2_4 + float_t v34; // xmm1_4 + float_t v35; // xmm0_4 + rob_chara_data* v36; // r14 + float_t v37; // xmm0_4 + vec3 a3; // [rsp+20h] [rbp-30h] BYREF + vec3 v39; // [rsp+30h] [rbp-20h] BYREF + __int16 a1; // [rsp+70h] [rbp+20h] BYREF + + v4 = *((int16_t*)data + 1); + v5 = func_data->rob_chr_data; + if (v4 & 0x02) { + v8 = v5->field_1E68.field_1EB4[0].field_0; + a1 = v5->miku_rot.field_2; + if (v8 > 4.0) + return; + v9 = v8 - *((float_t*)data + 5); + v10 = *((float_t*)data + 1); + if (v9 < v10 && v10 >= 0.0 || (v10 = *((float_t*)data + 2), v9 > v10) && v10 >= 0.0) + v9 = v10; + LABEL_8: + v11 = &v5->field_1588.field_330.field_20.x; + sub_1405357B0(&a1, &v5->miku_rot.field_24, &v5->field_1588.field_330.field_20, v9); + v5->field_1588.field_330.field_18 = 1; + goto LABEL_27; + } + if (v4 & 0x04) { + v12 = v5->field_1E68.field_1EB4[2].field_0; + a1 = v5->miku_rot.field_2 + 0x8000; + if (v12 > 4.0) + return; + v9 = v12 - *((float_t*)data + 5); + v13 = *((float_t*)data + 1); + if (v9 < v13 && v13 >= 0.0 || (v13 = *((float_t*)data + 2), v9 > v13) && v13 >= 0.0) + v9 = v13; + goto LABEL_8; + } + if (~v4 & 0x01) + return; + v14 = *((float_t*)data + 2); + v15 = *((float_t*)data + 3); + v16 = *((float_t*)data + 5); + v17 = *((float_t*)data + 4); + v5->field_1588.field_330.field_18 = 2; + v18 = -v16; + if (v18 >= *((float_t*)data + 1)) { + if (v14 < 0.0f) { + if ((v4 & 0x20) != 0) + v14 = *((float_t*)data + 1); + v18 = v18 - (float_t)-v14; + } + } + else + v18 = *((float_t*)data + 1); + v5->field_1588.field_330.field_20.z = v17; + v5->field_1588.field_330.field_20.y = 0.0; + v11 = &v5->field_1588.field_330.field_20.x; + *(int64_t*)&v39.x = 0i64; + v39.z = 0.0; + v5->field_1588.field_330.field_20.x = v15; + v19 = *(__int16*)data; + *(int64_t*)&a3.x = 0i64; + a3.z = 0.0; + sub_140533530(func_data, (float_t)v19, &a3); + sub_140533530(func_data, func_data->rob_chr_data->adjust.frame_data.frame, &v39); + v20 = &func_data->rob_chr_data->miku_rot.field_2; + a3.x = a3.x - v39.x; + a3.z = a3.z - v39.z; + sub_140535710(v20, &a3.x, &a3.x); + a1 = func_data->field_10->miku_rot.field_2; + sub_140535710(&a1, &v5->field_1588.field_330.field_20.x, &v5->field_1588.field_330.field_20.x); + v21 = v5->field_1588.field_330.field_20.x - a3.x; + v22 = v5->field_1588.field_330.field_20.z - a3.z; + v5->field_1588.field_330.field_20.x = v21; + v5->field_1588.field_330.field_20.z = v22; + v23 = func_data->field_10; + v24 = v23->miku_rot.field_24.y + v5->field_1588.field_330.field_20.y; + v25 = v23->miku_rot.field_24.z + v5->field_1588.field_330.field_20.z; + v5->field_1588.field_330.field_20.x = v21 + v23->miku_rot.field_24.x; + v26 = func_data->rob_chr_data; + v5->field_1588.field_330.field_20.y = v24; + v5->field_1588.field_330.field_20.z = v25; + v27 = v25 - v26->miku_rot.field_24.z; + v28 = v5->field_1588.field_330.field_20.x - v26->miku_rot.field_24.x; + v5->field_1588.field_330.field_20.y = v24 - v26->miku_rot.field_24.y; + v5->field_1588.field_330.field_20.z = v27; + v5->field_1588.field_330.field_20.x = v28; + v5->field_1588.field_330.field_20.y = 0.0; + v29 = (__m128)LODWORD(v5->field_1588.field_330.field_20.x); + v29.m128_f32[0] = (float_t)((float_t)(v29.m128_f32[0] * v29.m128_f32[0]) + + (float_t)(v5->field_1588.field_330.field_20.y * v5->field_1588.field_330.field_20.y)) + + (float_t)(v5->field_1588.field_330.field_20.z * v5->field_1588.field_330.field_20.z); + if (_mm_sqrt_ps(v29).m128_f32[0] > v18) { + vec3_normalize(&v5->field_1588.field_330.field_20); + v30 = v18 * *v11; + v31 = v18 * v5->field_1588.field_330.field_20.y; + v5->field_1588.field_330.field_20.z = v18 * v5->field_1588.field_330.field_20.z; + *v11 = v30; + v5->field_1588.field_330.field_20.y = v31; + } + v32 = func_data->rob_chr_data; + v33 = v32->miku_rot.field_24.z + v5->field_1588.field_330.field_20.z; + v34 = v32->miku_rot.field_24.y + v5->field_1588.field_330.field_20.y; + *v11 = v32->miku_rot.field_24.x + *v11; + v5->field_1588.field_330.field_20.y = v34; + v5->field_1588.field_330.field_20.z = v33; +LABEL_27: + v35 = (float_t)*(__int16*)data; + v5->field_1588.field_330.field_1C = v35; + if (v4 & 0x08) { + v36 = func_data->rob_chr_data; + if (v35 < v36->field_1588.field_0.field_1F4) + v35 = v36->field_1588.field_0.field_1F4; + v37 = v35 - v36->adjust.frame_data.frame; + if (v37 < 1.0) + v37 = 1.0; + v36->miku_rot.field_30.x = (float_t)(*v11 - v36->miku_rot.field_24.x) * (float_t)(1.0 / v37); + v36->miku_rot.field_30.z = (float_t)(v5->field_1588.field_330.field_20.z - v36->miku_rot.field_24.z) + * (float_t)(1.0 / v37); + v36->miku_rot.field_30.y = get_osage_gravity_const() * *((float_t*)data + 6); + func_data->rob_chr_data->field_8.field_B8.field_10.y = 0.0; + sub_140551AF0(func_data->rob_chr); + }*/ +} + +static void mothead_func_18(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_19(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_20(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_21(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_22(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_23(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_24(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_25(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_26(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_27(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_28(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_29(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + /*char* v5; // rbx + __int16 v8; // r9 + int32_t v9; // eax + int32_t v10; // eax + rob_chara_data* v11; // rdx + uint16_t v12; // r8 + int64_t v13; // r9 + float_t v14; // xmm5_4 + float_t v15; // xmm2_4 + float_t v16; // xmm3_4 + float_t v17; // xmm6_4 + float_t v18; // xmm7_4 + float_t v19; // xmm8_4 + float_t v20; // xmm9_4 + float_t v21; // xmm10_4 + float_t v22; // xmm4_4 + int64_t v23; // rcx + __int16 v24; // ax + int32_t* v25; // [rsp+88h] [rbp+10h] BYREF + + v5 = (char*)data + 52; + v25 = (int32_t*)((char*)data + 52); + if (!sub_1405333D0(&v25) + || ((v8 = *((int16_t*)data + 24)) != 0 + || (v9 = *(int32_t*)&v5[4 * ((uint64_t)(int32_t)func_data->rob_chr->chara_index >> 5)], + _bittest(&v9, func_data->rob_chr->chara_index & 0x1F))) + && (v8 != 1 + || (v10 = *(int32_t*)&v5[4 * ((uint64_t)(int32_t)func_data->rob_chr->chara_index >> 5)], + !_bittest(&v10, func_data->rob_chr->chara_index & 0x1F)))) { + v11 = func_data->rob_chr_data; + v12 = ((int16_t*)data)[1]; + LOWORD(v13) = ((int16_t*)data)[3]; + v14 = ((float_t*)data)[2]; + v15 = ((float_t*)data)[4]; + v16 = ((float_t*)data)[8]; + v17 = ((float_t*)data)[3]; + v18 = ((float_t*)data)[6]; + v19 = ((float_t*)data)[7]; + v20 = ((float_t*)data)[9]; + v21 = ((float_t*)data)[10]; + v22 = ((float_t*)data)[11]; + if (v11->adjust.field_28 & 8) { + v12 = word_140A2D430[v12]; + v13 = word_140A2D440[(__int16)v13]; + if (stru_140A2D480[v13].field_0) { + v14 = -v14; + v18 = -v18; + v20 = -v20; + } + + if (stru_140A2D480[v13].field_1) { + v17 = -v17; + v19 = -v19; + v21 = -v21; + } + + if (stru_140A2D480[v13].field_2) { + v15 = -v15; + v16 = -v16; + v22 = -v22; + } + } + v23 = v12; + v11->field_1588.field_330.field_33C[v23].field_0 = *((int16_t*)data + 2); + v11->field_1588.field_330.field_33C[v23].frame = (float_t)mhd_data->frame; + v11->field_1588.field_330.field_33C[v23].field_8 = (float_t)*(__int16*)data; + if (((int16_t*)data)[2] != 1) { + v11->field_1588.field_330.field_33C[v23].field_C = v13; + v24 = *((int16_t*)data + 10); + v11->field_1588.field_330.field_33C[v23].field_10.x = v14; + v11->field_1588.field_330.field_33C[v23].field_1C.x = v18; + v11->field_1588.field_330.field_33C[v23].field_28.x = v20; + v11->field_1588.field_330.field_33C[v23].field_10.y = v17; + v11->field_1588.field_330.field_33C[v23].field_E = v24; + v11->field_1588.field_330.field_33C[v23].field_1C.y = v19; + v11->field_1588.field_330.field_33C[v23].field_28.y = v21; + v11->field_1588.field_330.field_33C[v23].field_10.z = v15; + v11->field_1588.field_330.field_33C[v23].field_1C.z = v16; + v11->field_1588.field_330.field_33C[v23].field_28.z = v22; + } + }*/ +} + +static void mothead_func_30(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr_data->miku_rot.field_30.x = 0.0; + func_data->rob_chr_data->miku_rot.field_30.z = 0.0; +} + +static void mothead_func_31(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_32(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + /*rob_chara_data* v4; // rbx + int32_t v5; // er11 + float_t v7; // xmm1_4 + float_t v8; // xmm0_4 + float_t v9; // xmm2_4 + int32_t v10; // esi + int32_t v11; // er10 + int64_t v12; // r8 + int64_t v13; // rdi + int64_t v14; // rdx + int32_t v15; // ecx + int64_t v16; // r9 + + v4 = func_data->rob_chr_data; + v5 = *((int32_t*)data + 1); + v7 = (float_t)(v4->field_1588.field_0.field_8 - 1.0) - v4->adjust.frame_data.frame; + v8 = (float_t)*(__int16*)data; + if ((v4->adjust.field_28 & 8) != 0) + v5 = sub_140533440(v5); + v9 = *((float_t*)data + 2); + if (v7 >= v8) + v7 = v8; + v10 = *((int32_t*)data + 3); + v11 = 1; + v12 = 236i64; + v13 = 3i64; + do { + if (v11 & v10) { + v14 = 0i64; + v15 = 1; + v16 = 27i64; + do { + if (v15 & v5) { + *((uint8_t*)&v4->field_1588.field_0.field_270 + v12 + v14) = 1; + *((float_t*)&v4->field_1588.field_0.motion_id + v12 + v14) = v9; + *(&v4->field_1588.field_0.field_B0[12].field_4 + v12 + v14) = v7; + } + v15 = __ROL4__(v15, 1); + ++v14; + --v16; + } while (v16); + } + v11 = __ROL4__(v11, 1); + v12 += 27i64; + --v13; + } while (v13);*/ +} + +static uint64_t sub_1405333D0(uint32_t a1) { + uint64_t v1 = a1; + v1 = (((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555)) & 0x33333333) + + ((((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555)) >> 2) & 0x33333333); + return (((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) & 0xFF00FF) + + ((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) >> 8) & 0xFF00FF)) >> 16) + + (((v1 & 0xF) + ((v1 >> 4) & 0xF)) + (((v1 & 0xF0F) + ((v1 >> 4) & 0xF0F)) >> 8)); +} + +static void mothead_func_33(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + uint32_t* v5 = (uint32_t*)((size_t)data + 16); + if (sub_1405333D0(((uint32_t*)((size_t)data + 16))[0]) + && !(v5[(uint64_t)(int32_t)func_data->rob_chr->chara_index >> 5] + & (1 << (func_data->rob_chr->chara_index & 0x1F)))) + return; + + uint32_t* v10 = (uint32_t*)func_data->rob_chr->field_20; + if (sub_1405333D0(((uint32_t*)((size_t)data + 20))[0]) && !(func_data->rob_chr->field_20 + && (((uint32_t*)data + ((uint64_t)v10[4] >> 5))[5] & (1 << (v10[4] & 0x1F))))) + return; + + struc_223* v8 = &func_data->rob_chr_data->field_1588; + v8->field_330.field_310 = (float_t)mhd_data->frame; + v8->field_330.field_314 = (float_t)((int16_t*)data)[0]; + v8->field_330.field_318 = ((uint8_t*)data)[2]; + v8->field_330.field_31C = ((int32_t*)data)[1]; + v8->field_330.field_320 = ((float_t*)data)[2]; + v8->field_330.field_324 = func_data->rob_chr_data->adjust.field_138; + v8->field_330.field_328 = ((float_t*)data)[3]; + v8->field_330.field_32C = func_data->rob_chr_data->adjust.field_140.y; +} + +static void mothead_func_34(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_35(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_36(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_37(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_38(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_39(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_40(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_41(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_42(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_43(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_44(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_45(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_46(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_47(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_48(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_49(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void rob_chara_set_face_motion_id(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db); + +static void mothead_func_50_set_face_motion_id(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara_set_face_motion_id(func_data->rob_chr, ((int32_t*)data)[0], + ((float_t*)data)[1], 0, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); +} + +static void mothead_func_51(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_52(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_53_set_face_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_face_mottbl_motion(0, *(int32_t*)data, ((float_t*)data)[1], ((int32_t*)data)[3], + ((float_t*)data)[2] * 6.0f, ((float_t*)data)[4], 1.0f, -1, 0.0f, false, mot_db); +} + +static void mothead_func_54_set_hand_r_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_hand_r_mottbl_motion(0, *(int32_t*)data, ((float_t*)data)[1], ((int32_t*)data)[3], + ((float_t*)data)[2] * 12.0f, ((float_t*)data)[4], 1.0f, -1, 0.0f, mot_db); +} + +static void mothead_func_55_set_hand_l_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_hand_l_mottbl_motion(0, *(int32_t*)data, ((float_t*)data)[1], ((int32_t*)data)[3], + ((float_t*)data)[2] * 12.0f, ((float_t*)data)[4], 1.0f, -1, 0.0f, mot_db); +} + +static void mothead_func_56_set_mouth_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_mouth_mottbl_motion(0, *(int32_t*)data, ((float_t*)data)[1], ((int32_t*)data)[3], + ((float_t*)data)[2] * 6.0f, ((float_t*)data)[4], 1.0f, -1, 0.0f, mot_db); +} + +static void mothead_func_57_set_eyes_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_eyes_mottbl_motion(0, *(int32_t*)data, ((float_t*)data)[1], ((int32_t*)data)[3], + ((float_t*)data)[2] * 6.0f, ((float_t*)data)[4], 1.0f, -1, 0.0f, mot_db); +} + +static void mothead_func_58_set_eyelid_mottbl_motion(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_eyelid_mottbl_motion(0, *(int32_t*)data, ((float_t*)data)[1], ((int32_t*)data)[3], + ((float_t*)data)[2] * 6.0f, ((float_t*)data)[4], 1.0f, -1, 0.0f, mot_db); +} + +static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db); +static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, int32_t motion_id, float_t frame, + int32_t state, float_t duration, float_t a6, float_t step, int32_t a8, float_t offset, motion_database* mot_db); + +static void rob_chara_set_head_object(rob_chara* rob_chr, int32_t head_object_id, motion_database* mot_db) { + rob_chr->data.adjust.field_150.head_object = rob_chara_get_head_object(rob_chr, head_object_id); + rob_chara_set_face_motion_id(rob_chr, -1, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chara_set_eyelid_motion_id(rob_chr, -1, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chara_set_eyes_motion_id(rob_chr, -1, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chr->bone_data->field_788.field_91 = true; +} + +static void mothead_func_59_set_rob_chara_head_object(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara_set_head_object(func_data->rob_chr, ((int32_t*)data)[0], mot_db); +} + +static void sub_14041C950(rob_chara_bone_data* rob_bone_data, uint8_t a2, bool a3, + float_t a4, float_t a5, float_t a6, float_t a7, float_t a8, uint8_t a9) { + struc_258* v11 = &rob_bone_data->field_788; + bool v10 = !v11->field_8E && a3 || !a3 && v11->field_8E; + + v11->field_8C = a2; + if (!v11->field_8E && a3) + v11->field_8D = 1; + v11->field_8E = a3; + if (!v11->field_90 && a3) + v11->field_8F = 1; + v11->field_90 = a3; + v11->field_94 = a4 < 0.0f ? 1.0f : a4; + v11->field_98 = a4 < 0.0f ? 1.0f : a5; + v11->field_9C = a4 < 0.0f ? 1.0f : a7; + v11->field_A0 = a4 < 0.0f ? 1.0f : a6; + v11->field_A4 = 0.0f; + v11->field_A8 = 1.0f; + v11->field_AC = 0.0f; + v11->field_B0 = a8; + v11->field_1C4 = a9; +} + +static void sub_140554830(rob_chara* rob_chr, uint8_t a2, uint8_t a3, + float_t a4, float_t a5, float_t a6, float_t a7, float_t a8, uint8_t a9) { + sub_14041C950(rob_chr->bone_data, a2, a3, a4, a5, a6, a7, a8, a9); + if (fabsf(a6) <= 0.000001f) + rob_chr->data.field_2 |= 0x80; +} + +static void mothead_func_60(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + sub_140554830(func_data->rob_chr, 1, ((int32_t*)data)[0] != 0, + ((float_t*)data)[1], ((float_t*)data)[2], ((float_t*)data)[3] * 6.0f, 0.25f, 0.0f, 0); +} + +static void mothead_func_61_set_eyelid_motion_from_face(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_eyelid_mottbl_motion_from_face( + ((int32_t*)data)[0], ((float_t*)data)[1] * 6.0f, -1.0f, 0.0f, mot_db); +} + +static void rob_chara_set_parts_adjust_by_index(rob_chara* rob_chr, + rob_osage_parts index, rob_chara_data_parts_adjust* parts_adjust) { + if (index >= ROB_OSAGE_PARTS_LEFT && index <= ROB_OSAGE_PARTS_ANGEL_R) + rob_chara_set_parts_adjust(rob_chr, parts_adjust, + &rob_chr->data.adjust.parts_adjust[index], + &rob_chr->data.adjust.parts_adjust_prev[index]); +} + +static void mothead_func_62_rob_parts_adjust(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara* rob_chr = func_data->rob_chr; + + rob_chara_data_parts_adjust v16; + v16.reset(); + + int8_t v5 = ((int8_t*)data)[5]; + if (v5 >= 0 && v5 <= 6) { + v16.enable = true; + v16.frame = rob_chr->data.adjust.frame_data.frame - mhd_data->frame; + v16.transition_frame = rob_chr->data.adjust.frame_data.frame - mhd_data->frame; + v16.motion_id = rob_chr->data.adjust.motion_id; + v16.set_frame = (float_t)mhd_data->frame; + v16.force_duration = ((float_t*)data)[0]; + v16.type = v5; + v16.cycle_type = ((int8_t*)data)[7]; + v16.ignore_gravity = !!((uint8_t*)data)[6]; + v16.external_force_min.x = ((float_t*)data)[2]; + v16.external_force_min.y = ((float_t*)data)[3]; + v16.external_force_min.z = ((float_t*)data)[4]; + v16.external_force_strength.x = ((float_t*)data)[5]; + v16.external_force_strength.y = ((float_t*)data)[6]; + v16.external_force_strength.z = ((float_t*)data)[7]; + v16.external_force.x = ((float_t*)data)[8]; + v16.external_force.y = ((float_t*)data)[9]; + v16.external_force.z = ((float_t*)data)[10]; + v16.cycle = ((float_t*)data)[11]; + v16.force = ((float_t*)data)[13]; + v16.phase = ((float_t*)data)[12]; + v16.strength = ((float_t*)data)[14]; + v16.strength_transition = ((float_t*)data)[15]; + } + rob_chara_set_parts_adjust_by_index(rob_chr, (rob_osage_parts)((uint8_t*)data)[4], &v16); +} + +static void mothead_func_63(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + +} + +static void mothead_func_64_osage_reset(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_osage_reset(); +} + +static void mothead_func_65_motion_skin_param(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara* rob_chr = func_data->rob_chr; + int32_t motion_id = rob_chr->data.adjust.motion_id; + float_t _frame = (float_t)mhd_data->frame; + rob_chr->set_motion_skin_param(motion_id, _frame); + rob_chr->set_motion_reset_data(motion_id, _frame); +} + +static void mothead_func_66_osage_step(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_osage_step(((float_t*)data)[0]); +} + +static void mothead_func_67(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + bool v5 = false; + bool v6 = false; + switch (((int32_t*)data)[0]) { + case 0: + v6 = true; + break; + case 1: + v5 = true; + break; + case 2: + v6 = true; + v5 = true; + break; + } + + rob_chara_bone_data* rob_bone_data = func_data->rob_chr->bone_data; + rob_bone_data->field_958.field_58 = v6; + rob_bone_data->field_958.field_59 = v5; + rob_bone_data->field_958.field_8C = ((float_t*)data)[1]; +} + +static void mothead_func_68(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + motion_blend_mot* v2 = func_data->rob_chr->bone_data->motion_loaded.front(); + v2->mot_key_data.frame = -1.0f; + v2->mot_key_data.field_68.field_0 = ((int32_t*)data)[0]; + v2->mot_key_data.field_68.field_4 = ((float_t*)data)[0]; +} + +static void mothead_func_69(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + /*float_t v5 = (float_t)((int32_t*)data)[0]; + sub_14041BEF0(func_data->rob_chr->bone_data, v5); + pv_game* v6 = pv_game_data_get(); + if (v6) + pv_game::set_data_itmpv_max_frame(v6, func_data->rob_chr->chara_id, v5);*/ +} + +static void mothead_func_70(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + /*pv_game* v5 = pv_game_data_get(); + if (!v5) + return; + + int32_t v6 = v5->data.camera_auth_3d_uid; + if (v6 == -1) + return; + + int32_t id; + pv_game::get_data_auth_3d(v5, &id, v6); + if (auth_3d_data_check_id_not_empty(&id)) + auth_3d_data_set_max_frame(&id, (float_t)((int32_t*)data)[0]);*/ +} + +static void mothead_func_71_osage_move_cancel(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr->set_osage_move_cancel(((uint8_t*)data)[0], ((float_t*)data)[1]); +} + +static void mothead_func_72(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara_adjust_data* v6 = &func_data->rob_chr->data.adjust_data; + v6->offset.x = ((float_t*)data)[0]; + v6->offset.y = ((float_t*)data)[1]; + v6->offset.z = ((float_t*)data)[2]; + v6->offset_x = !!((uint8_t*)data)[24]; + v6->offset_y = !!((uint8_t*)data)[25]; + v6->offset_z = !!((uint8_t*)data)[26]; +} + +static void mothead_func_73_hand_adjust(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara_adjust* v4 = &func_data->rob_chr->data.adjust; + int32_t hand = ((int16_t*)data)[0]; + + rob_chara_data_hand_adjust* hand_adjust = &v4->hand_adjust[hand]; + rob_chara_data_hand_adjust* hand_adjust_prev = &v4->hand_adjust_prev[hand]; + *hand_adjust_prev = *hand_adjust; + + hand_adjust->reset(); + hand_adjust->type = (rob_chara_data_hand_adjust_type)((int16_t*)data)[4]; + hand_adjust->scale = ((float_t*)data)[3]; + hand_adjust->transition_time = ((float_t*)data)[1]; + hand_adjust->current_time = v4->frame_data.frame - (float_t)mhd_data->frame; + hand_adjust->scale_select = ((int16_t*)data)[1]; + + switch (((int16_t*)data)[1]) { + case 0: + hand_adjust->enable = true; + hand_adjust->rotation_blend = hand_adjust_prev->rotation_blend; + hand_adjust->offset_blend = 1.0f; + hand_adjust->enable_scale = false; + hand_adjust->offset = hand_adjust_prev->offset; + hand_adjust->disable_x = hand_adjust_prev->disable_x; + hand_adjust->disable_y = hand_adjust_prev->disable_y; + hand_adjust->disable_z = hand_adjust_prev->disable_z; + hand_adjust->field_3C = hand_adjust_prev->field_3C; + hand_adjust->field_40 = hand_adjust_prev->field_40; + break; + case 1: + hand_adjust->enable = true; + hand_adjust->rotation_blend = ((float_t*)data)[4]; + hand_adjust->offset_blend = ((float_t*)data)[9]; + hand_adjust->enable_scale = !!((uint8_t*)data)[32]; + hand_adjust->disable_x = !!((uint8_t*)data)[33]; + hand_adjust->disable_y = !!((uint8_t*)data)[34]; + hand_adjust->disable_z = !!((uint8_t*)data)[35]; + hand_adjust->offset.x = ((float_t*)data)[5]; + hand_adjust->offset.y = ((float_t*)data)[6]; + hand_adjust->offset.z = ((float_t*)data)[7]; + hand_adjust->field_3C = ((float_t*)data)[10]; + hand_adjust->field_40 = ((int32_t*)data)[11]; + break; + } +} + +static bool rob_osage_check_parts_bits(rob_osage* rob_osg, rob_osage_parts_bit parts_bits) { + if (rob_osg->osage_setting.parts != ROB_OSAGE_PARTS_NONE) + return !!(parts_bits & (1 << rob_osg->osage_setting.parts)); + return false; +} + +static void sub_1405F9520(rob_chara_item_equip_object* itm_eq_obj, rob_osage_parts_bit a2, bool a3) { + for (ExOsageBlock*& i : itm_eq_obj->osage_blocks) + if (rob_osage_check_parts_bits(&i->rob, a2)) + i->rob.field_1F0F = a3; +} + +static void sub_140513EE0(rob_chara_item_equip* rob_itm_eq, rob_osage_parts a2, bool a3) { + sub_1405F9520(&rob_itm_eq->item_equip_object[a2 == ROB_OSAGE_PARTS_MUFFLER ? ITEM_OUTER : ITEM_KAMI], + (rob_osage_parts_bit)(1 << a2), a3); +} + +static void sub_140555120(rob_chara* rob_chr, rob_osage_parts a2, bool a3) { + sub_140513EE0(rob_chr->item_equip, a2, a3); +} + +static void mothead_func_74(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + sub_140555120(func_data->rob_chr, (rob_osage_parts)((uint8_t*)data)[0], !!((uint8_t*)data)[1]); +} + +void sub_140555100(rob_chara* rob_chr, rob_chara_data_parts_adjust* a2) { + rob_chara_set_parts_adjust(rob_chr, a2, + &rob_chr->data.adjust.field_10D8[0], &rob_chr->data.adjust.field_10D8[1]); +} + +static void mothead_func_75(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + rob_chara* rob_chr = func_data->rob_chr; + + rob_chara_data_parts_adjust v14; + v14.reset(); + + int8_t v5 = ((int8_t*)data)[4]; + if (v5 >= 0 && v5 <= 5) { + v14.enable = true; + v14.frame = rob_chr->data.adjust.frame_data.frame - mhd_data->frame; + v14.transition_frame = rob_chr->data.adjust.frame_data.frame - mhd_data->frame; + v14.motion_id = rob_chr->data.adjust.motion_id; + v14.set_frame = (float_t)mhd_data->frame; + v14.force_duration = ((float_t*)data)[0]; + v14.type = v5; + v14.cycle_type = ((int8_t*)data)[5]; + v14.external_force_min.x = ((float_t*)data)[2]; + v14.external_force_min.y = ((float_t*)data)[3]; + v14.external_force_min.z = ((float_t*)data)[4]; + v14.external_force_strength.x = ((float_t*)data)[5]; + v14.external_force_strength.y = ((float_t*)data)[6]; + v14.external_force_strength.z = ((float_t*)data)[7]; + v14.external_force.x = ((float_t*)data)[8]; + v14.external_force.y = ((float_t*)data)[9]; + v14.external_force.z = ((float_t*)data)[10]; + v14.cycle = ((float_t*)data)[11]; + v14.phase = ((float_t*)data)[12]; + } + sub_140555100(rob_chr, &v14); +} + +static void mothead_func_76(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + struc_222* v4 = &func_data->rob_chr->data.adjust.field_12C8[((int16_t*)data)[0]]; + float_t v7 = v4->field_4; + v4->field_0 = true; + v4->field_4 = 0; + v4->field_8 = v7; + v4->field_C = ((float_t*)data)[2]; + v4->duration = ((float_t*)data)[1]; +} + +static void mothead_func_77(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + sub_14041BB70(func_data->rob_chr->bone_data, *(uint8_t*)data != 0); +} + +static void mothead_func_78(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + static const int16_t word_140A2D430[] = { + 1, 0, 3, 2, 4, 0, 0, 0 + }; + + rob_chara_data* v4 = func_data->rob_chr_data; + uint16_t v5 = ((uint8_t*)data)[2]; + if (v4->adjust.field_28 & 8) + v5 = word_140A2D430[v5]; + + struc_306* v7 = &v4->field_1588.field_330.field_33C[v5]; + int32_t v8 = v7->field_38; + int32_t v9 = v7->field_3C; + int32_t v10 = v7->field_40; + int32_t v11 = v7->field_48; + + v7->field_0 = -1; + v7->frame = -1.0f; + v7->field_8 = -1.0f; + v7->field_C = 0; + v7->field_E = 0; + + int32_t v12 = v7->field_34; + int32_t v13 = v7->field_44; + v7->field_10 = vec3_null; + v7->field_1C = vec3_null; + v7->field_28 = vec3_null; + v7->field_38 = 0; + v7->field_34 = 0; + v7->field_3C = 0; + v7->field_40 = 0; + v7->field_44 = 0; + v7->field_48 = 0; + + uint8_t v14 = ((uint8_t*)data)[3]; + if (v14 != 1) { + v12 = ((int32_t*)data)[1]; + v8 = ((int32_t*)data)[2]; + v9 = ((int32_t*)data)[3]; + v10 = ((int32_t*)data)[4]; + v13 = ((int32_t*)data)[5]; + v11 = ((int32_t*)data)[6]; + } + + v7->field_0 = v14; + v7->frame = (float_t)mhd_data->frame; + v7->field_8 = (float_t)((int16_t*)data)[1]; + v7->field_C = 26; + v7->field_34 = v12; + v7->field_38 = v8; + v7->field_3C = v9; + v7->field_40 = v10; + v7->field_44 = v13; + v7->field_48 = v11; +} + +static void mothead_func_79_rob_chara_coli_ring(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + //rob_chara_set_coli_ring(func_data->rob_chr, *(char*)data); +} + +static void mothead_func_80_adjust_get_global_trans(mothead_func_data* func_data, + void* data, const mothead_data* mhd_data, int32_t frame, motion_database* mot_db) { + func_data->rob_chr_data->adjust_data.get_global_trans = ((uint8_t*)data)[0]; +} + static void motion_blend_mot_interpolate(motion_blend_mot* a1) { - vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.begin; + vec3* keyframe_data = (vec3*)a1->mot_key_data.key_set_data.data(); bool reverse = motion_blend_mot_interpolate_get_reverse(&a1->field_4F8.field_0); float_t frame = a1->mot_play_data.frame_data.frame; bone_database_skeleton_type skeleton_type = a1->bone_data.rob_bone_data->base_skeleton_type; - bone_data* bones_data = a1->bone_data.bones.begin; - for (uint16_t* i = a1->bone_data.bone_indices.begin; i != a1->bone_data.bone_indices.end; i++) { - bone_data* data = &bones_data[*i]; - bool get_data = true; + bone_data* bones_data = a1->bone_data.bones.data(); + for (uint16_t& i : a1->bone_data.bone_indices) { + bone_data* data = &bones_data[i]; + bool get_data = sub_140410250(&a1->field_0.field_8, data->motion_bone_index);; if (reverse && data->mirror != 255) data = &bones_data[data->mirror]; @@ -5976,7 +7626,7 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { a1->mot_key_data.frame = frame; } - keyframe_data = (vec3*)&a1->mot_key_data.key_set_data.begin[bone_key_set_count]; + keyframe_data = (vec3*)&a1->mot_key_data.key_set_data.data()[bone_key_set_count]; vec3 global_trans = keyframe_data[0]; vec3 global_rotation = keyframe_data[1]; if (reverse) @@ -5989,21 +7639,21 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { mat4_rotate_y(rotation_y, &mat); mat4_translate_mult(&mat, global_trans.x, global_trans.y, global_trans.z, &mat); mat4_rotate_mult(&mat, global_rotation.x, global_rotation.y, global_rotation.z, &mat); - for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) - switch (i->type) { + for (bone_data& i : a1->bone_data.bones) + switch (i.type) { case BONE_DATABASE_BONE_TYPE_1: - mat4_mult_vec3_trans(&mat, &i->trans, &i->trans); + mat4_mult_vec3_trans(&mat, &i.trans, &i.trans); break; case BONE_DATABASE_BONE_POSITION_ROTATION: { mat4 rot_mat; mat4_clear_trans(&mat, &rot_mat); - i->rot_mat[0] = rot_mat; - mat4_mult_vec3_trans(&mat, &i->trans, &i->trans); + i.rot_mat[0] = rot_mat; + mat4_mult_vec3_trans(&mat, &i.trans, &i.trans); } break; case BONE_DATABASE_BONE_HEAD_IK_ROTATION: case BONE_DATABASE_BONE_ARM_IK_ROTATION: case BONE_DATABASE_BONE_LEGS_IK_ROTATION: - mat4_mult_vec3_trans(&mat, &i->ik_target, &i->ik_target); + mat4_mult_vec3_trans(&mat, &i.ik_target, &i.ik_target); break; } } @@ -6179,49 +7829,112 @@ static void sub_1401EB1D0(bone_data* a1, int32_t skeleton_select) { if (!a1->flags) { switch (a1->type) { case BONE_DATABASE_BONE_ROTATION: - a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + a1->rot_mat_prev[0][skeleton_select] = a1->rot_mat[0]; break; case BONE_DATABASE_BONE_TYPE_1: case BONE_DATABASE_BONE_POSITION: case BONE_DATABASE_BONE_POSITION_ROTATION: - a1->trans_dup[skeleton_select] = a1->trans; - a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + a1->trans_prev[skeleton_select] = a1->trans; + a1->rot_mat_prev[0][skeleton_select] = a1->rot_mat[0]; break; case BONE_DATABASE_BONE_HEAD_IK_ROTATION: - a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; + a1->rot_mat_prev[0][skeleton_select] = a1->rot_mat[0]; break; case BONE_DATABASE_BONE_ARM_IK_ROTATION: - a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; - a1->rot_mat_dup[skeleton_select + 2] = a1->rot_mat[1]; + a1->rot_mat_prev[0][skeleton_select] = a1->rot_mat[0]; + a1->rot_mat_prev[1][skeleton_select] = a1->rot_mat[1]; break; case BONE_DATABASE_BONE_LEGS_IK_ROTATION: - a1->rot_mat_dup[skeleton_select] = a1->rot_mat[0]; - a1->rot_mat_dup[skeleton_select + 2] = a1->rot_mat[1]; - a1->rot_mat_dup[skeleton_select + 4] = a1->rot_mat[2]; + a1->rot_mat_prev[0][skeleton_select] = a1->rot_mat[0]; + a1->rot_mat_prev[1][skeleton_select] = a1->rot_mat[1]; + a1->rot_mat_prev[2][skeleton_select] = a1->rot_mat[2]; break; } } } static void sub_140412E10(motion_blend_mot* a1, int32_t skeleton_select) { - for (bone_data* v2 = a1->bone_data.bones.begin; v2 != a1->bone_data.bones.end; v2++) { - if ((1 << (v2->motion_bone_index & 0x1F)) - & a1->field_0.field_8.bitfield.data()[v2->motion_bone_index >> 5]) { - sub_1401EB1D0(v2, skeleton_select); - if (v2->type == BONE_DATABASE_BONE_POSITION_ROTATION && (a1->field_4F8.field_0 & 0x02)) - vec3_add(v2->trans_dup[skeleton_select], a1->field_4F8.field_90, v2->trans_dup[skeleton_select]); + for (bone_data& i : a1->bone_data.bones) { + if ((1 << (i.motion_bone_index & 0x1F)) + & a1->field_0.field_8.bitfield.data()[i.motion_bone_index >> 5]) { + sub_1401EB1D0(&i, skeleton_select); + if (i.type == BONE_DATABASE_BONE_POSITION_ROTATION && (a1->field_4F8.field_0 & 0x02)) + vec3_add(i.trans_prev[skeleton_select], a1->field_4F8.field_90, i.trans_prev[skeleton_select]); } } } -static void sub_140412F20(mot_blend* a1, vector_old_bone_data* a2) { - for (bone_data* i = a2->begin; i != a2->end; ++i) - if (((1 << (i->motion_bone_index & 0x1F)) - & a1->field_0.field_8.bitfield.data()[i->motion_bone_index >> 5]) != 0) - sub_1401EB1D0(i, 0); +static void sub_140412F20(mot_blend* a1, std::vector* a2) { + for (bone_data& i : *a2) + if (((1 << (i.motion_bone_index & 0x1F)) + & a1->field_0.field_8.bitfield.data()[i.motion_bone_index >> 5]) != 0) + sub_1401EB1D0(&i, 0); } -static void sub_1404147F0(motion_blend_mot* a1, MotionBlendType blend_type, float_t blend) { +static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, + MotionBlendType blend_type, float_t blend, bone_database* bone_data, motion_database* mot_db) { + motion_blend_mot_set_blend(a1, blend_type, blend); + const mot_data* v6 = mot_key_data_load_file(&a1->mot_key_data, motion_id, mot_db); + bone_data_parent* v7 = &a1->bone_data; + if (bone_data) { + bone_data_parent_load_bone_indices_from_mot(v7, v6, bone_data, mot_db); + ::bone_data* bone = a1->bone_data.bones.data(); + for (uint16_t& i : a1->bone_data.bone_indices) + bone[i].frame = -1.0f; + } + else { + rob_chara_bone_data* rob_bone_data = v7->rob_bone_data; + for (mat4& i : rob_bone_data->mats) + i = mat4_identity; + + for (mat4& i : rob_bone_data->mats2) + i = mat4_identity; + + a1->bone_data.bone_indices.clear(); + } + + a1->field_4F8.field_8C = false; + a1->field_4F8.field_4C = a1->field_4F8.mat; + a1->field_4F8.mat = mat4u_identity; +} + +static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* mat) { + if (mat) { + a1->field_4F8.mat = *mat; + a1->field_4F8.field_8C = true; + } + else { + a1->field_4F8.mat = mat4u_identity; + a1->field_4F8.field_8C = false; + } + + mat4 m = a1->field_4F8.mat; + bone_data* v3 = a1->bone_data.bones.data(); + for (bone_data& v4 : a1->bone_data.bones) + bone_data_mult_1(&v4, &m, v3, true); +} + +static void motion_blend_mot_reset(motion_blend_mot* mot_blend_mot) { + mot_play_data_reset(&mot_blend_mot->mot_play_data); + mot_blend_mot->field_4F8.field_0 = 0; + mot_blend_mot->field_4F8.field_8 = 0; + mot_blend_mot->field_4F8.mat = mat4u_identity; + mot_blend_mot->field_4F8.field_4C = mat4u_identity; + mot_blend_mot->field_4F8.field_8C = false; + mot_blend_mot->field_4F8.eyes_adjust = 0.0f; + mot_blend_mot->field_4F8.prev_eyes_adjust = 0.0f; + mot_blend_mot->field_4F8.field_90 = vec3_identity; + mot_blend_mot->field_4F8.field_9C = vec3_identity; + mot_blend_mot->field_4F8.field_A8 = vec3_identity; + mot_blend_mot->field_4F8.field_BC = 0; + mot_blend_mot->field_4F8.field_BD = 0; + mot_blend_mot->field_4F8.field_C0 = 1.0f; + mot_blend_mot->field_4F8.field_C4 = 1.0f; + mot_blend_mot->field_4F8.field_C8 = vec3_null; +} + +static void motion_blend_mot_set_blend(motion_blend_mot* a1, + MotionBlendType blend_type, float_t blend) { switch (blend_type) { case MOTION_BLEND: default: @@ -6244,71 +7957,6 @@ static void sub_1404147F0(motion_blend_mot* a1, MotionBlendType blend_type, floa } } -static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, - MotionBlendType blend_type, float_t blend, bone_database* bone_data, motion_database* mot_db) { - sub_1404147F0(a1, blend_type, blend); - mot_data* v6 = mot_key_data_load_file(&a1->mot_key_data, motion_id, mot_db); - bone_data_parent* v7 = &a1->bone_data; - if (bone_data) { - bone_data_parent_load_bone_indices_from_mot(v7, v6, bone_data, mot_db); - vector_old_uint16_t* bone_indices = &a1->bone_data.bone_indices; - ::bone_data* bone = a1->bone_data.bones.begin; - for (uint16_t* i = bone_indices->begin; i != bone_indices->end; i++) - bone[*i].frame = -1.0f; - } - else { - rob_chara_bone_data* rob_bone_data = v7->rob_bone_data; - for (mat4& i : rob_bone_data->mats) - i = mat4_identity; - - for (mat4& i : rob_bone_data->mats2) - i = mat4_identity; - - a1->bone_data.bone_indices.end = a1->bone_data.bone_indices.begin; - } - - a1->field_4F8.field_8C = false; - a1->field_4F8.field_4C = a1->field_4F8.mat; - a1->field_4F8.mat = mat4u_identity; -} - -static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* mat) { - if (mat) { - a1->field_4F8.mat = *mat; - a1->field_4F8.field_8C = true; - } - else { - a1->field_4F8.mat = mat4u_identity; - a1->field_4F8.field_8C = false; - } - - mat4 m = a1->field_4F8.mat; - bone_data* v3 = a1->bone_data.bones.begin; - for (bone_data* v4 = a1->bone_data.bones.begin; v4 != a1->bone_data.bones.end; v4++) - bone_data_mult_1(v4, &m, v3, true); -} - -static void motion_blend_mot_reset(motion_blend_mot* mot_blend_mot) { - bone_data_parent_reset(&mot_blend_mot->bone_data); - mot_key_data_reset(&mot_blend_mot->mot_key_data); - mot_play_data_reset(&mot_blend_mot->mot_play_data); - mot_blend_mot->field_4F8.field_0 = 0; - mot_blend_mot->field_4F8.field_8 = 0; - mot_blend_mot->field_4F8.mat = mat4u_identity; - mot_blend_mot->field_4F8.field_4C = mat4u_identity; - mot_blend_mot->field_4F8.field_8C = false; - mot_blend_mot->field_4F8.eyes_adjust = 0.0f; - mot_blend_mot->field_4F8.prev_eyes_adjust = 0.0f; - mot_blend_mot->field_4F8.field_90 = vec3_identity; - mot_blend_mot->field_4F8.field_9C = vec3_identity; - mot_blend_mot->field_4F8.field_A8 = vec3_identity; - mot_blend_mot->field_4F8.field_BC = 0; - mot_blend_mot->field_4F8.field_BD = 0; - mot_blend_mot->field_4F8.field_C0 = 1.0f; - mot_blend_mot->field_4F8.field_C4 = 1.0f; - mot_blend_mot->field_4F8.field_C8 = vec3_null; -} - static void motion_blend_mot_set_duration(motion_blend_mot* mot, float_t duration, float_t step, float_t offset) { if (mot->blend) @@ -6338,7 +7986,7 @@ static void opd_data_decode(int16_t* src_data, size_t count, uint8_t shift, floa static void osage_coli_set(osage_coli* osg_coli, skin_param_osage_root_coli* skp_root_coli, mat4* mats) { - osg_coli->type = 0; + osg_coli->type = (skin_param_osage_root_coli_type)0; if (!skp_root_coli || !mats) return; @@ -6347,25 +7995,26 @@ static void osage_coli_set(osage_coli* osg_coli, osg_coli->radius = skp_root_coli->radius; mat4 mat = mats[skp_root_coli->bone0_index]; mat4_mult_vec3_trans(&mat, &skp_root_coli->bone0_pos, &osg_coli->bone0_pos); - if (skp_root_coli->type == 2 || skp_root_coli->type == 4) { + if (skp_root_coli->type == SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_CYLINDER + || skp_root_coli->type == SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_ELLIPSE) { mat = mats[skp_root_coli->bone1_index]; mat4_mult_vec3_trans(&mat, &skp_root_coli->bone1_pos, &osg_coli->bone1_pos); vec3_sub(osg_coli->bone1_pos, osg_coli->bone0_pos, osg_coli->bone_pos_diff); vec3_length_squared(osg_coli->bone_pos_diff, osg_coli->bone_pos_diff_length_squared); osg_coli->bone_pos_diff_length = sqrtf(osg_coli->bone_pos_diff_length_squared); if (osg_coli->bone_pos_diff_length < 0.01f) - osg_coli->type = 1; + osg_coli->type = SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_BALL; } - else if (skp_root_coli->type == 3) + else if (skp_root_coli->type == SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_PLANE) mat4_mult_vec3(&mat, &skp_root_coli->bone1_pos, &osg_coli->bone1_pos); } - osg_coli->type = 0; + osg_coli->type = (skin_param_osage_root_coli_type)0; } static void osage_coli_ring_set(osage_coli* osg_coli, std::vector* vec_skp_root_coli, mat4* mats) { if (!vec_skp_root_coli->size()) { - osg_coli->type = 0; + osg_coli->type = (skin_param_osage_root_coli_type)0; osg_coli->radius = 0.0f; osg_coli->bone0_pos = vec3_null; osg_coli->bone1_pos = vec3_null; @@ -6383,6 +8032,24 @@ static void osage_play_data_manager_get_opd_file_data(object_info obj_info, //osage_play_data_manager_get()->GetOpdFileData(v8, obj_info, motion_id, data, count); } +static const osage_setting_osg_cat* osage_setting_data_get_cat_value( + object_info* obj_info, const char* root_node) { + auto elem_obj = osage_setting_data.obj.find(*obj_info); + if (elem_obj == osage_setting_data.obj.end()) + return 0; + + std::pair key = { elem_obj->second, root_node }; + auto elem_cat = osage_setting_data.cat.find(key); + if (elem_cat == osage_setting_data.cat.end()) + return 0; + + return &elem_cat->second; +} + +static bool osage_setting_data_obj_has_key(object_info key) { + return osage_setting_data.obj.find(key) != osage_setting_data.obj.end(); +} + static bool pv_osage_manager_array_get_disp(int32_t* chara_id) { return pv_osage_manager_array_ptr_get(*chara_id)->GetDisp(); } @@ -6449,8 +8116,8 @@ void rob_chara_data_parts_adjust_ctrl(rob_chara* rob_chr, rob_chara_data_parts_a float_t cycle = parts_adjust->cycle; float_t v7 = 0.0f; parts_adjust->frame += rob_chr->data.adjust.step_data.frame; - if (rob_chr->data.field_1588.field_58 == 1) - cycle *= (60.0f / rob_chr->data.field_1588.field_8); + if (rob_chr->data.field_1588.field_0.field_58 == 1) + cycle *= (60.0f / rob_chr->data.field_1588.field_0.field_8); cycle *= parts_adjust->frame * 2.0f * (float_t)M_PI * (float_t)(1.0 / 60.0f); switch (parts_adjust->cycle_type) { @@ -6540,9 +8207,8 @@ static void rob_chara_item_equip_object_set_parts_external_force( static void rob_chara_item_equip_set_parts_external_force(rob_chara_item_equip* rob_itm_eq, int32_t parts, vec3* external_force, float_t force, float_t strength) { item_id id = (item_id)(parts == ROB_OSAGE_PARTS_MUFFLER ? ITEM_OUTER : ITEM_KAMI); - object_info obj_info = rob_itm_eq->item_equip_object[id].obj_info; - //if (!osage_setting_data_obj_has_key(&obj_info)) - // return; + if (!osage_setting_data_obj_has_key(rob_itm_eq->item_equip_object[id].obj_info)) + return; switch (parts) { case ROB_OSAGE_PARTS_SHORT_L: @@ -6622,9 +8288,9 @@ static void rob_chara_set_parts_external_force(rob_chara* rob_chr) { } static void sub_140505B20(rob_chara* rob_chr) { - if (rob_chr->data.field_1588.field_20.field_0 & 0x100) + if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x100) rob_chr->data.miku_rot.field_2 = rob_chr->data.miku_rot.rot_y_int16 - + rob_chr->data.field_1588.field_274; + + rob_chr->data.field_1588.field_0.field_274; else rob_chr->data.miku_rot.field_2 = rob_chr->data.miku_rot.rot_y_int16; @@ -6693,13 +8359,85 @@ static void rob_base_rob_chara_ctrl(rob_chara* rob_chr) { rob_chara_set_data_adjust_mat_pos_adjust_true(rob_chr); } -static void sub_140514520(rob_chara* rob_chr) { - //sub_140514540(rob_chr); - //sub_1405144C0(rob_chr); +static void sub_140514680(rob_chara* rob_chr) { + rob_chr->data.field_8.field_0 = 0; + rob_chr->data.field_8.field_4 = rob_chr->data.field_8.field_2C; +} + +static void sub_140514540(rob_chara* rob_chr) { + rob_chr->data.field_8.field_18 = rob_chr->data.field_8.field_4; + rob_chr->data.field_8.field_40 = rob_chr->data.field_8.field_2C; + if (rob_chr->data.field_8.field_2C.field_0 == 1) + sub_140514680(rob_chr); + rob_chr->data.field_8.field_2C.field_0 = 0; +} + +static void sub_1405145F0(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { + if (rob_chr->data.field_8.field_0) + return; + + float_t frame; + if (rob_chr->data.adjust.field_28 >= 0) + frame = 0.0f; + else + frame = rob_chr->data.adjust.frame_data.last_set_frame; + rob_chr->load_motion(rob_chr->data.field_8.field_4.motion_id, + rob_chr->data.field_8.field_4.field_10, frame, MOTION_BLEND, bone_data, mot_db); + rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, 0.0f, 1.0f, 1.0f); + rob_chr->set_motion_reset_data(rob_chr->data.field_8.field_4.motion_id, 0.0f); + rob_chr->data.field_8.field_0++; +} + +static void sub_1405144C0(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { + if (rob_chr->data.field_8.field_4.field_0 == 1) { + //sub_14036D130(6, &rob_chr); + sub_1405145F0(rob_chr, bone_data, mot_db); + } +} + +static void sub_140514520(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { + sub_140514540(rob_chr); + sub_1405144C0(rob_chr, bone_data, mot_db); +} + +static void sub_14054BC70(RobSubAction* a1) { + if (!a1->data.field_18) + return; + + switch (a1->data.field_18->type) { + case SUB_ACTION_EXECUTE_CRY: + a1->data.field_0 = &a1->data.cry; + break; + case SUB_ACTION_EXECUTE_SHAKE_HAND: + a1->data.field_0 = &a1->data.shake_hand; + break; + case SUB_ACTION_EXECUTE_EMBARRASSED: + a1->data.field_0 = &a1->data.embarrassed; + break; + case SUB_ACTION_EXECUTE_ANGRY: + a1->data.field_0 = &a1->data.angry; + break; + case SUB_ACTION_EXECUTE_LAUGH: + a1->data.field_0 = &a1->data.laugh; + break; + case SUB_ACTION_EXECUTE_COUNT_NUM: + a1->data.field_0 = &a1->data.count_num; + break; + default: + a1->data.field_0 = 0; + break; + } + + if (a1->data.field_0) + a1->data.field_0->Field_10(a1->data.field_10); + + if (a1->data.field_18) + delete a1->data.field_18; + a1->data.field_18 = 0; } static void sub_14054CC80(rob_chara* a1) { - //sub_14054BC70(&a1->data.rob_sub_action); + sub_14054BC70(&a1->data.rob_sub_action); if (a1->data.rob_sub_action.data.field_0) { a1->data.rob_sub_action.data.field_0->Field_18(a1); a1->data.rob_sub_action.data.field_0 = 0; @@ -6709,90 +8447,329 @@ static void sub_14054CC80(rob_chara* a1) { a1->data.rob_sub_action.data.field_8->Field_20(a1); } +static uint64_t sub_1405054E0(uint32_t a1) { + uint64_t v1 = a1; + v1 = (((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555)) & 0x33333333) + + ((((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555u)) >> 2) & 0x33333333); + return (((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) & 0xFF00FF) + + ((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) >> 8) & 0xFF00FF)) >> 16) + + (((v1 & 0xF) + ((v1 >> 4) & 0xF)) + (((v1 & 0xF0F) + ((v1 >> 4) & 0xF0F)) >> 8)); +} + +static bool sub_14054F930(uint32_t a1, uint32_t* a2) { + size_t v2 = 0; + while (a1 == *a2) { + v2++; + a2++; + if (v2) + return true; + } + return false; +} + +static void* sub_140551F60(rob_chara* rob_chr, uint32_t* a2) { + int16_t v2 = rob_chr->data.field_1588.field_0.field_244; + const mothead_data2* v3 = rob_chr->data.field_1588.field_0.field_248; + if (!v2) + return 0; + + while (v3) { + if (v3->type == 41) { + void*v5 = v3->data; + uint32_t v8 = ((uint32_t*)v5)[0]; + if (v8 & 0x10) { + if (sub_1405054E0(v8) == 1) + return v5; + } + else { + if (sub_14054F930(v8, a2)) + return v5; + + if (sub_1405054E0(*a2 & v8)) + return v5; + } + } + + v3++; + if (!--v2) + return 0; + } + return 0; +} + +static void sub_1405077D0(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { + void* v2 = sub_140551F60(rob_chr, &rob_chr->data.adjust.field_30); + void* v3 = v2; + if (!v2) + rob_chr->data.adjust.field_30 = 0; + else if ((float_t)((int16_t*)v2)[2] <= rob_chr->data.adjust.frame_data.frame) { + int32_t v4 = ((int32_t*)v2)[2]; + uint32_t v5 = ((uint32_t*)v2)[0]; + if (v5 & 0x400000 && sub_1405054E0(v5) == 1) + v4 = rob_chr->get_rob_cmn_mottbl_motion_id(0); + if (v4 != -1) { + rob_chr->load_motion(v4, !!(((uint8_t*)v3)[12] & 0x01), 0.0f, MOTION_BLEND, bone_data, mot_db); + //sub_14036D130(8, &rob_chr); + } + rob_chr->data.adjust.field_30 = 0; + } +} + static bool sub_140419E90(rob_chara_bone_data* rob_bone_data) { mot_play_data* v2 = &rob_bone_data->motion_loaded.front()->mot_play_data; if (v2->field_34) return v2->field_38 <= 0.0f; - else if (v2->frame_data.field_18 != 1) { - if (v2->frame_data.field_18 == 2 && v2->frame_data.field_1C > 3) - return v2->frame_data.frame < 0.0f; - return false; - } - else if (v2->frame_data.field_1C <= 3u || v2->frame_data.last_frame >= v2->frame_data.frame) - return false; - - return (bool)v2->frame_data.field_18; + else if (v2->frame_data.field_18 == 1) + return v2->frame_data.field_1C > 3 && v2->frame_data.last_frame < v2->frame_data.frame; + else if (v2->frame_data.field_18 == 2) + return v2->frame_data.field_1C > 3 && v2->frame_data.frame < 0.0f; + return false; } static uint8_t sub_14041A0D0(rob_chara_bone_data* rob_bone_data) { return rob_bone_data->motion_loaded.front()->mot_play_data.frame_data.field_28; } +static void sub_140505310(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { + switch (rob_chr->data.field_1588.field_0.field_58) { + case -1: { + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x81; + rob_chr->data.adjust.frame_data.frame = rob_chr->data.field_1588.field_0.field_8; + } break; + case 0: { + int32_t motion_id = rob_chr->data.field_1588.field_0.field_5C; + if (motion_id == -1) + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x81; + else + rob_chr->load_motion(motion_id, !!(rob_chr->data.field_1588.field_0.field_60 & 0x01), + 0.0f, MOTION_BLEND, bone_data, mot_db); + } break; + case 1: { + struc_223* v1 = &rob_chr->data.field_1588; + int32_t v3 = rob_chr->data.field_1588.field_0.field_6C; + if (v3 > 0) { + int32_t motion_id = rob_chr->data.field_1588.field_0.field_64; + if (motion_id != -1) { + if (rob_chr->data.adjust.field_2C >= v3) { + int32_t v6 = mothead_storage_get_mot_by_motion_id(motion_id, mot_db)->field_0.field_0; + if (~v6 & 0x80000 && ~v6 & 0x100000) + rob_chr->load_motion(motion_id, !!(rob_chr->data.field_1588.field_0.field_68 & 0x01), + 0.0f, MOTION_BLEND, bone_data, mot_db); + } + else if (v1->field_0.field_20.field_0 & 0x80000) { + int16_t* v8 = (int16_t*)rob_chr->data.field_8.field_148; + rob_chr->data.field_8.field_146 = v1->field_0.field_220; + if (v8) + v8[711] = v1->field_0.field_220; + } + else if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x100000) + rob_chr->data.field_8.field_0 = 1; + } + } + + rob_chr->data.adjust.frame_data.frame = rob_chara_bone_data_get_frame(rob_chr->bone_data); + v1->field_330.field_0.field_0 = v1->field_330.field_0.field_8; + rob_chr->data.adjust.field_2C++; + return; + } break; + case 2: + case 3: + case 5: { + rob_chr->load_motion(rob_chr->get_rob_cmn_mottbl_motion_id(0), + false, 0.0f, MOTION_BLEND, bone_data, mot_db); + } break; + } +} + static void sub_140505980(rob_chara* rob_chr) { int32_t v3; int32_t v4; if (rob_chr->data.adjust.field_24) { - if (rob_chr->data.adjust.field_24 - 1) { + if (rob_chr->data.adjust.field_24 != 1) { if (rob_chr->data.adjust.field_24 != 2) return; goto LABEL_23; } } else { - if (rob_chr->data.field_1588.field_78 > rob_chr->data.adjust.frame_data.frame) + if (rob_chr->data.field_1588.field_0.field_78 > rob_chr->data.adjust.frame_data.frame) return; - if (rob_chr->data.field_1588.field_10.field_0 & 0x4000) { - rob_chr->data.field_1588.field_20.field_0 |= 0x4000; - if ((rob_chr->data.field_1588.field_10.field_0 & 0x20000) != 0) - rob_chr->data.field_1588.field_20.field_0 &= ~0x20000; + if (rob_chr->data.field_1588.field_0.field_10.field_0 & 0x4000) { + rob_chr->data.field_1588.field_0.field_20.field_0 |= 0x4000; + if ((rob_chr->data.field_1588.field_0.field_10.field_0 & 0x20000) != 0) + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x20000; } - rob_chr->data.field_1588.field_20.field_0 &= ~0x02; + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x02; rob_chr->data.adjust.field_24 = 1; } - if (rob_chr->data.field_1588.field_7C > rob_chr->data.adjust.frame_data.frame) + if (rob_chr->data.field_1588.field_0.field_7C > rob_chr->data.adjust.frame_data.frame) return; - rob_chr->data.field_1588.field_20.field_0 |= 4u; - rob_chr->data.field_1588.field_20.field_8 &= ~0x400000; - v3 = rob_chr->data.field_1588.field_20.field_0; + rob_chr->data.field_1588.field_0.field_20.field_0 |= 4; + rob_chr->data.field_1588.field_0.field_20.field_8 &= ~0x400000; + v3 = rob_chr->data.field_1588.field_0.field_20.field_0; if (v3 & 0x4000) { - rob_chr->data.field_1588.field_20.field_0 = v3 & ~0x4000; - rob_chr->data.field_1588.field_88 &= ~0x02; - if (rob_chr->data.field_1588.field_88 & 0x04) - rob_chr->data.field_1588.field_20.field_0 &= ~0x8000; + rob_chr->data.field_1588.field_0.field_20.field_0 = v3 & ~0x4000; + rob_chr->data.field_1588.field_0.field_88 &= ~0x02; + if (rob_chr->data.field_1588.field_0.field_88 & 0x04) + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x8000; } else if (v3 & 0x2000000 && (v3 & 0x01) != 0 - && ~rob_chr->data.field_1588.field_20.field_4 & 0x10000000 - && ~rob_chr->data.field_1588.field_20.field_4 & 0x20000000) - rob_chr->data.field_1588.field_20.field_0 = v3 & ~0x01; + && ~rob_chr->data.field_1588.field_0.field_20.field_4 & 0x10000000 + && ~rob_chr->data.field_1588.field_0.field_20.field_4 & 0x20000000) + rob_chr->data.field_1588.field_0.field_20.field_0 = v3 & ~0x01; - v4 = rob_chr->data.field_1588.field_10.field_0; + v4 = rob_chr->data.field_1588.field_0.field_10.field_0; if (v4 & 0x10000 && v4 & 0x20000) - rob_chr->data.field_1588.field_20.field_0 &= ~0x20000; + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x20000; rob_chr->data.adjust.field_24 = 2; LABEL_23: - float_t v5 = rob_chr->data.field_1588.field_80; + float_t v5 = rob_chr->data.field_1588.field_0.field_80; if (v5 >= 0.0f && v5 <= rob_chr->data.adjust.frame_data.frame) { - if (v5 < (rob_chr->data.field_1588.field_8 - 1.0f) - || rob_chr->data.field_1588.field_58 == -1 - || rob_chr->data.field_1588.field_58 == 2) { - rob_chr->data.field_1588.field_20.field_0 &= ~0x2020081; + if (v5 < (rob_chr->data.field_1588.field_0.field_8 - 1.0f) + || rob_chr->data.field_1588.field_0.field_58 == -1 + || rob_chr->data.field_1588.field_0.field_58 == 2) { + rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x2020081; rob_chr->data.field_2 |= 0x20; } rob_chr->data.adjust.field_24 = 3; } } -static void sub_1405070E0(rob_chara* rob_chr) { - //if (sub_140419E90(rob_chr->bone_data) || sub_14041A0D0(rob_chr->bone_data)) - // sub_140505310(rob_chr); +static void mothead_apply(struc_223* a1, rob_chara* rob_chr, float_t frame, motion_database* mot_db) { + a1->field_330.field_338 = 0; + + mothead_func_data v7; + v7.rob_chr = rob_chr; + v7.rob_chr_data = &rob_chr->data; + if (rob_chr->field_20) + v7.field_10 = (rob_chara_data*)((size_t)rob_chr->field_20 + 0x440); + else + v7.field_10 = 0; + + struc_377* v4 = &a1->field_330.field_0; + v7.field_18 = rob_chr; + v7.field_28 = &rob_chr->data.field_1588; + v7.field_20 = &rob_chr->data; + if (!v4->field_0) + return; + + int32_t frame_int = (int32_t)frame; + while (v4->field_0->frame < frame_int && v4->field_0->type >= MOTHEAD_DATA_TYPE_0) { + if (v4->field_0->type >= MOTHEAD_DATA_MAX) { + v4->field_0++; + continue; + } + + mothead_data_type v4a = v4->field_0->type; + mothead_func func = mothead_func_array[v4a].func; + if (func) { + if (~mothead_func_array[v4a].flags & 0x01 || frame_int <= 0) + func(&v7, v4->field_0->data, v4->field_0, frame_int, mot_db); + else { + frame_int -= v4->field_0->frame; + if (frame_int <= 1) + func(&v7, v4->field_0->data, v4->field_0, frame_int, mot_db); + } + } + v4->field_0++; + } +} + +static void sub_1405044B0(rob_chara* rob_chr) { + float_t v2 = rob_chr->bone_data->ik_scale.ratio0; + float_t v4 = v2; + if (!rob_chr->data.field_1588.field_330.field_31C) { + rob_chr->data.adjust.field_138 = v2; + rob_chr->data.adjust.field_13C = v2; + rob_chr->data.adjust.field_140 = vec3_null; + return; + } + + float_t v5 = rob_chr->data.field_1588.field_330.field_324; + float_t v6 = v2; + float_t v7 = rob_chr->data.field_1588.field_330.field_32C; + float_t v8 = 0.0f; + if (rob_chr->data.field_1588.field_330.field_318 == 1) { + switch (rob_chr->data.field_1588.field_330.field_31C) { + case 1: + v6 = 1.0f; + break; + case 2: + v6 = rob_chr->bone_data->ik_scale.ratio0; + case 3: + v6 = rob_chr->bone_data->ik_scale.ratio1; + case 4: + v6 = rob_chr->bone_data->ik_scale.ratio2; + case 5: + v6 = rob_chr->bone_data->ik_scale.ratio3; + case 6: + if (!rob_chr->field_20) + break; + v6 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio0; + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 *= v4; + case 7: + if (!rob_chr->field_20) + break; + v6 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio1; + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 *= v4; + case 8: + if (!rob_chr->field_20) + break; + v6 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio2; + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 *= v4; + case 9: + if (!rob_chr->field_20) + break; + v6 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio3; + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 *= v4; + break; + case 10: + if (rob_chr->data.field_1588.field_330.field_320 > 0.0f) + v6 = rob_chr->data.field_1588.field_330.field_320; + break; + default: + break; + } + v8 = rob_chr->data.field_1588.field_330.field_328; + } + + float_t v15 = rob_chr->data.adjust.frame_data.frame; + float_t v16 = rob_chr->data.field_1588.field_330.field_314; + if (v15 < v16) { + float_t v17 = rob_chr->data.field_1588.field_330.field_310; + if (v15 < v17) { + v6 = v5; + v8 = v7; + } + else if (fabsf(v16 - v17) > 0.000001f && v16 - v17 > 0.0f) { + float_t v19 = (v16 - v15) / (v16 - v17); + v6 = v6 + (v5 - v6) * v19; + v8 = v8 + (v7 - v8) * v19; + } + } + + rob_chr->data.adjust.field_138 = v6; + rob_chr->data.adjust.field_13C = v4; + rob_chr->data.adjust.field_140.x = 0.0f; + rob_chr->data.adjust.field_140.y = v8; + rob_chr->data.adjust.field_140.z = 0.0f; +} + +static void sub_1405070E0(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { + if (sub_140419E90(rob_chr->bone_data) || sub_14041A0D0(rob_chr->bone_data)) + sub_140505310(rob_chr, bone_data, mot_db); sub_140505980(rob_chr); - //mothead_apply(&rob_chr->data.field_1588, rob_chr, rob_chr->data.adjust.frame_data.frame); - //sub_1405044B0(rob_chr); + mothead_apply(&rob_chr->data.field_1588, rob_chr, rob_chr->data.adjust.frame_data.frame, mot_db); + sub_1405044B0(rob_chr); } static void sub_1405079B0(rob_chara* rob_chr, int32_t a2, struc_222* a3) { @@ -7051,6 +9028,44 @@ static void sub_1405508F0(rob_chara* rob_chr, motion_database* mot_db) { rob_chara_set_eyelid_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } +static bool sub_1404190E0(rob_chara_bone_data* rob_bone_data) { + return rob_bone_data->eyelid.blend.field_8 || rob_bone_data->eyelid.blend.field_9; +} + +static void sub_140555F70(rob_chara* rob_chr, motion_database* mot_db) { + if (sub_1404190E0(rob_chr->bone_data)) + return; + + if (rob_chr->data.adjust.field_29 < 0) + return; + + int32_t v3 = rob_chr->data.adjust.field_150.field_1C0; + if (v3 == 1) { + if (rob_chr->data.adjust.field_29 & 2) { + rob_chr->set_eyelid_mottbl_motion_from_face(2, 3.0f, -1.0f, 1.0f, mot_db); + rob_chr->data.adjust.field_29 |= 0x02; + return; + } + return; + } + else if (v3 == 2) { + rob_chr->data.adjust.field_150.field_1C0 = 0; + rob_chr->data.adjust.field_29 &= ~0x02; + } + else if (v3 != 0) + return; + + sub_1405500F0(rob_chr); + if (~rob_chr->data.adjust.field_2A & 0x02 && rob_chr->data.adjust.field_29 & 0x01) { + rob_chr->data.adjust.field_150.time += rand_state_array_get_float(1) + * rob_chr->frame_speed * 2.0f * (float_t)(1.0 / 60.0); + if (rob_chr->data.adjust.field_150.time >= 5.0f) { + rob_chr->set_eyelid_mottbl_motion_from_face(1, 3.0f, -1.0f, 1.0f, mot_db); + rob_chr->data.adjust.field_29 |= 0x02; + } + } +} + static void sub_14041CA70(rob_chara_bone_data* rob_bone_data, float_t a2) { rob_bone_data->motion_loaded.front()->field_4F8.field_C0 = a2; } @@ -7132,6 +9147,56 @@ static object_info sub_140550310(rob_chara* rob_chr) { return rob_chr->data.adjust.field_150.face_object; } +static void sub_140412DA0(motion_blend_mot* a1, vec3* trans) { + if (a1->bone_data.bones.size()) + *trans = a1->bone_data.bones.front().trans; +} + +static void sub_140419800(rob_chara_bone_data* rob_bone_data, vec3* trans) { + sub_140412DA0(rob_bone_data->motion_loaded.front(), trans); +} + +static float_t sub_1405501F0(rob_chara* rob_chr) { + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + return rob_chr->data.adjust.field_138 / rob_chr->bone_data->ik_scale.ratio0; + return rob_chr->data.adjust.field_138; +} + +static float_t sub_1405503B0(rob_chara* rob_chr) { + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + return rob_chr->data.adjust.field_13C / rob_chr->bone_data->ik_scale.ratio0; + return rob_chr->data.adjust.field_13C; +} + +static void sub_140504F00(rob_chara* rob_chr) { + if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x08 + && ~rob_chr->data.field_1588.field_0.field_20.field_8 & 0x10000000) + return; + + vec3 v9 = vec3_null; + sub_140419800(rob_chr->bone_data, &v9); + float_t v3 = sub_1405503B0(rob_chr) * rob_chr->data.adjust.step_data.frame; + float_t v4 = sub_1405501F0(rob_chr) * rob_chr->data.adjust.step_data.frame; + v9.x -= v3 * rob_chr->data.field_1588.field_0.field_318.x; + v9.y -= v4 * rob_chr->data.field_1588.field_0.field_318.y; + v9.z -= v3 * rob_chr->data.field_1588.field_0.field_318.z; + + mat4 mat; + mat4_rotate_y((float_t)((double_t)rob_chr->data.miku_rot.rot_y_int16 * M_PI * (1.0 / 32768.0)), &mat); + mat4_mult_vec3(&mat, &v9, &v9); + + if (~rob_chr->data.field_1588.field_0.field_20.field_0 & 0x08) { + rob_chr->data.field_1588.field_0.field_20.field_0 |= 0x08; + rob_chr->data.miku_rot.position.x = rob_chr->data.miku_rot.field_24.x - v9.x; + rob_chr->data.miku_rot.position.z = rob_chr->data.miku_rot.field_24.z - v9.z; + } + + if (rob_chr->data.field_1588.field_0.field_20.field_8 & 0x10000000) { + rob_chr->data.field_1588.field_0.field_20.field_8 &= ~0x10000000; + rob_chr->data.miku_rot.position.y = rob_chr->data.miku_rot.field_24.y - v9.y; + } +} + static void sub_140504710(rob_chara* rob_chr, motion_database* mot_db, bone_database* bone_data, void* data, object_database* obj_db) { sub_1405509D0(rob_chr, mot_db); @@ -7140,12 +9205,12 @@ static void sub_140504710(rob_chara* rob_chr, motion_database* mot_db, sub_140550B20(rob_chr, mot_db); sub_140550960(rob_chr, mot_db); sub_1405508F0(rob_chr, mot_db); - //sub_140555F70(rob_chr, mot_db); + sub_140555F70(rob_chr, mot_db); sub_14041C9D0(rob_chr->bone_data, !!(rob_chr->data.adjust.field_28 & 0x08)); sub_14041D2D0(rob_chr->bone_data, !!(rob_chr->data.adjust.field_28 & 0x04)); sub_14041C680(rob_chr->bone_data, !!(rob_chr->data.field_0 & 0x02)); sub_14041D270(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.field_1588.field_274 * M_PI * (1.0 / 32768.0))); + (float_t)((double_t)rob_chr->data.field_1588.field_0.field_274 * M_PI * (1.0 / 32768.0))); sub_14041CA70(rob_chr->bone_data, rob_chr->data.adjust.field_138); sub_14041CAB0(rob_chr->bone_data, rob_chr->data.adjust.field_13C); sub_14041CA10(rob_chr->bone_data, &rob_chr->data.adjust.field_140); @@ -7221,7 +9286,7 @@ static void sub_140504710(rob_chara* rob_chr, motion_database* mot_db, rob_chara_bone_data_interpolate(rob_chr->bone_data); rob_chara_bone_data_update(rob_chr->bone_data, 0); - //sub_140504F00(rob_chr); + sub_140504F00(rob_chr); rob_chr->data.adjust.field_28 &= ~0x80; } @@ -7233,7 +9298,7 @@ static void sub_140504AC0(rob_chara* rob_chr) { vec3_add(v4, rob_chr->data.miku_rot.field_3C, v20); vec3_add(v20, rob_chr->data.field_8.field_B8.field_10, v20); v4.y = rob_chr->data.field_8.field_B8.field_10.y - - get_osage_gravity_const() * rob_chr->data.field_1588.field_200; + - get_osage_gravity_const() * rob_chr->data.field_1588.field_0.field_200; } else if (rob_chr->data.field_1 >= 0) { vec3 v20 = rob_chr->data.miku_rot.field_3C; @@ -7241,11 +9306,11 @@ static void sub_140504AC0(rob_chara* rob_chr) { v20.z += v4.z + rob_chr->data.field_8.field_B8.field_10.z; float_t v7 = 0.4f; - if (rob_chr->data.field_1588.field_20.field_0 & 0xC00) + if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0xC00) v7 = 0.6f; float_t v13 = powf(v7, 1.0f); - if (rob_chr->data.field_1588.field_348) + if (rob_chr->data.field_1588.field_330.field_18) v13 = 1.0f; v4.x *= v13; @@ -7256,39 +9321,40 @@ static void sub_140504AC0(rob_chara* rob_chr) { rob_chr->data.field_8.field_B8.field_10.z *= v13; if (rob_chr->data.field_0 & 0x04 - && rob_chr->data.field_1588.field_1EC > rob_chr->data.adjust.frame_data.frame) { + && rob_chr->data.field_1588.field_0.field_1EC > rob_chr->data.adjust.frame_data.frame) { v20.x += rob_chr->data.field_3DD4; v20.z += rob_chr->data.field_3DDC; } - if (rob_chr->data.field_1588.field_348 == 3) { + if (rob_chr->data.field_1588.field_330.field_18 == 3) { v20 = vec3_null; - if (rob_chr->data.field_1588.field_34C >= rob_chr->data.adjust.frame_data.frame) { - v20.y = rob_chr->data.field_1588.field_350.y; - } - else { - rob_chr->data.field_1588.field_348 = 0; - } + if (rob_chr->data.field_1588.field_330.field_1C >= rob_chr->data.adjust.frame_data.frame) + v20.y = rob_chr->data.field_1588.field_330.field_20.y; + else + rob_chr->data.field_1588.field_330.field_18 = 0; } - else if (rob_chr->data.field_1588.field_348) { + else if (rob_chr->data.field_1588.field_330.field_18) { v20.x = 0.0f; v20.z = 0.0f; - if (rob_chr->data.adjust.frame_data.frame > rob_chr->data.field_1588.field_34C - || rob_chr->data.field_1E68.field_1C && rob_chr->data.field_1588.field_348 == 1) - rob_chr->data.field_1588.field_348 = 0; + if (rob_chr->data.adjust.frame_data.frame > rob_chr->data.field_1588.field_330.field_1C + || rob_chr->data.field_1E68.field_1C && rob_chr->data.field_1588.field_330.field_18 == 1) + rob_chr->data.field_1588.field_330.field_18 = 0; else { - float_t v17 = rob_chr->data.field_1588.field_34C - rob_chr->data.adjust.frame_data.frame; + float_t v17 = rob_chr->data.field_1588.field_330.field_1C + - rob_chr->data.adjust.frame_data.frame; if (v17 < 0.0f) v17 = 0.0f; float_t v18 = 1.0f / (v17 + 1.0f); - v20.x = v18 * (rob_chr->data.field_1588.field_350.x - rob_chr->data.miku_rot.field_24.x); - v20.z = v18 * (rob_chr->data.field_1588.field_350.z - rob_chr->data.miku_rot.field_24.z); + v20.x = v18 * (rob_chr->data.field_1588.field_330.field_20.x + - rob_chr->data.miku_rot.field_24.x); + v20.z = v18 * (rob_chr->data.field_1588.field_330.field_20.z + - rob_chr->data.miku_rot.field_24.z); } } } - if (rob_chr->data.field_1588.field_20.field_4 & 0x4000000 + if (rob_chr->data.field_1588.field_0.field_20.field_4 & 0x4000000 && (rob_chr->data.field_3DA0 & 0x40 && rob_chr->data.field_3D9C & 0x20 || rob_chr->data.field_3DA0 & 0x20 && rob_chr->data.field_3D9C & 0x40)) { v4.x = 0.0f; @@ -7306,10 +9372,10 @@ static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { motion_database* mot_db = &data->data_ft.mot_db; object_database* obj_db = &data->data_ft.obj_db; - sub_140514520(rob_chr); + sub_140514520(rob_chr, bone_data, mot_db); sub_14054CC80(rob_chr); - //sub_1405077D0(rob_chr); - sub_1405070E0(rob_chr); + sub_1405077D0(rob_chr, bone_data, mot_db); + sub_1405070E0(rob_chr, bone_data, mot_db); sub_140507960(rob_chr); sub_140504710(rob_chr, mot_db, bone_data, data, obj_db); sub_140504AC0(rob_chr); @@ -7398,9 +9464,9 @@ static void rob_disp_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { rob_chara_item_equip_ctrl(rob_chr->item_equip); /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { sub_140543520(rob_chr->chara_id, 1, rob_chr->item_equip->step); - sub_14054FC90(rob_chr, 1u, "j_tail_l_006_wj"); + sub_14054FC90(rob_chr, 1, "j_tail_l_006_wj"); sub_140543520(rob_chr->chara_id, 2, rob_chr->item_equip->step); - sub_14054FC90(rob_chr, 2u, "j_tail_r_006_wj"); + sub_14054FC90(rob_chr, 2, "j_tail_r_006_wj"); }*/ } @@ -7461,7 +9527,7 @@ static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_d float_t eyes_xrot_adjust_neg = v1_neg * v2_neg; float_t eyes_xrot_adjust_pos = v1_pos * v2_pos; for (motion_blend_mot*& i : rob_bone_data->motions) { - bone_data* data = i->bone_data.bones.begin; + bone_data* data = i->bone_data.bones.data(); data[MOTION_BONE_KL_EYE_L].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; data[MOTION_BONE_KL_EYE_L].eyes_xrot_adjust_pos = eyes_xrot_adjust_pos; data[MOTION_BONE_KL_EYE_R].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; @@ -7505,7 +9571,7 @@ static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_dat } static void rob_chara_bone_data_ik_scale_calculate( - rob_chara_bone_data_ik_scale* ik_scale, vector_old_bone_data* vec_bone_data, + rob_chara_bone_data_ik_scale* ik_scale, std::vector* vec_bone_data, bone_database_skeleton_type base_skeleton_type, bone_database_skeleton_type skeleton_type, bone_database* bone_data) { const char* base_name = bone_database_skeleton_type_to_string(base_skeleton_type); @@ -7516,10 +9582,10 @@ static void rob_chara_bone_data_ik_scale_calculate( || !bone_data->get_skeleton_heel_height(name, &heel_height)) return; - ::bone_data* b_cl_mune = &vec_bone_data->begin[MOTION_BONE_CL_MUNE]; - ::bone_data* b_kl_kubi = &vec_bone_data->begin[MOTION_BONE_KL_KUBI]; - ::bone_data* b_c_kata_l = &vec_bone_data->begin[MOTION_BONE_C_KATA_L]; - ::bone_data* b_cl_momo_l = &vec_bone_data->begin[MOTION_BONE_CL_MOMO_L]; + ::bone_data* b_cl_mune = &vec_bone_data->data()[MOTION_BONE_CL_MUNE]; + ::bone_data* b_kl_kubi = &vec_bone_data->data()[MOTION_BONE_KL_KUBI]; + ::bone_data* b_c_kata_l = &vec_bone_data->data()[MOTION_BONE_C_KATA_L]; + ::bone_data* b_cl_momo_l = &vec_bone_data->data()[MOTION_BONE_CL_MOMO_L]; float_t base_height = fabsf(b_cl_momo_l->base_translation[0].y) + b_cl_momo_l->ik_segment_length[0] + b_cl_momo_l->ik_2nd_segment_length[0] + *base_heel_height; @@ -7848,8 +9914,8 @@ static void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data) bone_database_skeleton_type skeleton_type = rob_bone_data->base_skeleton_type; motion_blend_mot* v5 = rob_bone_data->motion_loaded.front(); - vector_old_bone_data* bones = &v5->bone_data.bones; - vector_old_uint16_t* bone_indices = &v5->bone_data.bone_indices; + std::vector* bones = &v5->bone_data.bones; + std::vector* bone_indices = &v5->bone_data.bone_indices; mot_blend_interpolate(&rob_bone_data->face, bones, bone_indices, skeleton_type); mot_blend_interpolate(&rob_bone_data->hand_l, bones, bone_indices, skeleton_type); mot_blend_interpolate(&rob_bone_data->hand_r, bones, bone_indices, skeleton_type); @@ -7912,7 +9978,7 @@ static void sub_1401EAD00(bone_data* a1, bone_data* a2) { case BONE_DATABASE_BONE_POSITION: case BONE_DATABASE_BONE_POSITION_ROTATION: a1->trans = a2->trans; - a1->trans_dup[0] = a2->trans_dup[0]; + a1->trans_prev[0] = a2->trans_prev[0]; break; } @@ -7922,29 +9988,29 @@ static void sub_1401EAD00(bone_data* a1, bone_data* a2) { case BONE_DATABASE_BONE_POSITION: case BONE_DATABASE_BONE_POSITION_ROTATION: a1->rot_mat[0] = a2->rot_mat[0]; - a1->rot_mat_dup[0] = a2->rot_mat_dup[0]; + a1->rot_mat_prev[0][0] = a2->rot_mat_prev[0][0]; break; case BONE_DATABASE_BONE_HEAD_IK_ROTATION: a1->rot_mat[0] = a2->rot_mat[0]; - a1->rot_mat_dup[0] = a2->rot_mat_dup[0]; a1->rot_mat[1] = a2->rot_mat[1]; - a1->rot_mat_dup[2] = a2->rot_mat_dup[2]; + a1->rot_mat_prev[0][0] = a2->rot_mat_prev[0][0]; + a1->rot_mat_prev[1][0] = a2->rot_mat_prev[1][0]; break; case BONE_DATABASE_BONE_ARM_IK_ROTATION: case BONE_DATABASE_BONE_LEGS_IK_ROTATION: a1->rot_mat[0] = a2->rot_mat[0]; - a1->rot_mat_dup[0] = a2->rot_mat_dup[0]; a1->rot_mat[1] = a2->rot_mat[1]; - a1->rot_mat_dup[2] = a2->rot_mat_dup[2]; a1->rot_mat[2] = a2->rot_mat[2]; - a1->rot_mat_dup[4] = a2->rot_mat_dup[4]; + a1->rot_mat_prev[0][0] = a2->rot_mat_prev[0][0]; + a1->rot_mat_prev[1][0] = a2->rot_mat_prev[1][0]; + a1->rot_mat_prev[2][0] = a2->rot_mat_prev[2][0]; break; } } -static void sub_140412BB0(motion_blend_mot* a1, vector_old_bone_data* a2) { - for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) - sub_1401EAD00(i, &a2->begin[i->motion_bone_index]); +static void sub_140412BB0(motion_blend_mot* a1, std::vector* a2) { + for (bone_data& i : a1->bone_data.bones) + sub_1401EAD00(&i, &a2->data()[i.motion_bone_index]); } static void sub_14041AE40(rob_chara_bone_data* rob_bone_data) { @@ -8402,15 +10468,15 @@ static void sub_140413EB0(struc_308* a1) { static void sub_1404117F0(motion_blend_mot* a1) { sub_140413EB0(&a1->field_4F8); int32_t skeleton_select = a1->mot_key_data.skeleton_select; - for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) - bone_data_mult_0(i, skeleton_select); + for (bone_data& i : a1->bone_data.bones) + bone_data_mult_0(&i, skeleton_select); } static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { - bone_data* b_n_hara_cp = &a1->bone_data.bones.begin[MOTION_BONE_N_HARA_CP]; - bone_data* b_kg_hara_y = &a1->bone_data.bones.begin[MOTION_BONE_KG_HARA_Y]; - bone_data* b_kl_hara_xz = &a1->bone_data.bones.begin[MOTION_BONE_KL_HARA_XZ]; - bone_data* b_kl_hara_etc = &a1->bone_data.bones.begin[MOTION_BONE_KL_HARA_ETC]; + bone_data* b_n_hara_cp = &a1->bone_data.bones.data()[MOTION_BONE_N_HARA_CP]; + bone_data* b_kg_hara_y = &a1->bone_data.bones.data()[MOTION_BONE_KG_HARA_Y]; + bone_data* b_kl_hara_xz = &a1->bone_data.bones.data()[MOTION_BONE_KL_HARA_XZ]; + bone_data* b_kl_hara_etc = &a1->bone_data.bones.data()[MOTION_BONE_KL_HARA_ETC]; a1->field_4F8.field_90 = vec3_null; mat4 rot_mat = b_n_hara_cp->rot_mat[0]; @@ -8450,48 +10516,48 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { } } -static void sub_140410A40(motion_blend_mot* a1, vector_old_bone_data* a2, vector_old_bone_data* a3) { +static void sub_140410A40(motion_blend_mot* a1, std::vector* a2, std::vector* a3) { MotionBlend* v4 = a1->blend; if (!v4 || !v4->field_9) return; v4->Field_20(a2, a3); - for (bone_data* i = a2->begin; i != a2->end; i++) { - if (!sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) + for (bone_data& i : *a2) { + if (!sub_140410250(&a1->field_0.field_8, i.motion_bone_index)) continue; bone_data* v8 = 0; if (a3) - v8 = &a3->begin[i->motion_bone_index]; - a1->blend->Blend(&a2->begin[i->motion_bone_index], v8); + v8 = &a3->data()[i.motion_bone_index]; + a1->blend->Blend(&a2->data()[i.motion_bone_index], v8); } } -static void sub_140410B70(motion_blend_mot* a1, vector_old_bone_data* a2) { +static void sub_140410B70(motion_blend_mot* a1, std::vector* a2) { MotionBlend* v3 = a1->blend; if (!v3 || !v3->field_9) return; v3->Field_20(&a1->bone_data.bones, a2); - for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) { - if (!sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) + for (bone_data& i : a1->bone_data.bones) { + if (!sub_140410250(&a1->field_0.field_8, i.motion_bone_index)) continue; bone_data* v6 = 0; if (a2) - v6 = &a2->begin[i->motion_bone_index]; - a1->blend->Blend(&a1->bone_data.bones.begin[i->motion_bone_index], v6); + v6 = &a2->data()[i.motion_bone_index]; + a1->blend->Blend(&a1->bone_data.bones.data()[i.motion_bone_index], v6); } } -static void sub_140410CB0(mot_blend* a1, vector_old_bone_data* a2) { +static void sub_140410CB0(mot_blend* a1, std::vector* a2) { if (!a1->blend.field_9) return; - for (bone_data* i = a2->begin; i != a2->end; i++) { - if (sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) - a1->blend.Blend(&a2->begin[i->motion_bone_index], 0); + for (bone_data& i : *a2) { + if (sub_140410250(&a1->field_0.field_8, i.motion_bone_index)) + a1->blend.Blend(&a2->data()[i.motion_bone_index], 0); } } @@ -8534,7 +10600,7 @@ static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { sub_140410CB0(&rob_bone_data->eyes, &v3->bone_data.bones); sub_140410CB0(&rob_bone_data->eyelid, &v3->bone_data.bones); - bone_data* v7 = &v3->bone_data.bones.begin[0]; + bone_data* v7 = &v3->bone_data.bones.data()[0]; v3->field_4F8.field_9C = v7->trans; if (sub_140413790(&v3->field_4F8)) { // WTF??? v3->field_4F8.field_90 = v7->trans; @@ -8664,9 +10730,7 @@ static void sub_140505C90(struc_264* a1) { a1->field_140 = 0; a1->field_144 = 0; a1->field_146 = 0; - a1->field_147 = 0; a1->field_148 = 0; - a1->field_14C = 0; a1->field_150 = 0; a1->field_152 = 0; a1->field_154 = 0; @@ -8739,13 +10803,13 @@ static void sub_140506440(rob_chara_adjust* a1) { a1->field_3B0.Reset(); for (rob_chara_data_parts_adjust& i : a1->parts_adjust) - rob_chara_data_parts_adjust_reset(&i); + i.reset(); for (rob_chara_data_parts_adjust& i : a1->parts_adjust_prev) - rob_chara_data_parts_adjust_reset(&i); + i.reset(); for (rob_chara_data_parts_adjust& i : a1->field_10D8) - rob_chara_data_parts_adjust_reset(&i); + i.reset(); for (struc_222& i : a1->field_12C8) { i.field_0 = 0; @@ -8757,183 +10821,181 @@ static void sub_140506440(rob_chara_adjust* a1) { } for (rob_chara_data_hand_adjust& i : a1->hand_adjust) - rob_chara_data_hand_adjust_reset(&i); + i.reset(); for (rob_chara_data_hand_adjust& i : a1->hand_adjust_prev) - rob_chara_data_hand_adjust_reset(&i); + i.reset(); } static void sub_140536DD0(struc_223* a1) { - a1->field_84 = 0; - a1->field_88 = 0; - a1->field_8C = 0; - a1->field_90 = 0; - a1->field_94 = 0; - a1->field_96 = 0; - a1->field_98 = -1; - a1->field_9C = 0; - a1->field_A0 = 0; - a1->field_A4 = 0; - a1->field_A8 = 0; - a1->field_B0[0] = { 0, 1.2f, 1.0f }; - a1->field_B0[1] = { 0, -1.0f, -1.0f }; - a1->field_B0[2] = { 0, -1.0f, -1.0f }; - a1->field_B0[3] = { 0, -1.0f, -1.0f }; - a1->field_B0[4] = { 0, -1.0f, -1.0f }; - a1->field_B0[5] = { 0, -1.0f, -1.0f }; - a1->field_B0[6] = { 0, -1.0f, -1.0f }; - a1->field_B0[7] = { 0, -1.0f, -1.0f }; - a1->field_B0[8] = { 0, -1.0f, -1.0f }; - a1->field_B0[9] = { 0, -1.0f, -1.0f }; - a1->field_B0[10] = { 0, -1.0f, -1.0f }; - a1->field_B0[11] = { 0, -1.0f, -1.0f }; - a1->field_B0[12] = { 0, -1.0f, -1.0f }; - a1->field_B0[13] = { 0, -1.0f, -1.0f }; - a1->field_B0[14] = { 0, -1.0f, -1.0f }; - a1->field_B0[15] = { 0, -1.0f, -1.0f }; - a1->field_B0[16] = { 0, -1.0f, -1.0f }; - a1->field_B0[17] = { 0, -1.0f, -1.0f }; - a1->field_B0[18] = { 0, -1.0f, -1.0f }; - a1->field_B0[19] = { 0, -1.0f, -1.0f }; - a1->field_B0[20] = { 0, -1.0f, -1.0f }; - a1->field_B0[21] = { 0, -1.0f, -1.0f }; - a1->field_B0[22] = { 0, -1.0f, -1.0f }; - a1->field_B0[23] = { 0, -1.0f, -1.0f }; - a1->field_B0[24] = { 0, -1.0f, -1.0f }; - a1->field_B0[25] = { 0, -1.0f, -1.0f }; - a1->field_260 = 0; - a1->field_270 = 0; - a1->field_2B0 = 0; - a1->field_2D8 = a1->field_2D0; - a1->field_310 = 3; - a1->field_314 = 0; + a1->field_0.field_84 = 0; + a1->field_0.field_88 = 0; + a1->field_0.field_8C = 0; + a1->field_0.field_90 = 0; + a1->field_0.field_94 = 0; + a1->field_0.field_96 = 0; + a1->field_0.field_98 = -1; + a1->field_0.field_9C = 0; + a1->field_0.field_A0 = 0; + a1->field_0.field_A4 = 0; + a1->field_0.field_A8 = 0; + a1->field_0.field_B0[0] = { 0, 1.2f, 1.0f }; + a1->field_0.field_B0[1] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[2] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[3] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[4] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[5] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[6] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[7] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[8] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[9] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[10] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[11] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[12] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[13] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[14] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[15] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[16] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[17] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[18] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[19] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[20] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[21] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[22] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[23] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[24] = { 0, -1.0f, -1.0f }; + a1->field_0.field_B0[25] = { 0, -1.0f, -1.0f }; + a1->field_0.field_260 = 0; + a1->field_0.field_270 = 0; + a1->field_0.field_2B0 = 0; + a1->field_0.field_2D8 = a1->field_0.field_2D0; + a1->field_0.field_310 = 3; + a1->field_0.field_314 = 0; } static void sub_140537110(struc_223* a1) { - a1->field_0 = -1; - a1->frame_count = 0.0f; - a1->field_8 = 0.0f; - a1->field_C = 0; + a1->field_0.motion_id = -1; + a1->field_0.frame_count = 0.0f; + a1->field_0.field_8 = 0.0f; + a1->field_0.field_C = 0; sub_140536DD0(a1); - a1->field_50 = 0; - a1->field_52 = 0; - a1->field_54 = 0; - a1->field_58 = -1; - a1->field_5C = -1; - a1->field_60 = 0; - a1->field_64 = -1; - a1->field_68 = 0; - a1->field_6C = -1; - a1->field_70 = 0.0f; - a1->field_74 = -1.0f; - a1->field_78 = 0.0f; - a1->field_7C = 0.0f; - a1->field_80 = 0.0f; - a1->field_1E8 = 0; - a1->field_1EC = 0.0f; - a1->field_1F0 = 0.0f; - a1->field_1F4 = 0.0f; - a1->field_1F8 = -1.0f; - a1->field_1FC = 0.0f; - a1->field_200 = 1.0f; - a1->field_204 = -1; - a1->field_208 = 0; - a1->field_20C = -1; - a1->field_210 = 0; - a1->field_218 = -1.0f; - a1->field_21C = -1.0f; - a1->field_220 = 0; - a1->field_228.clear(); - a1->field_238 = -1; - a1->field_23C = 0; - a1->field_240 = 0; - a1->field_244 = 0; - a1->field_248 = 0; - a1->field_250 = 0; - a1->field_258 = -1.0f; - a1->field_25C = 0; - a1->field_268 = 0; - a1->field_274 = 0; - a1->field_278 = 0; - a1->field_27C = -1; - a1->field_280 = 0; - a1->field_284 = 0; - a1->field_288 = 0; - a1->field_290 = 0; - a1->field_294 = 0; - a1->field_298 = 0; - a1->field_29C = 0.0f; - a1->field_2A0 = 0; - a1->field_2A4 = 0.0f; - a1->field_2A8 = 0.0f; - a1->field_2AC = 0.0f; - a1->field_2B8 = 0; - a1->field_2BC = 0; - a1->field_2C0 = -1.0f; - a1->field_2C4 = -1.0f; - a1->field_2C8 = 0; - a1->field_2E8 = -1; - a1->field_2EC = 0; - a1->field_2F4 = 0; - a1->field_2FC = -1; - a1->field_300 = 100; - a1->field_304 = 1; - a1->field_308 = 0; - a1->field_30C = 1.0f; - a1->field_2F0 = 0; - a1->field_318 = 0.0f; - a1->field_31C = 0.0f; - a1->field_320 = 0.0f; - a1->field_324 = 0.05f; - a1->field_328 = -1.0f; - a1->iterations = -1; + a1->field_0.field_50 = 0; + a1->field_0.field_52 = 0; + a1->field_0.field_54 = 0; + a1->field_0.field_58 = -1; + a1->field_0.field_5C = -1; + a1->field_0.field_60 = 0; + a1->field_0.field_64 = -1; + a1->field_0.field_68 = 0; + a1->field_0.field_6C = -1; + a1->field_0.field_70 = 0.0f; + a1->field_0.field_74 = -1.0f; + a1->field_0.field_78 = 0.0f; + a1->field_0.field_7C = 0.0f; + a1->field_0.field_80 = 0.0f; + a1->field_0.field_1E8 = 0; + a1->field_0.field_1EC = 0.0f; + a1->field_0.field_1F0 = 0.0f; + a1->field_0.field_1F4 = 0.0f; + a1->field_0.field_1F8 = -1.0f; + a1->field_0.field_1FC = 0.0f; + a1->field_0.field_200 = 1.0f; + a1->field_0.field_204 = -1; + a1->field_0.field_208 = 0; + a1->field_0.field_20C = -1; + a1->field_0.field_210 = 0; + a1->field_0.field_218 = -1.0f; + a1->field_0.field_21C = -1.0f; + a1->field_0.field_220 = 0; + a1->field_0.field_228.clear(); + a1->field_0.field_238 = -1; + a1->field_0.field_23C = 0.0f; + a1->field_0.field_240 = 0; + a1->field_0.field_244 = 0; + a1->field_0.field_248 = 0; + a1->field_0.field_250 = 0; + a1->field_0.field_258 = -1.0f; + a1->field_0.field_25C = 0; + a1->field_0.field_268 = 0; + a1->field_0.field_274 = 0; + a1->field_0.field_278 = 0; + a1->field_0.field_27C = -1; + a1->field_0.field_280 = 0; + a1->field_0.field_284 = 0; + a1->field_0.field_288 = 0; + a1->field_0.field_290 = 0; + a1->field_0.field_294 = 0; + a1->field_0.field_298 = 0; + a1->field_0.field_29C = 0.0f; + a1->field_0.field_2A0 = 0; + a1->field_0.field_2A4 = 0.0f; + a1->field_0.field_2A8 = 0.0f; + a1->field_0.field_2AC = 0.0f; + a1->field_0.field_2B8 = 0; + a1->field_0.field_2BC = 0; + a1->field_0.field_2C0 = -1.0f; + a1->field_0.field_2C4 = -1.0f; + a1->field_0.field_2C8 = 0; + a1->field_0.field_2E8 = -1; + a1->field_0.field_2EC = 0; + a1->field_0.field_2F0 = 0; + a1->field_0.field_2F4 = 0; + a1->field_0.field_2FC = -1; + a1->field_0.field_300 = 100; + a1->field_0.field_304 = 1; + a1->field_0.field_308 = 0; + a1->field_0.field_30C = 1.0f; + a1->field_0.field_318 = vec3_null; + a1->field_0.field_324 = 0.05f; + a1->field_0.field_328 = -1.0f; + a1->field_0.iterations = -1; } static void sub_1405335C0(struc_223* a1) { - a1->field_330.field_0 = 0; - a1->field_330.field_8 = 0; - a1->field_340 = 0; - a1->field_344 = 0; - a1->field_348 = 0; - a1->field_34C = 0.0f; - a1->field_350 = vec3_null; + a1->field_330.field_0.field_0 = 0; + a1->field_330.field_0.field_8 = 0; + a1->field_330.field_10 = 0; + a1->field_330.field_14 = 0; + a1->field_330.field_18 = 0; + a1->field_330.field_1C = 0.0f; + a1->field_330.field_20 = vec3_null; - for (struc_226& i : a1->field_35C) + for (struc_226& i : a1->field_330.field_2C) for (int8_t& j : i.field_0) j = 0; - for (struc_225& i : a1->field_3B0) + for (struc_225& i : a1->field_330.field_80) for (float_t& j : i.field_0) j = 1.0f; - for (struc_224& i : a1->field_4F4) + for (struc_224& i : a1->field_330.field_1C4) for (int32_t& j : i.field_0) j = 0; - a1->field_638 = 0; - a1->field_640 = -1.0f; - a1->field_644 = -1.0f; - a1->field_648 = 0; - a1->field_64C = 0; - a1->field_650 = 1.0f; - a1->field_654 = 1.0f; - a1->field_65C = 0; - a1->field_660 = -1.0f; - a1->field_664 = -1.0f; - a1->field_668 = 0; - a1->field_66C[0] = { -1, -1.0f, -1.0f }; - a1->field_66C[1] = { -1, -1.0f, -1.0f }; - a1->field_66C[2] = { -1, -1.0f, -1.0f }; - a1->field_66C[3] = { -1, -1.0f, -1.0f }; + a1->field_330.field_308 = 0; + a1->field_330.field_310 = -1.0f; + a1->field_330.field_314 = -1.0f; + a1->field_330.field_318 = 0; + a1->field_330.field_31C = 0; + a1->field_330.field_320 = 1.0f; + a1->field_330.field_324 = 1.0f; + a1->field_330.field_32C = 0; + a1->field_330.field_330 = -1.0f; + a1->field_330.field_334 = -1.0f; + a1->field_330.field_338 = 0; + a1->field_330.field_33C[0] = { -1, -1.0f, -1.0f }; + a1->field_330.field_33C[1] = { -1, -1.0f, -1.0f }; + a1->field_330.field_33C[2] = { -1, -1.0f, -1.0f }; + a1->field_330.field_33C[3] = { -1, -1.0f, -1.0f }; } static void sub_140539750(struc_223* a1) { - a1->field_20 = {}; - a1->field_10 = {}; + a1->field_0.field_10 = {}; + a1->field_0.field_20 = {}; sub_140537110(a1); sub_1405335C0(a1); a1->field_7A0 = 0; - a1->field_7A8 = -1; + a1->motion_set_id = -1; } static void sub_140505FB0(struc_209* a1) { @@ -9284,7 +11346,7 @@ static void sub_140513C40(rob_chara_item_equip* rob_itm_equip, item_id id, objec static void sub_140522A30(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_itm_equip, bone_database* bone_data, void* data, object_database* obj_db) { - chara_init_data* chr_init_data = chara_init_data_get(item_cos_data->chara_index); + const chara_init_data* chr_init_data = chara_init_data_get(item_cos_data->chara_index); for (int32_t i = ITEM_ATAMA; i < ITEM_KAMI; i++) { sub_140513950(rob_itm_equip, (item_id)i, chr_init_data->field_7E0[i], false, bone_data, data, obj_db); auto elem = item_cos_data->item_change.find(i); @@ -9884,7 +11946,7 @@ static void rob_chara_item_equip_disp( vec4 texture_color_coeff = rob_itm_equip->texture_color_coeff; object_data->set_texture_color_coeff(&texture_color_coeff); object_data->set_wet_param(rob_itm_equip->wet); - //sub_140502FB0(rob_itm_equip->field_F9); + //rctx->draw_pass.field_31C |= rob_itm_equip->field_F9; sub_140512C20(rob_itm_equip, rctx); //sub_1405421D0(chara_id, rctx->chara_reflect, rob_itm_equip->chara_color); @@ -10079,12 +12141,12 @@ static void rob_chara_item_equip_object_get_parent_bone_nodes( } static void rob_chara_item_equip_object_init_ex_data_bone_nodes( - rob_chara_item_equip_object* itm_eq_obj, obj_skin_ex_data* a2) { + rob_chara_item_equip_object* itm_eq_obj, obj_skin_ex_data* ex_data) { itm_eq_obj->ex_data_bone_nodes.clear(); itm_eq_obj->ex_data_mats.clear(); itm_eq_obj->ex_data_block_mats.clear(); - int32_t count = a2->bone_names_count; + int32_t count = ex_data->bone_names_count; itm_eq_obj->ex_data_bone_nodes.resize(count); itm_eq_obj->ex_data_mats.resize(count); itm_eq_obj->ex_data_block_mats.resize(count); @@ -10095,17 +12157,17 @@ static void rob_chara_item_equip_object_init_ex_data_bone_nodes( for (int32_t v10 = 0; v10 < count; v10++) v4[v10].mat = &v5[v10]; - if (a2->bone_names) { + if (ex_data->bone_names) { itm_eq_obj->ex_bones.clear(); for (int32_t i = 0; i < count; i++) { bone_node* node = &v4[i]; - node->name = a2->bone_names[i]; + node->name = ex_data->bone_names[i]; node->mat = &v5[i]; *node->mat = mat4_identity; node->ex_data_mat = &v8[i]; *node->ex_data_mat = mat4_identity; - itm_eq_obj->ex_bones.push_back({ a2->bone_names[i], i}); + itm_eq_obj->ex_bones.push_back({ ex_data->bone_names[i], i}); } } } @@ -10154,7 +12216,7 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object size_t null_count = 0; char** bone_names_ptr = ex_data->bone_names; obj_skin_block* v4 = ex_data->blocks; - for (int32_t i = 0; i < ex_data->blocks_count; i++, v4++) { + for (uint32_t i = 0; i < ex_data->blocks_count; i++, v4++) { ExNodeBlock* node; if (v4->type == OBJ_SKIN_BLOCK_CLOTH) { if (cloth_count >= 0x08) @@ -10245,7 +12307,7 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object for (ExNodeBlock*& i : itm_eq_obj->node_blocks) { ExNodeBlock* v86 = i->parent_node; if (v86) { - v86->has_parent_node = true; + v86->has_children_node = true; if ((v86->type & ~3u) || v86->type == EX_OSAGE || !v86->field_58) continue; } @@ -10262,21 +12324,21 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object while (!parent_node->field_58) { parent_node = parent_node->parent_node; if (!parent_node) - goto LABEL_166; + break; } - parent_bone_node = parent_node->parent_bone_node; + + if (parent_node) + parent_bone_node = parent_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; osg->rob.parent_mat = *parent_bone_node->ex_data_mat; } - LABEL_166: - ; } if (ex_data->osage_sibling_infos) - for (int32_t i = 0; i < ex_data->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex_data->osage_sibling_infos_count; i++) { obj_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; @@ -10488,7 +12550,7 @@ static void rob_chara_item_equip_object_skp_load_file( buf[i] += 0x20; key_val kv; - ((data_struct*)data)->load_file(&kv, "rom/skin_param/", buf, skin_param_file_read); + ((data_struct*)data)->load_file(&kv, "rom/skin_param/", buf, key_val::load_file); rob_chara_item_equip_object_skp_load(itm_eq_obj, &kv, bone_data); } @@ -10673,7 +12735,7 @@ static object_info rob_chara_get_object_info(rob_chara* rob_chr, item_id id) { } static void rob_chara_load_default_motion(rob_chara* rob_chr, bone_database* bone_data, motion_database* mot_db) { - int32_t motion_id = rob_cmn_mottbl_get_motion_id(rob_chr, 0); + int32_t motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); rob_chara_load_default_motion_sub(rob_chr, 1, motion_id, bone_data, mot_db); } @@ -10746,6 +12808,35 @@ static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skelet sub_140419820(rob_chr->bone_data, skeleton_select); } +static bool rob_chara_data_parts_adjust_compare(rob_chara_data_parts_adjust* left, rob_chara_data_parts_adjust* right) { + return right->motion_id == left->motion_id + && left->set_frame == 0.0f + && right->type == left->type + && right->cycle_type == left->cycle_type + && right->ignore_gravity == left->ignore_gravity + && left->external_force_min.x == right->external_force_min.x + && left->external_force_min.y == right->external_force_min.y + && left->external_force_min.z == right->external_force_min.z + && left->external_force_strength.x == right->external_force_strength.x + && left->external_force_strength.y == right->external_force_strength.y + && left->external_force_strength.z == right->external_force_strength.z + && left->external_force.x == right->external_force.x + && left->external_force.y == right->external_force.y + && left->external_force.z == right->external_force.z + && left->cycle == right->cycle + && left->phase == right->phase; +} + +static void rob_chara_set_parts_adjust(rob_chara* rob_chr, rob_chara_data_parts_adjust* parts_adjust_new, + rob_chara_data_parts_adjust* parts_adjust, rob_chara_data_parts_adjust* parts_adjust_prev) { + if (rob_chara_data_parts_adjust_compare(parts_adjust_new, parts_adjust)) { + parts_adjust_new->frame = parts_adjust->frame; + parts_adjust_new->transition_frame = parts_adjust->transition_frame; + } + *parts_adjust_prev = *parts_adjust; + *parts_adjust = *parts_adjust_new; +} + static void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, chara_index chara_index, int32_t module_index, rob_chara_pv_data* pv_data) { rob_chr->chara_id = chara_id; @@ -10843,7 +12934,7 @@ static void rob_osage_load_skin_param(rob_osage* rob_osg, key_val* kv, const cha skin_param_osage_root_parse(kv, name, skp_root, bone_data); rob_osage_set_skin_param_osage_root(rob_osg, skp_root); - osage_setting_osg_cat* osage_setting = 0;//osage_setting_data_get_cat_value(obj_info, name); + const osage_setting_osg_cat* osage_setting = osage_setting_data_get_cat_value(obj_info, name); if (osage_setting) rob_osg->osage_setting = *osage_setting; @@ -10958,18 +13049,6 @@ static void rob_osage_free(rob_osage* rob_osg) { rob_osage_reset(rob_osg); } -static bool skin_param_file_read(void* data, const char* path, const char* file, uint32_t hash) { - string s; - string_init(&s, path); - string_add(&s, file); - - key_val* kv = (key_val*)data; - kv->file_read(string_data(&s)); - - string_free(&s); - return kv->buf ? true : false; -} - static void skin_param_osage_node_parse(key_val* kv, const char* name, std::vector* vec, skin_param_osage_root* skp_root) { char buf[SKP_TEXT_BUF_SIZE]; @@ -11314,11 +13393,6 @@ static bool task_rob_load_check_load_req_data() { return true; } -void rob_chara_array_init() { - rob_chara_array = new rob_chara[ROB_CHARA_COUNT]; - rob_chara_pv_data_array = new rob_chara_pv_data[ROB_CHARA_COUNT]; -} - rob_chara* rob_chara_array_get(int32_t chara_id) { if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT) return 0; @@ -11357,37 +13431,6 @@ void rob_chara_array_free_chara_id(int32_t chara_id) { rob_chara_pv_data_array[chara_id].type = ROB_CHARA_TYPE_NONE; } -void rob_chara_array_free() { - delete[] rob_chara_array; - rob_chara_array = 0; - delete[] rob_chara_pv_data_array; - rob_chara_pv_data_array = 0; -} - -void rob_mot_tbl_init() { - p_file_handler rob_mot_tbl_file_handler; - rob_mot_tbl_file_handler.read_file(rctx_ptr->data, "rom/rob/", "rob_mot_tbl.bin"); - rob_mot_tbl_file_handler.set_read_free_func_data(0, rob_cmn_mottbl_read, 0); - rob_mot_tbl_file_handler.read_now(); - rob_mot_tbl_file_handler.free_data(); -} - -void rob_mot_tbl_free() { - free(rob_cmn_mottbl_data); -} - -void rob_thread_handler_init() { - if (!rob_thread_handler) - rob_thread_handler = new RobThreadHandler; -} - -void rob_thread_handler_free() { - if (rob_thread_handler) { - delete rob_thread_handler; - rob_thread_handler = 0; - } -} - bool pv_osage_manager_array_ptr_get_disp() { bool disp = false; for (int32_t i = 0; i < CHARA_MAX; i++) @@ -11404,16 +13447,15 @@ inline bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id) { return rob_chara_pv_data_array[chara_id].type != ROB_CHARA_TYPE_NONE; } -int32_t rob_cmn_mottbl_get_motion_id(rob_chara* rob_chr, int32_t id) { +int32_t rob_chara::get_rob_cmn_mottbl_motion_id(int32_t id) { if (id >= 214 && id <= 223) - return rob_chr->pv_data.field_74[id - 214]; + return pv_data.field_74[id - 214]; else if (id == 224) - return rob_chr->data.adjust.motion_id; + return data.adjust.motion_id; else if (id >= 226 && id <= 235) - return rob_chr->pv_data.field_74[id - 226]; + return pv_data.field_74[id - 226]; - chara_index chara_index = rob_chr->chara_index; - int32_t v2 = rob_chr->data.field_8.field_1A4; + int32_t v2 = data.field_8.field_1A4; if (rob_cmn_mottbl_data && chara_index >= CHARA_MIKU && chara_index >= 0 && chara_index < rob_cmn_mottbl_data->chara_count @@ -11451,6 +13493,34 @@ bone_node::bone_node() : name(), mat(), parent(), ex_data_mat() { } +mot_key_data::mot_key_data() : key_sets_ready(), key_set_count(), key_set(), +mot(), key_set_data(), mot_data(), skeleton_type(), skeleton_select(), field_68() { + motion_id = -1; + frame = -1.0f; +} + +mot_key_data::~mot_key_data() { + +} + +bone_data::bone_data() : type(), has_parent(), motion_bone_index(), mirror(), parent(), +flags(), key_set_offset(), key_set_count(), frame(), base_translation(), rotation(), +ik_target(), trans(), rot_mat(), trans_prev(), rot_mat_prev(), pole_target_mat(), +parent_mat(), node(), ik_segment_length(), ik_2nd_segment_length(), field_2E0() { + eyes_xrot_adjust_neg = 1.0f; + eyes_xrot_adjust_pos = 1.0f; +} + +bone_data_parent::bone_data_parent() : rob_bone_data(), +motion_bone_count(), ik_bone_count(), chain_pos(), global_trans(), +global_rotation(), bone_key_set_count(), global_key_set_count(), rotation_y() { + +} + +bone_data_parent::~bone_data_parent() { + +} + MotionBlend::MotionBlend() : field_8(), field_9(), duration(), frame(), step(1.0f), offset(), blend() { @@ -11533,12 +13603,12 @@ void MotionBlendCross::Field_18(struc_400* a2) { field_24 = mat4u_identity; } -void MotionBlendCross::Field_20(vector_old_bone_data* a2, vector_old_bone_data* a3) { +void MotionBlendCross::Field_20(std::vector* a2, std::vector* a3) { if (!a2 || !a3) return; - bone_data* v4 = a2->begin; - bone_data* v7 = a3->begin; + bone_data* v4 = a2->data(); + bone_data* v7 = a3->data(); mat4_mult(&v4[4].rot_mat[0], &v4[0].rot_mat[0], &field_64); mat4_mult(&v7[0].rot_mat[0], &field_24, &field_A4); @@ -11705,16 +13775,16 @@ void MotionBlendFreeze::Field_18(struc_400* a2) { field_34 = mat4u_identity; } -void MotionBlendFreeze::Field_20(vector_old_bone_data* a2, vector_old_bone_data* a3) { +void MotionBlendFreeze::Field_20(std::vector* a2, std::vector* a3) { if (!a2) return; - bone_data* v2 = a2->begin; + bone_data* v2 = a2->data(); mat4_mult(&v2[4].rot_mat[0], &v2->rot_mat[0], &field_74); - mat4_mult(&v2->rot_mat_dup[field_24], &field_34, &field_B4); + mat4_mult(&v2->rot_mat_prev[0][field_24], &field_34, &field_B4); mat4_blend_rotation(v2->rot_mat, &field_B4, v2->rot_mat, blend); - mat4_mult(&v2[4].rot_mat_dup[field_24], &field_B4, &field_B4); - mat4_blend_rotation(&v2[4].rot_mat[0], &v2[4].rot_mat_dup[field_24], &v2[4].rot_mat[0], blend); + mat4_mult(&v2[4].rot_mat_prev[0][field_24], &field_B4, &field_B4); + mat4_blend_rotation(&v2[4].rot_mat[0], &v2[4].rot_mat_prev[0][field_24], &v2[4].rot_mat[0], blend); mat4_mult(&v2[4].rot_mat[0], &v2->rot_mat[0], &field_F4); mat4_transpose(&field_F4, &field_F4); } @@ -11728,27 +13798,27 @@ void MotionBlendFreeze::Blend(bone_data* a2, bone_data* a3) { switch (a2->type) { case BONE_DATABASE_BONE_TYPE_1: case BONE_DATABASE_BONE_POSITION: - vec3_lerp_scalar(a2->trans_dup[field_24], a2->trans, a2->trans, blend); + vec3_lerp_scalar(a2->trans_prev[field_24], a2->trans, a2->trans, blend); break; case BONE_DATABASE_BONE_POSITION_ROTATION: if (field_21) { - a2->trans.x = lerp(a2->trans_dup[field_24].x, a2->trans.x, blend); - a2->trans.z = lerp(a2->trans_dup[field_24].z, a2->trans.z, blend); + a2->trans.x = lerp(a2->trans_prev[field_24].x, a2->trans.x, blend); + a2->trans.z = lerp(a2->trans_prev[field_24].z, a2->trans.z, blend); } if (field_20) - a2->trans.y = lerp(a2->trans_dup[field_24].y, a2->trans.y, blend); + a2->trans.y = lerp(a2->trans_prev[field_24].y, a2->trans.y, blend); break; case BONE_DATABASE_BONE_HEAD_IK_ROTATION: if (a2->motion_bone_index == MOTION_BONE_CL_MUNE) { - mat4_mult(&a2->rot_mat_dup[field_24], &field_B4, &v15); - mat4_mult(&a2->rot_mat_dup[field_24 + 2], &v15, &v15); + mat4_mult(&a2->rot_mat_prev[0][field_24], &field_B4, &v15); + mat4_mult(&a2->rot_mat_prev[1][field_24], &v15, &v15); mat4_mult(&a2->rot_mat[0], &field_74, &v16); mat4_mult(&a2->rot_mat[1], &v16, &v16); mat4_blend_rotation(&v16, &v15, &v16, blend); mat4_mult(&v16, &field_F4, &v16); } else { - mat4_mult(&a2->rot_mat_dup[field_24 + 2], &a2->rot_mat_dup[field_24], &v15); + mat4_mult(&a2->rot_mat_prev[1][field_24], &a2->rot_mat_prev[0][field_24], &v15); mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v16); mat4_blend_rotation(&v16, &v15, &v16, blend); } @@ -11757,8 +13827,8 @@ void MotionBlendFreeze::Blend(bone_data* a2, bone_data* a3) { break; case BONE_DATABASE_BONE_ARM_IK_ROTATION: case BONE_DATABASE_BONE_LEGS_IK_ROTATION: - mat4_blend_rotation(&a2->rot_mat[2], &a2->rot_mat_dup[field_24 + 4], &a2->rot_mat[2], blend); - mat4_mult(&a2->rot_mat_dup[field_24 + 2], &a2->rot_mat_dup[field_24], &v15); + mat4_blend_rotation(&a2->rot_mat[2], &a2->rot_mat_prev[2][field_24], &a2->rot_mat[2], blend); + mat4_mult(&a2->rot_mat_prev[1][field_24], &a2->rot_mat_prev[0][field_24], &v15); mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v16); mat4_blend_rotation(&v16, &v15, &v16, blend); mat4_transpose(&a2->rot_mat[0], &v15); @@ -11766,13 +13836,13 @@ void MotionBlendFreeze::Blend(bone_data* a2, bone_data* a3) { break; default: if (a2->motion_bone_index == MOTION_BONE_KL_KOSI_Y) { - mat4_mult(&a2->rot_mat_dup[field_24], &field_B4, &v16); + mat4_mult(&a2->rot_mat_prev[0][field_24], &field_B4, &v16); mat4_mult(&a2->rot_mat[0], &field_74, &v15); mat4_blend_rotation(&v15, &v16, &v15, blend); mat4_mult(&v15, &field_F4, &a2->rot_mat[0]); } else if (a2->motion_bone_index > MOTION_BONE_N_HARA) - mat4_blend_rotation(a2->rot_mat, &a2->rot_mat_dup[field_24], a2->rot_mat, blend); + mat4_blend_rotation(a2->rot_mat, &a2->rot_mat_prev[0][field_24], a2->rot_mat, blend); break; } } @@ -11805,7 +13875,7 @@ void PartialMotionBlendFreeze::Field_18(struc_400* a1) { } } -void PartialMotionBlendFreeze::Field_20(vector_old_bone_data* a1, vector_old_bone_data* a2) { +void PartialMotionBlendFreeze::Field_20(std::vector* a1, std::vector* a2) { } @@ -11817,27 +13887,27 @@ void PartialMotionBlendFreeze::Blend(bone_data* a2, bone_data* a3) { switch (a2->type) { case BONE_DATABASE_BONE_POSITION: case BONE_DATABASE_BONE_TYPE_1: - vec3_lerp_scalar(a2->trans_dup[0], a2->trans, a2->trans, blend); + vec3_lerp_scalar(a2->trans_prev[0], a2->trans, a2->trans, blend); break; case BONE_DATABASE_BONE_POSITION_ROTATION: - mat4_lerp_rotation(&a2->rot_mat_dup[0], &a2->rot_mat[0], &a2->rot_mat[0], blend); - vec3_lerp_scalar(a2->trans_dup[0], a2->trans, a2->trans, blend); + mat4_lerp_rotation(&a2->rot_mat_prev[0][0], &a2->rot_mat[0], &a2->rot_mat[0], blend); + vec3_lerp_scalar(a2->trans_prev[0], a2->trans, a2->trans, blend); break; case BONE_DATABASE_BONE_ARM_IK_ROTATION: case BONE_DATABASE_BONE_LEGS_IK_ROTATION: - mat4_lerp_rotation(&a2->rot_mat[2], &a2->rot_mat_dup[4], &a2->rot_mat[2], blend); + mat4_lerp_rotation(&a2->rot_mat[2], &a2->rot_mat_prev[2][0], &a2->rot_mat[2], blend); case BONE_DATABASE_BONE_HEAD_IK_ROTATION: { mat4u v15; mat4u v16; mat4u v17; - mat4_mult(&a2->rot_mat_dup[2], &a2->rot_mat_dup[0], &v16); + mat4_mult(&a2->rot_mat_prev[1][0], &a2->rot_mat_prev[0][0], &v16); mat4_mult(&a2->rot_mat[1], &a2->rot_mat[0], &v15); mat4_lerp_rotation(&v16, &v15, &v15, blend); mat4_transpose(&a2->rot_mat[0], &v17); mat4_mult(&a2->rot_mat[1], &v17, &v15); } break; default: - mat4_lerp_rotation(&a2->rot_mat_dup[0], &a2->rot_mat[0], &a2->rot_mat[0], blend); + mat4_lerp_rotation(&a2->rot_mat_prev[0][0], &a2->rot_mat[0], &a2->rot_mat[0], blend); break; } } @@ -11860,16 +13930,13 @@ struc_240::~struc_240() { motion_blend_mot::motion_blend_mot() : bone_data(), mot_key_data(), mot_play_data(), field_4F8(), field_5CC(), blend() { - bone_data_parent_reset(&bone_data); - mot_key_data_reset(&mot_key_data); mot_play_data_reset(&mot_play_data); field_4F8.field_C0 = 1.0f; field_4F8.field_C4 = 1.0f; } motion_blend_mot::~motion_blend_mot() { - mot_key_data_free(&mot_key_data); - bone_data_parent_free(&bone_data); + } rob_chara_bone_data_ik_scale::rob_chara_bone_data_ik_scale() { @@ -11884,7 +13951,7 @@ mot_blend::mot_blend() : field_30(), mot_key_data(), mot_play_data() { } mot_blend::~mot_blend() { - mot_key_data_free(&mot_key_data); + } rob_chara_bone_data::rob_chara_bone_data() : field_0(), field_1(), object_bone_count(), @@ -11935,7 +14002,7 @@ rob_chara_pv_data::~rob_chara_pv_data() { } ExNodeBlock::ExNodeBlock() : bone_node_ptr(), type(), name(), parent_bone_node(), -parent_name(), parent_node(), item_equip_object(), field_58(), field_59(), has_parent_node() { +parent_name(), parent_node(), item_equip_object(), field_58(), field_59(), has_children_node() { } @@ -12079,7 +14146,7 @@ void ExConstraintBlock::Field_18(int32_t stage, bool a3) { Field_20(); } else if (stage == 2) { - if (has_parent_node) + if (has_children_node) DataSet(); } else if (stage == 5) @@ -12218,12 +14285,12 @@ void ExConstraintBlock::Calc() { vec3_add(constraining_offset, source_node_trans, source_node_trans); mat4_set_translation(&mat, &source_node_trans); if (direction_up_vector_bone_node) { - vec3 up_vector_old_trans; - mat4_get_translation(direction_up_vector_bone_node->mat, &up_vector_old_trans); - mat4_mult_vec3_inv_trans(&mat, &up_vector_old_trans, &up_vector_old_trans); + vec3 up_vector_trans; + mat4_get_translation(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_old_trans); + 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) @@ -12278,18 +14345,18 @@ void ExConstraintBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, itm_eq_obj, string_data(&cns_data->source_node_name), bone_data); obj_skin_block_constraint_type type = cns_data->type; - char* up_vector_old_name; + char* up_vector_name; if (type == OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION; - up_vector_old_name = string_data(&cns_data->direction.up_vector.name); + up_vector_name = string_data(&cns_data->direction.up_vector.name); } else if (type == OBJ_SKIN_BLOCK_CONSTRAINT_POSITION) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; - up_vector_old_name = string_data(&cns_data->position.up_vector.name); + up_vector_name = string_data(&cns_data->position.up_vector.name); } else if (type == OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE; - up_vector_old_name = string_data(&cns_data->distance.up_vector.name); + up_vector_name = string_data(&cns_data->distance.up_vector.name); } else if (type == OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; @@ -12300,9 +14367,9 @@ void ExConstraintBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, return; } - if (up_vector_old_name) + if (up_vector_name) direction_up_vector_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( - itm_eq_obj, up_vector_old_name, bone_data); + itm_eq_obj, up_vector_name, bone_data); } void ExConstraintBlock::sub_1405F10D0(mat4* mat, vec3* a2, float_t a3, float_t a4) { @@ -12380,7 +14447,7 @@ void ExExpressionBlock::Field_18(int32_t stage, bool a3) { Field_20(); } else if (stage == 2) { - if (has_parent_node) + if (has_children_node) DataSet(); } else if (stage == 5) @@ -12599,13 +14666,13 @@ void ExOsageBlock::Field_18(int32_t stage, bool a3) { vec3 parent_scale = parent_bone_node->exp_data.parent_scale; switch (stage) { case 0: - sub_1404803B0(&rob, parent_node_mat, &parent_scale, has_parent_node); + sub_1404803B0(&rob, parent_node_mat, &parent_scale, has_children_node); break; case 1: case 2: if ((stage == 1 && field_58) || (stage == 2 && rob.field_2A0)) { SetWindDirection(); - sub_14047C800(&rob, parent_node_mat, &parent_scale, step, a3, true, has_parent_node); + sub_14047C800(&rob, parent_node_mat, &parent_scale, step, a3, true, has_children_node); } break; case 3: @@ -12754,7 +14821,7 @@ void ExOsageBlock::sub_1405F3E10(obj_skin_block_osage* osg_data, rob_osage_node* v9 = rob_osage_get_node(&rob, 0); a4->push_back({ osg_data->external_name_index, v9 }); - for (int32_t i = 0; i < osg_data->count; i++) { + for (uint32_t i = 0; i < osg_data->count; i++) { v9 = rob_osage_get_node(&rob, i); a4->push_back({ osg_nodes[i].name_index, v9 }); @@ -13031,8 +15098,8 @@ osage_ring_data::~osage_ring_data() { } -osage_setting_osg_cat::osage_setting_osg_cat() : parts(-1), exf() { - +osage_setting_osg_cat::osage_setting_osg_cat() : exf() { + parts = ROB_OSAGE_PARTS_NONE; } rob_osage::rob_osage() : skin_param_ptr(), osage_setting(), field_2A0(), field_2A1(), field_2A4(), @@ -13106,9 +15173,9 @@ struc_523::~struc_523() { struc_264::struc_264() : field_0(), field_4(), field_18(), field_2C(), field_40(), field_54(), field_68(), field_6C(), field_70(), field_74(), field_78(), field_7C(), field_80(), field_84(), field_88(), field_8C(), field_90(), field_94(), field_98(), field_9C(), field_A0(), field_A4(), field_A5(), field_A8(), field_AC(), -field_B0(), eyes_adjust(), field_140(), field_144(), field_145(), field_146(), field_147(), field_148(), -field_14C(), field_150(), field_152(), field_154(), field_158(), field_15C(), field_160(), field_164(), field_168(), -field_16C(), field_170(), field_174(), field_178(), field_17C(), field_180(), field_184(), field_188(), field_18C(), +field_B0(), eyes_adjust(), field_140(), field_144(), field_145(), field_146(), field_148(), field_150(), +field_152(), field_154(), field_158(), field_15C(), field_160(), field_164(), field_168(), field_16C(), +field_170(), field_174(), field_178(), field_17C(), field_180(), field_184(), field_188(), field_18C(), field_190(), field_194(), field_198(), field_19C(), field_1A0(), field_1A4(), field_1A8(), field_1B0(), field_1B4(), field_1B8(), field_1BC(), field_1C0(), field_1C8(), field_1C9(), field_1CA(), field_1CC(), field_1D0(), field_1D4() { @@ -13542,6 +15609,49 @@ void struc_405::Reset() { time = 0.0f; } +void rob_chara_data_parts_adjust::reset() { + enable = false; + frame = 0.0f; + transition_frame = 0.0f; + curr_external_force = vec3_null; + curr_force = 1.0f; + curr_strength = 1.0f; + motion_id = -1; + set_frame = 0.0f; + force_duration = 0.0f; + type = 6; + cycle_type = 0; + ignore_gravity = true; + external_force_min = vec3_null; + external_force_strength = vec3_null; + external_force = vec3_null; + cycle = 1.0f; + phase = 0.0f; + force = 1.0f; + strength = 1.0f; + strength_transition = 0.0f; +} + +void rob_chara_data_hand_adjust::reset() { + enable = false; + scale_select = 0; + type = ROB_CHARA_DATA_HAND_ADJUST_NONE; + current_scale = 1.0f; + scale = 1.0f; + transition_time = 0.0f; + current_time = 0.0f; + rotation_blend = 1.0f; + offset_blend = 1.0f; + enable_scale = false; + disable_x = false; + disable_y = false; + disable_z = false; + offset = vec3_null; + field_30 = vec3_null; + field_3C = 0.0f; + field_40 = 0; +} + rob_chara_adjust::rob_chara_adjust() : motion_id(-1), prev_motion_id(-1), frame_data(), step_data(), step(1.0f), field_24(), field_28(), field_29(), field_2A(), field_2C(), field_30(), field_34(), field_36(), field_38(), field_B8(), field_138(), field_13C(), field_140(), field_14C(), field_314(), @@ -13553,7 +15663,35 @@ rob_chara_adjust::~rob_chara_adjust() { } -struc_223::struc_223() : field_0(), frame_count(), field_8(), field_C(), field_10(), field_20(), + +mothead_mot::mothead_mot() { + field_0.field_0 = 19; + field_0.field_4 = 0; + field_0.field_8 = 0; + field_0.field_C = 0; + field_10 = 0x04; + field_12 = 0x04; +} + +mothead_mot::~mothead_mot() { + +} + +mothead::mothead() { + mot_set_id = -1; + first_mot_id = 0; + last_mot_id = 0; +} + +mothead::~mothead() { + for (mothead_mot*& i : mots) + if (i) { + delete i; + i = 0; + } +} + +struc_652::struc_652() : motion_id(), frame_count(), field_8(), field_C(), field_10(), field_20(), field_30(), field_40(), field_50(), field_52(), field_54(), field_58(), field_5C(), field_60(), field_64(), field_68(), field_6C(), field_70(), field_74(), field_78(), field_7C(), field_80(), field_84(), field_88(), field_8C(), field_90(), field_94(), field_96(), field_98(), field_9C(), @@ -13565,10 +15703,15 @@ field_27C(), field_280(), field_284(), field_288(), field_290(), field_294(), fi field_2A0(), field_2A4(), field_2A8(), field_2AC(), field_2B0(), field_2B8(), field_2BC(), field_2C0(), field_2C4(), field_2C8(), field_2CC(), field_2D0(), field_2D8(), field_2E0(), field_2E8(), field_2EC(), field_2F0(), field_2F4(), field_2F8(), field_2FC(), field_300(), field_304(), field_308(), field_30C(), -field_310(), field_314(), field_318(), field_31C(), field_320(), field_324(), field_328(), iterations(), -field_330(), field_340(), field_344(), field_348(), field_34C(), field_350(), field_35C(), field_3B0(), -field_4F4(), field_638(), field_640(), field_644(), field_648(), field_64C(), field_650(), field_654(), -field_658(), field_65C(), field_660(), field_664(), field_668(), field_66C(), field_7A0(), field_7A8() { +field_310(), field_314(), field_318(), field_324(), field_328(), iterations() { + +} + +struc_652::~struc_652() { + +} + +struc_223::struc_223() : field_330(), field_7A0(), motion_set_id() { } @@ -13609,8 +15752,8 @@ rob_chara_data::~rob_chara_data() { } -rob_chara::rob_chara() : chara_id(), type(), field_C(), -field_D(), chara_index(), module_index(), chara_init_data() { +rob_chara::rob_chara() : chara_id(), type(), field_C(), field_D(), +chara_index(), module_index(), chara_init_data(), field_20() { frame_speed = 1.0f; bone_data = new rob_chara_bone_data(); item_equip = new rob_chara_item_equip(); @@ -13627,48 +15770,14 @@ inline void motion_storage_init() { motion_storage_data = {}; } -inline void motion_storage_append_mot_set(uint32_t set_id) { - for (motion_storage& i : motion_storage_data) - if (i.set_id == set_id) { - i.count++; - return; - } +inline bool motion_storage_check_mot_file_not_ready(uint32_t set_id) { + auto elem = motion_storage_data.find(set_id); + if (elem != motion_storage_data.end()) + return elem->second.CheckNotReady(); + return false; } -inline void motion_storage_insert_motion_set(mot_set* set, uint32_t set_id) { - for (motion_storage& i : motion_storage_data) - if (i.set_id == set_id) { - i.count++; - i.set = *set; - return; - } - - motion_storage mot_set_storage;; - mot_set_storage.set_id = set_id; - mot_set_storage.count = 1; - mot_set_storage.set = *set; - motion_storage_data.push_back(mot_set_storage); -} - -inline mot_set* motion_storage_get_motion_set(uint32_t set_id) { - for (motion_storage& i : motion_storage_data) - if (i.set_id == set_id) - return &i.set; - return 0; -} - -inline void motion_storage_delete_motion_set(uint32_t set_id) { - for (std::vector::iterator i = motion_storage_data.begin(); - i != motion_storage_data.end(); i++) - if (i->set_id == set_id) { - i->count--; - if (i->count <= 0) - i = motion_storage_data.erase(i); - break; - } -} - -inline mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database* mot_db) { +inline const mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database* mot_db) { uint32_t set_id = -1; size_t motion_index = -1; for (motion_set_info& i : mot_db->motion_set) { @@ -13687,33 +15796,418 @@ inline mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database if (set_id == -1) return 0; - for (motion_storage& i : motion_storage_data) - if (i.set_id == set_id) - return &i.set.vec[motion_index]; + auto elem = motion_storage_data.find(set_id); + if (elem != motion_storage_data.end()) + return &elem->second.mot_set->vec[motion_index]; return 0; } inline float_t motion_storage_get_mot_data_frame_count(uint32_t motion_id, motion_database* mot_db) { - mot_data* mot = motion_storage_get_mot_data(motion_id, mot_db); + const mot_data* mot = motion_storage_get_mot_data(motion_id, mot_db); if (mot) return mot->frame_count; return 0.0f; } +inline const mot_set* motion_storage_get_motion_set(uint32_t set_id) { + auto elem = motion_storage_data.find(set_id); + if (elem != motion_storage_data.end()) + return elem->second.mot_set; + return 0; +} + inline void motion_storage_free() { motion_storage_data.clear(); - motion_storage_data.shrink_to_fit(); } -motion_storage::motion_storage() : set_id(), count() { +inline void mothead_storage_init() { + mothead_storage_data = {}; +} + +inline bool mothead_storage_check_mhd_file_not_ready(uint32_t set_id) { + auto elem = mothead_storage_data.find(set_id); + if (elem != mothead_storage_data.end()) + return elem->second.CheckNotReady(); + return false; +} + +inline const mothead_mot* mothead_storage_get_mot_by_motion_id(uint32_t motion_id, motion_database* mot_db) { + uint32_t set_id = mot_db->get_motion_set_id_by_motion_id(motion_id); + if (set_id == -1) + return &mothead_mot_null; + + auto elem = mothead_storage_data.find(set_id); + if (elem == mothead_storage_data.end() || !elem->second.data) + return &mothead_mot_null; + + mothead* mhd = elem->second.data; + if (mhd->first_mot_id > (int32_t)motion_id || mhd->last_mot_id < (int32_t)motion_id) + return &mothead_mot_null; + + mothead_mot* sub = mhd->mots[(ssize_t)(int32_t)motion_id - mhd->first_mot_id]; + if (!sub) + return &mothead_mot_null; + return sub; +} + +inline void mothead_storage_free() { + mothead_storage_data.clear(); +} + +inline void osage_setting_data_init() { + osage_setting_data.cat = {}; + osage_setting_data.obj = {}; +} + +inline bool osage_setting_data_load_file(void* data, const char* path, const char* file, uint32_t hash) { + key_val kv; + if (key_val::load_file(&kv, path, file, hash)) { + osage_setting_data.parse(&kv); + return true; + } + return false; +} + +inline void osage_setting_data_free() { + osage_setting_data.cat.clear(); + osage_setting_data.obj.clear(); +} + +MotFile::MotFile() : mot_set_info(), mot_set(), load_count() { + FreeData(); +} + +MotFile:: ~MotFile() { + FreeData(); +} + +bool MotFile::CheckNotReady() { + return file_handler.check_not_ready(); +} + +void MotFile::FreeData() { + mot_set_info = 0; + if (mot_set) { + delete mot_set; + mot_set = 0; + } + file_handler.free_data(); + load_count = 0; +} + +void MotFile::LoadFile(std::string* mdata_dir, uint32_t set) { + if (load_count > 0) { + load_count++; + return; + } + + std::string rom_dir = "rom/"; + std::string rob_dir = "rob/"; + std::string farc_file = "mot_" + mot_set_info->name + ".farc"; + std::string mot_file = "mot_" + mot_set_info->name + ".bin"; + if (mdata_dir && mdata_dir->size()) + if (rctx_ptr->data->check_file_exists(mdata_dir->c_str(), farc_file.c_str())) { + rom_dir = *mdata_dir; + rob_dir.clear(); + } + + std::string dir = rom_dir + rob_dir; + if (rctx_ptr->data->check_file_exists(dir.c_str(), farc_file.c_str())) { + if (file_handler.read_file(rctx_ptr->data, + dir.c_str(), farc_file.c_str(), mot_file.c_str(), false)) + file_handler.set_read_free_func_data(0, ParseFileParent, this); + } + else { + if (file_handler.read_file(rctx_ptr->data, rom_dir.c_str(), mot_file.c_str())) + file_handler.set_read_free_func_data(0, ParseFileParent, this); + } + load_count = 1; +} + +void MotFile::ParseFile(void* data, size_t size) { + mot_set = new ::mot_set; + mot_set->unpack_file(data, size, false); +} + +bool MotFile::Unload() { + if (--load_count < 0) { + load_count = 0; + return true; + } + else if (load_count <= 0) { + FreeData(); + return true; + } + else + return false; +} + +void MotFile::ParseFileParent(void* data, void* file_data, size_t size) { + ((MotFile*)data)->ParseFile(file_data, size); +} + +MhdFile::MhdFile() : data(), set(), load_count() { + FreeData(); +} + +MhdFile::~MhdFile() { + FreeData(); +} + +bool MhdFile::CheckNotReady() { + return file_handler.check_not_ready(); +} + +void MhdFile::FreeData() { + if (data) { + delete data; + data = 0; + } + set = -1; + file_path.clear(); + file_handler.free_data(); + load_count = 0; +} + +void MhdFile::LoadFile(const char* path, const char* file, uint32_t set) { + if (load_count > 0) { + load_count++; + return; + } + + this->set = set; + this->file_path = file_path; + if (file_handler.read_file(rctx_ptr->data, path, file)) + file_handler.set_read_free_func_data(0, ParseFileParent, this); + load_count = 1; +} + +void MhdFile::ParseFile(void* data) { + mothead_file* mhdf = (mothead_file*)((size_t)data + ((uint32_t*)data)[1]); + this->data = MhdFile::ParseMothead(mhdf, (size_t)mhdf); +} + +mothead* MhdFile::ParseMothead(mothead_file* mhdf, size_t data) { + mothead* mhd = new mothead; + mhd->mot_set_id = mhdf->mot_set_id; + mhd->first_mot_id = mhdf->first_mot_id; + mhd->last_mot_id = mhdf->last_mot_id; + uint32_t* mot_offsets = (uint32_t*)(data + mhdf->mot_offsets_offset); + size_t mot_count = (size_t)mhdf->last_mot_id - mhdf->first_mot_id + 1; + mhd->mots.resize(mot_count); + mothead_mot** mots = mhd->mots.data(); + for (; mot_count; mot_count--) { + *mots = 0; + if (*mot_offsets) + *mots = ParseMotheadMot((mothead_mot_file*)(data + *mot_offsets), data); + mots++; + mot_offsets++; + } + return mhd; +} + +mothead_mot* MhdFile::ParseMotheadMot(mothead_mot_file* mhdsf, size_t data) { + struct struc_335 { + int32_t type; + uint32_t offset; + }; + + struct struc_337 { + mothead_data_type type; + int32_t frame; + uint32_t offset; + }; + + mothead_mot* mhdm = new mothead_mot; + mhdm->field_0.field_0 = mhdsf->field_0; + mhdm->field_0.field_4 = mhdsf->field_4; + mhdm->field_0.field_8 = mhdsf->field_8; + mhdm->field_0.field_C = mhdsf->field_C; + mhdm->field_10 = mhdsf->field_10; + mhdm->field_12 = mhdsf->field_12; + + if (mhdsf->field_14) { + struc_335* v11 = (struc_335*)(data + mhdsf->field_14); + struc_335* v12 = v11; + while ((v12++)->type >= 0); + + size_t count = v12 - v11; + mhdm->field_18.resize(count); + mothead_data2* v15 = mhdm->field_18.data(); + for (size_t i = count; i; i--) { + v15->type = v11->type; + v15->data = (void*)(data + v11->offset); + v11++; + v15++; + } + } + + if (mhdsf->field_18) { + struc_337* v20 = (struc_337*)(data + mhdsf->field_18); + struc_337* v21 = v20; + while ((v21++)->type >= 0); + + size_t count = v21 - v20; + mhdm->data.resize(count); + mothead_data* v24 = mhdm->data.data(); + for (size_t i = count; i; i--) { + v24->type = v20->type; + v24->frame = v20->frame; + v24->data = (void*)(data + v20->offset); + v20++; + v24++; + } + } + + if (mhdsf->field_1C) { + uint32_t* v29 = (uint32_t*)(data + mhdsf->field_1C); + uint32_t* v30 = v29; + while (*v30++); + + size_t count = v30 - v29; + mhdm->field_28.resize(count); + int64_t* v33 = mhdm->field_28.data(); + for (size_t i = count; i; i--) + *v33++ = data + *v29++; + } + return mhdm; +} + +bool MhdFile::Unload() { + if (--load_count < 0) { + load_count = 0; + return true; + } + else if (load_count <= 0) { + FreeData(); + return true; + } + else + return false; +} + +void MhdFile::ParseFileParent(void* data, void* file_data, size_t size) { + ((MhdFile*)data)->ParseFile(file_data); +} + +osage_setting::osage_setting() { } -motion_storage::~motion_storage() { +osage_setting::~osage_setting() { } +void osage_setting::parse(key_val* kv) { + char buf[OSG_SET_TEXT_BUF_SIZE]; + int32_t count; + int32_t count1; + size_t len; + size_t len1; + size_t len2; + size_t len3; + size_t off; + + key_val lkv; + if (kv->get_local_key_val("cat", &lkv)) { + len = 3; + memcpy(buf, "cat", 3); + off = len; + + buf[off] = 0; + key_val slkv; + if (lkv.read_int32_t(buf, off, ".length", 8, &count) + && lkv.get_local_key_val(buf, &slkv)) + for (int32_t i = 0; i < count; i++) { + len1 = sprintf_s(buf + len, + OSG_SET_TEXT_BUF_SIZE - len, ".%d", i); + off = len + len1; + + std::string name; + lkv.read_string( + buf, off, ".name", 6, &name); + + len2 = 4; + memcpy(buf + len + len1, ".osg", 4); + off = len + len1 + len2; + + buf[min(off, OSG_SET_TEXT_BUF_SIZE - 1)] = 0; + key_val sslkv; + if (lkv.read_int32_t(buf, off, ".length", 8, &count1) + && lkv.get_local_key_val(buf, &sslkv)) + for (int32_t j = 0; j < count1; j++) { + len3 = sprintf_s(buf + len + len1 + len2, + OSG_SET_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); + off = len + len1 + len2 + len3; + + int32_t exf = 0; + lkv.read_int32_t( + buf, off, ".exf", 5, &exf); + + std::string parts; + lkv.read_string( + buf, off, ".parts", 7, &parts); + + std::string root; + lkv.read_string( + buf, off, ".root", 6, &root); + + std::pair key = { name, root }; + auto elem = cat.find(key); + if (elem == cat.end()) + elem = cat.insert({ key, {} }).first; + + elem->second.exf = exf; + elem->second.parts = parse_parts_string(&parts); + } + } + } + + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + + if (kv->get_local_key_val("obj", &lkv)) { + len = 3; + memcpy(buf, "obj", 3); + off = len; + + buf[off] = 0; + key_val slkv; + if (lkv.read_int32_t(buf, off, ".length", 8, &count) + && lkv.get_local_key_val(buf, &slkv)) { + for (int32_t i = 0; i < count; i++) { + len1 = sprintf_s(buf + len, + OSG_SET_TEXT_BUF_SIZE - len, ".%d", i); + off = len + len1; + + std::string cat; + lkv.read_string( + buf, off, ".cat", 5, &cat); + + std::string name; + lkv.read_string( + buf, off, ".name", 6, &name); + + obj.insert_or_assign(obj_db->get_object_info(name.c_str()), cat); + } + } + } +} + +rob_osage_parts osage_setting::parse_parts_string(std::string* s) { + static const char* parts_string_array[] = { + "LEFT", "RIGHT", "CENTER", "LONG_C", "SHORT_L", "SHORT_R", + "APPEND_L", "APPEND_R", "MUFFLER", "WHITE_ONE_L", "PONY", "ANGEL_L", "ANGEL_R", + }; + + for (const char*& i : parts_string_array) + if (!s->compare(i)) + return (rob_osage_parts)(&i - parts_string_array); + return ROB_OSAGE_PARTS_NONE; +} + ReqData::ReqData() : chara_index(), count() { + } ReqData::ReqData(::chara_index chara_index, int32_t count) { @@ -13841,14 +16335,14 @@ void PvOsageManager::sub_1404F7BD0(bool not_reset) { bone_database* bone_data = &data->data_ft.bone_data; motion_database* mot_db = &data->data_ft.mot_db; rob_chara* rob_chr = rob_chara_array_get(chara_id); - rob_chara_set_motion_id(rob_chr, rob_cmn_mottbl_get_motion_id(rob_chr, 0), + rob_chr->set_motion_id(rob_chr->get_rob_cmn_mottbl_motion_id(0), 0.0f, 0.0f, 1, 0, MOTION_BLEND_CROSS, bone_data, mot_db); - rob_chara_set_face_mottbl_motion(rob_chr, 0, 6, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, true, mot_db); - rob_chara_set_hand_l_mottbl_motion(rob_chr, 0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chara_set_hand_r_mottbl_motion(rob_chr, 0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chara_set_mouth_mottbl_motion(rob_chr, 0, 131, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chara_set_eyes_mottbl_motion(rob_chr, 0, 165, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chara_set_eyelid_mottbl_motion_from_face(rob_chr, 0, 0.0f, -1.0f, 0.0f, mot_db); + rob_chr->set_face_mottbl_motion(0, 6, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, true, mot_db); + rob_chr->set_hand_l_mottbl_motion(0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chr->set_hand_r_mottbl_motion(0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chr->set_mouth_mottbl_motion(0, 131, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chr->set_eyes_mottbl_motion(0, 165, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); + rob_chr->set_eyelid_mottbl_motion_from_face(0, 0.0f, -1.0f, 0.0f, mot_db); } Reset(); } @@ -14081,6 +16575,225 @@ void RobImplTask::FreeInitCharaList(int8_t* chara_id) { FreeList(chara_id, &init_chara); } +struc_462::struc_462() : rob_chr() { + pv_id = -1; + motion_id = -1; + frame = -1; +} + +struc_462::~struc_462() { + +} + +static uint8_t skin_param_manager_index = 0; + +SkinParamManager::SkinParamManager() { + index = skin_param_manager_index++; + state = 1; +} + +SkinParamManager::~SkinParamManager() { + state = 1; + Reset(); +} + +bool SkinParamManager::Init() { + state = 0; + sub_14060FBD0(); + return true; +} + +bool SkinParamManager::Ctrl() { + if (state == 0) { + if (sub_1406112F0()) + return false; + state = 1; + } + else if (state != 1) + return false; + return true; +} + +bool SkinParamManager::Dest() { + return true; +} + +void SkinParamManager::Disp() { + +} + +void SkinParamManager::Reset() { + field_70.clear(); + + for (auto i : field_88) { + if (!i.second) + continue; + + i.second->clear(); + i.second->shrink_to_fit(); + delete i.second; + i.second = 0; + } + field_88.clear(); + + for (auto i : field_98) { + if (!i.second) + continue; + + i.second->clear(); + i.second->shrink_to_fit(); + delete i.second; + i.second = 0; + } + field_98.clear(); + + for (auto i : field_A8) { + if (!i.second) + continue; + + i.second->clear(); + i.second->shrink_to_fit(); + delete i.second; + i.second = 0; + } + field_A8.clear(); + + for (struc_461*& i : field_B8) { + if (i->file_handler) { + delete i->file_handler; + i->file_handler = 0; + } + delete i; + } + field_B8.clear(); + + Task::SetDest(); +} + +void SkinParamManager::sub_14060FBD0() { + if (!field_70.size()) + return; + + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + + field_B8.clear(); + for (struc_462& i : field_70) { + rob_chara_item_equip* rob_itm_equip = i.rob_chr->item_equip; + for (int32_t j = ITEM_KAMI; j < ITEM_MAX; j++) { + object_info v9 = rob_chara_item_equip_get_object_info(rob_itm_equip, (item_id)j); + if (!v9.is_null()) + continue; + + const char* v11 = obj_db->get_object_name(v9); + if (!v11) + continue; + + obj_skin* skin = object_storage_get_obj_skin(v9); + if (!skin || !skin->ex_data_init) + return; + + obj_skin_ex_data* ex_data = &skin->ex_data; + int32_t osage_count = 0; + + obj_skin_block* b = ex_data->blocks; + for (int32_t k = ex_data->blocks_count; k; k--, b++) + if (b->type == OBJ_SKIN_BLOCK_OSAGE) + osage_count++; + + if (!ex_data || !(ex_data->field_2C + osage_count)) + continue; + + std::string v64 = "ext_skp_" + std::string(v11) + ".txt"; + struc_461* v19 = new struc_461; + if (!v19) + continue; + + v19->id = (item_id)j; + v19->rob_chr = i.rob_chr; + v19->field_C = -1; + + bool v17 = false; + std::string v61; + std::string v62; + if (i.name.size()) + //v19->field_C = sub_140610A90(this, &i, &v64, &i.name, &v61); + + if (v19->field_C == -1) { + std::string v63; + //v19->field_C = sub_14060B720(sp_skp_db_data_get(), &i, &v9, &v62, &v63); + if (v19->field_C == -1) { + delete v19; + continue; + } + + if (v19->field_C == 0 || v19->field_C == 1) { + v17 = true; + v61 = "rom/skin_param/" + v63; + } + else if (v19->field_C == 2) { + v61 = "rom/skin_param/" + v62; + } + } + + std::vector* v31 = 0; + if (v19->field_C == 0) { + std::pair> v49 = { v9, { i.motion_id, i.frame } }; + auto elem = field_88.find(v49); + if (elem != field_88.end()) { + delete v19; + continue; + } + + v31 = new std::vector; + field_88.insert({ v49, v31 }); + } + else if (v19->field_C == 1) { + std::pair> v49 = { v9, { i.motion_id, -1 } }; + auto elem = field_98.find(v49); + if (elem != field_98.end()) { + delete v19; + continue; + } + + v31 = new std::vector; + field_98.insert({ v49, v31 }); + } + else if (v19->field_C == 2) { + std::pair> v49 = { v9, { -1, -1 } }; + auto elem = field_A8.find(v49); + if (elem != field_A8.end()) { + delete v19; + continue; + } + + v31 = new std::vector; + field_A8.insert({ v49, v31 }); + } + + if (!v31) { + delete v19; + continue; + } + + v31->resize((size_t)ex_data->field_2C + osage_count); + v19->field_10 = v31; + + p_file_handler* v39 = new p_file_handler; + if (v17) + v39->read_file(rctx_ptr->data, 0, v61.c_str(), v62.c_str(), false); + else + v39->read_file(rctx_ptr->data, 0, v61.c_str()); + v19->file_handler = v39; + field_B8.push_back(v19); + } + } +} + +bool SkinParamManager::sub_1406112F0() { + return false; +} + TaskRobBase::TaskRobBase() { } @@ -14105,7 +16818,8 @@ bool TaskRobBase::Ctrl() { for (rob_chara*& i : ctrl_chara) if (i) - rob_thread_handler->AppendRobCharaFunc(i->chara_id, i, rob_base_rob_chara_ctrl_thread_main); + rob_thread_handler->AppendRobCharaFunc(i->chara_id, + i, rob_base_rob_chara_ctrl_thread_main); rob_thread_handler->sub_14054E3F0(); @@ -14634,21 +17348,20 @@ void TaskRobLoad::LoadCharaItemsParent(chara_index chara_index, void TaskRobLoad::LoadCharaObjSetMotionSet(chara_index chara_index, void* data, object_database* obj_db, motion_database* mot_db) { - chara_init_data* chr_init_data = chara_init_data_get(chara_index); + const chara_init_data* chr_init_data = chara_init_data_get(chara_index); object_storage_load_set(data, obj_db, chr_init_data->object_set); - motion_set_load_motion(2u, 0, mot_db); - //motion_set_load_mothead(2u, 0, mot_db); + motion_set_load_motion(2, 0, mot_db); + motion_set_load_mothead(2, 0, mot_db); motion_set_load_motion(chr_init_data->motion_set, 0, mot_db); } bool TaskRobLoad::LoadCharaObjSetMotionSetCheck(chara_index chara_index) { - chara_init_data* chr_init_data = chara_init_data_get(chara_index); + const chara_init_data* chr_init_data = chara_init_data_get(chara_index); if (object_storage_load_obj_set_check_not_read(chr_init_data->object_set) - /*|| motion_storage_check_mot_file_not_read(2)*/ - /*|| mothead_storage_check_mhd_file_not_read(2)*/) + || motion_storage_check_mot_file_not_ready(2) + || mothead_storage_check_mhd_file_not_ready(2)) return true; - //return motion_storage_check_mot_file_not_read(chr_init_data->motion_set); - return false; + return motion_storage_check_mot_file_not_ready(chr_init_data->motion_set); } void TaskRobLoad::ResetReqData() { @@ -14691,10 +17404,10 @@ void TaskRobLoad::UnloadCharaItemsParent(chara_index chara_index, item_cos_data* } void TaskRobLoad::UnloadCharaObjSetMotionSet(chara_index chara_index) { - chara_init_data* chr_init_data = chara_init_data_get(chara_index); + const chara_init_data* chr_init_data = chara_init_data_get(chara_index); object_storage_unload_set(chr_init_data->object_set); motion_set_unload_motion(2); - //motion_set_unload_mothead(2); + motion_set_unload_mothead(2); motion_set_unload_motion(chr_init_data->motion_set); } @@ -14756,7 +17469,7 @@ bool TaskRobManager::Ctrl() { motion_database* mot_db = &data->data_ft.mot_db; for (rob_chara*& i : load_chara) { - rob_chara_reset_data(i, &i->pv_data, bone_data, mot_db); + i->reset_data(&i->pv_data, bone_data, mot_db); AppendLoadedCharaList(i); } CheckTypeAppendInitCharaLists(&load_chara); @@ -15304,7 +18017,7 @@ static void sub_140548660(rob_chara* rob_chr) { static void sub_140548460(rob_chara* rob_chr) { rob_chr->data.field_2 ^= (rob_chr->data.field_2 ^ (2 * rob_chr->data.field_2)) & 0x10; - if (rob_chr->data.field_1588.field_20.field_0 & 0x01) + if (rob_chr->data.field_1588.field_0.field_20.field_0 & 0x01) rob_chr->data.field_2 |= 0x08; else rob_chr->data.field_2 &= ~0x08; diff --git a/src/CRE/rob.h b/src/CRE/rob.hpp similarity index 86% rename from src/CRE/rob.h rename to src/CRE/rob.hpp index 21e92dc3..81828c0c 100644 --- a/src/CRE/rob.h +++ b/src/CRE/rob.hpp @@ -6,14 +6,14 @@ #pragma once #include "../KKdLib/default.h" -#include "../KKdLib/database/bone.h" -#include "../KKdLib/database/motion.h" +#include "../KKdLib/database/bone.hpp" +#include "../KKdLib/database/motion.hpp" #include "../KKdLib/mat.h" -#include "../KKdLib/mot.h" +#include "../KKdLib/mot.hpp" #include "../KKdLib/vec.h" #include "draw_object.h" -#include "item_table.h" -#include "object.h" +#include "item_table.hpp" +#include "object.hpp" #include "static_var.h" enum ex_expression_block_stack_type { @@ -40,87 +40,88 @@ enum eyes_base_adjust_type { }; enum mothead_data_type { - MOTHEAD_DATA_TYPE_0 = 0x00, - MOTHEAD_DATA_TYPE_1 = 0x01, - MOTHEAD_DATA_TYPE_2 = 0x02, - MOTHEAD_DATA_TYPE_3 = 0x03, - MOTHEAD_DATA_TYPE_4 = 0x04, - MOTHEAD_DATA_TYPE_5 = 0x05, - MOTHEAD_DATA_TYPE_6 = 0x06, - MOTHEAD_DATA_TYPE_7 = 0x07, - MOTHEAD_DATA_TYPE_8 = 0x08, - MOTHEAD_DATA_TYPE_9 = 0x09, - MOTHEAD_DATA_TYPE_10 = 0x0A, - MOTHEAD_DATA_TYPE_11 = 0x0B, - MOTHEAD_DATA_TYPE_12 = 0x0C, - MOTHEAD_DATA_TYPE_13 = 0x0D, - MOTHEAD_DATA_TYPE_14 = 0x0E, - MOTHEAD_DATA_TYPE_15 = 0x0F, - MOTHEAD_DATA_TYPE_16 = 0x10, - MOTHEAD_DATA_TYPE_17 = 0x11, - MOTHEAD_DATA_TYPE_18 = 0x12, - MOTHEAD_DATA_TYPE_19 = 0x13, - MOTHEAD_DATA_TYPE_20 = 0x14, - MOTHEAD_DATA_TYPE_21 = 0x15, - MOTHEAD_DATA_TYPE_22 = 0x16, - MOTHEAD_DATA_TYPE_23 = 0x17, - MOTHEAD_DATA_TYPE_24 = 0x18, - MOTHEAD_DATA_TYPE_25 = 0x19, - MOTHEAD_DATA_TYPE_26 = 0x1A, - MOTHEAD_DATA_TYPE_27 = 0x1B, - MOTHEAD_DATA_TYPE_28 = 0x1C, - MOTHEAD_DATA_TYPE_29 = 0x1D, - MOTHEAD_DATA_TYPE_30 = 0x1E, - MOTHEAD_DATA_TYPE_31 = 0x1F, - MOTHEAD_DATA_TYPE_32 = 0x20, - MOTHEAD_DATA_TYPE_33 = 0x21, - MOTHEAD_DATA_TYPE_34 = 0x22, - MOTHEAD_DATA_TYPE_35 = 0x23, - MOTHEAD_DATA_TYPE_36 = 0x24, - MOTHEAD_DATA_TYPE_37 = 0x25, - MOTHEAD_DATA_TYPE_38 = 0x26, - MOTHEAD_DATA_TYPE_39 = 0x27, - MOTHEAD_DATA_TYPE_40 = 0x28, - MOTHEAD_DATA_TYPE_41 = 0x29, - MOTHEAD_DATA_TYPE_42 = 0x2A, - MOTHEAD_DATA_TYPE_43 = 0x2B, - MOTHEAD_DATA_TYPE_44 = 0x2C, - MOTHEAD_DATA_TYPE_45 = 0x2D, - MOTHEAD_DATA_TYPE_46 = 0x2E, - MOTHEAD_DATA_TYPE_47 = 0x2F, - MOTHEAD_DATA_TYPE_48 = 0x30, - MOTHEAD_DATA_TYPE_49 = 0x31, - MOTHEAD_DATA_TYPE_50 = 0x32, - MOTHEAD_DATA_TYPE_51 = 0x33, - MOTHEAD_DATA_TYPE_52 = 0x34, - MOTHEAD_DATA_TYPE_53 = 0x35, - MOTHEAD_DATA_TYPE_54 = 0x36, - MOTHEAD_DATA_TYPE_55 = 0x37, - MOTHEAD_DATA_TYPE_56 = 0x38, - MOTHEAD_DATA_TYPE_57 = 0x39, - MOTHEAD_DATA_TYPE_58 = 0x3A, - MOTHEAD_DATA_TYPE_59 = 0x3B, - MOTHEAD_DATA_TYPE_60 = 0x3C, - MOTHEAD_DATA_TYPE_61 = 0x3D, - MOTHEAD_DATA_TYPE_62 = 0x3E, - MOTHEAD_DATA_TYPE_63 = 0x3F, - MOTHEAD_DATA_WIND_RESET = 0x40, - MOTHEAD_DATA_ROB_RESET = 0x41, - MOTHEAD_DATA_ROB_STEP = 0x42, - MOTHEAD_DATA_TYPE_67 = 0x43, - MOTHEAD_DATA_TYPE_68 = 0x44, - MOTHEAD_DATA_TYPE_69 = 0x45, - MOTHEAD_DATA_TYPE_70 = 0x46, - MOTHEAD_DATA_HAND_ADJUST = 0x49, - MOTHEAD_DATA_TYPE_72 = 0x48, - MOTHEAD_DATA_TYPE_73 = 0x49, - MOTHEAD_DATA_TYPE_74 = 0x4A, - MOTHEAD_DATA_TYPE_75 = 0x4B, - MOTHEAD_DATA_TYPE_76 = 0x4C, - MOTHEAD_DATA_TYPE_77 = 0x4D, - MOTHEAD_DATA_TYPE_78 = 0x4E, - MOTHEAD_DATA_TYPE_79 = 0x4F, - MOTHEAD_DATA_TYPE_80 = 0x50, + MOTHEAD_DATA_TYPE_0 = 0x00, + MOTHEAD_DATA_TYPE_1 = 0x01, + MOTHEAD_DATA_TYPE_2 = 0x02, + MOTHEAD_DATA_TYPE_3 = 0x03, + MOTHEAD_DATA_TYPE_4 = 0x04, + MOTHEAD_DATA_TYPE_5 = 0x05, + MOTHEAD_DATA_TYPE_6 = 0x06, + MOTHEAD_DATA_TYPE_7 = 0x07, + MOTHEAD_DATA_TYPE_8 = 0x08, + MOTHEAD_DATA_TYPE_9 = 0x09, + MOTHEAD_DATA_TYPE_10 = 0x0A, + MOTHEAD_DATA_TYPE_11 = 0x0B, + MOTHEAD_DATA_TYPE_12 = 0x0C, + MOTHEAD_DATA_TYPE_13 = 0x0D, + MOTHEAD_DATA_TYPE_14 = 0x0E, + MOTHEAD_DATA_TYPE_15 = 0x0F, + MOTHEAD_DATA_TYPE_16 = 0x10, + MOTHEAD_DATA_TYPE_17 = 0x11, + MOTHEAD_DATA_TYPE_18 = 0x12, + MOTHEAD_DATA_TYPE_19 = 0x13, + MOTHEAD_DATA_TYPE_20 = 0x14, + MOTHEAD_DATA_TYPE_21 = 0x15, + MOTHEAD_DATA_TYPE_22 = 0x16, + MOTHEAD_DATA_TYPE_23 = 0x17, + MOTHEAD_DATA_TYPE_24 = 0x18, + MOTHEAD_DATA_TYPE_25 = 0x19, + MOTHEAD_DATA_TYPE_26 = 0x1A, + MOTHEAD_DATA_TYPE_27 = 0x1B, + MOTHEAD_DATA_TYPE_28 = 0x1C, + MOTHEAD_DATA_TYPE_29 = 0x1D, + MOTHEAD_DATA_TYPE_30 = 0x1E, + MOTHEAD_DATA_TYPE_31 = 0x1F, + MOTHEAD_DATA_TYPE_32 = 0x20, + MOTHEAD_DATA_TYPE_33 = 0x21, + MOTHEAD_DATA_TYPE_34 = 0x22, + MOTHEAD_DATA_TYPE_35 = 0x23, + MOTHEAD_DATA_TYPE_36 = 0x24, + MOTHEAD_DATA_TYPE_37 = 0x25, + MOTHEAD_DATA_TYPE_38 = 0x26, + MOTHEAD_DATA_TYPE_39 = 0x27, + MOTHEAD_DATA_TYPE_40 = 0x28, + MOTHEAD_DATA_TYPE_41 = 0x29, + MOTHEAD_DATA_TYPE_42 = 0x2A, + MOTHEAD_DATA_TYPE_43 = 0x2B, + MOTHEAD_DATA_TYPE_44 = 0x2C, + MOTHEAD_DATA_TYPE_45 = 0x2D, + MOTHEAD_DATA_TYPE_46 = 0x2E, + MOTHEAD_DATA_TYPE_47 = 0x2F, + MOTHEAD_DATA_TYPE_48 = 0x30, + MOTHEAD_DATA_TYPE_49 = 0x31, + MOTHEAD_DATA_SET_FACE_MOTION_ID = 0x32, + MOTHEAD_DATA_TYPE_51 = 0x33, + MOTHEAD_DATA_TYPE_52 = 0x34, + MOTHEAD_DATA_SET_FACE_MOTTBL_MOTION = 0x35, + MOTHEAD_DATA_SET_HAND_R_MOTTBL_MOTION = 0x36, + MOTHEAD_DATA_SET_HAND_L_MOTTBL_MOTION = 0x37, + MOTHEAD_DATA_SET_MOUTH_MOTTBL_MOTION = 0x38, + MOTHEAD_DATA_SET_EYES_MOTTBL_MOTION = 0x39, + MOTHEAD_DATA_SET_EYELID_MOTTBL_MOTION = 0x3A, + MOTHEAD_DATA_SET_ROB_CHARA_HEAD_OBJECT = 0x3B, + MOTHEAD_DATA_TYPE_60 = 0x3C, + MOTHEAD_DATA_SET_EYELID_MOTION_FROM_FACE = 0x3D, + MOTHEAD_DATA_ROB_PARTS_ADJUST = 0x3E, + MOTHEAD_DATA_TYPE_63 = 0x3F, + MOTHEAD_DATA_WIND_RESET = 0x40, + MOTHEAD_DATA_OSAGE_RESET = 0x41, + MOTHEAD_DATA_OSAGE_STEP = 0x42, + MOTHEAD_DATA_TYPE_67 = 0x43, + MOTHEAD_DATA_TYPE_68 = 0x44, + MOTHEAD_DATA_TYPE_69 = 0x45, + MOTHEAD_DATA_TYPE_70 = 0x46, + MOTHEAD_DATA_OSAGE_MOVE_CANCEL = 0x47, + MOTHEAD_DATA_TYPE_72 = 0x48, + MOTHEAD_DATA_HAND_ADJUST = 0x49, + MOTHEAD_DATA_TYPE_74 = 0x4A, + MOTHEAD_DATA_TYPE_75 = 0x4B, + MOTHEAD_DATA_TYPE_76 = 0x4C, + MOTHEAD_DATA_TYPE_77 = 0x4D, + MOTHEAD_DATA_TYPE_78 = 0x4E, + MOTHEAD_DATA_ROB_CHARA_COLI_RING = 0x4F, + MOTHEAD_DATA_ADJUST_GET_GLOBAL_TRANS = 0x50, + MOTHEAD_DATA_MAX = 0x51, }; enum MotionBlendType { @@ -637,12 +638,10 @@ struct mot_key_set { int32_t keys_count; int32_t current_key; int32_t last_key; - uint16_t* frames; - float_t* values; + const uint16_t* frames; + const float_t* values; }; -vector_old(mot_key_set) - struct eyes_adjust { bool xrot_adjust; eyes_base_adjust_type base_adjust; @@ -665,15 +664,18 @@ struct struc_369 { struct mot_key_data { bool key_sets_ready; size_t key_set_count; - vector_old_mot_key_set key_set; + std::vector key_set; mot mot; - vector_old_float_t key_set_data; - mot_data* mot_data; + std::vector key_set_data; + const mot_data* mot_data; bone_database_skeleton_type skeleton_type; int32_t skeleton_select; int32_t motion_id; float_t frame; struc_369 field_68; + + mot_key_data(); + ~mot_key_data(); }; struct bone_data { @@ -691,8 +693,8 @@ struct bone_data { vec3 ik_target; vec3 trans; mat4u rot_mat[3]; - vec3 trans_dup[2]; - mat4u rot_mat_dup[6]; + vec3 trans_prev[2]; + mat4u rot_mat_prev[3][2]; mat4* pole_target_mat; mat4* parent_mat; bone_node* node; @@ -701,22 +703,25 @@ struct bone_data { float_t field_2E0; float_t eyes_xrot_adjust_neg; float_t eyes_xrot_adjust_pos; -}; -vector_old(bone_data) + bone_data(); +}; struct bone_data_parent { rob_chara_bone_data* rob_bone_data; size_t motion_bone_count; size_t ik_bone_count; size_t chain_pos; - vector_old_bone_data bones; - vector_old_uint16_t bone_indices; + std::vector bones; + std::vector bone_indices; vec3 global_trans; vec3 global_rotation; uint32_t bone_key_set_count; uint32_t global_key_set_count; float_t rotation_y; + + bone_data_parent(); + ~bone_data_parent(); }; struct mot_play_frame_data { @@ -788,7 +793,7 @@ public: virtual void Reset(); virtual void Field_10(float_t a2, float_t a3, int32_t a4) = 0; virtual void Field_18(struc_400*) = 0; - virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) = 0; + virtual void Field_20(std::vector*, std::vector*) = 0; virtual void Blend(bone_data*, bone_data*) = 0; virtual bool Field_30(); @@ -809,7 +814,7 @@ public: virtual void Reset() override; virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; virtual void Field_18(struc_400*) override; - virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) override; + virtual void Field_20(std::vector*, std::vector*) override; virtual void Blend(bone_data*, bone_data*) override; }; @@ -839,7 +844,7 @@ public: virtual void Reset() override; virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; virtual void Field_18(struc_400*) override; - virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) override; + virtual void Field_20(std::vector*, std::vector*) override; virtual void Blend(bone_data*, bone_data*) override; }; @@ -850,7 +855,7 @@ public: virtual void Reset() override; virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; virtual void Field_18(struc_400*) override; - virtual void Field_20(vector_old_bone_data*, vector_old_bone_data*) override; + virtual void Field_20(std::vector*, std::vector*) override; virtual void Blend(bone_data*, bone_data*) override; }; @@ -862,7 +867,6 @@ struct struc_313 { ~struc_313(); }; - struct struc_240 { bool(*bone_check_func)(motion_bone_index bone_index); struc_313 field_8; @@ -1094,7 +1098,7 @@ struct struc_218 { }; struct struc_344 { - int32_t field_0; + int32_t chara_size_index; int32_t field_4; int32_t field_8; int32_t field_C; @@ -1127,7 +1131,7 @@ public: rob_chara_item_equip_object* item_equip_object; bool field_58; bool field_59; - bool has_parent_node; + bool has_children_node; ExNodeBlock(); virtual ~ExNodeBlock(); @@ -1389,7 +1393,7 @@ struct struc_571 { }; struct osage_coli { - int32_t type; + skin_param_osage_root_coli_type type; float_t radius; vec3 bone0_pos; vec3 bone1_pos; @@ -1418,7 +1422,7 @@ struct osage_ring_data { }; struct osage_setting_osg_cat { - int32_t parts; + rob_osage_parts parts; size_t exf; osage_setting_osg_cat(); @@ -1605,8 +1609,6 @@ struct ex_data_name_bone_index { int32_t bone_index; }; -vector_old(ex_data_name_bone_index) - struct rob_chara_item_equip; struct rob_chara_item_equip_object { @@ -1822,10 +1824,8 @@ struct struc_264 { 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; + int16_t field_146; + void* field_148; int8_t field_150; int16_t field_152; int32_t field_154; @@ -2119,7 +2119,7 @@ struct rob_chara_data_parts_adjust { float_t curr_force; float_t curr_strength; int32_t motion_id; - int32_t set_frame; + float_t set_frame; float_t force_duration; int32_t type; int32_t cycle_type; @@ -2132,6 +2132,8 @@ struct rob_chara_data_parts_adjust { float_t force; float_t strength; float_t strength_transition; + + void reset(); }; struct rob_chara_data_hand_adjust { @@ -2152,10 +2154,12 @@ struct rob_chara_data_hand_adjust { vec3 field_30; float_t field_3C; int32_t field_40; + + void reset(); }; struct struc_222 { - int8_t field_0; + bool field_0; float_t field_4; float_t field_8; float_t field_C; @@ -2174,7 +2178,7 @@ struct rob_chara_adjust { int8_t field_29; int8_t field_2A; int32_t field_2C; - int32_t field_30; + uint32_t field_30; int16_t field_34; int16_t field_36; int32_t field_38[32]; @@ -2225,30 +2229,43 @@ struct mothead_data2 { void* data; }; -struct mothead_sub { +struct mothead_mot { struc_228 field_0; int16_t field_10; int16_t field_12; - mothead_data2* field_18; - mothead_data* data; - int64_t* field_28; + std::vector field_18; + std::vector data; + std::vector field_28; + + mothead_mot(); + virtual ~mothead_mot(); }; struct mothead { int32_t mot_set_id; int32_t first_mot_id; int32_t last_mot_id; - mothead_sub** sub; + std::vector mots; + + mothead(); + virtual ~mothead(); }; struct mothead_file { int32_t mot_set_id; int32_t first_mot_id; int32_t last_mot_id; - int32_t field_C; + uint32_t mot_offsets_offset; }; -struct mothead_sub_file { +struct mothead_modern_file { + uint32_t mot_set_id; + int32_t mot_count; + int64_t hashes_offset; + int64_t mot_offsets_offset; +}; + +struct mothead_mot_file { int32_t field_0; int32_t field_4; int32_t field_8; @@ -2261,8 +2278,8 @@ struct mothead_sub_file { }; struct struc_377 { - mothead_data* field_0; - mothead_data* field_8; + const mothead_data* field_0; + const mothead_data* field_8; }; struct struc_226 { @@ -2294,8 +2311,8 @@ struct struc_306 { int32_t field_48; }; -struct struc_223 { - int32_t field_0; +struct struc_652 { + uint32_t motion_id; float_t frame_count; float_t field_8; int16_t field_C; @@ -2345,17 +2362,17 @@ struct struc_223 { int16_t field_220; std::list field_228; int16_t field_238; - int32_t field_23C; + float_t field_23C; int32_t field_240; int16_t field_244; - int64_t field_248; + const mothead_data2* 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; + uint16_t field_274; int16_t field_276; int32_t field_278; int32_t field_27C; @@ -2392,36 +2409,45 @@ struct struc_223 { float_t field_30C; int32_t field_310; int16_t field_314; - float_t field_318; - float_t field_31C; - float_t field_320; + vec3 field_318; float_t field_324; float_t field_328; int32_t iterations; - 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_652(); + ~struc_652(); +}; + +struct struc_651 { + struc_377 field_0; + int32_t field_10; + int32_t field_14; + int32_t field_18; + float_t field_1C; + vec3 field_20; + struc_226 field_2C[3]; + struc_225 field_80[3]; + struc_224 field_1C4[3]; + int64_t field_308; + float_t field_310; + float_t field_314; + int8_t field_318; + int32_t field_31C; + float_t field_320; + float_t field_324; + float_t field_328; + float_t field_32C; + float_t field_330; + float_t field_334; + int8_t field_338; + struc_306 field_33C[4]; +}; + +struct struc_223 { + struc_652 field_0; + struc_651 field_330; + const int64_t* field_7A0; + uint32_t motion_set_id; struc_223(); ~struc_223(); @@ -2652,6 +2678,19 @@ struct rob_chara_data { ~rob_chara_data(); }; +struct struc_307 { + int64_t field_0; + int32_t field_8; + int32_t field_C; + int64_t field_10; + int16_t field_18; + int16_t field_1A; + int16_t field_1C; + int16_t field_1E; + int64_t field_20; + rob_chara_bone_data* field_28; +}; + struct rob_chara { int8_t chara_id; rob_chara_type type; @@ -2660,16 +2699,62 @@ struct rob_chara { chara_index chara_index; int32_t module_index; float_t frame_speed; + void* field_20; rob_chara_bone_data* bone_data; rob_chara_item_equip* item_equip; rob_chara_item_cos_data item_cos_data; rob_chara_data data; rob_chara_data data_prev; - chara_init_data* chara_init_data; + const chara_init_data* chara_init_data; rob_chara_pv_data pv_data; rob_chara(); virtual ~rob_chara(); + + mat4* get_bone_data_mat(size_t index); + float_t get_frame(); + float_t get_frame_count(); + int32_t get_rob_cmn_mottbl_motion_id(int32_t id); + void load_motion(int32_t motion_id, bool a3, float_t frame, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); + void reset_data(rob_chara_pv_data* pv_data, + bone_database* bone_data, motion_database* mot_db); + void set_bone_data_frame(float_t frame); + void set_chara_height_adjust(bool value); + void set_chara_pos_adjust(vec3* value); + void set_chara_pos_adjust_y(float_t value); + void set_chara_size(float_t value); + void set_eyelid_mottbl_motion_from_face(int32_t a2, + float_t duration, float_t value, float_t offset, motion_database* mot_db); + void set_eyelid_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db); + void set_eyes_mottbl_motion(int32_t type, + int32_t mottbl_index, float_t value, int32_t state, float_t duration, + float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db); + void set_face_mottbl_motion(int32_t type, int32_t mottbl_index, + float_t value, int32_t state, float_t duration, float_t a7, + float_t step, int32_t a9, float_t offset, bool a11, motion_database* mot_db); + void set_frame(float_t frame); + void set_hand_l_mottbl_motion(int32_t type, int32_t mottbl_index, + float_t value, int32_t state, float_t duration, float_t a7, + float_t step, int32_t a9, float_t offset, motion_database* mot_db); + void set_hand_r_mottbl_motion(int32_t type, int32_t mottbl_index, + float_t value, int32_t state, float_t duration, float_t a7, + float_t step, int32_t a9, float_t offset, motion_database* mot_db); + bool set_motion_id(int32_t motion_id, float_t frame, + float_t duration, bool a5, bool set_motion_reset_data, + MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); + void set_motion_reset_data(int32_t motion_id, float_t frame); + void set_motion_skin_param(int32_t motion_id, float_t frame); + void set_mouth_mottbl_motion(int32_t type, int32_t mottbl_index, + float_t value, int32_t state, float_t duration, float_t a7, + float_t step, int32_t a9, float_t offset, motion_database* mot_db); + void set_osage_move_cancel(uint8_t id, float_t value); + void set_osage_reset(); + void set_osage_step(float_t value); + void set_parts_disp(item_id id, bool disp); + void set_visibility(bool value); }; struct skeleton_rotation_offset { @@ -2684,80 +2769,48 @@ struct skeleton_rotation_offset { extern rob_chara* rob_chara_array; extern rob_chara_pv_data* rob_chara_pv_data_array; -extern chara_init_data* chara_init_data_get(chara_index chara_index); +extern const chara_init_data* chara_init_data_get(chara_index chara_index); +extern int32_t chara_init_data_get_chara_size_index(chara_index chara_index); -extern void motion_set_load_motion(uint32_t set, std::string* motion_name, motion_database* mot_db); +extern float_t chara_pos_adjust_y_table_get_value(uint32_t a1); +extern float_t chara_size_table_get_value(uint32_t a1); + +extern void motion_set_load_mothead(uint32_t set, std::string* mdata_dir, motion_database* mot_db); +extern void motion_set_load_motion(uint32_t set, std::string* mdata_dir, motion_database* mot_db); +extern void motion_set_unload_mothead(uint32_t set); extern void motion_set_unload_motion(uint32_t set); extern void pv_osage_manager_array_reset(int32_t chara_id); -extern void pv_osage_manager_array_ptr_init(); -extern void pv_osage_manager_array_ptr_free(); +extern void rob_init(); +extern void rob_free(); extern mat4* rob_chara_bone_data_get_mats_mat(rob_chara_bone_data* rob_bone_data, size_t index); -extern mat4* rob_chara_get_bone_data_mat(rob_chara* chara, size_t index); -extern float_t rob_chara_get_frame(rob_chara* rob_chr); -extern float_t rob_chara_get_frame_count(rob_chara* rob_chr); -extern void rob_chara_load_motion(rob_chara* rob_chr, int32_t motion_id, bool a3, float_t frame, - MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); -extern void rob_chara_reset_data(rob_chara* rob_chr, rob_chara_pv_data* pv_data, - bone_database* bone_data, motion_database* mot_db); -extern void rob_chara_set_eyelid_mottbl_motion_from_face(rob_chara* rob_chr, - int32_t a2, float_t duration, float_t value, float_t offset, motion_database* mot_db); -extern void rob_chara_set_eyes_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, - float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db); -extern void rob_chara_set_face_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, - float_t a7, float_t step, int32_t a9, float_t offset, bool a11, motion_database* mot_db); -extern void rob_chara_set_frame(rob_chara* rob_chr, float_t frame); -extern void rob_chara_set_hand_l_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, - float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db); -extern void rob_chara_set_hand_r_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, - float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db); -extern bool rob_chara_set_motion_id(rob_chara* rob_chr, int32_t motion_id, - float_t frame, float_t duration, bool a5, bool set_motion_reset_data, - MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); -extern void rob_chara_set_motion_reset_data(rob_chara* rob_chr, int32_t motion_id, float_t frame); -extern void rob_chara_set_motion_skin_param(rob_chara* rob_chr, int32_t motion_id, float_t frame); -extern void rob_chara_set_mouth_mottbl_motion(rob_chara* rob_chr, - int32_t type, int32_t mottbl_index, float_t value, int32_t state, float_t duration, - float_t a7, float_t step, int32_t a9, float_t offset, motion_database* mot_db); -extern void rob_chara_set_osage_move_cancel(rob_chara* rob_chr, uint8_t id, float_t value); -extern void rob_chara_set_osage_reset(rob_chara* rob_chr); -extern void rob_chara_set_osage_step(rob_chara* rob_chr, float_t value); -extern void rob_chara_set_parts_disp(rob_chara* rob_chr, item_id id, bool disp); -extern void rob_chara_set_visibility(rob_chara* rob_chr, bool value); -extern void rob_chara_array_init(); extern rob_chara* rob_chara_array_get(int32_t chara_id); extern int32_t rob_chara_array_init_chara_index(chara_index chara_index, rob_chara_pv_data* pv_data, int32_t module_index, bool can_set_default); extern void rob_chara_array_free_chara_id(int32_t chara_id); -extern void rob_chara_array_free(); extern bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id); -extern int32_t rob_cmn_mottbl_get_motion_id(rob_chara* rob_chr, int32_t id); - -extern void rob_mot_tbl_init(); -extern void rob_mot_tbl_free(); - -extern void rob_thread_handler_init(); -extern void rob_thread_handler_free(); - extern bool pv_osage_manager_array_ptr_get_disp(); extern void task_rob_manager_append_task(); extern bool task_rob_manager_check_chara_loaded(int32_t chara_id); extern void motion_storage_init(); -extern void motion_storage_append_mot_set(uint32_t set_id); -extern void motion_storage_insert_motion_set(mot_set* set, uint32_t set_id); -extern mot_set* motion_storage_get_motion_set(uint32_t set_id); -extern void motion_storage_delete_motion_set(uint32_t set_id); -extern mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database* mot_db); +extern bool motion_storage_check_mot_file_not_ready(uint32_t set_id); +extern const mot_data* motion_storage_get_mot_data(uint32_t motion_id, motion_database* mot_db); extern float_t motion_storage_get_mot_data_frame_count(uint32_t motion_id, motion_database* mot_db); -extern void motion_storage_free(); \ No newline at end of file +extern const mot_set* motion_storage_get_motion_set(uint32_t set_id); +extern void motion_storage_free(); + +extern void mothead_storage_init(); +extern bool mothead_storage_check_mhd_file_not_ready(uint32_t set_id); +extern const mothead_mot* mothead_storage_get_mot_by_motion_id(uint32_t motion_id, motion_database* mot_db); +extern void mothead_storage_free(); + +extern void osage_setting_data_init(); +extern bool osage_setting_data_load_file(void* data, const char* path, const char* file, uint32_t hash); +extern void osage_setting_data_free(); diff --git a/src/CRE/shader.c b/src/CRE/shader.c index d09a977e..74ea18c2 100644 --- a/src/CRE/shader.c +++ b/src/CRE/shader.c @@ -5,7 +5,7 @@ #include "shader.h" #include "../KKdLib/io/path.h" -#include "../KKdLib/hash.h" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" #include "gl_state.h" #include diff --git a/src/CRE/shader.h b/src/CRE/shader.h index 86042cdb..4b46f127 100644 --- a/src/CRE/shader.h +++ b/src/CRE/shader.h @@ -5,12 +5,12 @@ #pragma once +#include +#include #include "../KKdLib/default.h" -#include "../KKdLib/string.h" -#include "../KKdLib/farc.h" +#include "../KKdLib/farc.hpp" #include "../KKdLib/mat.h" #include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" #include "static_var.h" #define SHADER_MAX_CLIP_PLANES 8 diff --git a/src/CRE/shader_glsl.c b/src/CRE/shader_glsl.c index 8631f78a..b88b31fa 100644 --- a/src/CRE/shader_glsl.c +++ b/src/CRE/shader_glsl.c @@ -4,7 +4,7 @@ */ #include "shader_glsl.h" -#include "../KKdLib/hash.h" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" #include "gl_state.h" #include "static_var.h" diff --git a/src/CRE/shader_glsl.h b/src/CRE/shader_glsl.h index f48db7dd..96cfd0b9 100644 --- a/src/CRE/shader_glsl.h +++ b/src/CRE/shader_glsl.h @@ -5,12 +5,12 @@ #pragma once +#include +#include #include "../KKdLib/default.h" -#include "../KKdLib/string.h" -#include "../KKdLib/farc.h" +#include "../KKdLib/farc.hpp" #include "../KKdLib/mat.h" #include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" #include #define SHADER_PARAM_NUM_PARAMS 12 @@ -43,7 +43,6 @@ struct shader_glsl { void use(); }; - #define shader_glsl_set_bool(s, name, value) \ { \ int32_t location = (s)->get_uniform_location((GLchar*)name); \ diff --git a/src/CRE/stage.c b/src/CRE/stage.cpp similarity index 99% rename from src/CRE/stage.c rename to src/CRE/stage.cpp index 3cb472c4..61736125 100644 --- a/src/CRE/stage.c +++ b/src/CRE/stage.cpp @@ -3,14 +3,14 @@ GitHub/GitLab: korenkonder */ -#include "stage.h" -#include "../KKdLib/hash.h" +#include "stage.hpp" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" #include "../KKdLib/vec.h" #include "draw_task.h" -#include "light_param.h" -#include "render_context.h" -#include "rob.h" +#include "light_param.hpp" +#include "render_context.hpp" +#include "rob.hpp" namespace stage_detail { static void TaskStage_CtrlInner(stage_detail::TaskStage* a1); @@ -416,7 +416,6 @@ static void stage_disp(stage* s) { mat4 mat; mat4_rotate_y(s->rot_y, &mat); - if (s->stage_data->object_ground.not_null() && s->ground) draw_task_add_draw_object_by_object_info(rctx_ptr, &mat, s->stage_data->object_ground, 0, 0, 0, 0, 0, 0); diff --git a/src/CRE/stage.h b/src/CRE/stage.hpp similarity index 96% rename from src/CRE/stage.h rename to src/CRE/stage.hpp index fc17775e..c9978649 100644 --- a/src/CRE/stage.h +++ b/src/CRE/stage.hpp @@ -7,9 +7,9 @@ #include #include "../KKdLib/default.h" -#include "../KKdLib/database/stage.h" -#include "render_context.h" -#include "auth_3d.h" +#include "../KKdLib/database/stage.hpp" +#include "render_context.hpp" +#include "auth_3d.hpp" struct stage { int32_t index; diff --git a/src/CRE/stage_modern.c b/src/CRE/stage_modern.cpp similarity index 99% rename from src/CRE/stage_modern.c rename to src/CRE/stage_modern.cpp index 17f69594..56c74a07 100644 --- a/src/CRE/stage_modern.c +++ b/src/CRE/stage_modern.cpp @@ -3,14 +3,14 @@ GitHub/GitLab: korenkonder */ -#include "stage_modern.h" -#include "../KKdLib/hash.h" +#include "stage_modern.hpp" +#include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.h" #include "../KKdLib/vec.h" #include "draw_task.h" -#include "light_param.h" -#include "render_context.h" -#include "rob.h" +#include "light_param.hpp" +#include "render_context.hpp" +#include "rob.hpp" namespace stage_detail { static void TaskStageModern_CtrlInner(stage_detail::TaskStageModern* a1); @@ -408,7 +408,6 @@ static void stage_modern_disp(stage_modern* s) { mat4 mat; mat4_rotate_y(s->rot_y, &mat); - if (s->stage_data->object_ground.not_null() && s->ground) draw_task_add_draw_object_by_object_info(rctx_ptr, &mat, s->stage_data->object_ground, 0, 0, 0, 0, 0, 0); diff --git a/src/CRE/stage_modern.h b/src/CRE/stage_modern.hpp similarity index 96% rename from src/CRE/stage_modern.h rename to src/CRE/stage_modern.hpp index 6453ae9b..e9e270b1 100644 --- a/src/CRE/stage_modern.h +++ b/src/CRE/stage_modern.hpp @@ -7,9 +7,9 @@ #include #include "../KKdLib/default.h" -#include "../KKdLib/database/stage.h" -#include "render_context.h" -#include "auth_3d.h" +#include "../KKdLib/database/stage.hpp" +#include "render_context.hpp" +#include "auth_3d.hpp" struct stage_modern { uint32_t hash; diff --git a/src/CRE/static_var.h b/src/CRE/static_var.h index c90d8cb6..f55ae5fd 100644 --- a/src/CRE/static_var.h +++ b/src/CRE/static_var.h @@ -6,8 +6,8 @@ #pragma once #include "../KKdLib/default.h" -#include "../KKdLib/light_param/fog.h" -#include "../KKdLib/light_param/light.h" +#include "../KKdLib/light_param/fog.hpp" +#include "../KKdLib/light_param/light.hpp" #include "../KKdLib/mat.h" #include "../KKdLib/vec.h" #include "../KKdLib/vec.h" diff --git a/src/CRE/task.c b/src/CRE/task.cpp similarity index 99% rename from src/CRE/task.c rename to src/CRE/task.cpp index 40438870..6e225a05 100644 --- a/src/CRE/task.c +++ b/src/CRE/task.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "task.h" +#include "task.hpp" #include "time.h" extern float_t get_delta_frame(); diff --git a/src/CRE/task.h b/src/CRE/task.hpp similarity index 100% rename from src/CRE/task.h rename to src/CRE/task.hpp diff --git a/src/CRE/texture.c b/src/CRE/texture.cpp similarity index 99% rename from src/CRE/texture.c rename to src/CRE/texture.cpp index ed868d85..7fdf47b5 100644 --- a/src/CRE/texture.c +++ b/src/CRE/texture.cpp @@ -3,9 +3,9 @@ GitHub/GitLab: korenkonder */ -#include "texture.h" +#include "texture.hpp" #include "../KKdLib/mat.h" -#include "../KKdLib/txp.h" +#include "../KKdLib/txp.hpp" #include "gl_state.h" #include "static_var.h" diff --git a/src/CRE/texture.h b/src/CRE/texture.hpp similarity index 98% rename from src/CRE/texture.h rename to src/CRE/texture.hpp index 6f82e011..d3c7c2d3 100644 --- a/src/CRE/texture.h +++ b/src/CRE/texture.hpp @@ -8,7 +8,7 @@ #include #include "../KKdLib/default.h" #include "../KKdLib/image.h" -#include "../KKdLib/txp.h" +#include "../KKdLib/txp.hpp" #include enum texture_flags { diff --git a/src/DivaGL/bone_data.c b/src/DivaGL/bone_data.c index 3b4adf09..6ae0ec6e 100644 --- a/src/DivaGL/bone_data.c +++ b/src/DivaGL/bone_data.c @@ -4318,11 +4318,11 @@ static void sub_14047C800(rob_osage* rob_osg, mat4* mat, mat4_transpose(&v130, &v130); float_t v104; - vec3_distance(v99->trans, v100->trans, v104); + vec3_distance_squared(v99->trans, v100->trans, v104); float_t v105 = v25 * v99->length; bool v106; - if (v104 >= fabs(v105)) { + if (v104 >= v105 * v105) { v105 = sqrtf(v104); v106 = false; } diff --git a/src/KKdLib/a3da.c b/src/KKdLib/a3da.cpp similarity index 94% rename from src/KKdLib/a3da.c rename to src/KKdLib/a3da.cpp index 3009b23e..8bf7eb2a 100644 --- a/src/KKdLib/a3da.c +++ b/src/KKdLib/a3da.cpp @@ -3,13 +3,13 @@ GitHub/GitLab: korenkonder */ -#include "a3da.h" -#include "f2/struct.h" +#include "a3da.hpp" +#include "f2/struct.hpp" #include "io/path.h" #include "io/stream.h" #include "half_t.h" -#include "hash.h" -#include "key_val.h" +#include "hash.hpp" +#include "key_val.hpp" #include "str_utils.h" #include @@ -47,10 +47,10 @@ struct a3dc_key_header { static void a3da_read_inner(a3da* a, stream* s); static void a3da_write_inner(a3da* a, stream* s); -static void a3da_read_text(a3da* a, void* data, size_t length); -static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc); -static void a3da_read_data(a3da* a, void* data, size_t length); -static void a3da_write_data(a3da* a, void** data, size_t* length); +static void a3da_read_text(a3da* a, void* data, size_t size); +static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc); +static void a3da_read_data(a3da* a, void* data, size_t size); +static void a3da_write_data(a3da* a, void** data, size_t* size); static void a3da_get_time_stamp(char* buf, size_t buf_size); static bool key_val_read_a3da_key(key_val* kv, char* buf, size_t offset, const char* str_add, size_t str_add_len, a3da_key* value); @@ -72,11 +72,11 @@ static bool key_val_read_a3da_vec3(key_val* kv, char* buf, size_t offset, const char* str_add, size_t str_add_len, a3da_vec3* value); static void key_val_write_a3da_vec3(stream* s, char* buf, size_t offset, const char* str_add, size_t str_add_len, a3da_vec3& value); -static void a3dc_read_a3da_key(void* data, size_t length, a3da_key* value); +static void a3dc_read_a3da_key(void* data, size_t size, a3da_key* value); static void a3dc_write_a3da_key(stream* s, a3da_key& value); -static void a3dc_read_a3da_key_f16(void* data, size_t length, a3da_key* value, a3da_compress_f16 f16); +static void a3dc_read_a3da_key_f16(void* data, size_t size, a3da_key* value, a3da_compress_f16 f16); static void a3dc_write_a3da_key_f16(stream* s, a3da_key& value, a3da_compress_f16 f16); -static void a3dc_read_a3da_model_transform(void* data, size_t length, +static void a3dc_read_a3da_model_transform(void* data, size_t size, a3da_model_transform* value, a3da_compress_f16 f16); static void a3dc_write_a3da_model_transform(stream* s, a3da_model_transform& value, a3da_compress_f16 f16); @@ -84,11 +84,11 @@ static void a3dc_write_a3da_model_transform_offset(stream* s, a3da_model_transform& value); static void a3dc_write_a3da_model_transform_offset_data(stream* s, a3da_model_transform& value); -static void a3dc_read_a3da_rgba(void* data, size_t length, a3da_rgba* value); +static void a3dc_read_a3da_rgba(void* data, size_t size, a3da_rgba* value); static void a3dc_write_a3da_rgba(stream* s, a3da_rgba& value); -static void a3dc_read_a3da_vec3(void* data, size_t length, a3da_vec3* value); +static void a3dc_read_a3da_vec3(void* data, size_t size, a3da_vec3* value); static void a3dc_write_a3da_vec3(stream* s, a3da_vec3& value); -static void a3dc_read_a3da_vec3_f16(void* data, size_t length, a3da_vec3* value, a3da_compress_f16 f16); +static void a3dc_read_a3da_vec3_f16(void* data, size_t size, a3da_vec3* value, a3da_compress_f16 f16); static void a3dc_write_a3da_vec3_f16(stream* s, a3da_vec3& value, a3da_compress_f16 f16); a3da::a3da() : ready(), compressed(), format(), _compress_f16(), _file_name(), _property_version(), @@ -132,18 +132,18 @@ void a3da::read(const wchar_t* path) { free(path_a3da); } -void a3da::read(const void* data, size_t length) { - if (!data || !length) +void a3da::read(const void* data, size_t size) { + if (!data || !size) return; stream s; - io_open(&s, data, length); + io_open(&s, data, size); a3da_read_inner(this, &s); io_free(&s); } void a3da::write(const char* path) { - if (!path || !this->ready) + if (!path || !ready) return; char* path_a3da = str_utils_add(path, ".a3da"); @@ -156,7 +156,7 @@ void a3da::write(const char* path) { } void a3da::write(const wchar_t* path) { - if (!path || !this->ready) + if (!path || !ready) return; wchar_t* path_a3da = str_utils_add(path, L".a3da"); @@ -168,14 +168,14 @@ void a3da::write(const wchar_t* path) { free(path_a3da); } -void a3da::write(void** data, size_t* length) { - if (!data || !this->ready) +void a3da::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; io_open(&s); a3da_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -186,14 +186,11 @@ bool a3da::load_file(void* data, const char* path, const char* file, uint32_t ha if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); a3da* a = (a3da*)data; - a->read(string_data(&s)); + a->read(s.c_str()); - string_free(&s); return a->ready; } @@ -282,7 +279,6 @@ a3da_dof::a3da_dof() : has_dof() { } - a3da_dof::~a3da_dof() { } @@ -451,7 +447,7 @@ static void a3da_read_inner(a3da* a, stream* s) { header.string_offset = io_read_uint32_t_reverse_endianness(&_s, true); header.string_length = io_read_uint32_t_reverse_endianness(&_s, true); - io_set_position(&_s, (ssize_t)sub_headers_offset + sub_headers_stride, SEEK_SET); + io_set_position(&_s, (int64_t)sub_headers_offset + sub_headers_stride, SEEK_SET); if (io_read_int32_t(&_s) != 0x4C42) goto End; header.binary_offset = io_read_uint32_t_reverse_endianness(&_s, true); @@ -551,7 +547,7 @@ static void a3da_write_inner(a3da* a, stream* s) { } } -static void a3da_read_text(a3da* a, void* data, size_t length) { +static void a3da_read_text(a3da* a, void* data, size_t size) { char buf[A3DA_TEXT_BUF_SIZE]; int32_t count; int32_t count1; @@ -562,7 +558,7 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { size_t off; key_val kv; - kv.parse((uint8_t*)data, length); + kv.parse((uint8_t*)data, size); key_val lkv; if (kv.get_local_key_val("_", &lkv)) { len = 1; @@ -1317,7 +1313,7 @@ static void a3da_read_text(a3da* a, void* data, size_t length) { } } -static void a3da_write_text(a3da* a, void** data, size_t* length, bool a3dc) { +static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) { char buf[A3DA_TEXT_BUF_SIZE]; int32_t count; int32_t count1; @@ -2187,176 +2183,176 @@ 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); } - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } -static void a3da_read_data(a3da* a, void* data, size_t length) { +static void a3da_read_data(a3da* a, void* data, size_t size) { a3da_compress_f16& _compress_f16 = a->_compress_f16; for (a3da_ambient& i : a->ambient) { if (i.flags & A3DA_AMBIENT_LIGHT_DIFFUSE) - a3dc_read_a3da_rgba(data, length, &i.light_diffuse); + a3dc_read_a3da_rgba(data, size, &i.light_diffuse); if (i.flags & A3DA_AMBIENT_RIM_LIGHT_DIFFUSE) - a3dc_read_a3da_rgba(data, length, &i.rim_light_diffuse); + a3dc_read_a3da_rgba(data, size, &i.rim_light_diffuse); } if (a->camera_auxiliary.flags) { a3da_camera_auxiliary* ca = &a->camera_auxiliary; if (ca->flags & A3DA_CAMERA_AUXILIARY_AUTO_EXPOSURE) - a3dc_read_a3da_key(data, length, &ca->auto_exposure); + a3dc_read_a3da_key(data, size, &ca->auto_exposure); if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE) - a3dc_read_a3da_key(data, length, &ca->exposure); + a3dc_read_a3da_key(data, size, &ca->exposure); if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE) - a3dc_read_a3da_key(data, length, &ca->exposure_rate); + a3dc_read_a3da_key(data, size, &ca->exposure_rate); if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA) - a3dc_read_a3da_key(data, length, &ca->gamma); + a3dc_read_a3da_key(data, size, &ca->gamma); if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA_RATE) - a3dc_read_a3da_key(data, length, &ca->gamma_rate); + a3dc_read_a3da_key(data, size, &ca->gamma_rate); if (ca->flags & A3DA_CAMERA_AUXILIARY_SATURATE) - a3dc_read_a3da_key(data, length, &ca->saturate); + a3dc_read_a3da_key(data, size, &ca->saturate); } for (a3da_camera_root& i : a->camera_root) { - a3dc_read_a3da_model_transform(data, length, &i.interest, _compress_f16); - a3dc_read_a3da_model_transform(data, length, &i.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.interest, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.model_transform, _compress_f16); a3da_camera_root_view_point* vp = &i.view_point; if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_FOV) - a3dc_read_a3da_key(data, length, &vp->fov); + a3dc_read_a3da_key(data, size, &vp->fov); else - a3dc_read_a3da_key(data, length, &vp->focal_length); - a3dc_read_a3da_model_transform(data, length, &vp->model_transform, _compress_f16); + a3dc_read_a3da_key(data, size, &vp->focal_length); + a3dc_read_a3da_model_transform(data, size, &vp->model_transform, _compress_f16); if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_ROLL) - a3dc_read_a3da_key(data, length, &vp->roll); + a3dc_read_a3da_key(data, size, &vp->roll); } for (a3da_chara& i : a->chara) - a3dc_read_a3da_model_transform(data, length, &i.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.model_transform, _compress_f16); for (a3da_curve& i : a->curve) - a3dc_read_a3da_key(data, length, &i.curve); + a3dc_read_a3da_key(data, size, &i.curve); if (a->dof.has_dof) { a3da_dof* d = &a->dof; - a3dc_read_a3da_model_transform(data, length, &d->model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &d->model_transform, _compress_f16); } for (a3da_fog& i : a->fog) { if (i.flags & A3DA_FOG_COLOR) - a3dc_read_a3da_rgba(data, length, &i.color); + a3dc_read_a3da_rgba(data, size, &i.color); if (i.flags & A3DA_FOG_DENSITY) - a3dc_read_a3da_key(data, length, &i.density); + a3dc_read_a3da_key(data, size, &i.density); if (i.flags & A3DA_FOG_END) - a3dc_read_a3da_key(data, length, &i.end); + a3dc_read_a3da_key(data, size, &i.end); if (i.flags & A3DA_FOG_START) - a3dc_read_a3da_key(data, length, &i.start); + a3dc_read_a3da_key(data, size, &i.start); } for (a3da_light& i : a->light) { if (i.flags & A3DA_LIGHT_AMBIENT) - a3dc_read_a3da_rgba(data, length, &i.ambient); + a3dc_read_a3da_rgba(data, size, &i.ambient); if (i.flags & A3DA_LIGHT_CONE_ANGLE) - a3dc_read_a3da_key(data, length, &i.cone_angle); + a3dc_read_a3da_key(data, size, &i.cone_angle); if (i.flags & A3DA_LIGHT_CONSTANT) - a3dc_read_a3da_key(data, length, &i.constant); + a3dc_read_a3da_key(data, size, &i.constant); if (i.flags & A3DA_LIGHT_DIFFUSE) - a3dc_read_a3da_rgba(data, length, &i.diffuse); + a3dc_read_a3da_rgba(data, size, &i.diffuse); if (i.flags & A3DA_LIGHT_DROP_OFF) - a3dc_read_a3da_key(data, length, &i.drop_off); + a3dc_read_a3da_key(data, size, &i.drop_off); if (i.flags & A3DA_LIGHT_FAR) - a3dc_read_a3da_key(data, length, &i._far); + a3dc_read_a3da_key(data, size, &i._far); if (i.flags & A3DA_LIGHT_INTENSITY) - a3dc_read_a3da_key(data, length, &i.intensity); + a3dc_read_a3da_key(data, size, &i.intensity); if (i.flags & A3DA_LIGHT_LINEAR) - a3dc_read_a3da_key(data, length, &i.linear); + a3dc_read_a3da_key(data, size, &i.linear); if (i.flags & A3DA_LIGHT_POSITION) - a3dc_read_a3da_model_transform(data, length, &i.position, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.position, _compress_f16); if (i.flags & A3DA_LIGHT_QUADRATIC) - a3dc_read_a3da_key(data, length, &i.quadratic); + a3dc_read_a3da_key(data, size, &i.quadratic); if (i.flags & A3DA_LIGHT_SPECULAR) - a3dc_read_a3da_rgba(data, length, &i.specular); + a3dc_read_a3da_rgba(data, size, &i.specular); if (i.flags & A3DA_LIGHT_SPOT_DIRECTION) - a3dc_read_a3da_model_transform(data, length, &i.spot_direction, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.spot_direction, _compress_f16); if (i.flags & A3DA_LIGHT_TONE_CURVE) - a3dc_read_a3da_rgba(data, length, &i.tone_curve); + a3dc_read_a3da_rgba(data, size, &i.tone_curve); } for (a3da_m_object_hrc& i : a->m_object_hrc) { for (a3da_object_instance& j : i.instance) - a3dc_read_a3da_model_transform(data, length, &j.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &j.model_transform, _compress_f16); - a3dc_read_a3da_model_transform(data, length, &i.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.model_transform, _compress_f16); for (a3da_object_node& j : i.node) - a3dc_read_a3da_model_transform(data, length, &j.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &j.model_transform, _compress_f16); } for (a3da_material_list& i : a->material_list) { if (i.flags & A3DA_MATERIAL_LIST_BLEND_COLOR) - a3dc_read_a3da_rgba(data, length, &i.blend_color); + a3dc_read_a3da_rgba(data, size, &i.blend_color); if (i.flags & A3DA_MATERIAL_LIST_GLOW_INTENSITY) - a3dc_read_a3da_key(data, length, &i.glow_intensity); + a3dc_read_a3da_key(data, size, &i.glow_intensity); if (i.flags & A3DA_MATERIAL_LIST_INCANDESCENCE) - a3dc_read_a3da_rgba(data, length, &i.incandescence); + a3dc_read_a3da_rgba(data, size, &i.incandescence); } for (a3da_object& i : a->object) { - a3dc_read_a3da_model_transform(data, length, &i.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.model_transform, _compress_f16); for (a3da_object_texture_transform& j : i.texture_transform) { if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_U) - a3dc_read_a3da_key(data, length, &j.coverage_u); + a3dc_read_a3da_key(data, size, &j.coverage_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_V) - a3dc_read_a3da_key(data, length, &j.coverage_v); + a3dc_read_a3da_key(data, size, &j.coverage_v); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_U) - a3dc_read_a3da_key(data, length, &j.offset_u); + a3dc_read_a3da_key(data, size, &j.offset_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_V) - a3dc_read_a3da_key(data, length, &j.offset_v); + a3dc_read_a3da_key(data, size, &j.offset_v); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_U) - a3dc_read_a3da_key(data, length, &j.repeat_u); + a3dc_read_a3da_key(data, size, &j.repeat_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_V) - a3dc_read_a3da_key(data, length, &j.repeat_v); + a3dc_read_a3da_key(data, size, &j.repeat_v); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE) - a3dc_read_a3da_key(data, length, &j.rotate); + a3dc_read_a3da_key(data, size, &j.rotate); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE_FRAME) - a3dc_read_a3da_key(data, length, &j.rotate_frame); + a3dc_read_a3da_key(data, size, &j.rotate_frame); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_U) - a3dc_read_a3da_key(data, length, &j.translate_frame_u); + a3dc_read_a3da_key(data, size, &j.translate_frame_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_V) - a3dc_read_a3da_key(data, length, &j.translate_frame_v); + a3dc_read_a3da_key(data, size, &j.translate_frame_v); } } for (a3da_object_hrc& i : a->object_hrc) for (a3da_object_node& j : i.node) - a3dc_read_a3da_model_transform(data, length, &j.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &j.model_transform, _compress_f16); for (a3da_point& i : a->point) - a3dc_read_a3da_model_transform(data, length, &i.model_transform, _compress_f16); + a3dc_read_a3da_model_transform(data, size, &i.model_transform, _compress_f16); if (a->post_process.flags) { a3da_post_process* pp = &a->post_process; if (pp->flags & A3DA_POST_PROCESS_INTENSITY) - a3dc_read_a3da_rgba(data, length, &pp->intensity); + a3dc_read_a3da_rgba(data, size, &pp->intensity); if (pp->flags & A3DA_POST_PROCESS_LENS_FLARE) - a3dc_read_a3da_key(data, length, &pp->lens_flare); + a3dc_read_a3da_key(data, size, &pp->lens_flare); if (pp->flags & A3DA_POST_PROCESS_LENS_GHOST) - a3dc_read_a3da_key(data, length, &pp->lens_ghost); + a3dc_read_a3da_key(data, size, &pp->lens_ghost); if (pp->flags & A3DA_POST_PROCESS_LENS_SHAFT) - a3dc_read_a3da_key(data, length, &pp->lens_shaft); + a3dc_read_a3da_key(data, size, &pp->lens_shaft); if (pp->flags & A3DA_POST_PROCESS_RADIUS) - a3dc_read_a3da_rgba(data, length, &pp->radius); + a3dc_read_a3da_rgba(data, size, &pp->radius); if (pp->flags & A3DA_POST_PROCESS_SCENE_FADE) - a3dc_read_a3da_rgba(data, length, &pp->scene_fade); + a3dc_read_a3da_rgba(data, size, &pp->scene_fade); } } -static void a3da_write_data(a3da* a, void** data, size_t* length) { +static void a3da_write_data(a3da* a, void** data, size_t* size) { a3da_compress_f16& _compress_f16 = a->_compress_f16; stream s; @@ -2611,7 +2607,7 @@ static void a3da_write_data(a3da* a, void** data, size_t* length) { a3dc_write_a3da_model_transform_offset_data(&s, i.model_transform); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -3125,15 +3121,15 @@ static void key_val_write_a3da_vec3(stream* s, char* buf, key_val_write_a3da_key(s, buf, offset, ".z", 3, value.z); } -inline static void a3dc_read_a3da_key(void* data, size_t length, a3da_key* value) { - a3dc_read_a3da_key_f16(data, length, value, A3DA_COMPRESS_F32F32F32F32); +inline static void a3dc_read_a3da_key(void* data, size_t size, a3da_key* value) { + a3dc_read_a3da_key_f16(data, size, value, A3DA_COMPRESS_F32F32F32F32); } inline static void a3dc_write_a3da_key(stream* s, a3da_key& value) { a3dc_write_a3da_key_f16(s, value, A3DA_COMPRESS_F32F32F32F32); } -static void a3dc_read_a3da_key_f16(void* data, size_t length, a3da_key* value, a3da_compress_f16 f16) { +static void a3dc_read_a3da_key_f16(void* data, size_t size, a3da_key* value, a3da_compress_f16 f16) { if (value->raw_data) { if (!value->raw_data_binary) return; @@ -3142,7 +3138,7 @@ static void a3dc_read_a3da_key_f16(void* data, size_t length, a3da_key* value, a value->raw_data_value_list_offset = 0; int32_t len = value->raw_data_value_list_size / 4; - value->keys.reserve(length); + value->keys.reserve(size); for (int32_t i = 0; i < len; i++) { kft3 k; k.frame = *(float_t*)_d; @@ -3308,7 +3304,7 @@ static void a3dc_write_a3da_key_f16(stream* s, a3da_key& value, a3da_compress_f1 } } -static void a3dc_read_a3da_model_transform(void* data, size_t length, +static void a3dc_read_a3da_model_transform(void* data, size_t size, a3da_model_transform* value, a3da_compress_f16 f16) { if (~value->flags & A3DA_MODEL_TRANSFORM_BIN_OFFSET) return; @@ -3338,10 +3334,10 @@ static void a3dc_read_a3da_model_transform(void* data, size_t length, value->visibility.bin_offset = head->visibility; enum_or(value->visibility.flags, A3DA_KEY_BIN_OFFSET); - a3dc_read_a3da_vec3(data, length, &value->scale); - a3dc_read_a3da_vec3_f16(data, length, &value->rotation, f16); - a3dc_read_a3da_vec3(data, length, &value->translation); - a3dc_read_a3da_key(data, length, &value->visibility); + a3dc_read_a3da_vec3(data, size, &value->scale); + a3dc_read_a3da_vec3_f16(data, size, &value->rotation, f16); + a3dc_read_a3da_vec3(data, size, &value->translation); + a3dc_read_a3da_key(data, size, &value->visibility); if (value->visibility.type == A3DA_KEY_NONE) { value->visibility.type = A3DA_KEY_STATIC; @@ -3400,18 +3396,18 @@ static void a3dc_write_a3da_model_transform_offset_data(stream* s, io_position_pop(s); } -static void a3dc_read_a3da_rgba(void* data, size_t length, a3da_rgba* value) { +static void a3dc_read_a3da_rgba(void* data, size_t size, a3da_rgba* value) { if (!value->flags) return; if (value->flags & A3DA_RGBA_R) - a3dc_read_a3da_key(data, length, &value->r); + a3dc_read_a3da_key(data, size, &value->r); if (value->flags & A3DA_RGBA_G) - a3dc_read_a3da_key(data, length, &value->g); + a3dc_read_a3da_key(data, size, &value->g); if (value->flags & A3DA_RGBA_B) - a3dc_read_a3da_key(data, length, &value->b); + a3dc_read_a3da_key(data, size, &value->b); if (value->flags & A3DA_RGBA_A) - a3dc_read_a3da_key(data, length, &value->a); + a3dc_read_a3da_key(data, size, &value->a); } static void a3dc_write_a3da_rgba(stream* s, a3da_rgba& value) { @@ -3428,10 +3424,10 @@ static void a3dc_write_a3da_rgba(stream* s, a3da_rgba& value) { a3dc_write_a3da_key(s, value.a); } -static void a3dc_read_a3da_vec3(void* data, size_t length, a3da_vec3* value) { - a3dc_read_a3da_key(data, length, &value->x); - a3dc_read_a3da_key(data, length, &value->y); - a3dc_read_a3da_key(data, length, &value->z); +static void a3dc_read_a3da_vec3(void* data, size_t size, a3da_vec3* value) { + a3dc_read_a3da_key(data, size, &value->x); + a3dc_read_a3da_key(data, size, &value->y); + a3dc_read_a3da_key(data, size, &value->z); } static void a3dc_write_a3da_vec3(stream* s, a3da_vec3& value) { @@ -3440,10 +3436,10 @@ static void a3dc_write_a3da_vec3(stream* s, a3da_vec3& value) { a3dc_write_a3da_key(s, value.z); } -static void a3dc_read_a3da_vec3_f16(void* data, size_t length, a3da_vec3* value, a3da_compress_f16 f16) { - a3dc_read_a3da_key_f16(data, length, &value->x, f16); - a3dc_read_a3da_key_f16(data, length, &value->y, f16); - a3dc_read_a3da_key_f16(data, length, &value->z, f16); +static void a3dc_read_a3da_vec3_f16(void* data, size_t size, a3da_vec3* value, a3da_compress_f16 f16) { + a3dc_read_a3da_key_f16(data, size, &value->x, f16); + a3dc_read_a3da_key_f16(data, size, &value->y, f16); + a3dc_read_a3da_key_f16(data, size, &value->z, f16); } static void a3dc_write_a3da_vec3_f16(stream* s, a3da_vec3& value, a3da_compress_f16 f16) { diff --git a/src/KKdLib/a3da.h b/src/KKdLib/a3da.hpp similarity index 98% rename from src/KKdLib/a3da.h rename to src/KKdLib/a3da.hpp index 664b7d81..1c15f99b 100644 --- a/src/KKdLib/a3da.h +++ b/src/KKdLib/a3da.hpp @@ -8,8 +8,8 @@ #include #include #include "default.h" -#include "light_param/fog.h" -#include "light_param/light.h" +#include "light_param/fog.hpp" +#include "light_param/light.hpp" #include "kf.h" #include "mat.h" #include "vec.h" @@ -512,10 +512,10 @@ struct a3da { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/database/auth_3d.c b/src/KKdLib/database/auth_3d.cpp similarity index 93% rename from src/KKdLib/database/auth_3d.c rename to src/KKdLib/database/auth_3d.cpp index 315d947b..ec6cea87 100644 --- a/src/KKdLib/database/auth_3d.c +++ b/src/KKdLib/database/auth_3d.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "auth_3d.h" +#include "auth_3d.hpp" #include "../io/path.h" #include "../io/stream.h" -#include "../key_val.h" -#include "../sort.h" +#include "../key_val.hpp" +#include "../sort.hpp" #include "../str_utils.h" #define AUTH_3D_DATABASE_TEXT_BUF_SIZE 0x400 @@ -19,8 +19,8 @@ static void auth_3d_database_load_uids(auth_3d_database* auth_3d_db, static void auth_3d_database_file_read_inner(auth_3d_database_file* auth_3d_db_file, stream* s); static void auth_3d_database_file_write_inner(auth_3d_database_file* auth_3d_db_file, stream* s); -static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_file, void* data, size_t length); -static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* length); +static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_file, void* data, size_t size); +static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* size); auth_3d_database_file::auth_3d_database_file() : ready(), uid_max(-1) { @@ -60,12 +60,12 @@ void auth_3d_database_file::read(const wchar_t* path) { free(path_bin); } -void auth_3d_database_file::read(const void* data, size_t length) { - if (!data || !length) +void auth_3d_database_file::read(const void* data, size_t size) { + if (!data || !size) return; stream s; - io_open(&s, data, length); + io_open(&s, data, size); auth_3d_database_file_read_inner(this, &s); io_free(&s); } @@ -96,14 +96,14 @@ void auth_3d_database_file::write(const wchar_t* path) { free(path_bin); } -void auth_3d_database_file::write(void** data, size_t* length) { - if (!data || !length || !ready) +void auth_3d_database_file::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; io_open(&s); auth_3d_database_file_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -114,14 +114,11 @@ bool auth_3d_database_file::load_file(void* data, const char* path, const char* if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); auth_3d_database_file* auth_3d_db = (auth_3d_database_file*)data; - auth_3d_db->read(string_data(&s)); + auth_3d_db->read(s.c_str()); - string_free(&s); return auth_3d_db->ready; } @@ -245,7 +242,7 @@ static void auth_3d_database_load_uids(auth_3d_database* auth_3d_db, if (uid_file->value.c_str()[0] == 'A') uid->enabled = true; - uid->name = std::string(uid_file->value.c_str() + 2, uid_file->value.size() - 2); + uid->name = uid_file->value.substr(2, uid_file->value.size() - 2); uid->category = uid_file->category; } @@ -306,7 +303,7 @@ static void auth_3d_database_file_write_inner(auth_3d_database_file* auth_3d_db_ free(a3da_data); } -static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_file, void* data, size_t length) { +static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_file, void* data, size_t size) { char buf[AUTH_3D_DATABASE_TEXT_BUF_SIZE]; int32_t count; size_t len; @@ -314,7 +311,7 @@ static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_fi size_t off; key_val kv; - kv.parse((uint8_t*)data, length); + kv.parse(data, size); key_val lkv; len = 8; @@ -369,7 +366,7 @@ static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_fi } } -static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* length) { +static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* size) { char buf[AUTH_3D_DATABASE_TEXT_BUF_SIZE]; int32_t count; size_t len; @@ -439,6 +436,6 @@ static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_f key_val::write_int32_t(&s, buf, off, ".max", 5, uid_max); } - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } diff --git a/src/KKdLib/database/auth_3d.h b/src/KKdLib/database/auth_3d.hpp similarity index 94% rename from src/KKdLib/database/auth_3d.h rename to src/KKdLib/database/auth_3d.hpp index 3224ae8b..6d34e058 100644 --- a/src/KKdLib/database/auth_3d.h +++ b/src/KKdLib/database/auth_3d.hpp @@ -56,10 +56,10 @@ struct auth_3d_database_file { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/database/bone.c b/src/KKdLib/database/bone.cpp similarity index 93% rename from src/KKdLib/database/bone.c rename to src/KKdLib/database/bone.cpp index da0034a5..7ec08bd7 100644 --- a/src/KKdLib/database/bone.c +++ b/src/KKdLib/database/bone.cpp @@ -3,28 +3,29 @@ GitHub/GitLab: korenkonder */ -#include "bone.h" -#include "../f2/struct.h" +#include "bone.hpp" +#include "../f2/struct.hpp" #include "../io/path.h" #include "../io/stream.h" +#include "../hash.hpp" #include "../str_utils.h" struct bone_database_skeleton_header { - ssize_t offset; - ssize_t bones_offset; - ssize_t positions_offset; - ssize_t unknown_value_offset; - ssize_t object_bone_names_offset; - ssize_t motion_bone_names_offset; - ssize_t parent_indices_offset; + int64_t offset; + int64_t bones_offset; + int64_t positions_offset; + int64_t unknown_value_offset; + int64_t object_bone_names_offset; + int64_t motion_bone_names_offset; + int64_t parent_indices_offset; }; static void bone_database_classic_read_inner(bone_database* bone_data, stream* s); static void bone_database_classic_write_inner(bone_database* bone_data, stream* s); static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, uint32_t header_length); static void bone_database_modern_write_inner(bone_database* bone_data, stream* s); -static ssize_t bone_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, const char* str); +static int64_t bone_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, const char* str); static bool bone_database_strings_push_back_check(std::vector& vec, const char* str); bone_database::bone_database() : ready(), modern(), is_x() { @@ -113,19 +114,19 @@ void bone_database::read(const wchar_t* path, bool modern) { } } -void bone_database::read(const void* data, size_t length, bool modern) { - if (!data || !length) +void bone_database::read(const void* data, size_t size, bool modern) { + if (!data || !size) return; if (!modern) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); bone_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - st.read(data, length); + st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; io_open(&s_bone, &st.data); @@ -184,7 +185,7 @@ void bone_database::write(const wchar_t* path) { } } -void bone_database::write(void** data, size_t* length) { +void bone_database::write(void** data, size_t* size) { if (!data || !ready) return; @@ -195,7 +196,7 @@ void bone_database::write(void** data, size_t* length) { else bone_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -207,8 +208,9 @@ bool bone_database::get_skeleton(const char* name, bone_database_skeleton** skel if ( !name) return false; + uint32_t name_hash = hash_utf8_murmurhash(name); for (bone_database_skeleton& i : this->skeleton) - if (!str_utils_compare(i.name.c_str(), name)) { + if (hash_string_murmurhash(&i.name) == name_hash) { *skeleton = &i; return true; } @@ -219,10 +221,12 @@ int32_t bone_database::get_skeleton_bone_index(const char* name, const char* bon if (!name || !bone_name) return -1; + uint32_t name_hash = hash_utf8_murmurhash(name); + uint32_t bone_name_hash = hash_utf8_murmurhash(bone_name); for (bone_database_skeleton& i : skeleton) - if (!str_utils_compare(i.name.c_str(), name)) { + if (hash_string_murmurhash(&i.name) == name_hash) { for (bone_database_bone& j : i.bone) - if (!str_utils_compare(j.name.c_str(), bone_name)) + if (hash_string_murmurhash(&j.name) == bone_name_hash) return (int32_t)(&j - i.bone.data()); return -1; } @@ -237,8 +241,9 @@ bool bone_database::get_skeleton_bones(const char* name, std::vector** if (!name) return false; + uint32_t name_hash = hash_utf8_murmurhash(name); for (bone_database_skeleton& i : skeleton) - if (!str_utils_compare(i.name.c_str(), name)) { + if (hash_string_murmurhash(&i.name) == name_hash) { *positions = &i.position; return true; } @@ -265,10 +271,12 @@ int32_t bone_database::get_skeleton_object_bone_index(const char* name, const ch if (!name || !bone_name) return -1; + uint32_t name_hash = hash_utf8_murmurhash(name); + uint32_t bone_name_hash = hash_utf8_murmurhash(bone_name); for (bone_database_skeleton& i : skeleton) - if (!str_utils_compare(i.name.c_str(), name)) { + if (hash_string_murmurhash(&i.name) == name_hash) { for (std::string& j : i.object_bone) - if (!str_utils_compare(j.c_str(), bone_name)) + if (hash_string_murmurhash(&j) == bone_name_hash) return (int32_t)(&j - i.object_bone.data()); return -1; } @@ -283,8 +291,9 @@ bool bone_database::get_skeleton_object_bones(const char* name, std::vectorread(string_data(&s), bone_data->modern); + bone_data->read(s.c_str(), bone_data->modern); - string_free(&s); return bone_data->ready; } @@ -586,23 +597,23 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* io_write_int32_t(s, 0); uint32_t skeleton_count = (uint32_t)bone_data->skeleton.size(); - ssize_t skeleton_offsets_offset = io_get_position(s); + int64_t skeleton_offsets_offset = io_get_position(s); io_write(s, skeleton_count * 0x04ULL); - ssize_t skeleton_name_offset = io_get_position(s); + int64_t skeleton_name_offset = io_get_position(s); for (bone_database_skeleton& i : bone_data->skeleton) io_write_string_null_terminated(s, &i.name); - ssize_t skeleton_name_offsets_offset = io_get_position(s); + int64_t skeleton_name_offsets_offset = io_get_position(s); for (bone_database_skeleton& i : bone_data->skeleton) { io_write_uint32_t(s, (uint32_t)skeleton_name_offset); skeleton_name_offset += i.name.size() + 1; } std::vector strings; - std::vector string_offsets; + std::vector string_offsets; - ssize_t* skeleton_offsets = force_malloc_s(ssize_t, skeleton_count); + int64_t* skeleton_offsets = force_malloc_s(int64_t, skeleton_count); for (uint32_t i = 0; i < skeleton_count; i++) { bone_database_skeleton* skel = &bone_data->skeleton[i]; @@ -627,7 +638,7 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* } io_align_write(s, 0x04); - ssize_t bones_offset = io_get_position(s); + int64_t bones_offset = io_get_position(s); for (bone_database_bone& j : skel->bone) { io_write_uint8_t(s, (uint8_t)j.type); io_write_uint8_t(s, j.has_parent ? 1 : 0); @@ -645,10 +656,10 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, "End")); - ssize_t positions_offset = io_get_position(s); + int64_t positions_offset = io_get_position(s); io_write(s, skel->position.data(), sizeof(vec3) * position_count); - ssize_t unknown_value_offset = io_get_position(s); + int64_t unknown_value_offset = io_get_position(s); io_write_float_t(s, skel->heel_height); for (std::string& j : skel->object_bone) @@ -658,7 +669,7 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* } io_align_write(s, 0x04); - ssize_t object_bone_names_offset = io_get_position(s); + int64_t object_bone_names_offset = io_get_position(s); for (std::string& j : skel->object_bone) io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, j.c_str())); @@ -670,12 +681,12 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* } io_align_write(s, 0x04); - ssize_t motion_bone_names_offset = io_get_position(s); + int64_t motion_bone_names_offset = io_get_position(s); for (std::string& j : skel->motion_bone) io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, j.c_str())); - ssize_t parent_indices_offset = io_get_position(s); + int64_t parent_indices_offset = io_get_position(s); io_write(s, skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); io_align_write(s, 0x04); @@ -723,26 +734,26 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, io_set_position(s, 0x04, SEEK_SET); uint32_t skeleton_count = io_read_uint32_t_stream_reverse_endianness(s); - ssize_t skeleton_offsets_offset = io_read_offset(s, header_length, is_x); - ssize_t skeleton_name_offsets_offset = io_read_offset(s, header_length, is_x); + int64_t skeleton_offsets_offset = io_read_offset(s, header_length, is_x); + int64_t skeleton_name_offsets_offset = io_read_offset(s, header_length, is_x); bone_data->skeleton.resize(skeleton_count); io_position_push(s, skeleton_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) { bone_database_skeleton* skeleton = &bone_data->skeleton[i]; - ssize_t skeleton_offset = io_read_offset(s, header_length, is_x); + int64_t skeleton_offset = io_read_offset(s, header_length, is_x); io_position_push(s, skeleton_offset, SEEK_SET); - ssize_t bones_offset; + int64_t bones_offset; uint32_t position_count; - ssize_t positions_offset; - ssize_t unknown_value_offset; + int64_t positions_offset; + int64_t unknown_value_offset; uint32_t object_bone_count; - ssize_t object_bone_names_offset; + int64_t object_bone_names_offset; uint32_t motion_bone_count; - ssize_t motion_bone_names_offset; - ssize_t parent_indices_offset; + int64_t motion_bone_names_offset; + int64_t parent_indices_offset; if (!is_x) { bones_offset = io_read_offset_f2(s, header_length); position_count = io_read_uint32_t_stream_reverse_endianness(s); @@ -1086,7 +1097,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_write_offset_pof_add(&s_bone, 0, 0x40, is_x, &pof); io_align_write(&s_bone, 0x10); - ssize_t skeleton_offsets_offset = io_get_position(&s_bone); + int64_t skeleton_offsets_offset = io_get_position(&s_bone); if (!is_x) for (bone_database_skeleton& i : bone_data->skeleton) io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); @@ -1096,7 +1107,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s io_align_write(&s_bone, 0x10); } - ssize_t skeleton_name_offsets_offset = io_get_position(&s_bone); + int64_t skeleton_name_offsets_offset = io_get_position(&s_bone); if (!is_x) for (bone_database_skeleton& i : bone_data->skeleton) io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); @@ -1182,7 +1193,6 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); - skh[i].bones_offset = io_get_position(&s_bone); for (bone_database_bone& j : skel->bone) { io_write(&s_bone, 0x08); @@ -1218,7 +1228,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } std::vector strings; - std::vector string_offsets; + std::vector string_offsets; if (is_x) for (uint32_t i = 0; i < skeleton_count; i++) { @@ -1423,8 +1433,8 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s st.write(s, true, is_x); } -inline static ssize_t bone_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, const char* str) { +inline static int64_t bone_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, const char* str) { size_t len = utf8_length(str); for (std::string& i : vec) if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) diff --git a/src/KKdLib/database/bone.h b/src/KKdLib/database/bone.hpp similarity index 96% rename from src/KKdLib/database/bone.h rename to src/KKdLib/database/bone.hpp index c00c135f..c311bfb2 100644 --- a/src/KKdLib/database/bone.h +++ b/src/KKdLib/database/bone.hpp @@ -73,11 +73,10 @@ struct bone_database { void read(const char* path, bool modern); void read(const wchar_t* path, bool modern); - void read(const void* data, size_t length, bool modern); + void read(const void* data, size_t size, bool modern); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); - + void write(void** data, size_t* size); bool get_skeleton(const char* name, bone_database_skeleton** skeleton); int32_t get_skeleton_bone_index(const char* name, const char* bone_name); diff --git a/src/KKdLib/database/item_table.c b/src/KKdLib/database/item_table.cpp similarity index 95% rename from src/KKdLib/database/item_table.c rename to src/KKdLib/database/item_table.cpp index a728345f..c2a2b665 100644 --- a/src/KKdLib/database/item_table.c +++ b/src/KKdLib/database/item_table.cpp @@ -3,19 +3,19 @@ GitHub/GitLab: korenkonder */ -#include "item_table.h" +#include "item_table.hpp" #include "../io/path.h" #include "../io/stream.h" -#include "../key_val.h" -#include "../sort.h" +#include "../key_val.hpp" +#include "../sort.hpp" #include "../str_utils.h" #define ITEM_TABLE_TEXT_BUF_SIZE 0x400 static void itm_table_read_inner(itm_table* itm_tbl, stream* s); static void itm_table_write_inner(itm_table* itm_tbl, stream* s); -static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t length); -static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* length); +static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size); +static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size); itm_table::itm_table() : ready() { @@ -55,12 +55,12 @@ void itm_table::read(const wchar_t* path) { free(path_bin); } -void itm_table::read(const void* data, size_t length) { - if (!data || !length) +void itm_table::read(const void* data, size_t size) { + if (!data || !size) return; stream s; - io_open(&s, data, length); + io_open(&s, data, size); itm_table_read_inner(this, &s); io_free(&s); } @@ -91,14 +91,14 @@ void itm_table::write(const wchar_t* path) { free(path_bin); } -void itm_table::write(void** data, size_t* length) { - if (!data || !length || !ready) +void itm_table::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; io_open(&s); itm_table_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -109,17 +109,56 @@ bool itm_table::load_file(void* data, const char* path, const char* file, uint32 if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); itm_table* itm_tbl = (itm_table*)data; - itm_tbl->read(string_data(&s)); + itm_tbl->read(s.c_str()); - string_free(&s); return itm_tbl->ready; } +const char* chara_index_get_name(chara_index chara_index) { + if (chara_index < CHARA_MIKU || chara_index > CHARA_TETO) + return 0; + + const char* chara_names[] = { + "MIKU", + "RIN", + "LEN", + "LUKA", + "NERU", + "HAKU", + "KAITO", + "MEIKO", + "SAKINE", + "TETO", + "EXTRA", + }; + + return chara_names[chara_index]; +} + +const char* chara_index_get_auth_3d_name(chara_index chara_index) { + if (chara_index < CHARA_MIKU || chara_index > CHARA_TETO) + return 0; + + const char* chara_names[] = { + "MIK", + "RIN", + "LEN", + "LUK", + "NER", + "HAK", + "KAI", + "MEI", + "SAK", + "TET", + "EXT", + }; + + return chara_names[chara_index]; +} + itm_table_item_data_tex::itm_table_item_data_tex() { } @@ -194,7 +233,7 @@ static void itm_table_write_inner(itm_table* itm_tbl, stream* s) { free(itm_tbl_data); } -static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t length) { +static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size) { char buf[ITEM_TABLE_TEXT_BUF_SIZE]; int32_t count; int32_t count1; @@ -206,7 +245,7 @@ static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t length) { size_t off; key_val kv; - kv.parse((uint8_t*)data, length); + kv.parse((uint8_t*)data, size); key_val lkv; len = 3; @@ -511,7 +550,7 @@ static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t length) { } } -static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* length) { +static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size) { char buf[ITEM_TABLE_TEXT_BUF_SIZE]; int32_t count; int32_t count1; @@ -610,7 +649,6 @@ static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* length key_val::write_int32_t(&s, buf, off, ".length", 8, count); } - if (itm_tbl->item.size() > 0) { len = 4; memcpy(buf, "item", 4); @@ -802,6 +840,6 @@ static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* length key_val::write_int32_t(&s, buf, off, ".length", 8, count); } - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } \ No newline at end of file diff --git a/src/KKdLib/database/item_table.h b/src/KKdLib/database/item_table.hpp similarity index 94% rename from src/KKdLib/database/item_table.h rename to src/KKdLib/database/item_table.hpp index c1bb373f..55bf13c7 100644 --- a/src/KKdLib/database/item_table.h +++ b/src/KKdLib/database/item_table.hpp @@ -185,10 +185,13 @@ struct itm_table { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; + +extern const char* chara_index_get_name(chara_index chara_index); +extern const char* chara_index_get_auth_3d_name(chara_index chara_index); diff --git a/src/KKdLib/database/motion.c b/src/KKdLib/database/motion.cpp similarity index 85% rename from src/KKdLib/database/motion.c rename to src/KKdLib/database/motion.cpp index 2b5a6f20..fd3c1199 100644 --- a/src/KKdLib/database/motion.c +++ b/src/KKdLib/database/motion.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "motion.h" +#include "motion.hpp" #include "../io/path.h" #include "../io/stream.h" -#include "../farc.h" -#include "../hash.h" +#include "../farc.hpp" +#include "../hash.hpp" #include "../str_utils.h" static void motion_database_read_inner(motion_database* mot_db, stream* s); @@ -61,12 +61,12 @@ void motion_database::read(const wchar_t* path) { free(path_farc); } -void motion_database::read(const void* data, size_t length) { - if (!data || !length) +void motion_database::read(const void* data, size_t size) { + if (!data || !size) return; stream s; - io_open(&s, data, length); + io_open(&s, data, size); motion_database_read_inner(this, &s); io_free(&s); } @@ -90,7 +90,7 @@ void motion_database::write(const char* path) { } void motion_database::write(const wchar_t* path) { - if (!path || !this->ready) + if (!path || !ready) return; farc f; @@ -107,14 +107,14 @@ void motion_database::write(const wchar_t* path) { f.write(path, FARC_COMPRESS_FArC, false); } -void motion_database::write(void** data, size_t* length) { - if (!data || !ready) +void motion_database::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; io_open(&s); motion_database_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -211,6 +211,54 @@ motion_set_info* motion_database::get_motion_set_by_name(const char* name) { return 0; } +motion_set_info* motion_database::get_motion_set_by_motion_id(uint32_t id) { + if (id == -1) + return 0; + + for (motion_set_info& i : motion_set) + for (motion_info& j : i.motion) + if (id == j.id) + return &i; + return 0; +} + +motion_set_info* motion_database::get_motion_set_by_motion_name(const char* name) { + if (!name) + return 0; + + uint32_t name_hash = hash_utf8_murmurhash(name); + + for (motion_set_info& i : motion_set) + for (motion_info& j : i.motion) + if (name_hash == j.name_hash) + return &i; + return 0; +} + +uint32_t motion_database::get_motion_set_id_by_motion_id(uint32_t id) { + if (id == -1) + return -1; + + for (motion_set_info& i : motion_set) + for (motion_info& j : i.motion) + if (id == j.id) + return i.id; + return -1; +} + +uint32_t motion_database::get_motion_set_id_by_motion_name(const char* name) { + if (!name) + return -1; + + uint32_t name_hash = hash_utf8_murmurhash(name); + + for (motion_set_info& i : motion_set) + for (motion_info& j : i.motion) + if (name_hash == j.name_hash) + return i.id; + return -1; +} + uint32_t motion_database::get_motion_set_id(const char* name) { if (!name) return -1; @@ -288,14 +336,11 @@ bool motion_database::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); motion_database* mot_db = (motion_database*)data; - mot_db->read(string_data(&s)); + mot_db->read(s.c_str()); - string_free(&s); return mot_db->ready; } @@ -383,7 +428,7 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { size_t bone_name_count = mot_db->bone_name.size(); size_t motion_set_count = mot_db->motion_set.size(); - ssize_t motion_sets_offset = io_get_position(s); + int64_t motion_sets_offset = io_get_position(s); io_write(s, 0x10 * motion_set_count + 0x10); io_align_write(s, 0x20); @@ -391,7 +436,7 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { for (motion_set_info& i : mot_db->motion_set) size += i.name.size() + 1; - ssize_t motion_set_name_offset = io_get_position(s); + int64_t motion_set_name_offset = io_get_position(s); io_write(s, size); size = 0; @@ -399,28 +444,28 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { for (motion_info& j : i.motion) size += j.name.size() + 1; - ssize_t motion_name_offset = io_get_position(s); + int64_t motion_name_offset = io_get_position(s); io_write(s, size); io_align_write(s, 0x20); - ssize_t motion_names_offset = io_get_position(s); + int64_t motion_names_offset = io_get_position(s); size = 0; for (motion_set_info& i : mot_db->motion_set) size += 0x04 * i.motion.size(); io_write(s, size); io_align_write(s, 0x20); - ssize_t motion_ids_offset = io_get_position(s); + int64_t motion_ids_offset = io_get_position(s); for (motion_set_info& i : mot_db->motion_set) for (motion_info& j : i.motion) io_write_uint32_t(s, j.id); io_align_write(s, 0x20); - ssize_t motion_set_ids_offset = io_get_position(s); + int64_t motion_set_ids_offset = io_get_position(s); for (motion_set_info& i : mot_db->motion_set) io_write_uint32_t(s, i.id); - ssize_t bone_name_offset = io_get_position(s); + int64_t bone_name_offset = io_get_position(s); size = 0; for (std::string& i : mot_db->bone_name) size += i.size() + 1; @@ -443,7 +488,7 @@ static void motion_database_write_inner(motion_database* mot_db, stream* s) { io_write_string_null_terminated(s, &i); io_position_pop(s); - ssize_t bone_name_offsets_offset = io_get_position(s); + int64_t bone_name_offsets_offset = io_get_position(s); io_write(s, 0x04 * bone_name_count); io_align_write(s, 0x20); diff --git a/src/KKdLib/database/motion.h b/src/KKdLib/database/motion.hpp similarity index 80% rename from src/KKdLib/database/motion.h rename to src/KKdLib/database/motion.hpp index d67f24d6..ca4bd45f 100644 --- a/src/KKdLib/database/motion.h +++ b/src/KKdLib/database/motion.hpp @@ -39,16 +39,20 @@ struct motion_database { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); void merge_mdata(motion_database* base_mot_db, motion_database* mdata_mot_db); void split_mdata(motion_database* base_mot_db, motion_database* mdata_mot_db); motion_set_info* get_motion_set_by_id(uint32_t id); motion_set_info* get_motion_set_by_name(const char* name); + motion_set_info* get_motion_set_by_motion_id(uint32_t id); + motion_set_info* get_motion_set_by_motion_name(const char* name); + uint32_t get_motion_set_id_by_motion_id(uint32_t id); + uint32_t get_motion_set_id_by_motion_name(const char* name); uint32_t get_motion_set_id(const char* name); const char* get_motion_set_name(uint32_t id); motion_info* get_motion_by_id(uint32_t id); diff --git a/src/KKdLib/database/object.c b/src/KKdLib/database/object.cpp similarity index 95% rename from src/KKdLib/database/object.c rename to src/KKdLib/database/object.cpp index 22dda5bb..214163d5 100644 --- a/src/KKdLib/database/object.c +++ b/src/KKdLib/database/object.cpp @@ -3,20 +3,20 @@ GitHub/GitLab: korenkonder */ -#include "object.h" -#include "../f2/struct.h" +#include "object.hpp" +#include "../f2/struct.hpp" #include "../io/path.h" #include "../io/stream.h" -#include "../hash.h" -#include "../sort.h" +#include "../hash.hpp" +#include "../sort.hpp" #include "../str_utils.h" static void object_database_classic_read_inner(object_database* obj_db, stream* s); static void object_database_classic_write_inner(object_database* obj_db, stream* s); static void object_database_modern_read_inner(object_database* obj_db, stream* s, uint32_t header_length); static void object_database_modern_write_inner(object_database* obj_db, stream* s); -static ssize_t object_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str); +static int64_t object_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, std::string& str); static void object_database_strings_push_back_check(std::vector& vec, std::string& str); object_info::object_info() { @@ -115,19 +115,19 @@ void object_database::read(const wchar_t* path, bool modern) { } } -void object_database::read(const void* data, size_t length, bool modern) { - if (!data || !length) +void object_database::read(const void* data, size_t size, bool modern) { + if (!data || !size) return; if (!modern) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); object_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - st.read(data, length); + st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; io_open(&s_mosi, &st.data); @@ -186,8 +186,8 @@ void object_database::write(const wchar_t* path) { } } -void object_database::write(void** data, size_t* length) { - if (!data || !ready) +void object_database::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; @@ -197,7 +197,7 @@ void object_database::write(void** data, size_t* length) { else object_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -399,14 +399,11 @@ bool object_database::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); object_database* obj_db = (object_database*)data; - obj_db->read(string_data(&s), obj_db->modern); + obj_db->read(s.c_str(), obj_db->modern); - string_free(&s); return obj_db->ready; } @@ -493,14 +490,14 @@ static void object_database_classic_write_inner(object_database* obj_db, stream* uint32_t object_set_count = (uint32_t)obj_db->object_set.size(); - std::vector string_offsets; + std::vector string_offsets; string_offsets.reserve(object_set_count * 4ULL); uint32_t max_object_set_id = 0; uint32_t object_count = 0; - ssize_t object_sets_offset = 0; + int64_t object_sets_offset = 0; size_t off_idx = 0; - ssize_t objects_offset = 0; + int64_t objects_offset = 0; if (string_offsets.size()) { for (object_set_info& i : obj_db->object_set) { string_offsets.push_back(io_get_position(s)); @@ -573,9 +570,9 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s io_read_uint32_t_stream_reverse_endianness(s); uint32_t object_set_count = io_read_uint32_t_stream_reverse_endianness(s); uint32_t max_object_set_id = io_read_uint32_t_stream_reverse_endianness(s); - ssize_t object_sets_offset = io_read_offset(s, header_length, is_x); + int64_t object_sets_offset = io_read_offset(s, header_length, is_x); uint32_t object_count = io_read_uint32_t_stream_reverse_endianness(s); - ssize_t objects_offset = io_read_offset(s, header_length, is_x); + int64_t objects_offset = io_read_offset(s, header_length, is_x); obj_db->object_set.resize(object_set_count); @@ -719,18 +716,18 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* io_write(&s_mosi, 0x08); io_align_write(&s_mosi, 0x10); - ssize_t object_sets_offset = io_get_position(&s_mosi); + int64_t object_sets_offset = io_get_position(&s_mosi); io_write(&s_mosi, object_set_count * (is_x ? 0x38ULL : 0x24ULL)); io_align_write(&s_mosi, 0x10); - ssize_t objects_offset = io_get_position(&s_mosi); + int64_t objects_offset = io_get_position(&s_mosi); io_write(&s_mosi, object_count * (is_x ? 0x10ULL : 0x0CULL)); io_align_write(&s_mosi, 0x10); std::vector strings; - std::vector string_offsets; + std::vector string_offsets; - strings.reserve((ssize_t)object_set_count + object_count); + strings.reserve((int64_t)object_set_count + object_count); for (object_set_info& i : obj_db->object_set) { object_database_strings_push_back_check(strings, i.name); @@ -825,8 +822,8 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* st.write(s, true, is_x); } -inline static ssize_t object_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str) { +inline static int64_t object_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, std::string& str) { for (std::string& i : vec) if (str == i) return vec_off[&i - vec.data()]; diff --git a/src/KKdLib/database/object.h b/src/KKdLib/database/object.hpp similarity index 96% rename from src/KKdLib/database/object.h rename to src/KKdLib/database/object.hpp index a1a116e0..d8c93b88 100644 --- a/src/KKdLib/database/object.h +++ b/src/KKdLib/database/object.hpp @@ -87,10 +87,10 @@ struct object_database { void read(const char* path, bool modern); void read(const wchar_t* path, bool modern); - void read(const void* data, size_t length, bool modern); + void read(const void* data, size_t size, bool modern); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); void merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db); void split_mdata(object_database* base_obj_db, object_database* mdata_obj_db); diff --git a/src/KKdLib/database/stage.c b/src/KKdLib/database/stage.cpp similarity index 96% rename from src/KKdLib/database/stage.c rename to src/KKdLib/database/stage.cpp index 437c4985..7a5f4c6d 100644 --- a/src/KKdLib/database/stage.c +++ b/src/KKdLib/database/stage.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "stage.h" -#include "../f2/struct.h" +#include "stage.hpp" +#include "../f2/struct.hpp" #include "../io/path.h" #include "../io/stream.h" -#include "../hash.h" +#include "../hash.hpp" #include "../str_utils.h" static void stage_database_classic_read_inner(stage_database* stage_data, stream* s); @@ -127,19 +127,19 @@ void stage_database::read(const wchar_t* path, bool modern) { } } -void stage_database::read(const void* data, size_t length, bool modern) { - if (!data || !length) +void stage_database::read(const void* data, size_t size, bool modern) { + if (!data || !size) return; if (!modern) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); stage_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - st.read(data, length); + st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; io_open(&s_stgc, &st.data); @@ -198,8 +198,8 @@ void stage_database::write(const wchar_t* path) { } } -void stage_database::write(void** data, size_t* length) { - if (!!data || !ready) +void stage_database::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; @@ -209,7 +209,7 @@ void stage_database::write(void** data, size_t* length) { else stage_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -220,14 +220,11 @@ bool stage_database::load_file(void* data, const char* path, const char* file, u if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); stage_database* stage_data = (stage_database*)data; - stage_data->read(string_data(&s), stage_data->modern); + stage_data->read(s.c_str(), stage_data->modern); - string_free(&s); return stage_data->ready; } @@ -477,7 +474,7 @@ static void stage_database_modern_read_inner(stage_database* stage_data, stream* io_set_position(s, 0x00, SEEK_SET); int32_t count = io_read_int32_t(s); - ssize_t stages_offset = io_read_offset(s, header_length, is_x); + int64_t stages_offset = io_read_offset(s, header_length, is_x); stage_data->stage_modern.resize(count); @@ -546,7 +543,7 @@ static void stage_database_modern_read_inner(stage_database* stage_data, stream* io_read_uint32_t_stream_reverse_endianness(s); int32_t auth3d_ids_count = io_read_int32_t_stream_reverse_endianness(s); - ssize_t auth3d_ids_offset = io_read_offset(s, header_length, is_x); + int64_t auth3d_ids_offset = io_read_offset(s, header_length, is_x); if (is_x) io_read_uint32_t_stream_reverse_endianness(s); diff --git a/src/KKdLib/database/stage.h b/src/KKdLib/database/stage.hpp similarity index 97% rename from src/KKdLib/database/stage.h rename to src/KKdLib/database/stage.hpp index fa290a53..294db526 100644 --- a/src/KKdLib/database/stage.h +++ b/src/KKdLib/database/stage.hpp @@ -8,7 +8,7 @@ #include #include #include "../default.h" -#include "object.h" +#include "object.hpp" enum stage_data_format { STAGE_DATA_UNK = 0, @@ -161,10 +161,10 @@ struct stage_database { void read(const char* path, bool modern); void read(const wchar_t* path, bool modern); - void read(const void* data, size_t length, bool modern); + void read(const void* data, size_t size, bool modern); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); void merge_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data); void split_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data); diff --git a/src/KKdLib/database/texture.c b/src/KKdLib/database/texture.cpp similarity index 92% rename from src/KKdLib/database/texture.c rename to src/KKdLib/database/texture.cpp index b7f930aa..9d67fc2a 100644 --- a/src/KKdLib/database/texture.c +++ b/src/KKdLib/database/texture.cpp @@ -3,20 +3,20 @@ GitHub/GitLab: korenkonder */ -#include "texture.h" -#include "../f2/struct.h" +#include "texture.hpp" +#include "../f2/struct.hpp" #include "../io/path.h" #include "../io/stream.h" -#include "../hash.h" -#include "../sort.h" +#include "../hash.hpp" +#include "../sort.hpp" #include "../str_utils.h" static void texture_database_classic_read_inner(texture_database* tex_db, stream* s); static void texture_database_classic_write_inner(texture_database* tex_db, stream* s); static void texture_database_modern_read_inner(texture_database* tex_db, stream* s, uint32_t header_length); static void texture_database_modern_write_inner(texture_database* tex_db, stream* s); -static ssize_t texture_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str); +static int64_t texture_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, std::string& str); static void texture_database_strings_push_back_check(std::vector& vec, std::string& str); texture_database::texture_database() : ready(), modern(), is_x() { @@ -105,19 +105,19 @@ void texture_database::read(const wchar_t* path, bool modern) { } } -void texture_database::read(const void* data, size_t length, bool modern) { - if (!data || !length) +void texture_database::read(const void* data, size_t size, bool modern) { + if (!data || !size) return; if (!modern) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); texture_database_classic_read_inner(this, &s); io_free(&s); } else { f2_struct st; - st.read(data, length); + st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; io_open(&s_mtxi, &st.data); @@ -176,8 +176,8 @@ void texture_database::write(const wchar_t* path) { } } -void texture_database::write(void** data, size_t* length) { - if (!data || !ready) +void texture_database::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; @@ -187,7 +187,7 @@ void texture_database::write(void** data, size_t* length) { else texture_database_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -260,18 +260,14 @@ bool texture_database::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); texture_database* tex_db = (texture_database*)data; - tex_db->read(string_data(&s), tex_db->modern); + tex_db->read(s.c_str(), tex_db->modern); - string_free(&s); return tex_db->ready; } - texture_info::texture_info() : name_hash(hash_murmurhash_empty), id((uint32_t)-1) { } @@ -313,7 +309,7 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea uint32_t textures_count = (uint32_t)tex_db->texture.size(); - std::vector string_offsets; + std::vector string_offsets; string_offsets.reserve(textures_count); for (texture_info& i : tex_db->texture) { @@ -322,7 +318,7 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea } io_align_write(s, 0x20); - ssize_t textures_offset = io_get_position(s); + int64_t textures_offset = io_get_position(s); if (string_offsets.size()) { size_t off_idx = 0; for (texture_info& i : tex_db->texture) { @@ -347,7 +343,7 @@ static void texture_database_modern_read_inner(texture_database* tex_db, stream* io_set_position(s, 0x00, SEEK_SET); uint32_t textures_count = io_read_uint32_t_stream_reverse_endianness(s); - ssize_t textures_offset = io_read_offset(s, header_length, is_x); + int64_t textures_offset = io_read_offset(s, header_length, is_x); tex_db->texture.resize(textures_count); @@ -411,12 +407,12 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream io_write_offset(&s_mtxi, 0, 0x20, is_x); io_align_write(&s_mtxi, 0x10); - ssize_t textures_offset = io_get_position(&s_mtxi); + int64_t textures_offset = io_get_position(&s_mtxi); io_write(&s_mtxi, textures_count * (is_x ? 0x10ULL : 0x08ULL)); io_align_write(&s_mtxi, 0x10); std::vector strings; - std::vector string_offsets; + std::vector string_offsets; strings.reserve(textures_count); @@ -439,14 +435,14 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream if (!is_x) for (texture_info& i : tex_db->texture) { io_write_uint32_t(&s_mtxi, i.id); - ssize_t offset = texture_database_strings_get_string_offset(strings, + int64_t offset = texture_database_strings_get_string_offset(strings, string_offsets, i.name); io_write_offset_f2_pof_add(&s_mtxi, offset, 0x20, &pof); } else for (texture_info& i : tex_db->texture) { io_write_uint32_t(&s_mtxi, i.id); - ssize_t offset = texture_database_strings_get_string_offset(strings, + int64_t offset = texture_database_strings_get_string_offset(strings, string_offsets, i.name); io_write_offset_x_pof_add(&s_mtxi, offset, &pof); } @@ -468,8 +464,8 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream st.write(s, true, tex_db->is_x); } -inline static ssize_t texture_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str) { +inline static int64_t texture_database_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, std::string& str) { for (std::string& i : vec) if (str == i) return vec_off[&i - vec.data()]; diff --git a/src/KKdLib/database/texture.h b/src/KKdLib/database/texture.hpp similarity index 90% rename from src/KKdLib/database/texture.h rename to src/KKdLib/database/texture.hpp index e4955270..9336f18d 100644 --- a/src/KKdLib/database/texture.h +++ b/src/KKdLib/database/texture.hpp @@ -30,10 +30,10 @@ struct texture_database { void read(const char* path, bool modern); void read(const wchar_t* path, bool modern); - void read(const void* data, size_t length, bool modern); + void read(const void* data, size_t size, bool modern); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); void merge_mdata(texture_database* base_tex_db, texture_database* mdata_tex_db); diff --git a/src/KKdLib/dds.c b/src/KKdLib/dds.c index e4c92bb3..88005c3c 100644 --- a/src/KKdLib/dds.c +++ b/src/KKdLib/dds.c @@ -145,8 +145,8 @@ DDSCONST DDS_PIXELFORMAT DDSPF_L8A8 = DDSCONST DDS_PIXELFORMAT DDSPF_A8 = { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; -static void dds_reverse_rgb(txp_format format, ssize_t size, uint8_t* data); -static bool dds_check_is_dxt1a(ssize_t size, uint8_t* data); +static void dds_reverse_rgb(txp_format format, int64_t size, uint8_t* data); +static bool dds_check_is_dxt1a(int64_t size, uint8_t* data); dds* dds_init() { dds* d = force_malloc_s(dds, 1); @@ -385,7 +385,7 @@ void dds_dispose(dds* d) { free(d); } -static void dds_reverse_rgb(txp_format format, ssize_t size, uint8_t* data) { +static void dds_reverse_rgb(txp_format format, int64_t size, uint8_t* data) { uint8_t l, r, g, b, a; switch (format) { case TXP_RGB8: @@ -459,7 +459,7 @@ static void dds_reverse_rgb(txp_format format, ssize_t size, uint8_t* data) { } } -static bool dds_check_is_dxt1a(ssize_t size, uint8_t* data) { +static bool dds_check_is_dxt1a(int64_t size, uint8_t* data) { while (size > 0) { if (*(uint16_t*)data <= *(uint16_t*)(data + 2)) return true; diff --git a/src/KKdLib/dds.h b/src/KKdLib/dds.h index 13c8f99f..5f4d810e 100644 --- a/src/KKdLib/dds.h +++ b/src/KKdLib/dds.h @@ -6,7 +6,7 @@ #pragma once #include "default.h" -#include "txp.h" +#include "txp.hpp" #include "vector.h" struct dds { diff --git a/src/KKdLib/default.c b/src/KKdLib/default.c index 8d4530b4..64079786 100644 --- a/src/KKdLib/default.c +++ b/src/KKdLib/default.c @@ -204,21 +204,21 @@ inline double_t reverse_endianness_double_t(double_t value) { return *(double_t*)&v; } -inline ssize_t utf8_length(const char* s) { +inline size_t utf8_length(const char* s) { if (!s) return 0; - ssize_t len = 0; + size_t len = 0; while (*s++) len++; return len; } -inline ssize_t utf16_length(const wchar_t* s) { +inline size_t utf16_length(const wchar_t* s) { if (!s) return 0; - ssize_t len = 0; + size_t len = 0; while (*s++) len++; return len; @@ -339,13 +339,13 @@ inline bool utf8_check_for_ascii_only(const char* s) { return true; } -ssize_t utf8_to_utf16_length(const char* s) { +size_t utf8_to_utf16_length(const char* s) { if (!s) return 0; uint32_t c = 0; - ssize_t length = 0; - ssize_t l = 0; + size_t length = 0; + size_t l = 0; while (*s) { char t = *s++; @@ -387,9 +387,9 @@ ssize_t utf8_to_utf16_length(const char* s) { return length; } -ssize_t utf16_to_utf8_length(const wchar_t* s) { +size_t utf16_to_utf8_length(const wchar_t* s) { uint32_t c = 0; - ssize_t length = 0; + size_t length = 0; while (*s) { c = *s++; if ((c & 0xFC00) == 0xD800) { diff --git a/src/KKdLib/default.h b/src/KKdLib/default.h index d245c5a9..c2cd9745 100644 --- a/src/KKdLib/default.h +++ b/src/KKdLib/default.h @@ -153,10 +153,10 @@ extern size_t reverse_endianness_size_t(size_t value); extern float_t reverse_endianness_float_t(float_t value); extern double_t reverse_endianness_double_t(double_t value); -extern ssize_t utf8_length(const char* s); -extern ssize_t utf16_length(const wchar_t* s); +extern size_t utf8_length(const char* s); +extern size_t utf16_length(const wchar_t* s); extern wchar_t* utf8_to_utf16(const char* s); extern char* utf16_to_utf8(const wchar_t* s); extern bool utf8_check_for_ascii_only(const char* s); -extern ssize_t utf8_to_utf16_length(const char* s); -extern ssize_t utf16_to_utf8_length(const wchar_t* s); +extern size_t utf8_to_utf16_length(const char* s); +extern size_t utf16_to_utf8_length(const wchar_t* s); diff --git a/src/KKdLib/dsc.c b/src/KKdLib/dsc.cpp similarity index 99% rename from src/KKdLib/dsc.c rename to src/KKdLib/dsc.cpp index 2e31ddb0..ea384e21 100644 --- a/src/KKdLib/dsc.c +++ b/src/KKdLib/dsc.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "dsc.h" -#include "f2/struct.h" -#include "hash.h" -#include "sort.h" +#include "dsc.hpp" +#include "f2/struct.hpp" +#include "hash.hpp" +#include "sort.hpp" #include "str_utils.h" static const dsc_func dsc_ac101_func[] = { @@ -2746,8 +2746,8 @@ void dsc::merge(int32_t count, ...) { } } -bool dsc::parse(void* data, size_t length, dsc_type type) { - if (!data || !(length / 4) || type < DSC_AC101 || type > DSC_VRFL) +bool dsc::parse(void* data, size_t size, dsc_type type) { + if (!data || !(size / 4) || type < DSC_AC101 || type > DSC_VRFL) return false; uint32_t* data_dsc = (uint32_t*)data; @@ -2758,7 +2758,7 @@ bool dsc::parse(void* data, size_t length, dsc_type type) { default: if (*data_dsc >= 0x10000000) { signature = *data_dsc++; - length--; + size--; } break; case DSC_F: @@ -2774,10 +2774,10 @@ bool dsc::parse(void* data, size_t length, dsc_type type) { case DSC_MGF: case DSC_X: case DSC_VRFL: - st.read(data, length); + st.read(data, size); data_dsc = (uint32_t*)st.data.data(); if (st.header.use_big_endian) - for (size_t i = length / 4; i; i--, data_dsc++) + for (size_t i = size / 4; i; i--, data_dsc++) *data_dsc = load_reverse_endianness_uint32_t(data_dsc); data_dsc = (uint32_t*)st.data.data(); @@ -2790,7 +2790,7 @@ bool dsc::parse(void* data, size_t length, dsc_type type) { break; } - length /= 4; + size /= 4; this->type = type; @@ -2800,15 +2800,15 @@ bool dsc::parse(void* data, size_t length, dsc_type type) { size_t func_count = 0; size_t data_size = 0; uint32_t* func_data = data_dsc; - for (size_t i = 0; i < length; i++) { + for (size_t i = 0; i < size; i++) { if (!*func_data) { - length = i; + size = i; break; } int32_t func_length = get_func_length(*func_data++); if (func_length < 0) { - length = i; + size = i; break; } @@ -2837,34 +2837,34 @@ bool dsc::parse(void* data, size_t length, dsc_type type) { return true; } -void dsc::unparse(void** data, size_t* length) { - if (!data || !length) +void dsc::unparse(void** data, size_t* size) { + if (!data || !size) return; dsc_get_func_length get_func_length = get_dsc_get_func_length(); bool f2 = false; - size_t size = 1; + size_t s = 1; switch (type) { default: if (signature >= 0x10000000) - size++; + s++; break; case DSC_F2: case DSC_MGF: case DSC_X: case DSC_VRFL: - size += 2; + s += 2; f2 = true; break; } for (dsc_data& i : this->data) - size += get_func_length(i.func) + 1ULL; + s += get_func_length(i.func) + 1ULL; - size_t data_size = size; + size_t data_size = s; if (f2) - data_size = align_val(size, 4); + data_size = align_val(s, 4); f2_struct st; uint32_t* data_dsc; @@ -2906,7 +2906,7 @@ void dsc::unparse(void** data, size_t* length) { enrs e; enrs_entry ee; - ee = { 0, 1, 4, (uint32_t)size }; + ee = { 0, 1, 4, (uint32_t)s }; ee.sub.push_back({ 0, 1, ENRS_DWORD }); e.vec.push_back(ee); @@ -2916,11 +2916,11 @@ void dsc::unparse(void** data, size_t* length) { st.header.length = 0x40; st.header.use_section_size = true; st.header.inner_signature = 0x13120420; - st.write(data, length, true, false); + st.write(data, size, true, false); } else { *data = data_dsc; - *length = data_size * sizeof(uint32_t); + *size = data_size * sizeof(uint32_t); } } @@ -2929,12 +2929,10 @@ int32_t dsc::calculate_target_flying_time(int32_t bpm, int32_t time_signature) { } bool dsc::load_file(void* data, const char* path, const char* file, uint32_t hash) { - string s; - string_init(&s, path); - string_add(&s, file); + std::string s = path + std::string(file); stream dsc_s; - io_open(&dsc_s, string_data(&s), "rb"); + io_open(&dsc_s, s.c_str(), "rb"); void* dsc_data = force_malloc(dsc_s.length); size_t dsc_length = dsc_s.length; io_read(&dsc_s, dsc_data, dsc_length); @@ -2943,7 +2941,6 @@ bool dsc::load_file(void* data, const char* path, const char* file, uint32_t has bool ret = d->parse(dsc_data, dsc_length, d->type); io_free(&dsc_s); - string_free(&s); free(dsc_data); return ret; } diff --git a/src/KKdLib/dsc.h b/src/KKdLib/dsc.hpp similarity index 99% rename from src/KKdLib/dsc.h rename to src/KKdLib/dsc.hpp index fc34222e..3072f9d8 100644 --- a/src/KKdLib/dsc.h +++ b/src/KKdLib/dsc.hpp @@ -292,9 +292,9 @@ struct dsc { dsc_get_func_length get_dsc_get_func_length(); uint32_t* get_func_data(dsc_data* data); void merge(int32_t count, ...); - bool parse(void* data, size_t length, dsc_type type); + bool parse(void* data, size_t size, dsc_type type); void rebuild(); - void unparse(void** data, size_t* length); + void unparse(void** data, size_t* size); static int32_t calculate_target_flying_time(int32_t bpm, int32_t time_signature); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); diff --git a/src/KKdLib/enbaya.c b/src/KKdLib/enbaya.c index f4fffae6..8f7fdae7 100644 --- a/src/KKdLib/enbaya.c +++ b/src/KKdLib/enbaya.c @@ -93,12 +93,9 @@ int32_t enb_initialize(uint8_t* data, enb_play_head** play_head) { *play_head = 0; enb_head* head = (enb_head*)data; - if (head->signature != 0x100A9DA4 && head->signature != 0x100AAD74) - return -3; - enb_play_head* ph = force_malloc_s(enb_play_head, 1); if (!ph) - return -4; + return -3; memset(ph, 0, sizeof(enb_play_head)); @@ -109,7 +106,7 @@ int32_t enb_initialize(uint8_t* data, enb_play_head** play_head) { if (!ph->track_data) { free(ph); - return -5; + return -4; } memset(ph->track_data, 0, sizeof(enb_track) * head->track_count); diff --git a/src/KKdLib/f2/enrs.c b/src/KKdLib/f2/enrs.cpp similarity index 99% rename from src/KKdLib/f2/enrs.c rename to src/KKdLib/f2/enrs.cpp index 2f378b3a..db6907c5 100644 --- a/src/KKdLib/f2/enrs.c +++ b/src/KKdLib/f2/enrs.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "enrs.h" +#include "enrs.hpp" enum enrs_value_type { ENRS_VALUE_INT8 = 0x0, diff --git a/src/KKdLib/f2/enrs.h b/src/KKdLib/f2/enrs.hpp similarity index 100% rename from src/KKdLib/f2/enrs.h rename to src/KKdLib/f2/enrs.hpp diff --git a/src/KKdLib/f2/pof.c b/src/KKdLib/f2/pof.cpp similarity index 94% rename from src/KKdLib/f2/pof.c rename to src/KKdLib/f2/pof.cpp index 55af44b1..0ced601e 100644 --- a/src/KKdLib/f2/pof.c +++ b/src/KKdLib/f2/pof.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "pof.h" +#include "pof.hpp" enum pof_value_type { POF_VALUE_INVALID = 0x0, @@ -24,7 +24,7 @@ pof::~pof() { } -void pof::add(stream* s,size_t offset) { +void pof::add(stream* s, int64_t offset) { if (!s) return; @@ -78,7 +78,7 @@ void pof::write(stream* s, bool shift_x) { else io_write_uint32_t(s, (uint32_t)align_val(l, 4)); - for (size_t& i : vec) { + for (int64_t& i : vec) { o = i; if (o & v) { pof_write_packed_value(s, 0x7FFFFFFF); @@ -105,7 +105,7 @@ uint32_t pof::length(bool shift_x) { uint8_t bit_shift = (uint8_t)(shift_x ? 3 : 2); size_t v = ((size_t)1 << bit_shift) - 1; - for (size_t& i : vec) { + for (int64_t& i : vec) { size_t o = i; if (o & v) break; @@ -125,7 +125,7 @@ uint32_t pof::length(bool shift_x) { return l; } -inline void io_write_offset_pof_add(stream* s, ssize_t val, +inline void io_write_offset_pof_add(stream* s, int64_t val, int32_t offset, bool is_x, pof* pof) { if (!is_x) { if (val) @@ -140,7 +140,7 @@ inline void io_write_offset_pof_add(stream* s, ssize_t val, } } -inline void io_write_offset_f2_pof_add(stream* s, ssize_t val, +inline void io_write_offset_f2_pof_add(stream* s, int64_t val, int32_t offset, pof* pof) { if (val) val += offset; @@ -148,7 +148,7 @@ inline void io_write_offset_f2_pof_add(stream* s, ssize_t val, io_write_int32_t_stream_reverse_endianness(s, (int32_t)val); } -inline void io_write_offset_x_pof_add(stream* s, ssize_t val, pof* pof) { +inline void io_write_offset_x_pof_add(stream* s, int64_t val, pof* pof) { io_align_write(s, 0x08); pof->add(s, 0); io_write_int64_t_stream_reverse_endianness(s, val); diff --git a/src/KKdLib/f2/pof.h b/src/KKdLib/f2/pof.hpp similarity index 61% rename from src/KKdLib/f2/pof.h rename to src/KKdLib/f2/pof.hpp index 63cd612a..17d08410 100644 --- a/src/KKdLib/f2/pof.h +++ b/src/KKdLib/f2/pof.hpp @@ -10,19 +10,19 @@ #include "../io/stream.h" struct pof { - std::vector vec; + std::vector vec; pof(); ~pof(); - void add(stream* s, size_t offset); + void add(stream* s, int64_t offset); void read(stream* s, bool shift_x = false); void write(stream* s, bool shift_x = false); uint32_t length(bool shift_x = false); }; -extern void io_write_offset_pof_add(stream* s, ssize_t val, +extern void io_write_offset_pof_add(stream* s, int64_t val, int32_t offset, bool is_x, pof* pof); -extern void io_write_offset_f2_pof_add(stream* s, ssize_t val, +extern void io_write_offset_f2_pof_add(stream* s, int64_t val, int32_t offset, pof* pof); -extern void io_write_offset_x_pof_add(stream* s, ssize_t val, pof* pof); +extern void io_write_offset_x_pof_add(stream* s, int64_t val, pof* pof); diff --git a/src/KKdLib/f2/struct.c b/src/KKdLib/f2/struct.cpp similarity index 93% rename from src/KKdLib/f2/struct.c rename to src/KKdLib/f2/struct.cpp index 97385ec7..852f745f 100644 --- a/src/KKdLib/f2/struct.c +++ b/src/KKdLib/f2/struct.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "struct.h" +#include "struct.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../divafile.h" @@ -23,6 +23,9 @@ f2_struct::~f2_struct() { } void f2_struct::read(const char* path) { + if (!path) + return; + stream s; io_open(&s, path, "rb"); if (&s.io.stream) { @@ -36,6 +39,9 @@ void f2_struct::read(const char* path) { } void f2_struct::read(const wchar_t* path) { + if (!path) + return; + stream s; io_open(&s, path, L"rb"); if (&s.io.stream) { @@ -48,9 +54,12 @@ void f2_struct::read(const wchar_t* path) { io_free(&s); } -void f2_struct::read(const void* data, size_t length) { +void f2_struct::read(const void* data, size_t size) { + if (!data || !size) + return; + stream s; - io_open(&s, data, length); + io_open(&s, data, size); if (&s.io.data.data) { divafile_decrypt(&s); @@ -62,6 +71,9 @@ void f2_struct::read(const void* data, size_t length) { } void f2_struct::read(stream* s) { + if (!s) + return; + if (s->io.stream || s->io.data.data) { divafile_decrypt(s); @@ -72,6 +84,9 @@ void f2_struct::read(stream* s) { } void f2_struct::write(const char* path, bool use_depth, bool shift_x) { + if (!path) + return; + stream s; io_open(&s, path, "wb"); if (s.io.stream) { @@ -82,6 +97,9 @@ void f2_struct::write(const char* path, bool use_depth, bool shift_x) { } void f2_struct::write(const wchar_t* path, bool use_depth, bool shift_x) { + if (!path) + return; + stream s; io_open(&s, path, L"wb"); if (s.io.stream) { @@ -91,8 +109,8 @@ void f2_struct::write(const wchar_t* path, bool use_depth, bool shift_x) { io_free(&s); } -void f2_struct::write(void** data, size_t* length, bool use_depth, bool shift_x) { - if (!data) +void f2_struct::write(void** data, size_t* size, bool use_depth, bool shift_x) { + if (!data || !size) return; f2_struct_get_length(this, shift_x); @@ -100,11 +118,14 @@ void f2_struct::write(void** data, size_t* length, bool use_depth, bool shift_x) io_open(&s, 0, header.data_size + 0x40ULL); f2_struct_write_inner(&s, this, 0, use_depth, shift_x); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } void f2_struct::write(stream* s, bool use_depth, bool shift_x) { + if (!s) + return; + if (s->io.stream || s->type == STREAM_MEMORY) { f2_struct_get_length(this, shift_x); f2_struct_write_inner(s, this, 0, use_depth, shift_x); diff --git a/src/KKdLib/f2/struct.h b/src/KKdLib/f2/struct.hpp similarity index 79% rename from src/KKdLib/f2/struct.h rename to src/KKdLib/f2/struct.hpp index 76e8c76f..b753a182 100644 --- a/src/KKdLib/f2/struct.h +++ b/src/KKdLib/f2/struct.hpp @@ -7,9 +7,9 @@ #include "../default.h" #include "../vector.h" -#include "enrs.h" +#include "enrs.hpp" #include "header.h" -#include "pof.h" +#include "pof.hpp" struct f2_struct; @@ -26,10 +26,10 @@ struct f2_struct { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void read(stream* s); void write(const char* path, bool use_depth = true, bool shift_x = false); void write(const wchar_t* path, bool use_depth = true, bool shift_x = false); - void write(void** data, size_t* length, bool use_depth = true, bool shift_x = false); + void write(void** data, size_t* size, bool use_depth = true, bool shift_x = false); void write(stream* s, bool use_depth = true, bool shift_x = false); }; diff --git a/src/KKdLib/farc.c b/src/KKdLib/farc.cpp similarity index 97% rename from src/KKdLib/farc.c rename to src/KKdLib/farc.cpp index e1ec7023..c9177aa9 100644 --- a/src/KKdLib/farc.c +++ b/src/KKdLib/farc.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "farc.h" +#include "farc.hpp" #include "io/path.h" #include "aes.h" #include "deflate.h" -#include "hash.h" +#include "hash.hpp" #include "str_utils.h" static const uint8_t key[] = { @@ -41,7 +41,8 @@ data(), data_compressed(), flags(), data_changed() { } farc_file::~farc_file() { - + free(data); + free(data_compressed); } void farc::add_file(const char* name) { @@ -56,7 +57,7 @@ void farc::add_file(const char* name) { files.push_back({}); if (name) - files.back().name = std::string(name); + files.back().name = name; for (size_t i = 0; i < files_count; i++) { files[i].data = data_temp[i * 2 + 0]; @@ -80,7 +81,7 @@ void farc::add_file(const wchar_t* name) { files.push_back({}); if (name) { char* name_temp = utf16_to_utf8(name); - files.back().name = std::string(name_temp); + files.back().name = name_temp; free(name_temp); } @@ -149,7 +150,7 @@ void farc::read(const wchar_t* path, bool unpack, bool save) { const char* dot = strrchr(directory_path.c_str(), '.'); if (dot) - directory_path = std::string(directory_path.c_str(), dot - directory_path.c_str()); + directory_path = directory_path.substr(0, dot - directory_path.c_str()); stream s; io_open(&s, file_path.c_str(), "rb"); @@ -158,18 +159,18 @@ void farc::read(const wchar_t* path, bool unpack, bool save) { io_free(&s); } -void farc::read(const void* data, size_t length, bool unpack) { - if (!data || !length) +void farc::read(const void* data, size_t size, bool unpack) { + if (!data || !size) return; files.clear(); files.shrink_to_fit(); - file_path = std::string("", 0); - directory_path = std::string("", 0); + file_path = {}; + directory_path = {}; stream s; - io_open(&s, data, length); + io_open(&s, data, size); if (!farc_read_header(this, &s) && unpack) farc_unpack_files(this, &s, false); io_free(&s); @@ -294,12 +295,12 @@ void farc::write(const wchar_t* path, farc_compress_mode mode, bool get_files) { } } -void farc::write(void** data, size_t* length, farc_compress_mode mode) { - if (!data || !length) +void farc::write(void** data, size_t* size, farc_compress_mode mode) { + if (!data || !size) return; - directory_path = std::string("", 0); - file_path = std::string("", 0); + directory_path = {}; + file_path = {}; stream s; io_open(&s); @@ -680,7 +681,7 @@ static errno_t farc_read_header(farc* f, stream* s) { f->files = std::vector(length); if (has_per_file_flags) for (farc_file& i : f->files) { - i.name = std::string((char*)dt); + i.name = (char*)dt; dt += i.name.size() + 1; i.offset = (size_t)load_reverse_endianness_int32_t((void*)dt); i.size_compressed = (size_t)load_reverse_endianness_int32_t((void*)(dt + 4)); @@ -690,7 +691,7 @@ static errno_t farc_read_header(farc* f, stream* s) { } else if (f->signature != FARC_FArc) for (farc_file& i : f->files) { - i.name = std::string((char*)dt); + i.name = (char*)dt; dt += i.name.size() + 1; i.offset = (size_t)load_reverse_endianness_int32_t((void*)dt); i.size_compressed = (size_t)load_reverse_endianness_int32_t((void*)(dt + 4)); @@ -699,7 +700,7 @@ static errno_t farc_read_header(farc* f, stream* s) { } else for (farc_file& i : f->files) { - i.name = std::string((char*)dt); + i.name = (char*)dt; dt += i.name.size() + 1; i.offset = (size_t)load_reverse_endianness_int32_t((void*)dt); i.size = (size_t)load_reverse_endianness_int32_t((void*)(dt + 4)); diff --git a/src/KKdLib/farc.h b/src/KKdLib/farc.hpp similarity index 92% rename from src/KKdLib/farc.h rename to src/KKdLib/farc.hpp index 51a1b8b3..cee84a63 100644 --- a/src/KKdLib/farc.h +++ b/src/KKdLib/farc.hpp @@ -62,13 +62,13 @@ struct farc { size_t get_file_size(const wchar_t* name); void read(const char* path, bool unpack, bool save); void read(const wchar_t* path, bool unpack, bool save); - void read(const void* data, size_t length, bool unpack); + void read(const void* data, size_t size, bool unpack); farc_file* read_file(const char* name); farc_file* read_file(const wchar_t* name); farc_file* read_file(uint32_t hash); void write(const char* path, farc_compress_mode mode, bool get_files); void write(const wchar_t* path, farc_compress_mode mode, bool get_files); - void write(void** data, size_t* length, farc_compress_mode mode); + void write(void** data, size_t* size, farc_compress_mode mode); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/half_t.c b/src/KKdLib/half_t.c index 590a5242..cffe8038 100644 --- a/src/KKdLib/half_t.c +++ b/src/KKdLib/half_t.c @@ -32,7 +32,7 @@ float_t half_to_float(half_t h) { if (exponent == 0x1F) si32 |= 0x7F800000; else if (exponent != 0x00) - si32 |= ((int32_t)exponent - 15 + 127) << 23; + si32 |= ((int32_t)exponent - 0x0F + 0x7F) << 23; si32 |= (int32_t)mantissa << 13; return *(float_t*)&si32; } @@ -49,13 +49,13 @@ half_t float_to_half(float_t val) { int16_t mantissa = (int16_t)((si32 >> 13) & 0x3FF); if (exponent == 0xFF) - exponent = 31; + exponent = 0x1F; else if (exponent != 0x00) { - exponent -= 127 - 15; - if (exponent < 0) + exponent -= 0x7F - 0x0F; + if (exponent < 0x00) exponent = mantissa = 0; - else if (exponent > 30) - exponent = 31; + else if (exponent >= 0x1F) + exponent = 0x1F; } return (half_t)((sign << 15) | (exponent << 10) | mantissa); } @@ -70,7 +70,7 @@ double_t half_to_double(half_t h) { if (exponent == 0x1F) si64 |= 0x7FF0000000000000; else if (exponent != 0x00) - si64 |= ((int64_t)exponent - 15 + 1023) << 52; + si64 |= ((int64_t)exponent - 0x0F + 0x3FF) << 52; si64 |= (int64_t)mantissa << 42; return *(double_t*)&si64; } @@ -87,13 +87,13 @@ half_t double_to_half(double_t val) { int16_t mantissa = (int16_t)((si64 >> 42) & 0x3FF); if (exponent == 0x7FF) - exponent = 31; + exponent = 0x1F; else if (exponent != 0x00) { - exponent -= 1023 - 15; - if (exponent < 0) + exponent -= 0x3FF - 0x0F; + if (exponent < 0x00) exponent = mantissa = 0; - else if (exponent > 30) - exponent = 31; + else if (exponent >= 0x1F) + exponent = 0x1F; } return (half_t)((sign << 15) | (exponent << 10) | mantissa); } diff --git a/src/KKdLib/hash.c b/src/KKdLib/hash.cpp similarity index 90% rename from src/KKdLib/hash.c rename to src/KKdLib/hash.cpp index a708dba4..4f6a5154 100644 --- a/src/KKdLib/hash.c +++ b/src/KKdLib/hash.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "hash.h" +#include "hash.hpp" static const uint16_t hash_crc16_ccitt_table[] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, @@ -46,13 +46,13 @@ const uint32_t hash_crc16_ccitt_empty = 0xFFFF; // FNV 1a 64-bit Modified // 0x1403B04D0 in SBZV_7.10 -inline uint64_t hash_fnv1a64m(const void* data, size_t length, bool make_upper) { +inline uint64_t hash_fnv1a64m(const void* data, size_t size, bool make_upper) { const uint8_t* d = (const uint8_t*)data; uint64_t hash = 0xCBF29CE484222325; if (data) if (make_upper) // Modification for only uppercase latin text - for (size_t i = length; i; i--) { + for (size_t i = size; i; i--) { uint8_t a = *d++; if (a > 0x60 && a < 0x7B) a -= 0x20; @@ -60,7 +60,7 @@ inline uint64_t hash_fnv1a64m(const void* data, size_t length, bool make_upper) hash *= 0x100000001B3; } else - for (size_t i = length; i; i--) { + for (size_t i = size; i; i--) { hash ^= *d++; hash *= 0x100000001B3; } @@ -90,7 +90,7 @@ inline uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper) { // 0x814D7A9C in PCSB00554 // 0x8134C304 in PCSB01007 // 0x0069CEA4 in NPEB02013 -uint32_t hash_murmurhash(const void* data, size_t length, +uint32_t hash_murmurhash(const void* data, size_t size, uint32_t seed, bool upper, bool big_endian) { const uint8_t* d = (const uint8_t*)data; @@ -104,23 +104,23 @@ uint32_t hash_murmurhash(const void* data, size_t length, if (d) if (upper) { if (big_endian) - for (i = 0; length > 3; length -= 4, i += 4, d += 4) { + for (i = 0; size > 3; size -= 4, i += 4, d += 4) { b = load_reverse_endianness_uint32_t(d); hash += b; hash *= m; hash ^= hash >> r; } else - for (i = 0; length > 3; length -= 4, i += 4, d += 4) { + for (i = 0; size > 3; size -= 4, i += 4, d += 4) { b = *(uint32_t*)d; hash += b; hash *= m; hash ^= hash >> r; } - if (length > 0) { - if (length > 1) { - if (length > 2) + if (size > 0) { + if (size > 1) { + if (size > 2) hash += (uint32_t)d[2] << 16; hash += (uint32_t)d[1] << 8; } @@ -131,7 +131,7 @@ uint32_t hash_murmurhash(const void* data, size_t length, } else { if (big_endian) - for (i = 0; length > 3; length -= 4, i += 4, d += 4) { + for (i = 0; size > 3; size -= 4, i += 4, d += 4) { b = load_reverse_endianness_uint32_t(d); a = b & 0xFF; @@ -159,7 +159,7 @@ uint32_t hash_murmurhash(const void* data, size_t length, hash ^= hash >> r; } else - for (i = 0; length > 3; length -= 4, i += 4, d += 4) { + for (i = 0; size > 3; size -= 4, i += 4, d += 4) { b = *(uint32_t*)d; a = b & 0xFF; @@ -187,9 +187,9 @@ uint32_t hash_murmurhash(const void* data, size_t length, hash ^= hash >> r; } - if (length > 0) { - if (length > 1) { - if (length > 2) { + if (size > 0) { + if (size > 1) { + if (size > 2) { b = d[2]; if (b > 0x60 && b < 0x7B) b -= 0x20; @@ -240,19 +240,19 @@ inline uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed, b // CRC16-CCITT // 0x140011A90 in SBZV_7.10 -inline uint16_t hash_crc16_ccitt(const void* data, size_t length, bool make_upper) { +inline uint16_t hash_crc16_ccitt(const void* data, size_t size, bool make_upper) { const uint8_t* d = (const uint8_t*)data; uint16_t hash = 0xFFFF; if (make_upper) // Modification for only uppercase latin text - for (size_t i = length; i; i--) { + for (size_t i = size; i; i--) { uint8_t a = *d++; if (a > 0x60 && a < 0x7B) a -= 0x20; hash = (uint16_t)(hash_crc16_ccitt_table[(hash >> 8) ^ a] ^ (hash << 8)); } else - for (size_t i = length; i; i--) + for (size_t i = size; i; i--) hash = (uint16_t)(hash_crc16_ccitt_table[(hash >> 8) ^ *d++] ^ (hash << 8)); return hash; } diff --git a/src/KKdLib/hash.h b/src/KKdLib/hash.hpp similarity index 81% rename from src/KKdLib/hash.h rename to src/KKdLib/hash.hpp index 7bd6b780..10d86de1 100644 --- a/src/KKdLib/hash.h +++ b/src/KKdLib/hash.hpp @@ -13,17 +13,17 @@ 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(const void* data, size_t length, bool make_upper = false); +extern uint64_t hash_fnv1a64m(const void* data, size_t size, bool make_upper = false); extern uint64_t hash_utf8_fnv1a64m(const char* data, bool make_upper = false); extern uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper = false); extern uint64_t hash_string_fnv1a64m(const string* data, bool make_upper = false); extern uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper = false); -extern uint32_t hash_murmurhash(const void* data, size_t length, uint32_t seed = 0, bool upper = false, bool big_endian = false); +extern uint32_t hash_murmurhash(const void* data, size_t size, uint32_t seed = 0, bool upper = false, bool big_endian = false); extern uint32_t hash_utf8_murmurhash(const char* data, uint32_t seed = 0, bool upper = false); extern uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed = 0, bool upper = false); extern uint32_t hash_string_murmurhash(const string* data, uint32_t seed = 0, bool upper = false); extern uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed = 0, bool upper = false); -extern uint16_t hash_crc16_ccitt(const void* data, size_t length, bool make_upper = false); +extern uint16_t hash_crc16_ccitt(const void* data, size_t size, bool make_upper = false); extern uint16_t hash_utf8_crc16_ccitt(const char* data, bool make_upper = false); extern uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper = false); extern uint16_t hash_string_crc16_ccitt(const string* data, bool make_upper = false); diff --git a/src/KKdLib/io/json.c b/src/KKdLib/io/json.cpp similarity index 78% rename from src/KKdLib/io/json.c rename to src/KKdLib/io/json.cpp index e293faac..472e6ce0 100644 --- a/src/KKdLib/io/json.c +++ b/src/KKdLib/io/json.cpp @@ -3,9 +3,9 @@ GitHub/GitLab: korenkonder */ -#include "json.h" +#include "json.hpp" -#define IO_JSON_READ_BUF_SIZE 0x200 +#define IO_JSON_READ_BUF_SIZE 0x400 struct io_json_read_buffer { char data[IO_JSON_READ_BUF_SIZE]; @@ -14,7 +14,7 @@ struct io_json_read_buffer { }; static int32_t io_json_read_char(stream* s, io_json_read_buffer* buf); -static void io_json_seek(stream* s, io_json_read_buffer* buf, ssize_t offset); +static void io_json_seek(stream* s, io_json_read_buffer* buf, int64_t offset); static void io_json_seek_one(stream* s, io_json_read_buffer* buf); static void io_json_read_inner(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); static void io_json_read_digit(stream* s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end); @@ -39,7 +39,7 @@ static void io_json_write_int64_t(stream* s, int64_t val); static void io_json_write_uint64_t(stream* s, uint64_t val); static void io_json_write_float_t(stream* s, float_t val); static void io_json_write_double_t(stream* s, double_t val); -static void io_json_write_string(stream* s, string* val); +static void io_json_write_string(stream* s, std::string* val); void io_json_read(stream* s, msgpack* msg) { if (!msg || !s->io.stream) @@ -72,10 +72,10 @@ static int32_t io_json_read_char(stream* s, io_json_read_buffer* buf) { return c; } -static void io_json_seek(stream* s, io_json_read_buffer* buf, ssize_t offset) { - if (offset >= buf->length - 1LL) { - ssize_t pos = io_get_position(s) - buf->length - offset; - ssize_t off = pos % IO_JSON_READ_BUF_SIZE; +static void io_json_seek(stream* s, io_json_read_buffer* buf, int64_t offset) { + if (buf->first < offset || offset >= buf->length - 1LL) { + int64_t pos = io_get_position(s) - buf->length - offset; + int64_t off = pos % IO_JSON_READ_BUF_SIZE; pos -= off; if (pos > 1) { io_set_position(s, pos, SEEK_SET); @@ -96,13 +96,13 @@ static void io_json_seek(stream* s, io_json_read_buffer* buf, ssize_t offset) { } } -static void io_json_seek_one(stream* s, io_json_read_buffer* buf) { +inline static void io_json_seek_one(stream* s, io_json_read_buffer* buf) { buf->first--; buf->length++; } static void io_json_read_inner(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { - msgpack_init_null(msg, name); + *msg = msgpack(name); while (*c != EOF) { if (CHECK_WHITESPACE(*c)) *c = io_json_read_char(s, buf); @@ -139,7 +139,7 @@ static void io_json_read_inner(stream* s, io_json_read_buffer* buf, const char* } } -static void io_json_read_digit(stream* s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end) { +inline static void io_json_read_digit(stream* s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end) { char* b = *dig_buf; while (isdigit(*c) && b < dig_buf_end) { *b++ = *c; @@ -186,9 +186,9 @@ static void io_json_read_float(stream* s, io_json_read_buffer* buf, const char* if (zero && !fraction) { if (negate) - msgpack_set_float_t(msg, name, -0.0f); + *msg = msgpack(name, -0.0f); else - msgpack_set_uint8_t(msg, name, 0); + *msg = msgpack(name, 0); io_json_seek_one(s, buf); return; } @@ -198,19 +198,19 @@ static void io_json_read_float(stream* s, io_json_read_buffer* buf, const char* return; if (val >= 0x00 && val < 0xFF) - msgpack_set_uint8_t(msg, name, (uint8_t)val); + *msg = msgpack(name, (uint8_t)val); else if (val >= (int8_t)0x80 && val <= (int8_t)0x7F) - msgpack_set_int8_t(msg, name, (int8_t)val); + *msg = msgpack(name, (int8_t)val); else if (val >= 0x0000 && val < 0xFFFF) - msgpack_set_uint16_t(msg, name, (uint16_t)val); + *msg = msgpack(name, (uint16_t)val); else if (val >= (int16_t)0x8000 && val <= (int16_t)0x7FFF) - msgpack_set_int16_t(msg, name, (int16_t)val); + *msg = msgpack(name, (int16_t)val); else if (val >= 0x00000000 && val <= 0xFFFFFFFF) - msgpack_set_uint32_t(msg, name, (uint32_t)val); + *msg = msgpack(name, (uint32_t)val); else if (val >= (int32_t)0x80000000 && val <= (int32_t)0x7FFFFFFF) - msgpack_set_int32_t(msg, name, (int32_t)val); + *msg = msgpack(name, (int32_t)val); else - msgpack_set_int64_t(msg, name, val); + *msg = msgpack(name, val); io_json_seek_one(s, buf); return; } @@ -233,13 +233,13 @@ static void io_json_read_float(stream* s, io_json_read_buffer* buf, const char* return; if ((float_t)val == val) - msgpack_set_float_t(msg, name, (float_t)val); + *msg = msgpack(name, (float_t)val); else - msgpack_set_double_t(msg, name, val); + *msg = msgpack(name, val); io_json_seek_one(s, buf); } -static uint8_t io_json_read_string_hex(int32_t c) { +inline static uint8_t io_json_read_string_hex(int32_t c) { if (c >= '0' && c <= '9') return c - '0'; else if (c >= 'A' && c <= 'F') @@ -254,7 +254,7 @@ static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgp if (*c != '"') return 0; - ssize_t pos = io_get_position(s) - buf->length; + int64_t pos = io_get_position(s) - buf->length; size_t len = 0; while (*c != EOF) { *c = io_json_read_char(s, buf); @@ -307,7 +307,7 @@ static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgp } if (*c == EOF) return 0; - ssize_t pos_end = io_get_position(s) - buf->length; + int64_t pos_end = io_get_position(s) - buf->length; io_json_seek(s, buf, pos_end - pos); char* temp = force_malloc_s(char, len + 1); @@ -374,11 +374,9 @@ static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgp return temp; } - -static void io_json_read_string(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +inline static void io_json_read_string(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { char* temp = io_json_read_string_inner(s, buf, msg, c); - if (temp) - msgpack_set_utf8_string(msg, name, temp); + *msg = msgpack(name, temp); free(temp); } @@ -393,8 +391,7 @@ inline static void io_json_read_skip_whitespace(stream* s, io_json_read_buffer* static void io_json_read_map(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { size_t i = 0; msgpack m; - msgpack_map map; - memset(&map, 0, sizeof(msgpack_map)); + msgpack_array map; if (*c != '}') { while (true) { io_json_read_skip_whitespace(s, buf, c); @@ -404,17 +401,17 @@ static void io_json_read_map(stream* s, io_json_read_buffer* buf, const char* na char* key = io_json_read_string_inner(s, buf, msg, c); if (!key) - goto End; + return; io_json_read_skip_whitespace(s, buf, c); if (*c != ':') { free(key); - goto End; + return; } io_json_read_skip_whitespace(s, buf, c); - msgpack* m = vector_old_msgpack_reserve_back(&map); - io_json_read_inner(s, buf, key, m, c); + map.push_back({}); + io_json_read_inner(s, buf, key, &map.back(), c); free(key); io_json_read_skip_whitespace(s, buf, c); @@ -422,27 +419,17 @@ static void io_json_read_map(stream* s, io_json_read_buffer* buf, const char* na if (*c == '}') break; else if (*c != ',') - goto End; + return; } - - goto Success; - - End: - msgpack_init_map(&m, 0); - msgpack_set_map(&m, 0, &map); - msgpack_free(&m); - return; } -Success: - msgpack_set_map(msg, name, &map); + *msg = msgpack(name, false, map); } static void io_json_read_array(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { size_t i = 0; msgpack m; msgpack_array array; - memset(&array, 0, sizeof(msgpack_array)); if (*c != ']') { while (true) { io_json_read_skip_whitespace(s, buf, c); @@ -450,30 +437,22 @@ static void io_json_read_array(stream* s, io_json_read_buffer* buf, const char* if (*c == ']') break; - msgpack* m = vector_old_msgpack_reserve_back(&array); - io_json_read_inner(s, buf, 0, m, c); + array.push_back({}); + io_json_read_inner(s, buf, 0, &array.back(), c); io_json_read_skip_whitespace(s, buf, c); if (*c == ']') break; else if (*c != ',') - goto End; + return; } - goto Success; - - End: - msgpack_init_map(&m, 0); - msgpack_set_array(&m, 0, &array); - msgpack_free(&m); - return; } -Success: - msgpack_set_array(msg, name, &array); + *msg = msgpack(name, true, array); } -static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +inline static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { if (*c != 't') { if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'a') return; @@ -483,7 +462,7 @@ static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const char* n return; if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'e') return; - msgpack_set_bool(msg, name, false); + *msg = msgpack(name, false); } else { if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'r') @@ -492,11 +471,11 @@ static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const char* n return; if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'e') return; - msgpack_set_bool(msg, name, true); + *msg = msgpack(name, true); } } -static void io_json_read_null(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +inline static void io_json_read_null(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'u') return; if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'l') @@ -504,7 +483,7 @@ static void io_json_read_null(stream* s, io_json_read_buffer* buf, const char* n if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'l') return; - msgpack_set_null(msg, name); + *msg = msgpack(name); } void io_json_write(stream* s, msgpack* msg) { @@ -518,7 +497,7 @@ void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { for (size_t i = 0; i < tabs; i++) io_write(s, " ", 2); - if (msg->name.length) { + if (msg->name.size()) { io_json_write_string(s, &msg->name); io_write(s, ": ", 2); } @@ -527,7 +506,7 @@ void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { case MSGPACK_NULL: io_json_write_null(s); break; - case MSGPACK_bool: + case MSGPACK_BOOL: io_json_write_bool(s, *MSGPACK_SELECT_PTR(bool, msg)); break; case MSGPACK_INT8: { @@ -561,15 +540,15 @@ void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { io_json_write_double_t(s, *MSGPACK_SELECT_PTR(double_t, msg)); break; case MSGPACK_STRING: - io_json_write_string(s, MSGPACK_SELECT_PTR(string, msg)); + io_json_write_string(s, MSGPACK_SELECT_PTR(std::string, msg)); break; case MSGPACK_ARRAY: { msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); io_write(s, "[\n", 2); - for (msgpack* i = ptr->begin; i != ptr->end; i++) { - io_json_write_inner(s, i, tabs + 1); - if (i + 1 != ptr->end) + for (msgpack& i : *ptr) { + io_json_write_inner(s, &i, tabs + 1); + if (&i + 1 != ptr->data() + ptr->size()) io_write_char(s, ','); io_write_char(s, '\n'); } @@ -579,12 +558,12 @@ void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { io_write_char(s, ']'); } break; case MSGPACK_MAP: { - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); io_write(s, "{\n", 2); - for (msgpack* i = ptr->begin; i != ptr->end; i++) { - io_json_write_inner(s, i, tabs + 1); - if (i + 1 != ptr->end) + for (msgpack& i : *ptr) { + io_json_write_inner(s, &i, tabs + 1); + if (&i + 1 != ptr->data() + ptr->size()) io_write_char(s, ','); io_write_char(s, '\n'); } @@ -596,113 +575,142 @@ void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { } } -static void io_json_write_null(stream* s) { +inline static void io_json_write_null(stream* s) { io_write(s, "null", 4); } -static void io_json_write_bool(stream* s, bool val) { +inline static void io_json_write_bool(stream* s, bool val) { if (val) io_write(s, "true", 4); else io_write(s, "false", 4); } -static void io_json_write_int8_t(stream* s, int8_t val) { +inline static void io_json_write_int8_t(stream* s, int8_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hhi", val); io_write(s, temp, len); } -static void io_json_write_uint8_t(stream* s, uint8_t val) { +inline static void io_json_write_uint8_t(stream* s, uint8_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hhu", val); io_write(s, temp, len); } -static void io_json_write_int16_t(stream* s, int16_t val) { +inline static void io_json_write_int16_t(stream* s, int16_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hi", val); io_write(s, temp, len); } -static void io_json_write_uint16_t(stream* s, uint16_t val) { +inline static void io_json_write_uint16_t(stream* s, uint16_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hu", val); io_write(s, temp, len); } -static void io_json_write_int32_t(stream* s, int32_t val) { +inline static void io_json_write_int32_t(stream* s, int32_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%i", val); io_write(s, temp, len); } -static void io_json_write_uint32_t(stream* s, uint32_t val) { +inline static void io_json_write_uint32_t(stream* s, uint32_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%u", val); io_write(s, temp, len); } -static void io_json_write_int64_t(stream* s, int64_t val) { +inline static void io_json_write_int64_t(stream* s, int64_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%lli", val); io_write(s, temp, len); } -static void io_json_write_uint64_t(stream* s, uint64_t val) { +inline static void io_json_write_uint64_t(stream* s, uint64_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%llu", val); io_write(s, temp, len); } -static void io_json_write_float_t(stream* s, float_t val) { +inline static void io_json_write_float_t(stream* s, float_t val) { char temp[0x40]; size_t len = sprintf_s(temp, 0x40, "%.15lg", (double_t)val); io_write(s, temp, len); } -static void io_json_write_double_t(stream* s, double_t val) { +inline static void io_json_write_double_t(stream* s, double_t val) { char temp[0x40]; size_t len = sprintf_s(temp, 0x40, "%.15lg", val); io_write(s, temp, len); } -static void io_json_write_string(stream* s, string* val) { - if (!string_data(val)) { - io_json_write_null(s); - return; - } - +inline static void io_json_write_string(stream* s, std::string* val) { io_write_char(s, '\"'); - char* str = string_data(val); - size_t len = val->length; - for (size_t i = 0; i < len; i++) { - char c = str[i]; - if (c == 0x22) - io_write(s, "\\\"", 2); - else if (c == 0x5C) - io_write(s, "\\\\", 2); - else if (c == 0x2F) - io_write(s, "\\/", 2); - else if (c == 0x08) - io_write(s, "\\b", 2); - else if (c == 0x0C) - io_write(s, "\\f", 2); - else if (c == 0x0A) - io_write(s, "\\n", 2); - else if (c == 0x0D) - io_write(s, "\\r", 2); - else if (c == 0x09) - io_write(s, "\\t", 2); - else if ((uint8_t)c < 0x20) { + const char* str = val->c_str(); + size_t len = val->size(); + for (size_t i = len; i; i--, str++) + switch (*str) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x0B: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: { io_write(s, "\\u", 2); char t[5]; - size_t len = sprintf_s(t, 5, "%04x", (wchar_t)c); + size_t len = sprintf_s(t, 5, "%04x", (wchar_t)*str); io_write(s, t, len); + } break; + case 0x08: + io_write(s, "\\b", 2); + break; + case 0x09: + io_write(s, "\\t", 2); + break; + case 0x0A: + io_write(s, "\\n", 2); + break; + case 0x0C: + io_write(s, "\\f", 2); + break; + case 0x0D: + io_write(s, "\\r", 2); + break; + case 0x22: + io_write(s, "\\\"", 2); + break; + case 0x5C: + io_write(s, "\\\\", 2); + break; + case 0x2F: + io_write(s, "\\/", 2); + break; + default: + io_write_char(s, *str); } - else - io_write_char(s, c); - } io_write_char(s, '\"'); } diff --git a/src/KKdLib/io/json.h b/src/KKdLib/io/json.hpp similarity index 89% rename from src/KKdLib/io/json.h rename to src/KKdLib/io/json.hpp index 6da6e7cc..bdaed444 100644 --- a/src/KKdLib/io/json.h +++ b/src/KKdLib/io/json.hpp @@ -6,7 +6,7 @@ #pragma once #include "../default.h" -#include "../msgpack.h" +#include "../msgpack.hpp" #include "stream.h" extern void io_json_read(stream* s, msgpack* msg); diff --git a/src/KKdLib/io/msgpack.c b/src/KKdLib/io/msgpack.cpp similarity index 68% rename from src/KKdLib/io/msgpack.c rename to src/KKdLib/io/msgpack.cpp index 0f5ec65f..191e2653 100644 --- a/src/KKdLib/io/msgpack.c +++ b/src/KKdLib/io/msgpack.cpp @@ -3,12 +3,12 @@ GitHub/GitLab: korenkonder */ -#include "msgpack.h" +#include "msgpack.hpp" -static void io_msgpack_read_inner(stream* s, char* name, msgpack* msg); -static void io_msgpack_read_string(stream* s, char* name, msgpack* msg, size_t length); -static void io_msgpack_read_array(stream* s, char* name, msgpack* msg, size_t length); -static void io_msgpack_read_map(stream* s, char* name, msgpack* msg, size_t length); +static void io_msgpack_read_inner(stream* s, const char* name, msgpack* msg); +static void io_msgpack_read_string(stream* s, const char* name, msgpack* msg, size_t length); +static void io_msgpack_read_array(stream* s, const char* name, msgpack* msg, size_t length); +static void io_msgpack_read_map(stream* s, const char* name, msgpack* msg, size_t length); static void io_msgpack_write_inner(stream* s, msgpack* msg); static void io_msgpack_write_null(stream* s); static void io_msgpack_write_bool(stream* s, bool val); @@ -22,7 +22,7 @@ static void io_msgpack_write_int64_t(stream* s, int64_t val); static void io_msgpack_write_uint64_t(stream* s, uint64_t val); static void io_msgpack_write_float_t(stream* s, float_t val); static void io_msgpack_write_double_t(stream* s, double_t val); -static void io_msgpack_write_string(stream* s, string* val); +static void io_msgpack_write_string(stream* s, std::string* val); static void io_msgpack_write_array(stream* s, size_t val); static void io_msgpack_write_map(stream* s, size_t val); @@ -30,15 +30,23 @@ void io_msgpack_read(stream* s, msgpack* msg) { io_msgpack_read_inner(s, 0, msg); } -static void io_msgpack_read_inner(stream* s, char* name, msgpack* msg) { +static void io_msgpack_read_inner(stream* s, const char* name, msgpack* msg) { uint8_t type = io_read_uint8_t(s); - msgpack_init_null(msg, name); + *msg = msgpack(name); switch (type >> 4) { - case 0x0: case 0x1: case 0x2: case 0x3: - case 0x4: case 0x5: case 0x6: case 0x7: - case 0xE: case 0xF: - msgpack_set_int8_t(msg, name, (int8_t)type); + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + case 0xE: + case 0xF: + default: + *msg = msgpack(name, (int8_t)type); return; case 0x8: io_msgpack_read_map(s, name, msg, type & 0x0F); @@ -46,17 +54,21 @@ static void io_msgpack_read_inner(stream* s, char* name, msgpack* msg) { case 0x9: io_msgpack_read_array(s, name, msg, type & 0x0F); return; - case 0xA: case 0xB: + case 0xA: + case 0xB: io_msgpack_read_string(s, name, msg, type & 0x1F); return; + case 0xC: + case 0xD: + break; } switch (type) { case 0xC2: - msgpack_set_bool(msg, name, false); + *msg = msgpack(name, false); break; case 0xC3: - msgpack_set_bool(msg, name, true); + *msg = msgpack(name, true); break; case 0xC4: io_set_position(s, io_read_uint8_t(s), SEEK_CUR); @@ -77,34 +89,34 @@ static void io_msgpack_read_inner(stream* s, char* name, msgpack* msg) { io_set_position(s, io_read_uint32_t_reverse_endianness(s, true) + 1ULL, SEEK_CUR); break; case 0xCA: - msgpack_set_float_t(msg, name, io_read_float_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_float_t_reverse_endianness(s, true)); break; case 0xCB: - msgpack_set_double_t(msg, name, io_read_double_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_double_t_reverse_endianness(s, true)); break; case 0xCC: - msgpack_set_uint8_t(msg, name, io_read_uint8_t(s)); + *msg = msgpack(name, io_read_uint8_t(s)); break; case 0xCD: - msgpack_set_uint16_t(msg, name, io_read_uint16_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_uint16_t_reverse_endianness(s, true)); break; case 0xCE: - msgpack_set_uint32_t(msg, name, io_read_uint32_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_uint32_t_reverse_endianness(s, true)); break; case 0xCF: - msgpack_set_uint64_t(msg, name, io_read_uint64_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_uint64_t_reverse_endianness(s, true)); break; case 0xD0: - msgpack_set_int8_t(msg, name, io_read_int8_t(s)); + *msg = msgpack(name, io_read_int8_t(s)); break; case 0xD1: - msgpack_set_int16_t(msg, name, io_read_int16_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_int16_t_reverse_endianness(s, true)); break; case 0xD2: - msgpack_set_int32_t(msg, name, io_read_int32_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_int32_t_reverse_endianness(s, true)); break; case 0xD3: - msgpack_set_int64_t(msg, name, io_read_int64_t_reverse_endianness(s, true)); + *msg = msgpack(name, io_read_int64_t_reverse_endianness(s, true)); break; case 0xD4: io_set_position(s, 2, SEEK_CUR); @@ -145,44 +157,32 @@ static void io_msgpack_read_inner(stream* s, char* name, msgpack* msg) { } } -static void io_msgpack_read_string(stream* s, char* name, msgpack* msg, size_t length) { - string str; +inline static void io_msgpack_read_string(stream* s, const char* name, msgpack* msg, size_t length) { + std::string str; io_read_string(s, &str, length); - msgpack_set_string(msg, name, &str); - string_free(&str); + *msg = msgpack(name, &str); } -static void io_msgpack_read_array(stream* s, char* name, msgpack* msg, size_t length) { - msgpack m; - msgpack_init_array(&m, 0, length); - msgpack_array* ptr = MSGPACK_SELECT(msgpack_array, m); +inline static void io_msgpack_read_array(stream* s, const char* name, msgpack* msg, size_t length) { + *msg = msgpack(name, true, length); + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); for (size_t i = 0; i < length; i++) - io_msgpack_read_inner(s, 0, &ptr->begin[i]); - msgpack_set_array(msg, name, ptr); - msgpack_free(&m); + io_msgpack_read_inner(s, 0, &ptr->data()[i]); } -static void io_msgpack_read_map(stream* s, char* name, msgpack* msg, size_t length) { - msgpack m; - msgpack_init_map(&m, 0); - msgpack_map* ptr = MSGPACK_SELECT(msgpack_map, m); - *ptr = vector_old_empty(msgpack); - vector_old_msgpack_reserve(ptr, length); +inline static void io_msgpack_read_map(stream* s, const char* name, msgpack* msg, size_t length) { + *msg = msgpack(name, false, length); + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); for (size_t i = 0; i < length; i++) { - msgpack t_m; - msgpack_init_null(&t_m, 0); + msgpack t_m = msgpack(); io_msgpack_read_inner(s, 0, &t_m); - char* n = 0; + const char* n = 0; if (t_m.type == MSGPACK_STRING) - n = string_data(MSGPACK_SELECT(string, t_m)); + n = MSGPACK_SELECT(std::string, t_m)->c_str(); - msgpack* m = vector_old_msgpack_reserve_back(ptr); - io_msgpack_read_inner(s, n, m); - msgpack_free(&t_m); + io_msgpack_read_inner(s, n, &ptr->data()[i]); } - msgpack_set_map(msg, name, ptr); - msgpack_free(&m); } void io_msgpack_write(stream* s, msgpack* msg) { @@ -193,14 +193,14 @@ void io_msgpack_write(stream* s, msgpack* msg) { } static void io_msgpack_write_inner(stream* s, msgpack* msg) { - if (msg->name.length) + if (msg->name.size()) io_msgpack_write_string(s, &msg->name); switch (msg->type) { case MSGPACK_NULL: io_msgpack_write_null(s); break; - case MSGPACK_bool: + case MSGPACK_BOOL: io_msgpack_write_bool(s, *MSGPACK_SELECT_PTR(bool, msg)); break; case MSGPACK_INT8: { @@ -234,44 +234,44 @@ static void io_msgpack_write_inner(stream* s, msgpack* msg) { io_msgpack_write_double_t(s, *MSGPACK_SELECT_PTR(double_t, msg)); break; case MSGPACK_STRING: - io_msgpack_write_string(s, MSGPACK_SELECT_PTR(string, msg)); + io_msgpack_write_string(s, MSGPACK_SELECT_PTR(std::string, msg)); break; case MSGPACK_ARRAY: { msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - io_msgpack_write_array(s, vector_old_length(*ptr)); - for (msgpack* i = ptr->begin; i != ptr->end; i++) - io_msgpack_write_inner(s, i); + io_msgpack_write_array(s, ptr->size()); + for (msgpack& i : *ptr) + io_msgpack_write_inner(s, &i); } break; case MSGPACK_MAP: { - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - io_msgpack_write_map(s, vector_old_length(*ptr)); - for (msgpack* i = ptr->begin; i != ptr->end; i++) - io_msgpack_write_inner(s, i); + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); + io_msgpack_write_map(s, ptr->size()); + for (msgpack& i : *ptr) + io_msgpack_write_inner(s, &i); } break; } } -static void io_msgpack_write_null(stream* s) { +inline static void io_msgpack_write_null(stream* s) { io_write_uint8_t(s, 0xC0); } -static void io_msgpack_write_bool(stream* s, bool val) { +inline static void io_msgpack_write_bool(stream* s, bool val) { io_write_uint8_t(s, val ? 0xC3 : 0xC2); } -static void io_msgpack_write_int8_t(stream* s, int8_t val) { +inline static void io_msgpack_write_int8_t(stream* s, int8_t val) { if (val < -0x20) io_write_uint8_t(s, 0xD0); io_write_int8_t(s, val); } -static void io_msgpack_write_uint8_t(stream* s, uint8_t val) { +inline static void io_msgpack_write_uint8_t(stream* s, uint8_t val) { if (val >= 0x80) io_write_uint8_t(s, 0xCC); io_write_uint8_t(s, val); } -static void io_msgpack_write_int16_t(stream* s, int16_t val) { +inline static void io_msgpack_write_int16_t(stream* s, int16_t val) { if ((int8_t)val == val) io_msgpack_write_int8_t(s, (int8_t)val); else if ((uint8_t)val == val) @@ -282,7 +282,7 @@ static void io_msgpack_write_int16_t(stream* s, int16_t val) { } } -static void io_msgpack_write_uint16_t(stream* s, uint16_t val) { +inline static void io_msgpack_write_uint16_t(stream* s, uint16_t val) { if ((uint8_t)val == val) io_msgpack_write_uint8_t(s, (uint8_t)val); else { @@ -291,7 +291,7 @@ static void io_msgpack_write_uint16_t(stream* s, uint16_t val) { } } -static void io_msgpack_write_int32_t(stream* s, int32_t val) { +inline static void io_msgpack_write_int32_t(stream* s, int32_t val) { if ((int16_t)val == val) io_msgpack_write_int16_t(s, (int16_t)val); else if ((uint16_t)val == val) @@ -302,7 +302,7 @@ static void io_msgpack_write_int32_t(stream* s, int32_t val) { } } -static void io_msgpack_write_uint32_t(stream* s, uint32_t val) { +inline static void io_msgpack_write_uint32_t(stream* s, uint32_t val) { if ((uint16_t)val == val) io_msgpack_write_uint16_t(s, (uint16_t)val); else { @@ -311,7 +311,7 @@ static void io_msgpack_write_uint32_t(stream* s, uint32_t val) { } } -static void io_msgpack_write_int64_t(stream* s, int64_t val) { +inline static void io_msgpack_write_int64_t(stream* s, int64_t val) { if ((int32_t)val == val) io_msgpack_write_int32_t(s, (int32_t)val); else if ((uint32_t)val == val) @@ -322,7 +322,7 @@ static void io_msgpack_write_int64_t(stream* s, int64_t val) { } } -static void io_msgpack_write_uint64_t(stream* s, uint64_t val) { +inline static void io_msgpack_write_uint64_t(stream* s, uint64_t val) { if ((uint32_t)val == val) io_msgpack_write_uint32_t(s, (uint32_t)val); else { @@ -331,8 +331,8 @@ static void io_msgpack_write_uint64_t(stream* s, uint64_t val) { } } -static void io_msgpack_write_float_t(stream* s, float_t val) { - if (*(uint32_t*)&val == 0x80000000) { +inline static void io_msgpack_write_float_t(stream* s, float_t val) { + if (val == -0.0f) { io_write_uint8_t(s, 0xCA); io_write_float_t_reverse_endianness(s, -0.0f, true); } @@ -344,8 +344,8 @@ static void io_msgpack_write_float_t(stream* s, float_t val) { } } -static void io_msgpack_write_double_t(stream* s, double_t val) { - if (*(uint64_t*)&val == 0x8000000000000000) { +inline static void io_msgpack_write_double_t(stream* s, double_t val) { + if (val == -0.0) { io_write_uint8_t(s, 0xCA); io_write_float_t_reverse_endianness(s, -0.0f, true); } @@ -359,13 +359,13 @@ static void io_msgpack_write_double_t(stream* s, double_t val) { } } -static void io_msgpack_write_string(stream* s, string* val) { +inline static void io_msgpack_write_string(stream* s, std::string* val) { if (!val) { io_msgpack_write_null(s); return; } - size_t len = val->length; + size_t len = val->size(); if (len < 0x20) io_write_uint8_t(s, 0xA0 | (len & 0x1F)); else if (len < 0x100) { @@ -380,10 +380,10 @@ static void io_msgpack_write_string(stream* s, string* val) { io_write_uint8_t(s, 0xDB); io_write_uint32_t_reverse_endianness(s, (uint32_t)len, true); } - io_write(s, string_data(val), len); + io_write(s, val->c_str(), len); } -static void io_msgpack_write_array(stream* s, size_t val) { +inline static void io_msgpack_write_array(stream* s, size_t val) { size_t len = val; if (!len) io_msgpack_write_null(s); @@ -399,7 +399,7 @@ static void io_msgpack_write_array(stream* s, size_t val) { } } -static void io_msgpack_write_map(stream* s, size_t val) { +inline static void io_msgpack_write_map(stream* s, size_t val) { size_t len = val; if (!len) io_msgpack_write_null(s); diff --git a/src/KKdLib/io/msgpack.h b/src/KKdLib/io/msgpack.hpp similarity index 89% rename from src/KKdLib/io/msgpack.h rename to src/KKdLib/io/msgpack.hpp index 6f92abee..fd4f2009 100644 --- a/src/KKdLib/io/msgpack.h +++ b/src/KKdLib/io/msgpack.hpp @@ -6,7 +6,7 @@ #pragma once #include "../default.h" -#include "../msgpack.h" +#include "../msgpack.hpp" #include "stream.h" extern void io_msgpack_read(stream* s, msgpack* msg); diff --git a/src/KKdLib/io/path.c b/src/KKdLib/io/path.c index 7bdd7b87..75d99e52 100644 --- a/src/KKdLib/io/path.c +++ b/src/KKdLib/io/path.c @@ -99,7 +99,7 @@ void path_get_files(std::vector* files, const char* path) { char* file_temp = utf16_to_utf8(fdata.cFileName); if (file_temp) - files->push_back(std::string(file_temp)); + files->push_back(file_temp); free(file_temp); } while (FindNextFileW(h, &fdata)); FindClose(h); @@ -217,7 +217,7 @@ void path_get_directories(std::vector* directories, char* directory_temp = utf16_to_utf8(fdata.cFileName); if (directory_temp) - directories->push_back(std::string(directory_temp)); + directories->push_back(directory_temp); free(directory_temp); } while (FindNextFileW(h, &fdata)); FindClose(h); @@ -367,8 +367,7 @@ void path_get_directories_recursive(std::vector* directories, } char* directory_temp = utf16_to_utf8(fdata.cFileName); - std::string directory = std::string(directory_temp); - temp_vec.push_back(directory); + temp_vec.push_back(directory_temp); free(directory_temp); } while (FindNextFileW(h, &fdata)); FindClose(h); diff --git a/src/KKdLib/io/stream.c b/src/KKdLib/io/stream.c index f79b357f..46bb0059 100644 --- a/src/KKdLib/io/stream.c +++ b/src/KKdLib/io/stream.c @@ -21,7 +21,7 @@ void io_open(stream* s, const char* path, const char* mode) { wchar_t* temp_mode = utf8_to_utf16((char*)mode); s->io.stream = _wfsopen(temp_path, temp_mode, _SH_DENYNO); s->type = s->io.stream ? ferror(s->io.stream) ? STREAM_NONE : STREAM_FILE : STREAM_NONE; - s->position_stack = vector_old_empty(ssize_t); + s->position_stack = vector_old_empty(int64_t); io_get_length(s); free(temp_path); free(temp_mode); @@ -34,27 +34,27 @@ void io_open(stream* s, const wchar_t* path, const wchar_t* mode) { s->io.stream = _wfsopen(path, mode, _SH_DENYNO); s->type = s->io.stream ? ferror(s->io.stream) ? STREAM_NONE : STREAM_FILE : STREAM_NONE; - s->position_stack = vector_old_empty(ssize_t); + s->position_stack = vector_old_empty(int64_t); io_get_length(s); } -void io_open(stream* s, const void* data, size_t length) { +void io_open(stream* s, const void* data, size_t size) { memset(s, 0, sizeof(stream)); - if (!data || !length) { + if (!data || !size) { s->type = STREAM_MEMORY; s->length = 0; return; } s->io.data.vec = vector_old_empty(uint8_t); - vector_old_uint8_t_reserve(&s->io.data.vec, length); + vector_old_uint8_t_reserve(&s->io.data.vec, size); if (s->io.data.vec.begin && data) - memcpy(s->io.data.vec.begin, data, length); + memcpy(s->io.data.vec.begin, data, size); s->io.data.data = s->io.data.vec.begin; - s->io.data.vec.end = s->io.data.vec.begin + length; + s->io.data.vec.end = s->io.data.vec.begin + size; s->type = STREAM_MEMORY; - s->position_stack = vector_old_empty(ssize_t); - s->length = length; + s->position_stack = vector_old_empty(int64_t); + s->length = size; } void io_open(stream* s, std::vector* data) { @@ -72,17 +72,17 @@ void io_open(stream* s, std::vector* data) { s->io.data.data = s->io.data.vec.begin; s->io.data.vec.end = s->io.data.vec.begin + data->size(); s->type = STREAM_MEMORY; - s->position_stack = vector_old_empty(ssize_t); + s->position_stack = vector_old_empty(int64_t); s->length = data->size(); } -void io_copy(stream* s, void** data, size_t* length) { - if (!s || !data || !length || s->type != STREAM_MEMORY) +void io_copy(stream* s, void** data, size_t* size) { + if (!s || !data || !size || s->type != STREAM_MEMORY) return; - *length = vector_old_length(s->io.data.vec); - *data = force_malloc(*length); - memcpy(*data, s->io.data.vec.begin, *length); + *size = vector_old_length(s->io.data.vec); + *data = force_malloc(*size); + memcpy(*data, s->io.data.vec.begin, *size); } void io_copy(stream* s, std::vector* data) { @@ -94,8 +94,8 @@ void io_copy(stream* s, std::vector* data) { memcpy(data->data(), s->io.data.vec.begin, length); } -void io_align_read(stream* s, ssize_t align) { - ssize_t position; +void io_align_read(stream* s, int64_t align) { + int64_t position; switch (s->type) { case STREAM_FILE: position = _ftelli64(s->io.stream); @@ -107,8 +107,8 @@ void io_align_read(stream* s, ssize_t align) { return; } - ssize_t capacity; - ssize_t temp_align = align - position % align; + int64_t capacity; + int64_t temp_align = align - position % align; if (align != temp_align) switch (s->type) { case STREAM_FILE: @@ -127,8 +127,8 @@ void io_align_read(stream* s, ssize_t align) { } } -void io_align_write(stream* s, ssize_t align) { - ssize_t position; +void io_align_write(stream* s, int64_t align) { + int64_t position; switch (s->type) { case STREAM_FILE: position = _ftelli64(s->io.stream); @@ -140,13 +140,13 @@ void io_align_write(stream* s, ssize_t align) { return; } - ssize_t capacity; - ssize_t temp_align = align - position % align; + int64_t capacity; + int64_t temp_align = align - position % align; if (align != temp_align) switch (s->type) { case STREAM_FILE: { memset(s->buf, 0, min(sizeof(s->buf), temp_align)); - ssize_t i = temp_align; + int64_t i = temp_align; while (i >= sizeof(s->buf)) { fwrite(s->buf, 1, sizeof(s->buf), s->io.stream); i -= sizeof(s->buf); @@ -179,7 +179,7 @@ int io_flush(stream* s) { } } -inline ssize_t io_get_length(stream* s) { +inline int64_t io_get_length(stream* s) { switch (s->type) { case STREAM_FILE: if (s->io.stream) { @@ -201,7 +201,7 @@ inline ssize_t io_get_length(stream* s) { return s->length; } -inline ssize_t io_get_position(stream* s) { +inline int64_t io_get_position(stream* s) { switch (s->type) { case STREAM_FILE: return _ftelli64(s->io.stream); @@ -212,8 +212,8 @@ inline ssize_t io_get_position(stream* s) { } } -int32_t io_set_position(stream* s, ssize_t pos, int32_t seek) { - ssize_t capacity; +int32_t io_set_position(stream* s, int64_t pos, int32_t seek) { + int64_t capacity; switch (s->type) { case STREAM_FILE: return _fseeki64(s->io.stream, pos, seek); @@ -270,8 +270,8 @@ int32_t io_set_position(stream* s, ssize_t pos, int32_t seek) { } } -inline int32_t io_position_push(stream* s, ssize_t pos, int32_t seek) { - *vector_old_ssize_t_reserve_back(&s->position_stack) = io_get_position(s); +inline int32_t io_position_push(stream* s, int64_t pos, int32_t seek) { + *vector_old_int64_t_reserve_back(&s->position_stack) = io_get_position(s); return io_set_position(s, pos, seek); } @@ -279,22 +279,22 @@ inline void io_position_pop(stream* s) { if (vector_old_length(s->position_stack) < 1) return; - ssize_t position = s->position_stack.end[-1]; - vector_old_ssize_t_pop_back(&s->position_stack, 0); + int64_t position = s->position_stack.end[-1]; + vector_old_int64_t_pop_back(&s->position_stack, 0); io_set_position(s, position, SEEK_SET); io_flush(s); } -inline ssize_t io_read(stream* s, ssize_t count) { +inline int64_t io_read(stream* s, int64_t count) { return io_read(s, (void*)0, count); } -ssize_t io_read(stream* s, void* buf, ssize_t count) { - ssize_t capacity; +int64_t io_read(stream* s, void* buf, int64_t count) { + int64_t capacity; switch (s->type) { case STREAM_FILE: if (!buf) { - ssize_t act_count = 0; + int64_t act_count = 0; while (count > 0) { act_count += fread(s->buf, 1, min(count, sizeof(s->buf)), s->io.stream); count -= sizeof(s->buf); @@ -319,17 +319,17 @@ ssize_t io_read(stream* s, void* buf, ssize_t count) { } } -inline ssize_t io_write(stream* s, ssize_t count) { +inline int64_t io_write(stream* s, int64_t count) { return io_write(s, (void*)0, count); } -ssize_t io_write(stream* s, void* buf, ssize_t count) { - ssize_t capacity; +int64_t io_write(stream* s, void* buf, int64_t count) { + int64_t capacity; switch (s->type) { case STREAM_FILE: if (!buf) { memset(s->buf, 0, sizeof(s->buf)); - ssize_t act_count = 0; + int64_t act_count = 0; while (count > 0) { act_count += fwrite(s->buf, 1, min(count, sizeof(s->buf)), s->io.stream); count -= sizeof(s->buf); @@ -341,7 +341,7 @@ ssize_t io_write(stream* s, void* buf, ssize_t count) { case STREAM_MEMORY: capacity = s->io.data.vec.capacity_end - s->io.data.data; if (capacity < count) { - ssize_t pos = s->io.data.data - s->io.data.vec.begin; + int64_t pos = s->io.data.data - s->io.data.vec.begin; vector_old_uint8_t_reserve(&s->io.data.vec, count + capacity); s->io.data.data = s->io.data.vec.begin + pos; } @@ -358,7 +358,7 @@ ssize_t io_write(stream* s, void* buf, ssize_t count) { } } -inline ssize_t io_write(stream* s, const void* buf, ssize_t count) { +inline int64_t io_write(stream* s, const void* buf, int64_t count) { return io_write(s, (void*)buf, count); } @@ -376,14 +376,14 @@ int32_t io_read_char(stream* s) { } int32_t io_write_char(stream* s, char c) { - ssize_t capacity; + int64_t capacity; switch (s->type) { case STREAM_FILE: return fputc(c, s->io.stream); case STREAM_MEMORY: capacity = s->io.data.vec.capacity_end - s->io.data.data; if (capacity < 1) { - ssize_t pos = s->io.data.data - s->io.data.vec.begin; + int64_t pos = s->io.data.data - s->io.data.vec.begin; vector_old_uint8_t_reserve(&s->io.data.vec, 1 - capacity); s->io.data.data = s->io.data.vec.begin + pos; } @@ -449,41 +449,41 @@ inline void io_read_wstring(stream* s, std::wstring* str, size_t length) { } inline void io_read_string_null_terminated(stream* s, string* str) { - ssize_t offset = io_get_position(s); - ssize_t length = 0; + int64_t offset = io_get_position(s); + int64_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_string_null_terminated(stream* s, std::string* str) { - ssize_t offset = io_get_position(s); - ssize_t length = 0; + int64_t offset = io_get_position(s); + int64_t length = 0; char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); *str = std::string(temp, length); free(temp); } inline void io_read_wstring_null_terminated(stream* s, wstring* str) { - ssize_t offset = io_get_position(s); - ssize_t length = 0; + int64_t offset = io_get_position(s); + int64_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_wstring_null_terminated(stream* s, std::wstring* str) { - ssize_t offset = io_get_position(s); - ssize_t length = 0; + int64_t offset = io_get_position(s); + int64_t length = 0; wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); *str = std::wstring(temp, length); free(temp); } inline void io_read_string_null_terminated_offset(stream* s, - ssize_t offset, string* str) { + int64_t offset, string* str) { if (offset) { - ssize_t length = 0; + int64_t length = 0; char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); string_init_length(str, temp, length); free(temp); @@ -493,21 +493,21 @@ inline void io_read_string_null_terminated_offset(stream* s, } inline void io_read_string_null_terminated_offset(stream* s, - ssize_t offset, std::string* str) { + int64_t offset, std::string* str) { if (offset) { - ssize_t length = 0; + int64_t length = 0; char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); *str = std::string(temp, length); free(temp); } else - *str = std::string(); + *str = {}; } inline void io_read_wstring_null_terminated_offset(stream* s, - ssize_t offset, wstring* str) { + int64_t offset, wstring* str) { if (offset) { - ssize_t length = 0; + int64_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); @@ -517,9 +517,9 @@ inline void io_read_wstring_null_terminated_offset(stream* s, } inline void io_read_wstring_null_terminated_offset(stream* s, - ssize_t offset, std::wstring* str) { + int64_t offset, std::wstring* str) { if (offset) { - ssize_t length = 0; + int64_t length = 0; wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); *str = std::wstring(temp, length); free(temp); @@ -529,38 +529,38 @@ 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); - ssize_t length = 0; + int64_t offset = io_get_position(s); + int64_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); - ssize_t length = 0; + int64_t offset = io_get_position(s); + int64_t length = 0; return io_read_utf16_string_null_terminated_offset_length(s, offset, &length); } -inline char* io_read_utf8_string_null_terminated_length(stream* s, ssize_t* length) { - ssize_t offset = io_get_position(s); +inline char* io_read_utf8_string_null_terminated_length(stream* s, int64_t* length) { + int64_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); +inline wchar_t* io_read_utf16_string_null_terminated_length(stream* s, int64_t* length) { + int64_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) { - ssize_t length = 0; +inline char* io_read_utf8_string_null_terminated_offset(stream* s, int64_t offset) { + int64_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) { - ssize_t length = 0; +inline wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, int64_t offset) { + int64_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) { +char* io_read_utf8_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length) { io_position_push(s, offset, SEEK_SET); size_t name_length = 0; @@ -584,7 +584,7 @@ char* io_read_utf8_string_null_terminated_offset_length(stream* s, ssize_t offse return str; } -wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, ssize_t offset, ssize_t* length) { +wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length) { io_position_push(s, offset, SEEK_SET); size_t name_length = 0; @@ -664,8 +664,8 @@ inline void io_write_utf16_string_null_terminated(stream* s, const wchar_t* str) io_write_uint16_t(s, 0); } -inline ssize_t io_read_offset(stream* s, int32_t offset, bool is_x) { - ssize_t val; +inline int64_t io_read_offset(stream* s, int32_t offset, bool is_x) { + int64_t val; if (!is_x) { val = io_read_int32_t_stream_reverse_endianness(s); if (val) @@ -679,7 +679,7 @@ inline ssize_t io_read_offset(stream* s, int32_t offset, bool is_x) { } inline int64_t io_read_offset_f2(stream* s, int32_t offset) { - ssize_t val = io_read_int32_t_stream_reverse_endianness(s); + int64_t val = io_read_int32_t_stream_reverse_endianness(s); if (val) val -= offset; return val; @@ -687,11 +687,11 @@ inline int64_t io_read_offset_f2(stream* s, int32_t offset) { inline int64_t io_read_offset_x(stream* s) { io_align_read(s, 0x08); - ssize_t val = io_read_int64_t_stream_reverse_endianness(s); + int64_t val = io_read_int64_t_stream_reverse_endianness(s); return val; } -inline void io_write_offset(stream* s, ssize_t val, int32_t offset, bool is_x) { +inline void io_write_offset(stream* s, int64_t val, int32_t offset, bool is_x) { if (!is_x) { if (val) val += offset; @@ -703,13 +703,13 @@ inline void io_write_offset(stream* s, ssize_t val, int32_t offset, bool is_x) { } } -inline void io_write_offset_f2(stream* s, ssize_t val, int32_t offset) { +inline void io_write_offset_f2(stream* s, int64_t val, int32_t offset) { if (val) val += offset; io_write_int32_t_stream_reverse_endianness(s, (int32_t)val); } -inline void io_write_offset_x(stream* s, ssize_t val) { +inline void io_write_offset_x(stream* s, int64_t val) { io_align_write(s, 0x08); io_write_int64_t_stream_reverse_endianness(s, val); } @@ -729,7 +729,7 @@ void io_free(stream* s) { vector_old_uint8_t_free(&s->io.data.vec, 0); break; } - vector_old_ssize_t_free(&s->position_stack, 0); + vector_old_int64_t_free(&s->position_stack, 0); memset(s, 0, sizeof(stream)); } diff --git a/src/KKdLib/io/stream.h b/src/KKdLib/io/stream.h index b266cf00..3003a219 100644 --- a/src/KKdLib/io/stream.h +++ b/src/KKdLib/io/stream.h @@ -27,32 +27,32 @@ struct stream { vector_old_uint8_t vec; } data; } io; - ssize_t length; + int64_t length; stream_type type; bool is_big_endian; - vector_old_ssize_t position_stack; + vector_old_int64_t position_stack; }; extern void io_open(stream* s); extern void io_open(stream* s, const char* path, const char* mode); extern void io_open(stream* s, const wchar_t* path, const wchar_t* mode); -extern void io_open(stream* s, const void* data, size_t length); +extern void io_open(stream* s, const void* data, size_t size); extern void io_open(stream* s, std::vector* data); -extern void io_copy(stream* s, void** data, size_t* length); +extern void io_copy(stream* s, void** data, size_t* size); extern void io_copy(stream* s, std::vector* data); -extern void io_align_read(stream* s, ssize_t align); -extern void io_align_write(stream* s, ssize_t align); +extern void io_align_read(stream* s, int64_t align); +extern void io_align_write(stream* s, int64_t align); extern int io_flush(stream* s); -extern ssize_t io_get_length(stream* s); -extern ssize_t io_get_position(stream* s); -extern int32_t io_set_position(stream* s, ssize_t pos, int32_t seek); -extern int32_t io_position_push(stream* s, ssize_t pos, int32_t seek); +extern int64_t io_get_length(stream* s); +extern int64_t io_get_position(stream* s); +extern int32_t io_set_position(stream* s, int64_t pos, int32_t seek); +extern int32_t io_position_push(stream* s, int64_t pos, int32_t seek); extern void io_position_pop(stream* s); -extern ssize_t io_read(stream* s, ssize_t count); -extern ssize_t io_read(stream* s, void* buf, ssize_t count); -extern ssize_t io_write(stream* s, ssize_t count); -extern ssize_t io_write(stream* s, void* buf, ssize_t count); -extern ssize_t io_write(stream* s, const void* buf, ssize_t count); +extern int64_t io_read(stream* s, int64_t count); +extern int64_t io_read(stream* s, void* buf, int64_t count); +extern int64_t io_write(stream* s, int64_t count); +extern int64_t io_write(stream* s, void* buf, int64_t count); +extern int64_t io_write(stream* s, const void* buf, int64_t count); extern int32_t io_read_char(stream* s); extern int32_t io_write_char(stream* s, char c); @@ -69,18 +69,18 @@ extern void io_read_string_null_terminated(stream* s, string* str); extern void io_read_string_null_terminated(stream* s, std::string* str); extern void io_read_wstring_null_terminated(stream* s, wstring* str); extern void io_read_wstring_null_terminated(stream* s, std::wstring* str); -extern void io_read_string_null_terminated_offset(stream* s, ssize_t offset, string* str); -extern void io_read_string_null_terminated_offset(stream* s, ssize_t offset, std::string* str); -extern void io_read_wstring_null_terminated_offset(stream* s, ssize_t offset, wstring* str); -extern void io_read_wstring_null_terminated_offset(stream* s, ssize_t offset, std::wstring* str); +extern void io_read_string_null_terminated_offset(stream* s, int64_t offset, string* str); +extern void io_read_string_null_terminated_offset(stream* s, int64_t offset, std::string* str); +extern void io_read_wstring_null_terminated_offset(stream* s, int64_t offset, wstring* str); +extern void io_read_wstring_null_terminated_offset(stream* s, int64_t offset, std::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 char* io_read_utf8_string_null_terminated_length(stream* s, int64_t* length); +extern wchar_t* io_read_utf16_string_null_terminated_length(stream* s, int64_t* length); +extern char* io_read_utf8_string_null_terminated_offset(stream* s, int64_t offset); +extern wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, int64_t offset); +extern char* io_read_utf8_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length); +extern wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length); extern void io_write_string(stream* s, string* str); extern void io_write_string(stream* s, std::string* str); extern void io_write_wstring(stream* s, wstring* str); @@ -93,12 +93,12 @@ extern void io_write_utf8_string(stream* s, const char* str); extern void io_write_utf16_string(stream* s, const wchar_t* str); extern void io_write_utf8_string_null_terminated(stream* s, const char* str); extern void io_write_utf16_string_null_terminated(stream* s, const wchar_t* str); -extern ssize_t io_read_offset(stream* s, int32_t offset, bool is_x); -extern ssize_t io_read_offset_f2(stream* s, int32_t offset); -extern ssize_t io_read_offset_x(stream* s); -extern void io_write_offset(stream* s, ssize_t val, int32_t offset, bool is_x); -extern void io_write_offset_f2(stream* s, ssize_t val, int32_t offset); -extern void io_write_offset_x(stream* s, ssize_t val); +extern int64_t io_read_offset(stream* s, int32_t offset, bool is_x); +extern int64_t io_read_offset_f2(stream* s, int32_t offset); +extern int64_t io_read_offset_x(stream* s); +extern void io_write_offset(stream* s, int64_t val, int32_t offset, bool is_x); +extern void io_write_offset_f2(stream* s, int64_t val, int32_t offset); +extern void io_write_offset_x(stream* s, int64_t val); extern void io_free(stream* s); #define io_read_write(t) \ diff --git a/src/KKdLib/key_val.c b/src/KKdLib/key_val.cpp similarity index 92% rename from src/KKdLib/key_val.c rename to src/KKdLib/key_val.cpp index 58865925..cf706167 100644 --- a/src/KKdLib/key_val.c +++ b/src/KKdLib/key_val.cpp @@ -3,12 +3,12 @@ GitHub/GitLab: korenkonder */ -#include "key_val.h" +#include "key_val.hpp" #include "io/path.h" -#include "hash.h" +#include "hash.hpp" #include "str_utils.h" -static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length); +static int64_t key_val_get_key_index(key_val* kv, char* str, size_t length); static void key_val_sort(key_val* kv); key_val::key_val() : buf() { @@ -104,13 +104,13 @@ bool key_val::has_key(const char* str) { return false; } -void key_val::parse(uint8_t* data, size_t length) { - if (!data || !length) +void key_val::parse(void* data, size_t size) { + if (!data || !size) return; char** lines; size_t count; - if (!str_utils_text_file_parse(data, length, &buf, &lines, &count)) + if (!str_utils_text_file_parse(data, size, &buf, &lines, &count)) return; key.reserve(count); @@ -153,7 +153,7 @@ bool key_val::read_bool(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = false; @@ -168,7 +168,7 @@ bool key_val::read_float_t(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0.0f; @@ -183,7 +183,7 @@ bool key_val::read_int32_t(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0; @@ -198,7 +198,7 @@ bool key_val::read_uint32_t(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0; @@ -213,7 +213,7 @@ bool key_val::read_string(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = string_empty; @@ -228,10 +228,10 @@ bool key_val::read_string(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { - *value = std::string(); + *value = {}; return false; } *value = std::string(val[index], val_len[index]); @@ -243,7 +243,7 @@ bool key_val::read_string(char* buf, size_t offset, memcpy(buf + offset, str_add, str_add_len); offset += str_add_len - 1; - ssize_t index = key_val_get_key_index(this, buf, offset); + int64_t index = key_val_get_key_index(this, buf, offset); buf[offset - (str_add_len - 1)] = 0; if (index == -1) { *value = 0; @@ -326,6 +326,18 @@ void key_val::get_lexicographic_order(std::vector* vec, int32_t length) } } +bool key_val::load_file(void* data, const char* path, const char* file, uint32_t hash) { + string s; + string_init(&s, path); + string_add(&s, file); + + key_val* kv = (key_val*)data; + kv->file_read(string_data(&s)); + + string_free(&s); + return kv->buf ? true : false; +} + void key_val::write_bool(stream* s, char* buf, size_t offset, const char* str_add, size_t str_add_len, bool value) { if (!value) @@ -429,7 +441,7 @@ void key_val::write_vec3(stream* s, char* buf, write_float_t(s, buf, offset, ".z", 3, value.z); } -static ssize_t key_val_get_key_index(key_val* kv, char* str, size_t length) { +static int64_t key_val_get_key_index(key_val* kv, char* str, size_t length) { if (kv->key_hash.size() < 1) return -1; @@ -498,7 +510,7 @@ static void key_val_sort(key_val* kv) { for (size_t i = 1; i < RADIX; i++) c[i] += c[i - 1]; - for (ssize_t i = count - 1; i >= 0; i--) { + for (int64_t i = count - 1; i >= 0; i--) { size_t index = --c[(arr_key_hash[i] >> s) & (RADIX - 1)]; o_key_hash[index] = arr_key_hash[i]; o_key_index[index] = arr_key_index[i]; diff --git a/src/KKdLib/key_val.h b/src/KKdLib/key_val.hpp similarity index 95% rename from src/KKdLib/key_val.h rename to src/KKdLib/key_val.hpp index ce3538aa..c4239ad1 100644 --- a/src/KKdLib/key_val.h +++ b/src/KKdLib/key_val.hpp @@ -28,7 +28,7 @@ struct key_val { void file_read(const wchar_t* path); bool get_local_key_val(const char* str, key_val* lkv); bool has_key(const char* str); - void parse(uint8_t* data, size_t length); + void parse(void* data, size_t size); bool read_bool(char* buf, size_t offset, const char* str_add, size_t str_add_len, bool* value); bool read_float_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, float_t* value); bool read_int32_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, int32_t* value); @@ -39,6 +39,7 @@ struct key_val { bool read_vec3(char* buf, size_t offset, const char* str_add, size_t str_add_len, vec3* value); static void get_lexicographic_order(std::vector* vec, int32_t length); + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); static void write_bool(stream* s, char* buf, size_t offset, const char* str_add, size_t str_add_len, bool value); static void write_float_t(stream* s, char* buf, @@ -55,4 +56,5 @@ struct key_val { size_t offset, const char* str_add, size_t str_add_len, const char* value); static void write_vec3(stream* s, char* buf, size_t offset, const char* str_add, size_t str_add_len, vec3& value); + }; diff --git a/src/KKdLib/light_param/face.c b/src/KKdLib/light_param/face.cpp similarity index 94% rename from src/KKdLib/light_param/face.c rename to src/KKdLib/light_param/face.cpp index 21f52091..5c01ee74 100644 --- a/src/KKdLib/light_param/face.c +++ b/src/KKdLib/light_param/face.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "face.h" +#include "face.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../str_utils.h" @@ -42,9 +42,9 @@ void light_param_face::read(const wchar_t* path) { free(path_txt); } -void light_param_face::read(const void* data, size_t length) { +void light_param_face::read(const void* data, size_t size) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); light_param_face_read_inner(this, &s); io_free(&s); } @@ -75,14 +75,14 @@ void light_param_face::write(const wchar_t* path) { free(path_txt); } -void light_param_face::write(void** data, size_t* length) { +void light_param_face::write(void** data, size_t* size) { if (!data || !ready) return; stream s; io_open(&s); light_param_face_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -97,14 +97,11 @@ bool light_param_face::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); light_param_face* face = (light_param_face*)data; - face->read(string_data(&s)); + face->read(s.c_str()); - string_free(&s); return face->ready; } diff --git a/src/KKdLib/light_param/face.h b/src/KKdLib/light_param/face.hpp similarity index 84% rename from src/KKdLib/light_param/face.h rename to src/KKdLib/light_param/face.hpp index fc711d2f..0d692cbb 100644 --- a/src/KKdLib/light_param/face.h +++ b/src/KKdLib/light_param/face.hpp @@ -19,10 +19,10 @@ struct light_param_face { light_param_face(); void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); ~light_param_face(); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); diff --git a/src/KKdLib/light_param/fog.c b/src/KKdLib/light_param/fog.cpp similarity index 95% rename from src/KKdLib/light_param/fog.c rename to src/KKdLib/light_param/fog.cpp index a7e0407e..16bddeac 100644 --- a/src/KKdLib/light_param/fog.c +++ b/src/KKdLib/light_param/fog.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "fog.h" +#include "fog.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../str_utils.h" @@ -46,9 +46,9 @@ void light_param_fog::read(const wchar_t* path) { free(path_txt); } -void light_param_fog::read(const void* data, size_t length) { +void light_param_fog::read(const void* data, size_t size) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); light_param_fog_read_inner(this, &s); io_free(&s); } @@ -79,14 +79,14 @@ void light_param_fog::write(const wchar_t* path) { free(path_txt); } -void light_param_fog::write(void** data, size_t* length) { +void light_param_fog::write(void** data, size_t* size) { if (!data || !ready) return; stream s; io_open(&s); light_param_fog_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -97,14 +97,11 @@ bool light_param_fog::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); light_param_fog* fog = (light_param_fog*)data; - fog->read(string_data(&s)); + fog->read(s.c_str()); - string_free(&s); return fog->ready; } diff --git a/src/KKdLib/light_param/fog.h b/src/KKdLib/light_param/fog.hpp similarity index 91% rename from src/KKdLib/light_param/fog.h rename to src/KKdLib/light_param/fog.hpp index 7b5f6387..b587c7cd 100644 --- a/src/KKdLib/light_param/fog.h +++ b/src/KKdLib/light_param/fog.hpp @@ -47,10 +47,10 @@ struct light_param_fog { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/light_param/glow.c b/src/KKdLib/light_param/glow.cpp similarity index 97% rename from src/KKdLib/light_param/glow.c rename to src/KKdLib/light_param/glow.cpp index 418cec5b..fc02f9ce 100644 --- a/src/KKdLib/light_param/glow.c +++ b/src/KKdLib/light_param/glow.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "glow.h" +#include "glow.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../str_utils.h" @@ -50,9 +50,9 @@ void light_param_glow::read(const wchar_t* path) { free(path_txt); } -void light_param_glow::read(const void* data, size_t length) { +void light_param_glow::read(const void* data, size_t size) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); light_param_glow_read_inner(this, &s); io_free(&s); } @@ -83,14 +83,14 @@ void light_param_glow::write(const wchar_t* path) { free(path_txt); } -void light_param_glow::write(void** data, size_t* length) { +void light_param_glow::write(void** data, size_t* size) { if (!data || !ready) return; stream s; io_open(&s); light_param_glow_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -101,14 +101,11 @@ bool light_param_glow::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); light_param_glow* glow = (light_param_glow*)data; - glow->read(string_data(&s)); + glow->read(s.c_str()); - string_free(&s); return glow->ready; } diff --git a/src/KKdLib/light_param/glow.h b/src/KKdLib/light_param/glow.hpp similarity index 92% rename from src/KKdLib/light_param/glow.h rename to src/KKdLib/light_param/glow.hpp index a4342e1d..f1be1a00 100644 --- a/src/KKdLib/light_param/glow.h +++ b/src/KKdLib/light_param/glow.hpp @@ -47,10 +47,10 @@ struct light_param_glow { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/light_param/ibl.c b/src/KKdLib/light_param/ibl.cpp similarity index 98% rename from src/KKdLib/light_param/ibl.c rename to src/KKdLib/light_param/ibl.cpp index ad10bba4..feea4f20 100644 --- a/src/KKdLib/light_param/ibl.c +++ b/src/KKdLib/light_param/ibl.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "ibl.h" +#include "ibl.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../str_utils.h" @@ -45,9 +45,9 @@ void light_param_ibl::read(const wchar_t* path) { free(path_ibl); } -void light_param_ibl::read(const void* data, size_t length) { +void light_param_ibl::read(const void* data, size_t size) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); light_param_ibl_read_inner(this, &s); io_free(&s); } @@ -59,14 +59,11 @@ bool light_param_ibl::load_file(void* data, const char* path, const char* file, if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); light_param_ibl* ibl = (light_param_ibl*)data; - ibl->read(string_data(&s)); + ibl->read(s.c_str()); - string_free(&s); return ibl->ready; } diff --git a/src/KKdLib/light_param/ibl.h b/src/KKdLib/light_param/ibl.hpp similarity index 95% rename from src/KKdLib/light_param/ibl.h rename to src/KKdLib/light_param/ibl.hpp index 468e625b..b89ef077 100644 --- a/src/KKdLib/light_param/ibl.h +++ b/src/KKdLib/light_param/ibl.hpp @@ -42,7 +42,7 @@ struct light_param_ibl { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/light_param/light.c b/src/KKdLib/light_param/light.cpp similarity index 97% rename from src/KKdLib/light_param/light.c rename to src/KKdLib/light_param/light.cpp index 2c213ab5..98c53e78 100644 --- a/src/KKdLib/light_param/light.c +++ b/src/KKdLib/light_param/light.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "light.h" +#include "light.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../str_utils.h" @@ -46,9 +46,9 @@ void light_param_light::read(const wchar_t* path) { free(path_txt); } -void light_param_light::read(const void* data, size_t length) { +void light_param_light::read(const void* data, size_t size) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); light_param_light_read_inner(this, &s); io_free(&s); } @@ -79,14 +79,14 @@ void light_param_light::write(const wchar_t* path) { free(path_txt); } -void light_param_light::write(void** data, size_t* length) { +void light_param_light::write(void** data, size_t* size) { if (!data || !ready) return; stream s; io_open(&s); light_param_light_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } @@ -97,14 +97,11 @@ bool light_param_light::load_file(void* data, const char* path, const char* file if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); light_param_light* light = (light_param_light*)data; - light->read(string_data(&s)); + light->read(s.c_str()); - string_free(&s); return light->ready; } diff --git a/src/KKdLib/light_param/light.h b/src/KKdLib/light_param/light.hpp similarity index 94% rename from src/KKdLib/light_param/light.h rename to src/KKdLib/light_param/light.hpp index 1efe6549..ce795f4c 100644 --- a/src/KKdLib/light_param/light.h +++ b/src/KKdLib/light_param/light.hpp @@ -77,10 +77,10 @@ struct light_param_light { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/light_param/wind.c b/src/KKdLib/light_param/wind.cpp similarity index 96% rename from src/KKdLib/light_param/wind.c rename to src/KKdLib/light_param/wind.cpp index 11ccd083..fc60f91a 100644 --- a/src/KKdLib/light_param/wind.c +++ b/src/KKdLib/light_param/wind.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "wind.h" +#include "wind.hpp" #include "../io/path.h" #include "../io/stream.h" #include "../str_utils.h" @@ -47,9 +47,9 @@ void light_param_wind::read(const wchar_t* path) { free(path_txt); } -void light_param_wind::read(const void* data, size_t length) { +void light_param_wind::read(const void* data, size_t size) { stream s; - io_open(&s, data, length); + io_open(&s, data, size); light_param_wind_read_inner(this, &s); io_free(&s); } @@ -80,14 +80,14 @@ void light_param_wind::write(const wchar_t* path) { free(path_txt); } -void light_param_wind::write(void** data, size_t* length) { - if (!data || !ready) +void light_param_wind::write(void** data, size_t* size) { + if (!data || !size || !ready) return; stream s; io_open(&s); light_param_wind_write_inner(this, &s); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } diff --git a/src/KKdLib/light_param/wind.h b/src/KKdLib/light_param/wind.hpp similarity index 89% rename from src/KKdLib/light_param/wind.h rename to src/KKdLib/light_param/wind.hpp index f488569b..8a306912 100644 --- a/src/KKdLib/light_param/wind.h +++ b/src/KKdLib/light_param/wind.hpp @@ -36,10 +36,10 @@ struct light_param_wind { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); void write(const char* path); void write(const wchar_t* path); - void write(void** data, size_t* length); + void write(void** data, size_t* size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/mot.c b/src/KKdLib/mot.cpp similarity index 72% rename from src/KKdLib/mot.c rename to src/KKdLib/mot.cpp index 9e852ad3..0875b39f 100644 --- a/src/KKdLib/mot.c +++ b/src/KKdLib/mot.cpp @@ -3,12 +3,12 @@ GitHub/GitLab: korenkonder */ -#include "mot.h" -#include "f2/struct.h" +#include "mot.hpp" +#include "f2/struct.hpp" #include "io/path.h" #include "io/stream.h" #include "half_t.h" -#include "hash.h" +#include "hash.hpp" #include "str_utils.h" struct mot_header_classic { @@ -29,325 +29,11 @@ struct mot_header_modern { int32_t bone_info_count; }; -static bool mot_classic_read_inner(mot_set* ms, stream* s); +static void mot_classic_read_inner(mot_set* ms, stream* s); static void mot_classic_write_inner(mot_set* ms, stream* s); -static bool mot_modern_read_inner(mot_set* ms, stream* s); +static void mot_modern_read_inner(mot_set* ms, stream* s); static void mot_modern_write_inner(mot_set* ms, stream* s); -mot_set_farc::mot_set_farc() : ready(), modern() { - -} - -mot_set_farc::~mot_set_farc() { - -} - -void mot_set_farc::read(const char* path, bool modern) { - if (!path) - return; - - char* path_farc = str_utils_add(path, ".farc"); - if (path_check_file_exists(path_farc)) { - farc f; - f.read(path_farc, true, false); - - vec.reserve(f.files.size()); - if (!modern) - for (farc_file& i : f.files) { - if (!i.data || !i.size - || str_utils_compare_length(i.name.c_str(), i.name.size(), "mot_", 4) - || !str_utils_check_ends_with(i.name.c_str(), ".bin")) - continue; - - mot_set ms; - - stream s; - io_open(&s, i.data, i.size); - bool ret = mot_classic_read_inner(&ms, &s); - io_free(&s); - - if (!ret) - continue; - - ms.name = std::string(i.name.c_str(), i.name.size() - 4); - vec.push_back(ms); - ready = true; - modern = false; - } - else - for (farc_file& i : f.files) { - if (!i.data || !i.size - || !str_utils_check_ends_with(i.name.c_str(), ".mot")) - continue; - - mot_set ms; - - stream s; - io_open(&s, i.data, i.size); - bool ret = mot_classic_read_inner(&ms, &s); - io_free(&s); - - if (!ret) - continue; - - ms.name = std::string(i.name.c_str(), i.name.size() - 4); - vec.push_back(ms); - ready = true; - modern = true; - } - } - free(path_farc); -} - -void mot_set_farc::read(const wchar_t* path, bool modern) { - if (!path) - return; - - wchar_t* path_farc = str_utils_add(path, L".farc"); - if (path_check_file_exists(path_farc)) { - farc f; - f.read(path_farc, true, false); - - vec.reserve(f.files.size()); - if (!modern) - for (farc_file& i : f.files) { - if (!i.data || !i.size - || str_utils_compare_length(i.name.c_str(), i.name.size(), "mot_", 4) - || !str_utils_check_ends_with(i.name.c_str(), ".bin")) - continue; - - mot_set ms; - - stream s; - io_open(&s, i.data, i.size); - bool ret = mot_classic_read_inner(&ms, &s); - io_free(&s); - - if (!ret) - continue; - - ms.name = std::string(i.name.c_str(), i.name.size() - 4); - vec.push_back(ms); - ready = true; - modern = false; - } - else - for (farc_file& i : f.files) { - if (!i.data || !i.size - || !str_utils_check_ends_with(i.name.c_str(), ".mot")) - continue; - - mot_set ms; - - stream s; - io_open(&s, i.data, i.size); - bool ret = mot_classic_read_inner(&ms, &s); - io_free(&s); - - if (!ret) - continue; - - ms.name = std::string(i.name.c_str(), i.name.size() - 4); - vec.push_back(ms); - ready = true; - modern = true; - } - } - free(path_farc); -} - -void mot_set_farc::read(const void* data, size_t length, bool modern) { - if (!data || !length) - return; - - farc f; - f.read(data, length, true); - - vec.reserve(f.files.size()); - if (!modern) - for (farc_file& i : f.files) { - if (!i.data || !i.size - || str_utils_compare_length(i.name.c_str(), i.name.size(), "mot_", 4) - || !str_utils_check_ends_with(i.name.c_str(), ".bin")) - continue; - - mot_set ms; - - stream s; - io_open(&s, i.data, i.size); - bool ret = mot_classic_read_inner(&ms, &s); - io_free(&s); - - if (!ret) - continue; - - ms.name = std::string(i.name.c_str(), i.name.size() - 4); - vec.push_back(ms); - ready = true; - modern = false; - } - else - for (farc_file& i : f.files) { - if (!i.data || !i.size - || !str_utils_check_ends_with(i.name.c_str(), ".mot")) - continue; - - mot_set ms; - - stream s; - io_open(&s, i.data, i.size); - bool ret = mot_classic_read_inner(&ms, &s); - io_free(&s); - - if (!ret) - continue; - - ms.name = std::string(i.name.c_str(), i.name.size() - 4); - vec.push_back(ms); - ready = true; - modern = true; - } -} - -void mot_set_farc::write(const char* path, farc_compress_mode mode) { - if (!path || !ready) - return; - - char* path_farc = str_utils_add(path, ".farc"); - - farc f; - if (!modern) - for (mot_set& i : vec) { - f.add_file(); - farc_file* ff = &f.files.back(); - - stream s; - io_open(&s); - mot_classic_write_inner(&i, &s); - io_align_write(&s, 0x10); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); - - ff->name = i.name; - ff->name += ".bin"; - } - else - for (mot_set& i : vec) { - f.add_file(); - farc_file* ff = &f.files.back(); - - stream s; - io_open(&s); - mot_modern_write_inner(&i, &s); - io_align_write(&s, 0x10); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); - - ff->name = i.name; - ff->name += ".mot"; - - } - f.write(path_farc, mode, false); - free(path_farc); -} - -void mot_set_farc::write(const wchar_t* path, farc_compress_mode mode) { - if (!path || !ready) - return; - - wchar_t* path_farc = str_utils_add(path, L".farc"); - - farc f; - if (!modern) - for (mot_set& i : vec) { - f.add_file(); - farc_file* ff = &f.files.back(); - - stream s; - io_open(&s); - mot_classic_write_inner(&i, &s); - io_align_write(&s, 0x10); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); - - ff->name = i.name; - ff->name += ".bin"; - } - else - for (mot_set& i : vec) { - f.add_file(); - farc_file* ff = &f.files.back(); - - stream s; - io_open(&s); - mot_modern_write_inner(&i, &s); - io_align_write(&s, 0x10); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); - - ff->name = i.name; - ff->name += ".mot"; - } - f.write(path_farc, mode, false); - free(path_farc); -} - -void mot_set_farc::write(void** data, size_t* length, farc_compress_mode mode) { - if (!data || !ready) - return; - - farc f; - if (!modern) - for (mot_set& i : vec) { - f.add_file(); - farc_file* ff = &f.files.back(); - - stream s; - io_open(&s); - mot_classic_write_inner(&i, &s); - io_align_write(&s, 0x10); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); - - ff->name = i.name; - ff->name += ".bin"; - } - else - for (mot_set& i : vec) { - f.add_file(); - farc_file* ff = &f.files.back(); - - stream s; - io_open(&s); - mot_modern_write_inner(&i, &s); - io_align_write(&s, 0x10); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); - - ff->name = i.name; - ff->name += ".mot"; - } - f.write(data, length, mode); -} - -bool mot_set_farc::load_file(void* data, const char* path, const char* file, uint32_t hash) { - size_t file_len = utf8_length(file); - - const char* t = strrchr(file, '.'); - if (t) - file_len = t - file; - - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); - - mot_set_farc* msf = (mot_set_farc*)data; - msf->read(string_data(&s), msf->modern); - - string_free(&s); - return msf->ready; -} - mot_bone_info::mot_bone_info() : index() { } @@ -373,7 +59,7 @@ mot_data::~mot_data() { } -mot_set::mot_set() : is_x() { +mot_set::mot_set() : ready(), modern(), is_x() { } @@ -381,7 +67,34 @@ mot_set::~mot_set() { } -static bool mot_classic_read_inner(mot_set* ms, stream* s) { +void mot_set::pack_file(void** data, size_t* size) { + if (!data || !size || !ready) + return; + + stream s; + io_open(&s); + if (!modern) + mot_classic_write_inner(this, &s); + else + mot_modern_write_inner(this, &s); + io_copy(&s, data, size); + io_free(&s); +} + +void mot_set::unpack_file(const void* data, size_t size, bool modern) { + if (!data || !size) + return; + + stream s; + io_open(&s, data, size); + if (!modern) + mot_classic_read_inner(this, &s); + else + mot_modern_read_inner(this, &s); + io_free(&s); +} + +static void mot_classic_read_inner(mot_set* ms, stream* s) { size_t count = 0; while (io_read_uint64_t(s) != 0) { io_read_uint64_t(s); @@ -389,8 +102,9 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { } if (count == 0) { + ms->ready = false; + ms->modern = false; ms->is_x = false; - return false; } io_set_position(s, 0x00, SEEK_SET); @@ -472,8 +186,9 @@ static bool mot_classic_read_inner(mot_set* ms, stream* s) { } free(mh); + ms->ready = true; + ms->modern = false; ms->is_x = false; - return true; } static void mot_classic_write_inner(mot_set* ms, stream* s) { @@ -538,7 +253,7 @@ static void mot_classic_write_inner(mot_set* ms, stream* s) { io_write_uint16_t(s, 0x00); io_write_uint16_t(s, 0x00); } - io_align_write(s, 0x04); + io_align_write(s, 0x10); io_set_position(s, 0x00, SEEK_SET); for (size_t i = 0; i < count; i++) { @@ -550,12 +265,15 @@ static void mot_classic_write_inner(mot_set* ms, stream* s) { free(mh); } -static bool mot_modern_read_inner(mot_set* ms, stream* s) { +static void mot_modern_read_inner(mot_set* ms, stream* s) { bool ret = false; f2_struct st; st.read(s); - if (st.header.signature != reverse_endianness_uint32_t('MOTC') || !st.data.size()) - return false; + if (st.header.signature != reverse_endianness_uint32_t('MOTC') || !st.data.size()) { + ms->ready = false; + ms->modern = false; + ms->is_x = false; + } stream s_motc; io_open(&s_motc, &st.data); @@ -676,8 +394,9 @@ static bool mot_modern_read_inner(mot_set* ms, stream* s) { io_free(&s_motc); + ms->ready = true; + ms->modern = true; ms->is_x = is_x; - return true; } static void mot_modern_write_inner(mot_set* ms, stream* s) { diff --git a/src/KKdLib/mot.h b/src/KKdLib/mot.hpp similarity index 69% rename from src/KKdLib/mot.h rename to src/KKdLib/mot.hpp index 39b05556..d2dab167 100644 --- a/src/KKdLib/mot.h +++ b/src/KKdLib/mot.hpp @@ -5,11 +5,10 @@ #pragma once +#include +#include #include "default.h" -#include "farc.h" -#include "string.h" #include "vec.h" -#include "vector.h" enum mot_key_set_type { MOT_KEY_SET_NONE = 0x00, @@ -66,31 +65,16 @@ struct mot_data { }; struct mot_set { + bool ready; + bool modern; bool is_x; std::string name; std::vector vec; mot_set(); - ~mot_set(); -}; + virtual ~mot_set(); -struct mot_set_farc { - bool ready; - bool modern; - - std::vector vec; - - mot_set_farc(); - ~mot_set_farc(); - - void read(const char* path, bool modern); - void read(const wchar_t* path, bool modern); - void read(const void* data, size_t length, bool modern); - void write(const char* path, farc_compress_mode mode); - void write(const wchar_t* path, farc_compress_mode mode); - void write(void** data, size_t* length, farc_compress_mode mode); - - static bool load_file(void* data, const char* path, const char* file, uint32_t hash); - + void pack_file(void** data, size_t* size); + void unpack_file(const void* data, size_t size, bool modern); }; diff --git a/src/KKdLib/msgpack.c b/src/KKdLib/msgpack.c deleted file mode 100644 index 97904894..00000000 --- a/src/KKdLib/msgpack.c +++ /dev/null @@ -1,993 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "msgpack.h" -#include "str_utils.h" - -#define MSGPACK_ALLOCATE(a, b) \ -if (MSGPACK_CHECK(a)) \ - (b).ptr = force_malloc(sizeof(a)); -#define MSGPACK_ALLOCATE_PTR(a, b) \ -if (MSGPACK_CHECK(a)) \ - (b)->ptr = force_malloc(sizeof(a)); - -vector_old_func(msgpack); - -void msgpack_init_map(msgpack* msg, const char* name) { - msg->type = MSGPACK_MAP; - MSGPACK_ALLOCATE_PTR(msgpack_map, msg); - string_init(&msg->name, name); - - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - ptr->capacity_end = ptr->end = ptr->begin = 0; -} - -void msgpack_init_array(msgpack* msg, const char* name, size_t length) { - msg->type = MSGPACK_ARRAY; - MSGPACK_ALLOCATE_PTR(msgpack_array, msg); - string_init(&msg->name, name); - - msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - ptr->capacity_end = ptr->end = ptr->begin = 0; - vector_old_msgpack_reserve(ptr, length); - ptr->end = ptr->begin + length; -} - -void msgpack_init_null(msgpack* msg, const char* name) { - msg->type = MSGPACK_NULL; - string_init(&msg->name, name); -} - -void msgpack_init_bool(msgpack* msg, const char* name, bool val) { - msg->type = MSGPACK_bool; - MSGPACK_ALLOCATE_PTR(bool, msg); - string_init(&msg->name, name); - - bool* ptr = MSGPACK_SELECT_PTR(bool, msg); - *ptr = val; -} - -void msgpack_init_int8_t(msgpack* msg, const char* name, int8_t val) { - msg->type = MSGPACK_INT8; - MSGPACK_ALLOCATE_PTR(int8_t, msg); - string_init(&msg->name, name); - - int8_t* ptr = MSGPACK_SELECT_PTR(int8_t, msg); - *ptr = val; -} - -void msgpack_init_uint8_t(msgpack* msg, const char* name, uint8_t val) { - msg->type = MSGPACK_UINT8; - MSGPACK_ALLOCATE_PTR(uint8_t, msg); - string_init(&msg->name, name); - - uint8_t* ptr = MSGPACK_SELECT_PTR(uint8_t, msg); - *ptr = val; -} - -void msgpack_init_int16_t(msgpack* msg, const char* name, int16_t val) { - msg->type = MSGPACK_INT16; - MSGPACK_ALLOCATE_PTR(int16_t, msg); - string_init(&msg->name, name); - - int16_t* ptr = MSGPACK_SELECT_PTR(int16_t, msg); - *ptr = val; -} - -void msgpack_init_uint16_t(msgpack* msg, const char* name, uint16_t val) { - msg->type = MSGPACK_UINT16; - MSGPACK_ALLOCATE_PTR(uint16_t, msg); - string_init(&msg->name, name); - - uint16_t* ptr = MSGPACK_SELECT_PTR(uint16_t, msg); - *ptr = val; -} - -void msgpack_init_int32_t(msgpack* msg, const char* name, int32_t val) { - msg->type = MSGPACK_INT32; - MSGPACK_ALLOCATE_PTR(int32_t, msg); - string_init(&msg->name, name); - - int32_t* ptr = MSGPACK_SELECT_PTR(int32_t, msg); - *ptr = val; -} - -void msgpack_init_uint32_t(msgpack* msg, const char* name, uint32_t val) { - msg->type = MSGPACK_UINT32; - MSGPACK_ALLOCATE_PTR(uint32_t, msg); - string_init(&msg->name, name); - - uint32_t* ptr = MSGPACK_SELECT_PTR(uint32_t, msg); - *ptr = val; -} - -void msgpack_init_int64_t(msgpack* msg, const char* name, int64_t val) { - msg->type = MSGPACK_INT64; - MSGPACK_ALLOCATE_PTR(int64_t, msg); - string_init(&msg->name, name); - - int64_t* ptr = MSGPACK_SELECT_PTR(int64_t, msg); - *ptr = val; -} - -void msgpack_init_uint64_t(msgpack* msg, const char* name, uint64_t val) { - msg->type = MSGPACK_UINT64; - MSGPACK_ALLOCATE_PTR(uint64_t, msg); - string_init(&msg->name, name); - - uint64_t* ptr = MSGPACK_SELECT_PTR(uint64_t, msg); - *ptr = val; -} - -void msgpack_init_float_t(msgpack* msg, const char* name, float_t val) { - msg->type = MSGPACK_FLOAT; - MSGPACK_ALLOCATE_PTR(float_t, msg); - string_init(&msg->name, name); - - float_t* ptr = MSGPACK_SELECT_PTR(float_t, msg); - *ptr = val; -} - -void msgpack_init_double_t(msgpack* msg, const char* name, double_t val) { - msg->type = MSGPACK_DOUBLE; - MSGPACK_ALLOCATE_PTR(double_t, msg); - string_init(&msg->name, name); - - double_t* ptr = MSGPACK_SELECT_PTR(double_t, msg); - *ptr = val; -} - -void msgpack_init_utf8_string(msgpack* msg, const char* name, const char* val) { - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_init(MSGPACK_SELECT_PTR(string, msg), val); -} - -void msgpack_init_utf16_string(msgpack* msg, const char* name, const wchar_t* val) { - char* temp = utf16_to_utf8(val); - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_init(MSGPACK_SELECT_PTR(string, msg), temp); - free(temp); -} - -void msgpack_init_string(msgpack* msg, const char* name, string* val) { - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_copy(val, MSGPACK_SELECT_PTR(string, msg)); -} - -void msgpack_init_wstring(msgpack* msg, const char* name, wstring* val) { - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_copy_wstring(val, MSGPACK_SELECT_PTR(string, msg)); -} - -bool msgpack_check_null(msgpack* msg) { - if (msg->type == MSGPACK_ARRAY) - return MSGPACK_SELECT_PTR(msgpack_array, msg)->begin == 0; - else if (msg->type == MSGPACK_MAP) - return MSGPACK_SELECT_PTR(msgpack_map, msg)->begin == 0; - return msg->type == MSGPACK_NONE; -} - -bool msgpack_check_not_null(msgpack* msg) { - if (msg->type == MSGPACK_ARRAY) - return MSGPACK_SELECT_PTR(msgpack_array, msg)->begin != 0; - else if (msg->type == MSGPACK_MAP) - return MSGPACK_SELECT_PTR(msgpack_map, msg)->begin != 0; - return msg->type != MSGPACK_NONE; -} - -msgpack* msgpack_get_by_index(msgpack* msg, size_t index) { - if (msg->type != MSGPACK_ARRAY) - return 0; - - msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - if ((ssize_t)index < vector_old_length(*ptr)) - return &ptr->begin[index]; - return 0; -} - -void msgpack_set_by_index(msgpack* msg, msgpack* m, size_t index) { - if (msg->type != MSGPACK_ARRAY) - return; - - msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - if ((ssize_t)index < vector_old_length(*ptr)) { - msgpack_free(&ptr->begin[index]); - ptr->begin[index] = *m; - } -} - -msgpack* msgpack_get_by_name(msgpack* msg, const char* name) { - if (msg->type != MSGPACK_MAP) - return 0; - - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - for (msgpack* i = ptr->begin; i != ptr->end; i++) - if (!str_utils_compare(string_data(&i->name), name)) - return i; - - return 0; -} - -void msgpack_set_by_name(msgpack* msg, msgpack* m) { - if (msg->type != MSGPACK_MAP) - return; - - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - for (msgpack* i = ptr->begin; i != ptr->end; i++) - if (!str_utils_compare(string_data(&i->name), string_data(&m->name))) { - msgpack_free(i); - *i = *m; - return; - } - - msgpack_append(msg, m); -} - -void msgpack_append(msgpack* msg, msgpack* m) { - if (msg->type != MSGPACK_MAP) - return; - - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - vector_old_msgpack_push_back(ptr, m); - memset(m->data, 0, sizeof(m->data)); -} - -void msgpack_append_bool(msgpack* msg, const char* name, bool val) { - msgpack m; - m.type = MSGPACK_bool; - MSGPACK_ALLOCATE(bool, m); - string_init(&m.name, name); - - bool* ptr = MSGPACK_SELECT(bool, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_int8_t(msgpack* msg, const char* name, int8_t val) { - msgpack m; - m.type = MSGPACK_INT8; - MSGPACK_ALLOCATE(int8_t, m); - string_init(&m.name, name); - - int8_t* ptr = MSGPACK_SELECT(int8_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_uint8_t(msgpack* msg, const char* name, uint8_t val) { - msgpack m; - m.type = MSGPACK_UINT8; - MSGPACK_ALLOCATE(uint8_t, m); - string_init(&m.name, name); - - uint8_t* ptr = MSGPACK_SELECT(uint8_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_int16_t(msgpack* msg, const char* name, int16_t val) { - msgpack m; - m.type = MSGPACK_INT16; - MSGPACK_ALLOCATE(int16_t, m); - string_init(&m.name, name); - - int16_t* ptr = MSGPACK_SELECT(int16_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_uint16_t(msgpack* msg, const char* name, uint16_t val) { - msgpack m; - m.type = MSGPACK_UINT16; - MSGPACK_ALLOCATE(uint16_t, m); - string_init(&m.name, name); - - uint16_t* ptr = MSGPACK_SELECT(uint16_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_int32_t(msgpack* msg, const char* name, int32_t val) { - msgpack m; - m.type = MSGPACK_INT32; - MSGPACK_ALLOCATE(int32_t, m); - string_init(&m.name, name); - - int32_t* ptr = MSGPACK_SELECT(int32_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_uint32_t(msgpack* msg, const char* name, uint32_t val) { - msgpack m; - m.type = MSGPACK_UINT32; - MSGPACK_ALLOCATE(uint32_t, m); - string_init(&m.name, name); - - uint32_t* ptr = MSGPACK_SELECT(uint32_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_int64_t(msgpack* msg, const char* name, int64_t val) { - msgpack m; - m.type = MSGPACK_INT64; - MSGPACK_ALLOCATE(int64_t, m); - string_init(&m.name, name); - - int64_t* ptr = MSGPACK_SELECT(int64_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_uint64_t(msgpack* msg, const char* name, uint64_t val) { - msgpack m; - m.type = MSGPACK_UINT64; - MSGPACK_ALLOCATE(uint64_t, m); - string_init(&m.name, name); - - uint64_t* ptr = MSGPACK_SELECT(uint64_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_float_t(msgpack* msg, const char* name, float_t val) { - msgpack m; - m.type = MSGPACK_FLOAT; - MSGPACK_ALLOCATE(float_t, m); - string_init(&m.name, name); - - float_t* ptr = MSGPACK_SELECT(float_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_double_t(msgpack* msg, const char* name, double_t val) { - msgpack m; - m.type = MSGPACK_DOUBLE; - MSGPACK_ALLOCATE(double_t, m); - string_init(&m.name, name); - - double_t* ptr = MSGPACK_SELECT(double_t, m); - *ptr = val; - msgpack_append(msg, &m); -} - -void msgpack_append_utf8_string(msgpack* msg, const char* name, const char* val) { - msgpack m; - m.type = MSGPACK_STRING; - MSGPACK_ALLOCATE(string, m); - string_init(&m.name, name); - string_init(MSGPACK_SELECT(string, m), val); - msgpack_append(msg, &m); -} - -void msgpack_append_utf16_string(msgpack* msg, const char* name, const wchar_t* val) { - msgpack m; - char* temp = utf16_to_utf8(val); - m.type = MSGPACK_STRING; - MSGPACK_ALLOCATE(string, m); - string_init(&m.name, name); - string_init(MSGPACK_SELECT(string, m), temp); - free(temp); - msgpack_append(msg, &m); -} - -void msgpack_append_string(msgpack* msg, const char* name, string* val) { - msgpack m; - m.type = MSGPACK_STRING; - MSGPACK_ALLOCATE(string, m); - string_init(&m.name, name); - string_copy(val, MSGPACK_SELECT(string, m)); - msgpack_append(msg, &m); -} - -void msgpack_append_wstring(msgpack* msg, const char* name, wstring* val) { - msgpack m; - m.type = MSGPACK_STRING; - MSGPACK_ALLOCATE(string, m); - string_init(&m.name, name); - string_copy_wstring(val, MSGPACK_SELECT(string, m)); - msgpack_append(msg, &m); -} - -void msgpack_set_null(msgpack* msg, const char* name) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_NULL; - string_init(&msg->name, name); -} - -void msgpack_set_array(msgpack* msg, const char* name, msgpack_array* val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_ARRAY; - MSGPACK_ALLOCATE_PTR(msgpack_array, msg); - string_init(&msg->name, name); - - msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - *ptr = *val; - val->capacity_end = val->end = val->begin = 0; -} - -void msgpack_set_array_empty(msgpack* msg, const char* name) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_ARRAY; - MSGPACK_ALLOCATE_PTR(msgpack_array, msg); - string_init(&msg->name, name); - - msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - ptr->capacity_end = ptr->end = ptr->begin = 0; -} - -void msgpack_set_map(msgpack* msg, const char* name, msgpack_map* val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_MAP; - MSGPACK_ALLOCATE_PTR(msgpack_map, msg); - string_init(&msg->name, name); - - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - *ptr = *val; - val->capacity_end = val->end = val->begin = 0; -} - -void msgpack_set_map_empty(msgpack* msg, const char* name) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_MAP; - MSGPACK_ALLOCATE_PTR(msgpack_map, msg); - string_init(&msg->name, name); - - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - ptr->capacity_end = ptr->end = ptr->begin = 0; -} - -void msgpack_set_bool(msgpack* msg, const char* name, bool val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_bool; - MSGPACK_ALLOCATE_PTR(bool, msg); - string_init(&msg->name, name); - - bool* ptr = MSGPACK_SELECT_PTR(bool, msg); - *ptr = val; -} - -void msgpack_set_int8_t(msgpack* msg, const char* name, int8_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_INT8; - MSGPACK_ALLOCATE_PTR(int8_t, msg); - string_init(&msg->name, name); - - int8_t* ptr = MSGPACK_SELECT_PTR(int8_t, msg); - *ptr = val; -} - -void msgpack_set_uint8_t(msgpack* msg, const char* name, uint8_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_UINT8; - MSGPACK_ALLOCATE_PTR(uint8_t, msg); - string_init(&msg->name, name); - - uint8_t* ptr = MSGPACK_SELECT_PTR(uint8_t, msg); - *ptr = val; -} - -void msgpack_set_int16_t(msgpack* msg, const char* name, int16_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_INT16; - MSGPACK_ALLOCATE_PTR(int16_t, msg); - string_init(&msg->name, name); - - int16_t* ptr = MSGPACK_SELECT_PTR(int16_t, msg); - *ptr = val; -} - -void msgpack_set_uint16_t(msgpack* msg, const char* name, uint16_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_UINT16; - MSGPACK_ALLOCATE_PTR(uint16_t, msg); - string_init(&msg->name, name); - - uint16_t* ptr = MSGPACK_SELECT_PTR(uint16_t, msg); - *ptr = val; -} - -void msgpack_set_int32_t(msgpack* msg, const char* name, int32_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_INT32; - MSGPACK_ALLOCATE_PTR(int32_t, msg); - string_init(&msg->name, name); - - int32_t* ptr = MSGPACK_SELECT_PTR(int32_t, msg); - *ptr = val; -} - -void msgpack_set_uint32_t(msgpack* msg, const char* name, uint32_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_UINT32; - MSGPACK_ALLOCATE_PTR(uint32_t, msg); - string_init(&msg->name, name); - - uint32_t* ptr = MSGPACK_SELECT_PTR(uint32_t, msg); - *ptr = val; -} - -void msgpack_set_int64_t(msgpack* msg, const char* name, int64_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_INT64; - MSGPACK_ALLOCATE_PTR(int64_t, msg); - string_init(&msg->name, name); - - int64_t* ptr = MSGPACK_SELECT_PTR(int64_t, msg); - *ptr = val; -} - -void msgpack_set_uint64_t(msgpack* msg, const char* name, uint64_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_UINT64; - MSGPACK_ALLOCATE_PTR(uint64_t, msg); - string_init(&msg->name, name); - - uint64_t* ptr = MSGPACK_SELECT_PTR(uint64_t, msg); - *ptr = val; -} - -void msgpack_set_float_t(msgpack* msg, const char* name, float_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_FLOAT; - MSGPACK_ALLOCATE_PTR(float_t, msg); - string_init(&msg->name, name); - - float_t* ptr = MSGPACK_SELECT_PTR(float_t, msg); - *ptr = val; -} - -void msgpack_set_double_t(msgpack* msg, const char* name, double_t val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_DOUBLE; - MSGPACK_ALLOCATE_PTR(double_t, msg); - string_init(&msg->name, name); - - double_t* ptr = MSGPACK_SELECT_PTR(double_t, msg); - *ptr = val; -} - -void msgpack_set_utf8_string(msgpack* msg, const char* name, const char* val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_init(MSGPACK_SELECT_PTR(string, msg), val); -} - -void msgpack_set_utf16_string(msgpack* msg, const char* name, const wchar_t* val) { - if (!msg) - return; - - char* temp = utf16_to_utf8(val); - msgpack_free(msg); - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_init(MSGPACK_SELECT_PTR(string, msg), temp); - free(temp); -} - -void msgpack_set_string(msgpack* msg, const char* name, string* val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_copy(val, MSGPACK_SELECT_PTR(string, msg)); -} - -void msgpack_set_wstring(msgpack* msg, const char* name, wstring* val) { - if (!msg) - return; - - msgpack_free(msg); - msg->type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(string, msg); - string_init(&msg->name, name); - string_copy_wstring(val, MSGPACK_SELECT_PTR(string, msg)); -} - -msgpack* msgpack_read(msgpack* msg, const char* name) { - if (!msg) - return 0; - - return name ? msgpack_get_by_name(msg, name) : msg; -} - -bool msgpack_read_bool(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (m && m->type == MSGPACK_bool) - return *MSGPACK_SELECT_PTR(bool, m); - return 0; -} - -int8_t msgpack_read_int8_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return *MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return (int8_t)*MSGPACK_SELECT_PTR(uint8_t, m); - return 0; -} - -uint8_t msgpack_read_uint8_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return (uint8_t)*MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - return 0; -} - -int16_t msgpack_read_int16_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return *MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return *MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return (int16_t)*MSGPACK_SELECT_PTR(uint16_t, m); - return 0; -} - -uint16_t msgpack_read_uint16_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return (uint16_t)(int16_t)*MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return (uint16_t)(int16_t)*MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - return 0; -} - -int32_t msgpack_read_int32_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return *MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return *MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - else if (m->type == MSGPACK_INT32) - return *MSGPACK_SELECT_PTR(int32_t, m); - else if (m->type == MSGPACK_UINT32) - return (int32_t)*MSGPACK_SELECT_PTR(uint32_t, m); - return 0; -} - -uint32_t msgpack_read_uint32_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return (uint32_t)(int32_t)*MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return (uint32_t)(int32_t)*MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - else if (m->type == MSGPACK_INT32) - return (uint32_t)(int32_t)*MSGPACK_SELECT_PTR(int32_t, m); - else if (m->type == MSGPACK_UINT32) - return *MSGPACK_SELECT_PTR(uint32_t, m); - return 0; -} - -int64_t msgpack_read_int64_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return *MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return *MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - else if (m->type == MSGPACK_INT32) - return *MSGPACK_SELECT_PTR(int32_t, m); - else if (m->type == MSGPACK_UINT32) - return *MSGPACK_SELECT_PTR(uint32_t, m); - else if (m->type == MSGPACK_INT64) - return *MSGPACK_SELECT_PTR(int64_t, m); - else if (m->type == MSGPACK_UINT64) - return (int64_t)*MSGPACK_SELECT_PTR(uint64_t, m); - return 0; -} - -uint64_t msgpack_read_uint64_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return (uint64_t)(int64_t)*MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return (uint64_t)(int64_t)*MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - else if (m->type == MSGPACK_INT32) - return (uint64_t)(int64_t)*MSGPACK_SELECT_PTR(int32_t, m); - else if (m->type == MSGPACK_UINT32) - return *MSGPACK_SELECT_PTR(uint32_t, m); - else if (m->type == MSGPACK_INT32) - return (uint64_t)*MSGPACK_SELECT_PTR(int64_t, m); - else if (m->type == MSGPACK_UINT32) - return *MSGPACK_SELECT_PTR(uint64_t, m); - return 0; -} - -float_t msgpack_read_float_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return *MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return *MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - else if (m->type == MSGPACK_INT32) - return (float_t)*MSGPACK_SELECT_PTR(int32_t, m); - else if (m->type == MSGPACK_UINT32) - return (float_t)*MSGPACK_SELECT_PTR(uint32_t, m); - else if (m->type == MSGPACK_INT64) - return (float_t)*MSGPACK_SELECT_PTR(int64_t, m); - else if (m->type == MSGPACK_UINT64) - return (float_t)*MSGPACK_SELECT_PTR(uint64_t, m); - else if (m->type == MSGPACK_FLOAT) - return *MSGPACK_SELECT_PTR(float_t, m); - else if (m->type == MSGPACK_DOUBLE) - return (float_t)*MSGPACK_SELECT_PTR(double_t, m); - return 0; -} - -double_t msgpack_read_double_t(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - if (!m) - return 0; - - if (m->type == MSGPACK_INT8) - return *MSGPACK_SELECT_PTR(int8_t, m); - else if (m->type == MSGPACK_UINT8) - return *MSGPACK_SELECT_PTR(uint8_t, m); - else if (m->type == MSGPACK_INT16) - return *MSGPACK_SELECT_PTR(int16_t, m); - else if (m->type == MSGPACK_UINT16) - return *MSGPACK_SELECT_PTR(uint16_t, m); - else if (m->type == MSGPACK_INT32) - return *MSGPACK_SELECT_PTR(int32_t, m); - else if (m->type == MSGPACK_UINT32) - return *MSGPACK_SELECT_PTR(uint32_t, m); - else if (m->type == MSGPACK_INT64) - return (double_t)*MSGPACK_SELECT_PTR(int64_t, m); - else if (m->type == MSGPACK_UINT64) - return (double_t)*MSGPACK_SELECT_PTR(uint64_t, m); - else if (m->type == MSGPACK_FLOAT) - return *MSGPACK_SELECT_PTR(float_t, m); - else if (m->type == MSGPACK_DOUBLE) - return *MSGPACK_SELECT_PTR(double_t, m); - return 0; -} - -char* msgpack_read_utf8_string(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - - if (m && m->type == MSGPACK_STRING) { - string* ptr = MSGPACK_SELECT_PTR(string, m); - size_t length = ptr->length; - char* val = force_malloc_s(char, length + 1); - memcpy(val, string_data(ptr), length); - val[length] = 0; - return val; - } - return 0; -} - -wchar_t* msgpack_read_utf16_string(msgpack* msg, const char* name) { - if (!msg) - return 0; - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - - if (m && m->type == MSGPACK_STRING) { - string* ptr = MSGPACK_SELECT_PTR(string, m); - wchar_t* temp = utf8_to_utf16(string_data(ptr)); - size_t length = utf16_length(temp); - wchar_t* val = force_malloc_s(wchar_t, length + 1); - memcpy(val, temp, sizeof(wchar_t) * length); - val[length] = 0; - free(temp); - return val; - } - return 0; -} - -void msgpack_read_string(msgpack* msg, const char* name, string* str) { - if (!msg) { - *str = string_empty; - return; - } - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - - if (m && m->type == MSGPACK_STRING) { - string* ptr = MSGPACK_SELECT_PTR(string, m); - string_init_length(str, string_data(ptr), ptr->length); - } - else - *str = string_empty; -} - -void msgpack_read_wstring(msgpack* msg, const char* name, wstring* str) { - if (!msg) { - *str = wstring_empty; - return; - } - - msgpack* m = name ? msgpack_get_by_name(msg, name) : msg; - - if (m && m->type == MSGPACK_STRING) { - string* ptr = MSGPACK_SELECT_PTR(string, m); - wchar_t* temp = utf8_to_utf16(string_data(ptr)); - wstring_init(str, temp); - free(temp); - } - else - *str = wstring_empty; -} - -void msgpack_free(msgpack* msg) { - if (!msg) - return; - - string_free(&msg->name); - - switch (msg->type) { - case MSGPACK_STRING: - string_free(MSGPACK_SELECT_PTR(string, msg)); - break; - case MSGPACK_ARRAY: { - msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - vector_old_msgpack_free(ptr, msgpack_free); - } break; - case MSGPACK_MAP: { - msgpack_map* ptr = MSGPACK_SELECT_PTR(msgpack_map, msg); - vector_old_msgpack_free(ptr, msgpack_free); - } break; - } - memset(msg, 0, sizeof(msgpack)); -} diff --git a/src/KKdLib/msgpack.cpp b/src/KKdLib/msgpack.cpp new file mode 100644 index 00000000..164f3cb6 --- /dev/null +++ b/src/KKdLib/msgpack.cpp @@ -0,0 +1,910 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "msgpack.hpp" + +#define MSGPACK_ALLOCATE(a, b) \ +if (MSGPACK_CHECK(a)) \ + (b).data.ptr = new (a); +#define MSGPACK_ALLOCATE_PTR(a, b) \ +if (MSGPACK_CHECK(a)) \ + (b)->data.ptr = new (a); + +msgpack::msgpack() : data() { + type = MSGPACK_NULL; +} + +msgpack::msgpack(const msgpack& m) : msgpack() { + if (this == &m) + return; + + switch (m.type) { + case MSGPACK_BOOL: { + MSGPACK_ALLOCATE_PTR(double_t, this); + bool* s_ptr = MSGPACK_SELECT(bool, m); + bool* d_ptr = MSGPACK_SELECT_PTR(bool, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT8: { + MSGPACK_ALLOCATE_PTR(int8_t, this); + int8_t* s_ptr = MSGPACK_SELECT(int8_t, m); + int8_t* d_ptr = MSGPACK_SELECT_PTR(int8_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT8: { + MSGPACK_ALLOCATE_PTR(uint8_t, this); + uint8_t* s_ptr = MSGPACK_SELECT(uint8_t, m); + uint8_t* d_ptr = MSGPACK_SELECT_PTR(uint8_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT16: { + MSGPACK_ALLOCATE_PTR(int16_t, this); + int16_t* s_ptr = MSGPACK_SELECT(int16_t, m); + int16_t* d_ptr = MSGPACK_SELECT_PTR(int16_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT16: { + MSGPACK_ALLOCATE_PTR(uint16_t, this); + uint16_t* s_ptr = MSGPACK_SELECT(uint16_t, m); + uint16_t* d_ptr = MSGPACK_SELECT_PTR(uint16_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT32: { + MSGPACK_ALLOCATE_PTR(int32_t, this); + int32_t* s_ptr = MSGPACK_SELECT(int32_t, m); + int32_t* d_ptr = MSGPACK_SELECT_PTR(int32_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT32: { + MSGPACK_ALLOCATE_PTR(uint32_t, this); + uint32_t* s_ptr = MSGPACK_SELECT(uint32_t, m); + uint32_t* d_ptr = MSGPACK_SELECT_PTR(uint32_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT64: { + MSGPACK_ALLOCATE_PTR(int64_t, this); + int64_t* s_ptr = MSGPACK_SELECT(int64_t, m); + int64_t* d_ptr = MSGPACK_SELECT_PTR(int64_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT64: { + MSGPACK_ALLOCATE_PTR(uint64_t, this); + uint64_t* s_ptr = MSGPACK_SELECT(uint64_t, m); + uint64_t* d_ptr = MSGPACK_SELECT_PTR(uint64_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_FLOAT: { + MSGPACK_ALLOCATE_PTR(float_t, this); + float_t* s_ptr = MSGPACK_SELECT(float_t, m); + float_t* d_ptr = MSGPACK_SELECT_PTR(float_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_DOUBLE: { + MSGPACK_ALLOCATE_PTR(double_t, this); + double_t* s_ptr = MSGPACK_SELECT(double_t, m); + double_t* d_ptr = MSGPACK_SELECT_PTR(double_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_STRING: { + MSGPACK_ALLOCATE_PTR(std::string, this); + std::string* s_ptr = MSGPACK_SELECT(std::string, m); + std::string* d_ptr = MSGPACK_SELECT_PTR(std::string, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_ARRAY: + case MSGPACK_MAP: { + MSGPACK_ALLOCATE_PTR(msgpack_array, this); + msgpack_array* s_ptr = MSGPACK_SELECT(msgpack_array, m); + msgpack_array* d_ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + *d_ptr = *s_ptr; + } break; + } + type = m.type; + name = m.name; +} + +msgpack::msgpack(const char* name, bool array, size_t length) : msgpack() { + type = array ? MSGPACK_ARRAY : MSGPACK_MAP; + MSGPACK_ALLOCATE_PTR(msgpack_array, this); + if (name) + this->name = std::string(name); + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + *ptr = {}; + ptr->resize(length); +} + +msgpack::msgpack(const char* name, bool array, msgpack_array& val) : msgpack() { + type = array ? MSGPACK_ARRAY : MSGPACK_MAP; + MSGPACK_ALLOCATE_PTR(msgpack_array, this); + if (name) + this->name = std::string(name); + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + *ptr = val; +} + +msgpack::msgpack(const char* name) : msgpack() { + type = MSGPACK_NULL; + if (name) + this->name = std::string(name); +} + +msgpack::msgpack(const char* name, bool val) : msgpack() { + type = MSGPACK_BOOL; + MSGPACK_ALLOCATE_PTR(bool, this); + if (name) + this->name = std::string(name); + + bool* ptr = MSGPACK_SELECT_PTR(bool, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, int8_t val) : msgpack() { + type = MSGPACK_INT8; + MSGPACK_ALLOCATE_PTR(int8_t, this); + if (name) + this->name = std::string(name); + + int8_t* ptr = MSGPACK_SELECT_PTR(int8_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, uint8_t val) : msgpack() { + type = MSGPACK_UINT8; + MSGPACK_ALLOCATE_PTR(uint8_t, this); + if (name) + this->name = std::string(name); + + uint8_t* ptr = MSGPACK_SELECT_PTR(uint8_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, int16_t val) : msgpack() { + type = MSGPACK_INT16; + MSGPACK_ALLOCATE_PTR(int16_t, this); + if (name) + this->name = std::string(name); + + int16_t* ptr = MSGPACK_SELECT_PTR(int16_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, uint16_t val) : msgpack() { + type = MSGPACK_UINT16; + MSGPACK_ALLOCATE_PTR(uint16_t, this); + if (name) + this->name = std::string(name); + + uint16_t* ptr = MSGPACK_SELECT_PTR(uint16_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, int32_t val) : msgpack() { + type = MSGPACK_INT32; + MSGPACK_ALLOCATE_PTR(int32_t, this); + if (name) + this->name = std::string(name); + + int32_t* ptr = MSGPACK_SELECT_PTR(int32_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, uint32_t val) : msgpack() { + type = MSGPACK_UINT32; + MSGPACK_ALLOCATE_PTR(uint32_t, this); + if (name) + this->name = std::string(name); + + uint32_t* ptr = MSGPACK_SELECT_PTR(uint32_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, int64_t val) : msgpack() { + type = MSGPACK_INT64; + MSGPACK_ALLOCATE_PTR(int64_t, this); + if (name) + this->name = std::string(name); + + int64_t* ptr = MSGPACK_SELECT_PTR(int64_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, uint64_t val) : msgpack() { + type = MSGPACK_UINT64; + MSGPACK_ALLOCATE_PTR(uint64_t, this); + if (name) + this->name = std::string(name); + + uint64_t* ptr = MSGPACK_SELECT_PTR(uint64_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, float_t val) : msgpack() { + type = MSGPACK_FLOAT; + MSGPACK_ALLOCATE_PTR(float_t, this); + if (name) + this->name = std::string(name); + + float_t* ptr = MSGPACK_SELECT_PTR(float_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, double_t val) : msgpack() { + type = MSGPACK_DOUBLE; + MSGPACK_ALLOCATE_PTR(double_t, this); + if (name) + this->name = std::string(name); + + double_t* ptr = MSGPACK_SELECT_PTR(double_t, this); + *ptr = val; +} + +msgpack::msgpack(const char* name, const char* val) : msgpack() { + type = MSGPACK_STRING; + MSGPACK_ALLOCATE_PTR(std::string, this); + if (name) + this->name = std::string(name); + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + *ptr = {}; + if (val) + *ptr = std::string(val); +} + +msgpack::msgpack(const char* name, const wchar_t* val) : msgpack() { + char* temp = utf16_to_utf8(val); + type = MSGPACK_STRING; + MSGPACK_ALLOCATE_PTR(std::string, this); + if (name) + this->name = std::string(name); + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + *ptr = {}; + if (temp) + *ptr = std::string(temp); + free(temp); +} + +msgpack::msgpack(const char* name, string* val) : msgpack() { + type = MSGPACK_STRING; + MSGPACK_ALLOCATE_PTR(std::string, this); + if (name) + this->name = std::string(name); + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + *ptr = {}; + if (val) + *ptr = std::string(string_data(val), val->length); +} + +msgpack::msgpack(const char* name, std::string* val) : msgpack() { + type = MSGPACK_STRING; + MSGPACK_ALLOCATE_PTR(std::string, this); + if (name) + this->name = std::string(name); + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + *ptr = {}; + if (val) + *ptr = *val; +} + +msgpack::msgpack(const char* name, wstring* val) : msgpack() { + char* temp = utf16_to_utf8(wstring_data(val)); + type = MSGPACK_STRING; + MSGPACK_ALLOCATE_PTR(std::string, this); + if (name) + this->name = std::string(name); + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + *ptr = {}; + if (temp) + *ptr = std::string(temp); + free(temp) +} + +msgpack::msgpack(const char* name, std::wstring* val) : msgpack() { + char* temp = utf16_to_utf8(val->c_str()); + type = MSGPACK_STRING; + MSGPACK_ALLOCATE_PTR(std::string, this); + if (name) + this->name = std::string(name); + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + *ptr = {}; + if (temp) + *ptr = std::string(temp); + free(temp) +} + +msgpack::~msgpack() { + switch (type) { + case MSGPACK_BOOL: { + bool* ptr = MSGPACK_SELECT_PTR(bool, this); + if (MSGPACK_CHECK(bool)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_INT8: { + int8_t* ptr = MSGPACK_SELECT_PTR(int8_t, this); + if (MSGPACK_CHECK(int8_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_UINT8: { + uint8_t* ptr = MSGPACK_SELECT_PTR(uint8_t, this); + if (MSGPACK_CHECK(uint8_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_INT16: { + int16_t* ptr = MSGPACK_SELECT_PTR(int16_t, this); + if (MSGPACK_CHECK(int16_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_UINT16: { + uint16_t* ptr = MSGPACK_SELECT_PTR(uint16_t, this); + if (MSGPACK_CHECK(uint16_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_INT32: { + int32_t* ptr = MSGPACK_SELECT_PTR(int32_t, this); + if (MSGPACK_CHECK(int32_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_UINT32: { + uint32_t* ptr = MSGPACK_SELECT_PTR(uint32_t, this); + if (MSGPACK_CHECK(uint32_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_INT64: { + int64_t* ptr = MSGPACK_SELECT_PTR(int64_t, this); + if (MSGPACK_CHECK(int64_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_UINT64: { + uint64_t* ptr = MSGPACK_SELECT_PTR(uint64_t, this); + if (MSGPACK_CHECK(uint64_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_FLOAT: { + float_t* ptr = MSGPACK_SELECT_PTR(float_t, this); + if (MSGPACK_CHECK(float_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_DOUBLE: { + double_t* ptr = MSGPACK_SELECT_PTR(double_t, this); + if (MSGPACK_CHECK(double_t)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_STRING: { + std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); + ptr->clear(); + ptr->shrink_to_fit(); + if (MSGPACK_CHECK(std::string)) { + delete ptr; + data.ptr = 0; + } + } break; + case MSGPACK_ARRAY: + case MSGPACK_MAP: { + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + ptr->clear(); + ptr->shrink_to_fit(); + if (MSGPACK_CHECK(msgpack_array)) { + delete ptr; + data.ptr = 0; + } + } break; + } +} + +bool msgpack::check_null() { + if (type == MSGPACK_ARRAY || type == MSGPACK_MAP) + return MSGPACK_SELECT_PTR(msgpack_array, this)->size() == 0; + return type == MSGPACK_NONE; +} + +bool msgpack::check_not_null() { + if (type == MSGPACK_ARRAY || type == MSGPACK_MAP) + return MSGPACK_SELECT_PTR(msgpack_array, this)->size() != 0; + return type != MSGPACK_NONE; +} + +msgpack* msgpack::get_by_index(size_t index) { + if (type != MSGPACK_ARRAY) + return 0; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + if (index < ptr->size()) + return &ptr->data()[index]; + return 0; +} + +void msgpack::set_by_index(msgpack* m, size_t index) { + if (type != MSGPACK_ARRAY) + return; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + if (index < ptr->size()) { + msgpack& msg = ptr->data()[index]; + msg.~msgpack(); + msg = *m; + } +} + +msgpack* msgpack::get_by_name(const char* name) { + if (type != MSGPACK_MAP) + return 0; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + for (msgpack& i : *ptr) + if (!i.name.compare(name)) + return &i; + + return 0; +} + +void msgpack::set_by_name(msgpack* m) { + if (type != MSGPACK_MAP) + return; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + for (msgpack& i : *ptr) + if (!i.name.compare(m->name)) { + i.~msgpack(); + i = *m; + return; + } + + append(m); +} + +void msgpack::append(msgpack* m) { + if (type != MSGPACK_MAP) + return; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + ptr->push_back(*m); + *m = {}; +} + +void msgpack::append(msgpack& m) { + if (type != MSGPACK_MAP) + return; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + ptr->push_back(m); + m = {}; +} + +void msgpack::append(msgpack&& m) { + if (type != MSGPACK_MAP) + return; + + msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + ptr->push_back(m); + m = {}; +} + +msgpack* msgpack::read(const char* name) { + if (!this) + return 0; + + return name ? get_by_name(name) : this; +} + +bool msgpack::read_bool(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (m && m->type == MSGPACK_BOOL) + return *MSGPACK_SELECT_PTR(bool, m); + return 0; +} + +int8_t msgpack::read_int8_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return *MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return (int8_t)*MSGPACK_SELECT_PTR(uint8_t, m); + return 0; +} + +uint8_t msgpack::read_uint8_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return (uint8_t)*MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + return 0; +} + +int16_t msgpack::read_int16_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return *MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return *MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return (int16_t)*MSGPACK_SELECT_PTR(uint16_t, m); + return 0; +} + +uint16_t msgpack::read_uint16_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return (uint16_t)(int16_t)*MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return (uint16_t)(int16_t)*MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + return 0; +} + +int32_t msgpack::read_int32_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return *MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return *MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + else if (m->type == MSGPACK_INT32) + return *MSGPACK_SELECT_PTR(int32_t, m); + else if (m->type == MSGPACK_UINT32) + return (int32_t)*MSGPACK_SELECT_PTR(uint32_t, m); + return 0; +} + +uint32_t msgpack::read_uint32_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return (uint32_t)(int32_t)*MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return (uint32_t)(int32_t)*MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + else if (m->type == MSGPACK_INT32) + return (uint32_t)(int32_t)*MSGPACK_SELECT_PTR(int32_t, m); + else if (m->type == MSGPACK_UINT32) + return *MSGPACK_SELECT_PTR(uint32_t, m); + return 0; +} + +int64_t msgpack::read_int64_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return *MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return *MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + else if (m->type == MSGPACK_INT32) + return *MSGPACK_SELECT_PTR(int32_t, m); + else if (m->type == MSGPACK_UINT32) + return *MSGPACK_SELECT_PTR(uint32_t, m); + else if (m->type == MSGPACK_INT64) + return *MSGPACK_SELECT_PTR(int64_t, m); + else if (m->type == MSGPACK_UINT64) + return (int64_t)*MSGPACK_SELECT_PTR(uint64_t, m); + return 0; +} + +uint64_t msgpack::read_uint64_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return (uint64_t)(int64_t)*MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return (uint64_t)(int64_t)*MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + else if (m->type == MSGPACK_INT32) + return (uint64_t)(int64_t)*MSGPACK_SELECT_PTR(int32_t, m); + else if (m->type == MSGPACK_UINT32) + return *MSGPACK_SELECT_PTR(uint32_t, m); + else if (m->type == MSGPACK_INT32) + return (uint64_t)*MSGPACK_SELECT_PTR(int64_t, m); + else if (m->type == MSGPACK_UINT32) + return *MSGPACK_SELECT_PTR(uint64_t, m); + return 0; +} + +float_t msgpack::read_float_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return *MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return *MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + else if (m->type == MSGPACK_INT32) + return (float_t)*MSGPACK_SELECT_PTR(int32_t, m); + else if (m->type == MSGPACK_UINT32) + return (float_t)*MSGPACK_SELECT_PTR(uint32_t, m); + else if (m->type == MSGPACK_INT64) + return (float_t)*MSGPACK_SELECT_PTR(int64_t, m); + else if (m->type == MSGPACK_UINT64) + return (float_t)*MSGPACK_SELECT_PTR(uint64_t, m); + else if (m->type == MSGPACK_FLOAT) + return *MSGPACK_SELECT_PTR(float_t, m); + else if (m->type == MSGPACK_DOUBLE) + return (float_t)*MSGPACK_SELECT_PTR(double_t, m); + return 0; +} + +double_t msgpack::read_double_t(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + if (!m) + return 0; + + if (m->type == MSGPACK_INT8) + return *MSGPACK_SELECT_PTR(int8_t, m); + else if (m->type == MSGPACK_UINT8) + return *MSGPACK_SELECT_PTR(uint8_t, m); + else if (m->type == MSGPACK_INT16) + return *MSGPACK_SELECT_PTR(int16_t, m); + else if (m->type == MSGPACK_UINT16) + return *MSGPACK_SELECT_PTR(uint16_t, m); + else if (m->type == MSGPACK_INT32) + return *MSGPACK_SELECT_PTR(int32_t, m); + else if (m->type == MSGPACK_UINT32) + return *MSGPACK_SELECT_PTR(uint32_t, m); + else if (m->type == MSGPACK_INT64) + return (double_t)*MSGPACK_SELECT_PTR(int64_t, m); + else if (m->type == MSGPACK_UINT64) + return (double_t)*MSGPACK_SELECT_PTR(uint64_t, m); + else if (m->type == MSGPACK_FLOAT) + return *MSGPACK_SELECT_PTR(float_t, m); + else if (m->type == MSGPACK_DOUBLE) + return *MSGPACK_SELECT_PTR(double_t, m); + return 0; +} + +char* msgpack::read_utf8_string(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + + if (m && m->type == MSGPACK_STRING) { + std::string* ptr = MSGPACK_SELECT_PTR(std::string, m); + size_t length = ptr->size(); + char* val = force_malloc_s(char, length + 1); + memcpy(val, ptr->c_str(), length); + val[length] = 0; + return val; + } + return 0; +} + +wchar_t* msgpack::read_utf16_string(const char* name) { + if (!this) + return 0; + + msgpack* m = name ? get_by_name(name) : this; + + if (m && m->type == MSGPACK_STRING) { + std::string* ptr = MSGPACK_SELECT_PTR(std::string, m); + wchar_t* temp = utf8_to_utf16(ptr->c_str()); + size_t length = utf16_length(temp); + wchar_t* val = force_malloc_s(wchar_t, length + 1); + memcpy(val, temp, sizeof(wchar_t) * length); + val[length] = 0; + free(temp); + return val; + } + return 0; +} + +void msgpack::read_string(const char* name, string* str) { + if (!this) { + *str = string_empty; + return; + } + + msgpack* m = name ? get_by_name(name) : this; + + if (m && m->type == MSGPACK_STRING) { + std::string* ptr = MSGPACK_SELECT_PTR(std::string, m); + string_init_length(str, ptr->c_str(), ptr->size()); + } + else + *str = string_empty; +} + +void msgpack::read_string(const char* name, wstring* str) { + if (!this) { + *str = wstring_empty; + return; + } + + msgpack* m = name ? get_by_name(name) : this; + + if (m && m->type == MSGPACK_STRING) { + std::string* ptr = MSGPACK_SELECT_PTR(std::string, m); + wchar_t* temp = utf8_to_utf16(ptr->c_str()); + wstring_init(str, temp); + free(temp); + } + else + *str = wstring_empty; +} + +msgpack& msgpack::operator=(const msgpack& m) { + if (this == &m) + return *this; + + switch (m.type) { + case MSGPACK_BOOL: { + MSGPACK_ALLOCATE_PTR(double_t, this); + bool* s_ptr = MSGPACK_SELECT(bool, m); + bool* d_ptr = MSGPACK_SELECT_PTR(bool, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT8: { + MSGPACK_ALLOCATE_PTR(int8_t, this); + int8_t* s_ptr = MSGPACK_SELECT(int8_t, m); + int8_t* d_ptr = MSGPACK_SELECT_PTR(int8_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT8: { + MSGPACK_ALLOCATE_PTR(uint8_t, this); + uint8_t* s_ptr = MSGPACK_SELECT(uint8_t, m); + uint8_t* d_ptr = MSGPACK_SELECT_PTR(uint8_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT16: { + MSGPACK_ALLOCATE_PTR(int16_t, this); + int16_t* s_ptr = MSGPACK_SELECT(int16_t, m); + int16_t* d_ptr = MSGPACK_SELECT_PTR(int16_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT16: { + MSGPACK_ALLOCATE_PTR(uint16_t, this); + uint16_t* s_ptr = MSGPACK_SELECT(uint16_t, m); + uint16_t* d_ptr = MSGPACK_SELECT_PTR(uint16_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT32: { + MSGPACK_ALLOCATE_PTR(int32_t, this); + int32_t* s_ptr = MSGPACK_SELECT(int32_t, m); + int32_t* d_ptr = MSGPACK_SELECT_PTR(int32_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT32: { + MSGPACK_ALLOCATE_PTR(uint32_t, this); + uint32_t* s_ptr = MSGPACK_SELECT(uint32_t, m); + uint32_t* d_ptr = MSGPACK_SELECT_PTR(uint32_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_INT64: { + MSGPACK_ALLOCATE_PTR(int64_t, this); + int64_t* s_ptr = MSGPACK_SELECT(int64_t, m); + int64_t* d_ptr = MSGPACK_SELECT_PTR(int64_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_UINT64: { + MSGPACK_ALLOCATE_PTR(uint64_t, this); + uint64_t* s_ptr = MSGPACK_SELECT(uint64_t, m); + uint64_t* d_ptr = MSGPACK_SELECT_PTR(uint64_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_FLOAT: { + MSGPACK_ALLOCATE_PTR(float_t, this); + float_t* s_ptr = MSGPACK_SELECT(float_t, m); + float_t* d_ptr = MSGPACK_SELECT_PTR(float_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_DOUBLE: { + MSGPACK_ALLOCATE_PTR(double_t, this); + double_t* s_ptr = MSGPACK_SELECT(double_t, m); + double_t* d_ptr = MSGPACK_SELECT_PTR(double_t, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_STRING: { + MSGPACK_ALLOCATE_PTR(std::string, this); + std::string* s_ptr = MSGPACK_SELECT(std::string, m); + std::string* d_ptr = MSGPACK_SELECT_PTR(std::string, this); + *d_ptr = *s_ptr; + } break; + case MSGPACK_ARRAY: + case MSGPACK_MAP: { + MSGPACK_ALLOCATE_PTR(msgpack_array, this); + msgpack_array* s_ptr = MSGPACK_SELECT(msgpack_array, m); + msgpack_array* d_ptr = MSGPACK_SELECT_PTR(msgpack_array, this); + *d_ptr = *s_ptr; + } break;} + type = m.type; + name = m.name; + return *this; +} diff --git a/src/KKdLib/msgpack.h b/src/KKdLib/msgpack.h deleted file mode 100644 index 4b84abce..00000000 --- a/src/KKdLib/msgpack.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "default.h" -#include "string.h" -#include "vector.h" - -enum msgpack_type { - MSGPACK_NONE = 0, - MSGPACK_NULL, - MSGPACK_bool, - MSGPACK_INT8, - MSGPACK_UINT8, - MSGPACK_INT16, - MSGPACK_UINT16, - MSGPACK_INT32, - MSGPACK_UINT32, - MSGPACK_INT64, - MSGPACK_UINT64, - MSGPACK_FLOAT, - MSGPACK_DOUBLE, - MSGPACK_STRING, - MSGPACK_ARRAY, - MSGPACK_MAP, -}; - -#pragma pack(push, 4) -struct msgpack { - union { - uint8_t data[0x1C]; - void* ptr; - }; - msgpack_type type; - string name; -}; -#pragma pack(pop) - -#define MSGPACK_CHECK(a) sizeof(a) > 0x1C -#define MSGPACK_SELECT(a, b) (MSGPACK_CHECK(a) ? (a*)(b).ptr : (##a##*)(b).data) -#define MSGPACK_SELECT_PTR(a, b) (MSGPACK_CHECK(a) ? (a*)(b)->ptr : (##a##*)(b)->data) - -vector_old(msgpack) - -typedef vector_old_msgpack msgpack_array; -typedef vector_old_msgpack msgpack_map; - -extern void msgpack_init_map(msgpack* msg, const char* name); -extern void msgpack_init_array(msgpack* msg, const char* name, size_t length); -extern void msgpack_init_null(msgpack* msg, const char* name); -extern void msgpack_init_bool(msgpack* msg, const char* name, bool val); -extern void msgpack_init_int8_t(msgpack* msg, const char* name, int8_t val); -extern void msgpack_init_uint8_t(msgpack* msg, const char* name, uint8_t val); -extern void msgpack_init_int16_t(msgpack* msg, const char* name, int16_t val); -extern void msgpack_init_uint16_t(msgpack* msg, const char* name, uint16_t val); -extern void msgpack_init_int32_t(msgpack* msg, const char* name, int32_t val); -extern void msgpack_init_uint32_t(msgpack* msg, const char* name, uint32_t val); -extern void msgpack_init_int64_t(msgpack* msg, const char* name, int64_t val); -extern void msgpack_init_uint64_t(msgpack* msg, const char* name, uint64_t val); -extern void msgpack_init_float_t(msgpack* msg, const char* name, float_t val); -extern void msgpack_init_double_t(msgpack* msg, const char* name, double_t val); -extern void msgpack_init_utf8_string(msgpack* msg, const char* name, const char* val); -extern void msgpack_init_utf16_string(msgpack* msg, const char* name, const wchar_t* val); -extern void msgpack_init_string(msgpack* msg, const char* name, string* val); -extern void msgpack_init_wstring(msgpack* msg, const char* name, wstring* val); -extern bool msgpack_check_null(msgpack* msg); -extern bool msgpack_check_not_null(msgpack* msg); -extern msgpack* msgpack_get_by_index(msgpack* msg, size_t index); -extern void msgpack_set_by_index(msgpack* msg, msgpack* m, size_t index); -extern msgpack* msgpack_get_by_name(msgpack* msg, const char* name); -extern void msgpack_set_by_name(msgpack* msg, msgpack* m); -extern void msgpack_append(msgpack* msg, msgpack* m); -extern void msgpack_append_bool(msgpack* msg, const char* name, bool val); -extern void msgpack_append_int8_t(msgpack* msg, const char* name, int8_t val); -extern void msgpack_append_uint8_t(msgpack* msg, const char* name, uint8_t val); -extern void msgpack_append_int16_t(msgpack* msg, const char* name, int16_t val); -extern void msgpack_append_uint16_t(msgpack* msg, const char* name, uint16_t val); -extern void msgpack_append_int32_t(msgpack* msg, const char* name, int32_t val); -extern void msgpack_append_uint32_t(msgpack* msg, const char* name, uint32_t val); -extern void msgpack_append_int64_t(msgpack* msg, const char* name, int64_t val); -extern void msgpack_append_uint64_t(msgpack* msg, const char* name, uint64_t val); -extern void msgpack_append_float_t(msgpack* msg, const char* name, float_t val); -extern void msgpack_append_double_t(msgpack* msg, const char* name, double_t val); -extern void msgpack_append_utf8_string(msgpack* msg, const char* name, const char* val); -extern void msgpack_append_utf16_string(msgpack* msg, const char* name, const wchar_t* val); -extern void msgpack_append_string(msgpack* msg, const char* name, string* val); -extern void msgpack_append_wstring(msgpack* msg, const char* name, wstring* val); -extern void msgpack_set_null(msgpack* msg, const char* name); -extern void msgpack_set_array(msgpack* msg, const char* name, msgpack_array* val); -extern void msgpack_set_array_empty(msgpack* msg, const char* name); -extern void msgpack_set_map(msgpack* msg, const char* name, msgpack_map* val); -extern void msgpack_set_map_empty(msgpack* msg, const char* name); -extern void msgpack_set_bool(msgpack* msg, const char* name, bool val); -extern void msgpack_set_int8_t(msgpack* msg, const char* name, int8_t val); -extern void msgpack_set_uint8_t(msgpack* msg, const char* name, uint8_t val); -extern void msgpack_set_int16_t(msgpack* msg, const char* name, int16_t val); -extern void msgpack_set_uint16_t(msgpack* msg, const char* name, uint16_t val); -extern void msgpack_set_int32_t(msgpack* msg, const char* name, int32_t val); -extern void msgpack_set_uint32_t(msgpack* msg, const char* name, uint32_t val); -extern void msgpack_set_int64_t(msgpack* msg, const char* name, int64_t val); -extern void msgpack_set_uint64_t(msgpack* msg, const char* name, uint64_t val); -extern void msgpack_set_float_t(msgpack* msg, const char* name, float_t val); -extern void msgpack_set_double_t(msgpack* msg, const char* name, double_t val); -extern void msgpack_set_utf8_string(msgpack* msg, const char* name, const char* val); -extern void msgpack_set_utf16_string(msgpack* msg, const char* name, const wchar_t* val); -extern void msgpack_set_string(msgpack* msg, const char* name, string* val); -extern void msgpack_set_wstring(msgpack* msg, const char* name, wstring* val); -extern msgpack* msgpack_read(msgpack* msg, const char* name); -extern bool msgpack_read_bool(msgpack* msg, const char* name); -extern int8_t msgpack_read_int8_t(msgpack* msg, const char* name); -extern uint8_t msgpack_read_uint8_t(msgpack* msg, const char* name); -extern int16_t msgpack_read_int16_t(msgpack* msg, const char* name); -extern uint16_t msgpack_read_uint16_t(msgpack* msg, const char* name); -extern int32_t msgpack_read_int32_t(msgpack* msg, const char* name); -extern uint32_t msgpack_read_uint32_t(msgpack* msg, const char* name); -extern int64_t msgpack_read_int64_t(msgpack* msg, const char* name); -extern uint64_t msgpack_read_uint64_t(msgpack* msg, const char* name); -extern float_t msgpack_read_float_t(msgpack* msg, const char* name); -extern double_t msgpack_read_double_t(msgpack* msg, const char* name); -extern char* msgpack_read_utf8_string(msgpack* msg, const char* name); -extern wchar_t* msgpack_read_utf16_string(msgpack* msg, const char* name); -extern void msgpack_read_string(msgpack* msg, const char* name, string* str); -extern void msgpack_read_wstring(msgpack* msg, const char* name, wstring* str); -extern void msgpack_free(msgpack* msg); diff --git a/src/KKdLib/msgpack.hpp b/src/KKdLib/msgpack.hpp new file mode 100644 index 00000000..a0482db0 --- /dev/null +++ b/src/KKdLib/msgpack.hpp @@ -0,0 +1,107 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include "default.h" +#include "string.h" + +enum msgpack_type : uint32_t { + MSGPACK_NONE = 0, + MSGPACK_NULL, + MSGPACK_BOOL, + MSGPACK_INT8, + MSGPACK_UINT8, + MSGPACK_INT16, + MSGPACK_UINT16, + MSGPACK_INT32, + MSGPACK_UINT32, + MSGPACK_INT64, + MSGPACK_UINT64, + MSGPACK_FLOAT, + MSGPACK_DOUBLE, + MSGPACK_STRING, + MSGPACK_ARRAY, + MSGPACK_MAP, +}; + +struct msgpack; + +typedef std::vector msgpack_array; + +union msgpack_data { + uint8_t data[0x08]; + union { + void* ptr; + std::string* str; + msgpack_array* arr; + }; +}; + +struct msgpack { + msgpack_type type; + std::string name; + msgpack_data data; + + msgpack(); + msgpack(const msgpack& m); + msgpack(const char* name); + msgpack(const char* name, bool array, size_t length); + msgpack(const char* name, bool array, msgpack_array& val); + msgpack(const char* name, bool val); + msgpack(const char* name, int8_t val); + msgpack(const char* name, uint8_t val); + msgpack(const char* name, int16_t val); + msgpack(const char* name, uint16_t val); + msgpack(const char* name, int32_t val); + msgpack(const char* name, uint32_t val); + msgpack(const char* name, int64_t val); + msgpack(const char* name, uint64_t val); + msgpack(const char* name, float_t val); + msgpack(const char* name, double_t val); + msgpack(const char* name, const char* val); + msgpack(const char* name, const wchar_t* val); + msgpack(const char* name, string* val); + msgpack(const char* name, std::string* val); + msgpack(const char* name, wstring* val); + msgpack(const char* name, std::wstring* val); + ~msgpack(); + + bool check_null(); + bool check_not_null(); + msgpack* get_by_index(size_t index); + void set_by_index(msgpack* m, size_t index); + msgpack* get_by_name(const char* name); + void set_by_name(msgpack* m); + void append(msgpack* m); + void append(msgpack& m); + void append(msgpack&& m); + msgpack* read(const char* name); + bool read_bool(const char* name); + int8_t read_int8_t(const char* name); + uint8_t read_uint8_t(const char* name); + int16_t read_int16_t(const char* name); + uint16_t read_uint16_t(const char* name); + int32_t read_int32_t(const char* name); + uint32_t read_uint32_t(const char* name); + int64_t read_int64_t(const char* name); + uint64_t read_uint64_t(const char* name); + float_t read_float_t(const char* name); + double_t read_double_t(const char* name); + char* read_utf8_string(const char* name); + wchar_t* read_utf16_string(const char* name); + void read_string(const char* name, string* str); + void read_string(const char* name, std::string* str); + void read_string(const char* name, wstring* str); + void read_string(const char* name, std::wstring* str); + + msgpack& operator=(const msgpack& m); +}; + +#define MSGPACK_CHECK(a) (sizeof(a) > 0x08) +#define MSGPACK_SELECT(a, b) (MSGPACK_CHECK(a) ? (a*)(b).data.ptr : (##a##*)(b).data.data) +#define MSGPACK_SELECT_PTR(a, b) (MSGPACK_CHECK(a) ? (a*)(b)->data.ptr : (##a##*)(b)->data.data) diff --git a/src/KKdLib/obj.c b/src/KKdLib/obj.cpp similarity index 82% rename from src/KKdLib/obj.c rename to src/KKdLib/obj.cpp index 863b591b..8fb4e75e 100644 --- a/src/KKdLib/obj.c +++ b/src/KKdLib/obj.cpp @@ -3,15 +3,15 @@ GitHub/GitLab: korenkonder */ -#include "obj.h" -#include "f2/struct.h" +#include "obj.hpp" +#include +#include "f2/struct.hpp" #include "io/path.h" #include "io/stream.h" #include "half_t.h" -#include "hash.h" -#include "sort.h" +#include "hash.hpp" +#include "sort.hpp" #include "str_utils.h" -#include "vector.h" enum obj_vertex_attrib_type { OBJ_VERTEX_ATTRIB_POSITION = 0x00000001, @@ -31,55 +31,55 @@ enum obj_vertex_attrib_type { }; struct obj_skin_block_header { - ssize_t block_signature_offset; - ssize_t block_offset; + int64_t block_signature_offset; + int64_t block_offset; }; struct obj_skin_ex_data_header { - int32_t osage_count; - ssize_t osage_nodes_offset; - ssize_t osage_names_offset; - ssize_t blocks_offset; - int32_t bone_names_count; - ssize_t bone_names_offset; - ssize_t osage_sibling_infos_offset; - int32_t cloth_count; + uint32_t osage_count; + int64_t osage_nodes_offset; + int64_t osage_names_offset; + int64_t blocks_offset; + uint32_t bone_names_count; + int64_t bone_names_offset; + int64_t osage_sibling_infos_offset; + uint32_t cloth_count; }; struct obj_skin_header { - ssize_t bone_ids_offset; - ssize_t bone_matrices_offset; - ssize_t bone_names_offset; - ssize_t ex_data_offset; - ssize_t bone_parent_ids_offset; + int64_t bone_ids_offset; + int64_t bone_matrices_offset; + int64_t bone_names_offset; + int64_t ex_data_offset; + int64_t bone_parent_ids_offset; }; struct obj_sub_mesh_header { - ssize_t bone_indices_offset; - ssize_t indices_offset; + int64_t bone_indices_offset; + int64_t indices_offset; }; struct obj_mesh_header { - ssize_t sub_meshes_offset; + int64_t sub_meshes_offset; obj_vertex_attrib_type attrib_type; - int32_t vertex_size; - int32_t vertex_count; - ssize_t attrib_offsets[20]; + uint32_t vertex_size; + uint32_t vertex_count; + int64_t attrib_offsets[20]; uint32_t attrib_flags; }; struct obj_header { - ssize_t meshes_offset; - ssize_t materials_offset; + int64_t meshes_offset; + int64_t materials_offset; }; struct obj_set_header { int32_t max_object_id; - ssize_t objects_offset; - ssize_t object_skins_offset; - ssize_t object_names_offset; - ssize_t object_ids_offset; - ssize_t texture_ids_offset; + int64_t objects_offset; + int64_t object_skins_offset; + int64_t object_names_offset; + int64_t object_ids_offset; + int64_t texture_ids_offset; }; const char obj_material_texture_enrs_table_bin[] = @@ -119,128 +119,129 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s); static void obj_set_classic_write_inner(obj_set* os, stream* s); static void obj_classic_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); static void obj_classic_write_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); -static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset); -static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset); -static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset); -static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset); +static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset); +static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset); +static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset); +static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset); static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, stream* s, char** str); static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, - ssize_t* field_18_offset, ssize_t* field_1C_offset, ssize_t* field_20_offset, - ssize_t* field_24_offset, ssize_t* field_28_offset); + stream* s, std::vector& strings, std::vector& string_offsets, + int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, + int64_t* field_24_offset, int64_t* field_28_offset); static void obj_classic_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, stream* s, char** str); static void obj_classic_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets); + stream* s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, stream* s, char** str); static void obj_classic_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets); + stream* s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, stream* s, char** str); static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names, ssize_t* offsets); + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* offsets); static void obj_classic_read_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, stream* s, char** str); static void obj_classic_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets); + stream* s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, stream* s, char** str); static void obj_classic_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets); + stream* s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_expression(obj_skin_block_expression* b, stream* s, char** str); static void obj_classic_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names); + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names); static void obj_classic_read_skin_block_motion(obj_skin_block_motion* b, stream* s, char** str); static void obj_classic_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, - char** bone_names, ssize_t* bone_names_offset, ssize_t* bone_matrices_offset); + stream* s, std::vector& strings, std::vector& string_offsets, + char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset); static void obj_classic_read_skin_block_node(obj_skin_block_node* b, stream* s, char** str); static void obj_classic_write_skin_block_node(obj_skin_block_node* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets); + stream* s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, stream* s, char** str); static void obj_classic_write_skin_block_osage(obj_skin_block_osage* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, ssize_t* nodes_offset); -static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, - ssize_t base_offset, int32_t vertex_count, obj_vertex_attrib_type attrib_type); -static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, - ssize_t base_offset, int32_t* vertex_count, obj_vertex_attrib_type* attrib_type, int32_t* vertex_size); + stream* s, std::vector& strings, std::vector& string_offsets, int64_t* nodes_offset); +static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, obj_mesh* mesh, + int64_t base_offset, uint32_t vertex_count, obj_vertex_attrib_type attrib_type); +static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offsets, obj_mesh* mesh, + int64_t base_offset, uint32_t* vertex_count, obj_vertex_attrib_type* attrib_type, uint32_t* vertex_size); static void obj_set_modern_read_inner(obj_set* os, stream* s); static void obj_set_modern_write_inner(obj_set* os, stream* s); static void obj_modern_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); static void obj_modern_write_index(obj* obj, stream* s, bool is_x, obj_sub_mesh* sub_mesh, f2_struct* ovtx); -static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, +static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, uint32_t header_length, bool is_x, stream* s_oidx, stream* s_ovtx); static void obj_modern_write_model(obj* obj, stream* s, - ssize_t base_offset, bool is_x, f2_struct* omdl); -static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, + int64_t base_offset, bool is_x, f2_struct* omdl); +static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, uint32_t header_length, bool is_x); static void obj_modern_write_skin(obj* obj, stream* s, - ssize_t base_offset, bool is_x, f2_struct* oskn); + int64_t base_offset, bool is_x, f2_struct* oskn); static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x, - ssize_t* field_18_offset, ssize_t* field_1C_offset, ssize_t* field_20_offset, - ssize_t* field_24_offset, ssize_t* field_28_offset); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, + int64_t* field_24_offset, int64_t* field_28_offset); static void obj_modern_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names, - bool is_x, ssize_t* offsets); + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, + bool is_x, int64_t* offsets); static void obj_modern_read_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_expression(obj_skin_block_expression* b, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names, bool is_x); + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x); static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x, - char** bone_names, ssize_t* bone_names_offset, ssize_t* bone_matrices_offset); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset); static void obj_modern_read_skin_block_node(obj_skin_block_node* b, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_node(obj_skin_block_node* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_osage(obj_skin_block_osage* b, stream* s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_osage(obj_skin_block_osage* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x); -static void obj_modern_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, - const uint32_t attrib_flags, int32_t vertex_count, int32_t vertex_size); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); +static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, obj_mesh* mesh, + const uint32_t attrib_flags, uint32_t vertex_count, uint32_t vertex_size); static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, - ssize_t* attrib_offsets, obj_mesh* mesh, uint32_t* attrib_flags, - int32_t* vertex_count, int32_t* vertex_size, f2_struct* ovtx); + int64_t* attrib_offsets, obj_mesh* mesh, uint32_t* attrib_flags, + uint32_t* vertex_count, uint32_t* vertex_size, f2_struct* ovtx); static void obj_skin_block_node_free(obj_skin_block_node* b); -static uint32_t obj_skin_strings_get_string_index(vector_old_string* vec, const char* str); -static ssize_t obj_skin_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, const char* str); -static ssize_t obj_skin_strings_get_string_offset_by_index(vector_old_string* vec, - vector_old_ssize_t* vec_off, char** strings, uint32_t index); -static void obj_skin_strings_push_back_check(vector_old_string* vec, const char* str); -static void obj_skin_strings_push_back_check_by_index(vector_old_string* vec, char** strings, uint32_t index); +static uint32_t obj_skin_strings_get_string_index(std::vector& vec, const char* str); +static int64_t obj_skin_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, const char* str); +static int64_t obj_skin_strings_get_string_offset_by_index(std::vector& vec, + std::vector& vec_off, char** strings, uint32_t index); +static void obj_skin_strings_push_back_check(std::vector& vec, const char* str); +static void obj_skin_strings_push_back_check_by_index(std::vector& vec, + char** strings, uint32_t index); obj_set::obj_set() : ready(), modern(), is_x(), objects(), objects_count(), texture_ids(), texture_ids_count() { @@ -248,13 +249,13 @@ objects_count(), texture_ids(), texture_ids_count() { } obj_set::~obj_set() { - for (int32_t i = 0; i < objects_count; i++) { + for (uint32_t i = 0; i < objects_count; i++) { obj* obj = &objects[i]; - for (int32_t j = 0; j < obj->skin.bones_count; j++) + for (uint32_t j = 0; j < obj->skin.bones_count; j++) string_free(&obj->skin.bones[j].name); free(obj->skin.bones); - for (int32_t j = 0; j < obj->skin.ex_data.blocks_count; j++) { + for (uint32_t j = 0; j < obj->skin.ex_data.blocks_count; j++) { obj_skin_block* block = &obj->skin.ex_data.blocks[j]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: { @@ -264,7 +265,7 @@ obj_set::~obj_set() { for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; - for (int32_t l = 0; l < 4; l++) + for (uint32_t l = 0; l < 4; l++) string_free(&sub->sub_data[l].bone_name); } free(cloth->field_1C); @@ -280,7 +281,7 @@ obj_set::~obj_set() { case OBJ_SKIN_BLOCK_EXPRESSION: { obj_skin_block_expression* expression = &block->expression; obj_skin_block_node_free(&expression->base); - for (int32_t k = 0; k < 9; k++) + for (uint32_t k = 0; k < 9; k++) string_free(&expression->expressions[k]); } break; case OBJ_SKIN_BLOCK_MOTION: { @@ -305,10 +306,10 @@ obj_set::~obj_set() { free(obj->skin.ex_data.osage_sibling_infos); if (obj->meshes) - for (int32_t j = 0; j < obj->meshes_count; j++) { + for (uint32_t j = 0; j < obj->meshes_count; j++) { obj_mesh* mesh = &obj->meshes[j]; if (mesh->sub_meshes) - for (int32_t k = 0; k < mesh->sub_meshes_count; k++) { + for (uint32_t k = 0; k < mesh->sub_meshes_count; k++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[k]; free(sub_mesh->bone_indices); free(sub_mesh->indices); @@ -324,7 +325,7 @@ obj_set::~obj_set() { free(texture_ids); } -void obj_set::pack_file(void** data, size_t* length) { +void obj_set::pack_file(void** data, size_t* size) { if (!data || !ready) return; @@ -335,16 +336,16 @@ void obj_set::pack_file(void** data, size_t* length) { else obj_set_modern_write_inner(this, &s); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); } -void obj_set::unpack_file(void* data, size_t length, bool modern) { - if (!data || !length) +void obj_set::unpack_file(void* data, size_t size, bool modern) { + if (!data || !size) return; stream s; - io_open(&s, data, length); + io_open(&s, data, size); if (!modern) obj_set_classic_read_inner(this, &s); else @@ -390,14 +391,14 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { osh.texture_ids_offset = io_read_int32_t(s); os->texture_ids_count = io_read_int32_t(s); - int32_t count = os->objects_count; + uint32_t count = os->objects_count; os->objects = force_malloc_s(obj, os->objects_count); int32_t* objects_offsets = 0; if (osh.objects_offset) { objects_offsets = force_malloc_s(int32_t, count); io_set_position(s, osh.objects_offset, SEEK_SET); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) objects_offsets[i] = io_read_int32_t(s); } @@ -405,7 +406,7 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { if (osh.object_skins_offset) { object_skins_offsets = force_malloc_s(int32_t, count); io_set_position(s, osh.object_skins_offset, SEEK_SET); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) object_skins_offsets[i] = io_read_int32_t(s); } @@ -413,12 +414,12 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { if (osh.object_names_offset) { object_names_offsets = force_malloc_s(int32_t, count); io_set_position(s, osh.object_names_offset, SEEK_SET); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) object_names_offsets[i] = io_read_int32_t(s); } if (osh.objects_offset) { - for (int32_t i = 0; i < count; i++) { + for (uint32_t i = 0; i < count; i++) { obj* obj = &os->objects[i]; if (objects_offsets[i]) obj_classic_read_model(obj, s, objects_offsets[i]); @@ -431,14 +432,14 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { } io_set_position(s, osh.object_ids_offset, SEEK_SET); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) os->objects[i].id = io_read_uint32_t(s); } if (osh.texture_ids_offset) { os->texture_ids = force_malloc_s(uint32_t, os->texture_ids_count); io_set_position(s, osh.texture_ids_offset, SEEK_SET); - for (int32_t i = 0; i < os->texture_ids_count; i++) + for (uint32_t i = 0; i < os->texture_ids_count; i++) os->texture_ids[i] = io_read_uint32_t(s); } @@ -451,7 +452,6 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { os->ready = true; } - static void obj_set_classic_write_inner(obj_set* os, stream* s) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -472,28 +472,28 @@ static void obj_set_classic_write_inner(obj_set* os, stream* s) { memset(&osh, 0, sizeof(obj_set_header)); osh.max_object_id = -1; - int32_t count = os->objects_count; + uint32_t count = os->objects_count; osh.objects_offset = io_get_position(s); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_int32_t(s, 0); io_align_write(s, 0x10); int32_t* objects_offsets = force_malloc_s(int32_t, count); - for (int32_t i = 0; i < count; i++) { + for (uint32_t i = 0; i < count; i++) { objects_offsets[i] = (int32_t)io_get_position(s); obj_classic_write_model(&os->objects[i], s, objects_offsets[i]); } io_align_write(s, 0x10); io_position_push(s, osh.objects_offset, SEEK_SET); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_int32_t(s, (int32_t)objects_offsets[i]); io_position_pop(s); free(objects_offsets); osh.object_ids_offset = io_get_position(s); - for (int32_t i = 0; i < count; i++) { + for (uint32_t i = 0; i < count; i++) { int32_t object_id = os->objects[i].id; io_write_uint32_t(s, object_id); if (osh.max_object_id < object_id) @@ -502,30 +502,30 @@ static void obj_set_classic_write_inner(obj_set* os, stream* s) { io_align_write(s, 0x10); int32_t* object_names_offsets = force_malloc_s(int32_t, count); - for (int32_t i = 0; i < count; i++) { + for (uint32_t i = 0; i < count; i++) { object_names_offsets[i] = (int32_t)io_get_position(s); io_write_string_null_terminated(s, &os->objects[i].name); } io_align_write(s, 0x10); osh.object_names_offset = io_get_position(s); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_int32_t(s, object_names_offsets[i]); io_align_write(s, 0x10); free(object_names_offsets); osh.texture_ids_offset = io_get_position(s); - for (int32_t i = 0; i < os->texture_ids_count; i++) + for (uint32_t i = 0; i < os->texture_ids_count; i++) io_write_uint32_t(s, os->texture_ids[i]); io_align_write(s, 0x10); osh.object_skins_offset = io_get_position(s); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_int32_t(s, 0); io_align_write(s, 0x10); int32_t* object_skins_offsets = force_malloc_s(int32_t, count); - for (int32_t i = 0; i < count; i++) { + for (uint32_t i = 0; i < count; i++) { if (!os->objects[i].skin_init) { object_skins_offsets[i] = 0; continue; @@ -537,7 +537,7 @@ static void obj_set_classic_write_inner(obj_set* os, stream* s) { io_align_write(s, 0x10); io_position_push(s, osh.object_skins_offset, SEEK_SET); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_int32_t(s, object_skins_offsets[i]); io_position_pop(s); free(object_skins_offsets); @@ -560,23 +560,23 @@ static void obj_set_classic_write_inner(obj_set* os, stream* s) { static void obj_classic_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh) { bool tri_strip = sub_mesh->primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP; - int32_t indices_count = sub_mesh->indices_count; + uint32_t indices_count = sub_mesh->indices_count; uint32_t* indices = force_malloc_s(uint32_t, indices_count); switch (sub_mesh->index_format) { case OBJ_INDEX_U8: - for (int32_t i = 0; i < indices_count; i++) { + for (uint32_t i = 0; i < indices_count; i++) { uint8_t idx = io_read_uint8_t(s); indices[i] = tri_strip && idx == 0xFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U16: - for (int32_t i = 0; i < indices_count; i++) { + for (uint32_t i = 0; i < indices_count; i++) { uint16_t idx = io_read_uint16_t(s); indices[i] = tri_strip && idx == 0xFFFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U32: - for (int32_t i = 0; i < indices_count; i++) + for (uint32_t i = 0; i < indices_count; i++) indices[i] = io_read_uint32_t(s); break; } @@ -585,25 +585,25 @@ static void obj_classic_read_index(obj* obj, stream* s, static void obj_classic_write_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh) { uint32_t* indices = sub_mesh->indices; - int32_t indices_count = sub_mesh->indices_count; + uint32_t indices_count = sub_mesh->indices_count; switch (sub_mesh->index_format) { case OBJ_INDEX_U8: - for (int32_t i = 0; i < indices_count; i++) + for (uint32_t i = 0; i < indices_count; i++) io_write_uint8_t(s, (uint8_t)indices[i]); break; case OBJ_INDEX_U16: - for (int32_t i = 0; i < indices_count; i++) + for (uint32_t i = 0; i < indices_count; i++) io_write_uint16_t(s, (uint16_t)indices[i]); break; case OBJ_INDEX_U32: - for (int32_t i = 0; i < indices_count; i++) + for (uint32_t i = 0; i < indices_count; i++) io_write_uint32_t(s, indices[i]); break; } io_align_write(s, 0x04); } -static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset) { +static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { const size_t mesh_size = 0xD8; const size_t sub_mesh_size = 0x5C; @@ -624,7 +624,7 @@ static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset) { if (oh.meshes_offset > 0) { obj->meshes = force_malloc_s(obj_mesh, obj->meshes_count); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; io_set_position(s, base_offset + oh.meshes_offset + mesh_size * i, SEEK_SET); @@ -642,7 +642,7 @@ static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset) { mh.vertex_size = io_read_int32_t(s); mh.vertex_count = io_read_int32_t(s); - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) mh.attrib_offsets[j] = io_read_int32_t(s); mesh->flags = (obj_mesh_flags)io_read_uint32_t(s); @@ -653,7 +653,7 @@ static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset) { if (mh.sub_meshes_offset) { mesh->sub_meshes = force_malloc_s(obj_sub_mesh, mesh->sub_meshes_count); - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; io_set_position(s, base_offset + mh.sub_meshes_offset + sub_mesh_size * j, SEEK_SET); @@ -705,7 +705,7 @@ static void obj_classic_read_model(obj* obj, stream* s, ssize_t base_offset) { } } -static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { +static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { const size_t mesh_size = 0xD8; const size_t sub_mesh_size = 0x5C; @@ -728,7 +728,7 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { oh.meshes_offset = io_get_position(s) - base_offset; obj_mesh_header* mhs = force_malloc_s(obj_mesh_header, obj->meshes_count); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; io_write(s, 0x04); @@ -742,7 +742,7 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -751,13 +751,13 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { io_write(s, sizeof(mesh->name)); } - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; obj_mesh_header* mh = &mhs[i]; if (mesh->sub_meshes_count) { mh->sub_meshes_offset = io_get_position(s) - base_offset; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { io_write(s, 0x04); io_write_float_t(s, 0.0f); io_write_float_t(s, 0.0f); @@ -781,7 +781,7 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { obj_classic_write_vertex(obj, s, mh->attrib_offsets, mesh, base_offset, &mh->vertex_count, &mh->attrib_type, &mh->vertex_size); - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; obj_sub_mesh_header smh; @@ -818,7 +818,7 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { } io_position_push(s, base_offset + oh.meshes_offset, SEEK_SET); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; obj_mesh_header* mh = &mhs[i]; @@ -833,7 +833,7 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { io_write_int32_t(s, mh->vertex_size); io_write_int32_t(s, mh->vertex_count); - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) io_write_int32_t(s, (int32_t)mh->attrib_offsets[j]); io_write_int32_t(s, mesh->flags); @@ -866,7 +866,7 @@ static void obj_classic_write_model(obj* obj, stream* s, ssize_t base_offset) { io_position_pop(s); } -static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { +static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { obj_skin* sk = &obj->skin; obj->skin_init = true; io_set_position(s, base_offset, SEEK_SET); @@ -888,19 +888,18 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { if (sh.bone_names_offset) { bone_names_offsets = force_malloc_s(int32_t, sk->bones_count); io_set_position(s, sh.bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) bone_names_offsets[i] = io_read_int32_t(s); } - if (sh.bone_ids_offset) { io_set_position(s, sh.bone_ids_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) sk->bones[i].id = io_read_uint32_t(s); if (sh.bone_matrices_offset) { io_set_position(s, sh.bone_matrices_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; mat.row0.x = io_read_float_t(s); mat.row1.x = io_read_float_t(s); @@ -922,13 +921,13 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { } if (sh.bone_names_offset) - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) io_read_string_null_terminated_offset(s, bone_names_offsets[i], &sk->bones[i].name); if (sh.bone_parent_ids_offset) { io_set_position(s, sh.bone_parent_ids_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) sk->bones[i].parent = io_read_uint32_t(s); } } @@ -952,44 +951,52 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { exh.bone_names_offset = io_read_int32_t(s); exh.osage_sibling_infos_offset = io_read_int32_t(s); exh.cloth_count = io_read_int32_t(s); - io_read(s, 0, 0x1C); + ex->field_24 = io_read_uint32_t(s); + ex->field_28 = io_read_uint32_t(s); + ex->field_2C = io_read_uint32_t(s); + ex->field_30 = io_read_uint32_t(s); + ex->field_34 = io_read_uint32_t(s); + ex->field_38 = io_read_uint32_t(s); + ex->field_3C = io_read_uint32_t(s); + ex->field_40 = io_read_uint32_t(s); if (exh.bone_names_offset) { - vector_old_string bone_names = vector_old_empty(string); - vector_old_string_reserve(&bone_names, exh.bone_names_count); + std::vector bone_names; + bone_names.reserve(exh.bone_names_count); int32_t* strings_offsets = force_malloc_s(int32_t, exh.bone_names_count); io_set_position(s, exh.bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < exh.bone_names_count; i++) + for (uint32_t i = 0; i < exh.bone_names_count; i++) strings_offsets[i] = io_read_int32_t(s); size_t buf_size = 0; - for (int32_t i = 0; i < exh.bone_names_count; i++) { - string* str = vector_old_string_reserve_back(&bone_names); - if (strings_offsets[i]) - io_read_string_null_terminated_offset(s, strings_offsets[i], str); + for (uint32_t i = 0; i < exh.bone_names_count; i++) { + if (strings_offsets[i]) { + std::string str; + io_read_string_null_terminated_offset(s, strings_offsets[i], &str); + bone_names.push_back(str); + } else - *str = string_empty; - buf_size += str->length + 1; + bone_names.push_back({}); + buf_size += bone_names.back().size() + 1; } free(strings_offsets); - if (bone_names.begin) { + if (bone_names.size()) { ex->bone_names_buf = force_malloc_s(char, buf_size); ex->bone_names = force_malloc_s(char*, buf_size + 1); ex->bone_names_count = exh.bone_names_count; char* bone_names_buf = ex->bone_names_buf; char** bone_names_ptr = ex->bone_names; - for (int32_t i = 0; i < exh.bone_names_count; i++) { - string* str = &bone_names.begin[i]; + for (uint32_t i = 0; i < exh.bone_names_count; i++) { + std::string* str = &bone_names.data()[i]; *bone_names_ptr++ = bone_names_buf; - memcpy(bone_names_buf, string_data(str), str->length); - bone_names_buf[str->length] = 0; - bone_names_buf += str->length + 1; + memcpy(bone_names_buf, str->c_str(), str->size()); + bone_names_buf[str->size()] = 0; + bone_names_buf += str->size() + 1; } *bone_names_ptr = 0; } - vector_old_string_free(&bone_names, string_free); } else { ex->bone_names_buf = 0; @@ -1005,7 +1012,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { ex->osage_nodes = force_malloc_s(obj_skin_osage_node, ex->osage_nodes_count); io_set_position(s, exh.osage_nodes_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_nodes_count; i++) { + for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; osage_node->name_index = io_read_uint32_t(s); @@ -1024,7 +1031,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { obj_skin_block_header* bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); io_set_position(s, exh.blocks_offset, SEEK_SET); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { bhs[i].block_signature_offset = io_read_int32_t(s); bhs[i].block_offset = io_read_int32_t(s); } @@ -1033,18 +1040,16 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { memset(&block, 0, sizeof(obj_skin_block)); ex->blocks = force_malloc_s(obj_skin_block, ex->blocks_count); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; - string block_signature = string_empty; + std::string block_signature; io_read_string_null_terminated_offset(s, bhs[i].block_signature_offset, &block_signature); - if (block_signature.length != 3) { - string_free(&block_signature); + if (block_signature.size() != 3) continue; - } - uint32_t signature = load_reverse_endianness_uint32_t(string_data(&block_signature)); + uint32_t signature = load_reverse_endianness_uint32_t(block_signature.c_str()); switch (signature) { case 'CLS\0': block->type = OBJ_SKIN_BLOCK_CLOTH; @@ -1077,7 +1082,6 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { s, bone_names); break; } - string_free(&block_signature); } free(bhs); } @@ -1094,7 +1098,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { obj_skin_osage_sibling_info, ex->osage_sibling_infos_count); ex->osage_sibling_infos = osis; io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { osis[i].name_index = io_read_uint32_t(s); osis[i].sibling_name_index = io_read_uint32_t(s); osis[i].max_distance = io_read_float_t(s); @@ -1103,7 +1107,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; @@ -1126,7 +1130,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, ssize_t base_offset) { } } -static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { +static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { obj_skin* sk = &obj->skin; obj_skin_header sh; @@ -1140,29 +1144,29 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_write(s, 0x0C); io_align_write(s, 0x10); - vector_old_string strings = vector_old_empty(string); - vector_old_ssize_t string_offsets = vector_old_empty(ssize_t); - vector_old_string bone_names = vector_old_empty(string); + std::vector strings; + std::vector string_offsets; + std::vector bone_names; if (sk->bones) { sh.bone_ids_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) io_write_int32_t(s, sk->bones[i].id); io_align_write(s, 0x10); sh.bone_parent_ids_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) io_write_int32_t(s, sk->bones[i].parent); io_align_write(s, 0x10); sh.bone_names_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { io_write_int32_t(s, 0); - obj_skin_strings_push_back_check(&strings, string_data(&sk->bones[i].name)); + obj_skin_strings_push_back_check(strings, string_data(&sk->bones[i].name)); } io_align_write(s, 0x10); sh.bone_matrices_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; io_write_float_t(s, mat.row0.x); io_write_float_t(s, mat.row1.x); @@ -1185,14 +1189,14 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } obj_skin_block_header* bhs = 0; - ssize_t osage_block_node = 0; - ssize_t motion_block_node_mats = 0; - ssize_t motion_block_node_name_offset = 0; - ssize_t field_18 = 0; - ssize_t field_1C = 0; - ssize_t field_20 = 0; - ssize_t field_24 = 0; - ssize_t field_28 = 0; + int64_t osage_block_node = 0; + int64_t motion_block_node_mats = 0; + int64_t motion_block_node_name_offset = 0; + int64_t field_18 = 0; + int64_t field_1C = 0; + int64_t field_20 = 0; + int64_t field_24 = 0; + int64_t field_28 = 0; obj_skin_ex_data_header exh; memset(&exh, 0, sizeof(obj_skin_ex_data_header)); @@ -1215,7 +1219,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (ex->osage_nodes_count) { exh.osage_nodes_offset = io_get_position(s); - for (int32_t i = 0; i < ex->osage_nodes_count; i++) { + for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -1223,7 +1227,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); exh.osage_sibling_infos_offset = io_get_position(s); - for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -1236,7 +1240,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { exh.cloth_count = 0; exh.osage_count = 0; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) exh.cloth_count++; @@ -1246,124 +1250,124 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (exh.osage_count || exh.cloth_count) { exh.osage_names_offset = io_get_position(s); - for (int32_t i = 0; i < exh.osage_count; i++) + for (uint32_t i = 0; i < exh.osage_count; i++) io_write_int32_t(s, 0); - for (int32_t i = 0; i < exh.cloth_count; i++) + for (uint32_t i = 0; i < exh.cloth_count; i++) io_write_int32_t(s, 0); io_align_write(s, 0x10); } char** bone_names_ptr = ex->bone_names; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(&strings, string_data(&cloth->mesh_name)); - obj_skin_strings_push_back_check(&strings, string_data(&cloth->backface_mesh_name)); + obj_skin_strings_push_back_check(strings, string_data(&cloth->mesh_name)); + 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]; - for (int32_t l = 0; l < 4; l++) - obj_skin_strings_push_back_check(&strings, + for (uint32_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"); + obj_skin_strings_push_back_check(strings, "CLS"); } break; case OBJ_SKIN_BLOCK_CONSTRAINT: { obj_skin_block_constraint* constraint = &block->constraint; - obj_skin_strings_push_back_check(&strings, string_data(&constraint->base.parent_name)); - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check(strings, string_data(&constraint->base.parent_name)); + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, constraint->name_index); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->source_node_name)); + obj_skin_strings_push_back_check(strings, string_data(&constraint->source_node_name)); switch (constraint->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - obj_skin_strings_push_back_check(&strings, "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, + 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, + obj_skin_strings_push_back_check(strings, "Position"); + 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, + 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"); + obj_skin_strings_push_back_check(strings, "CNS"); - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, constraint->name_index); } break; case OBJ_SKIN_BLOCK_EXPRESSION: { obj_skin_block_expression* expression = &block->expression; - for (int32_t j = 0; j < expression->expressions_count; j++) - obj_skin_strings_push_back_check(&strings, string_data(&expression->expressions[j])); - obj_skin_strings_push_back_check(&strings, string_data(&expression->base.parent_name)); - obj_skin_strings_push_back_check_by_index(&strings, + for (uint32_t j = 0; j < expression->expressions_count; j++) + obj_skin_strings_push_back_check(strings, string_data(&expression->expressions[j])); + obj_skin_strings_push_back_check(strings, string_data(&expression->base.parent_name)); + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, expression->name_index); - obj_skin_strings_push_back_check(&strings, "EXP"); + obj_skin_strings_push_back_check(strings, "EXP"); - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, expression->name_index); } break; case OBJ_SKIN_BLOCK_MOTION: { obj_skin_block_motion* motion = &block->motion; - obj_skin_strings_push_back_check(&strings, string_data(&motion->base.parent_name)); - obj_skin_strings_push_back_check(&strings, string_data(&motion->name)); - for (int32_t j = 0; j < motion->nodes_count; j++) - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check(strings, string_data(&motion->base.parent_name)); + obj_skin_strings_push_back_check(strings, string_data(&motion->name)); + for (uint32_t j = 0; j < motion->nodes_count; j++) + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, motion->nodes[j].name_index); - obj_skin_strings_push_back_check(&strings, "MOT"); + obj_skin_strings_push_back_check(strings, "MOT"); - obj_skin_strings_push_back_check(&bone_names, string_data(&motion->name)); - for (int32_t j = 0; j < motion->nodes_count; j++) - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check(bone_names, string_data(&motion->name)); + for (uint32_t j = 0; j < motion->nodes_count; j++) + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, motion->nodes[j].name_index); } break; case OBJ_SKIN_BLOCK_OSAGE: { obj_skin_block_osage* osage = &block->osage; - obj_skin_strings_push_back_check(&strings, string_data(&osage->base.parent_name)); - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check(strings, string_data(&osage->base.parent_name)); + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage->name_index); - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage->external_name_index); - for (int32_t j = 0; j < osage->count; j++) { + for (uint32_t j = 0; j < osage->count; j++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[j]; - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage_node->name_index); int32_t name_index = osage->name_index; obj_skin_osage_sibling_info* osage_sibling_infos = ex->osage_sibling_infos; - for (int32_t k = 0; k < ex->osage_sibling_infos_count; k++) { + for (uint32_t k = 0; k < ex->osage_sibling_infos_count; k++) { if (name_index == osage_sibling_infos->name_index) { - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage_sibling_infos->sibling_name_index); break; } osage_sibling_infos++; } } - obj_skin_strings_push_back_check(&strings, "OSG"); + obj_skin_strings_push_back_check(strings, "OSG"); - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage->external_name_index); - for (int32_t j = 0; j < osage->count; j++) { + for (uint32_t j = 0; j < osage->count; j++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[j]; - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage_node->name_index); int32_t name_index = osage->name_index; obj_skin_osage_sibling_info* osage_sibling_infos = ex->osage_sibling_infos; - for (int32_t k = 0; k < ex->osage_sibling_infos_count; k++) { + for (uint32_t k = 0; k < ex->osage_sibling_infos_count; k++) { if (name_index == osage_sibling_infos->name_index) { - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage_sibling_infos->sibling_name_index); break; } @@ -1372,15 +1376,15 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } obj_skin_osage_node* child_osage_node = &ex->osage_nodes[osage->start_index]; - for (int32_t j = 0; j < osage->count; j++) { - obj_skin_strings_push_back_check_by_index(&bone_names, + for (uint32_t j = 0; j < osage->count; j++) { + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, child_osage_node->name_index); int32_t name_index = child_osage_node->name_index; obj_skin_osage_sibling_info* osage_sibling_infos = ex->osage_sibling_infos; - for (int32_t k = 0; k < ex->osage_sibling_infos_count; k++) { + for (uint32_t k = 0; k < ex->osage_sibling_infos_count; k++) { if (name_index == osage_sibling_infos->name_index) { - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage_sibling_infos->sibling_name_index); break; } @@ -1388,24 +1392,24 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } child_osage_node++; } - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage->name_index); if (osage->root_init) - obj_skin_strings_push_back_check(&strings, string_data(&osage->root.name)); + obj_skin_strings_push_back_check(strings, string_data(&osage->root.name)); } break; } } - exh.bone_names_count = (int32_t)vector_old_length(bone_names); + exh.bone_names_count = (int32_t)bone_names.size(); exh.bone_names_offset = io_get_position(s); - for (string* i = bone_names.begin; i != bone_names.end; i++) + for (std::string& i : bone_names) io_write_int32_t(s, 0); io_align_write(s, 0x10); if (ex->blocks_count > 0) { exh.blocks_offset = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); } @@ -1414,7 +1418,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; @@ -1437,7 +1441,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } io_align_write(s, 0x10); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; @@ -1448,7 +1452,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } io_align_write(s, 0x10); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -1458,7 +1462,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } io_align_write(s, 0x10); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; @@ -1490,7 +1494,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); int32_t motion_block_count = 0; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -1504,7 +1508,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (exh.osage_count) { osage_block_node = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; @@ -1517,7 +1521,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (motion_block_count) { motion_block_node_mats = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -1528,7 +1532,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); motion_block_node_name_offset = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -1541,20 +1545,20 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (exh.cloth_count) { field_18 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - for (int32_t j = 0; j < 32; j++) + for (uint32_t j = 0; j < 32; j++) if (cloth->field_10 & (1 << j)) io_write(s, sizeof(mat4)); } io_align_write(s, 0x10); field_1C = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -1566,7 +1570,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); field_20 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -1577,7 +1581,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); field_24 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -1588,7 +1592,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_align_write(s, 0x10); field_28 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -1602,108 +1606,108 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { } if (sk->bones || sk->ex_data_init) { - quicksort_string(strings.begin, vector_old_length(strings)); - vector_old_ssize_t_reserve(&string_offsets, vector_old_length(strings)); - for (string* i = strings.begin; i != strings.end; i++) { - *vector_old_ssize_t_reserve_back(&string_offsets) = io_get_position(s); - io_write_string_null_terminated(s, i); + quicksort_string(strings.data(), strings.size()); + string_offsets.reserve(strings.size()); + for (std::string& i : strings) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &i); } } io_align_write(s, 0x10); - vector_old_string osage_names = vector_old_empty(string); + std::vector osage_names; if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; - ssize_t cls_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "CLS"); - ssize_t cns_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "CNS"); - ssize_t exp_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "EXP"); - ssize_t mot_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "MOT"); - ssize_t osg_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "OSG"); + int64_t cls_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "CLS"); + int64_t cns_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "CNS"); + int64_t exp_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "EXP"); + int64_t mot_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "MOT"); + int64_t osg_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "OSG"); if (ex->blocks_count > 0) { - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_cloth(&block->cloth, - s, &strings, &string_offsets, &field_18, &field_1C, &field_20, &field_24, &field_28); + s, strings, string_offsets, &field_18, &field_1C, &field_20, &field_24, &field_28); io_position_pop(s); } - ssize_t constraint_type_name_offsets[4]; - constraint_type_name_offsets[0] = obj_skin_strings_get_string_offset(&strings, - &string_offsets, "Orientation"); - 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"); + int64_t constraint_type_name_offsets[4]; + constraint_type_name_offsets[0] = obj_skin_strings_get_string_offset(strings, + string_offsets, "Orientation"); + 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++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_constraint(&block->constraint, - s, &strings, &string_offsets, bone_names_ptr, constraint_type_name_offsets); + s, strings, string_offsets, bone_names_ptr, constraint_type_name_offsets); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_expression(&block->expression, - s, &strings, &string_offsets, bone_names_ptr); + s, strings, string_offsets, bone_names_ptr); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_motion(&block->motion, - s, &strings, &string_offsets, bone_names_ptr, + s, strings, string_offsets, bone_names_ptr, &motion_block_node_name_offset, &motion_block_node_mats); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_osage(&block->osage, - s, &strings, &string_offsets, &osage_block_node); + s, strings, string_offsets, &osage_block_node); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(&osage_names, string_data(&cloth->mesh_name)); + obj_skin_strings_push_back_check(osage_names, string_data(&cloth->mesh_name)); } else if (block->type == OBJ_SKIN_BLOCK_OSAGE) { obj_skin_block_osage* osage = &block->osage; - obj_skin_strings_push_back_check_by_index(&osage_names, + obj_skin_strings_push_back_check_by_index(osage_names, bone_names_ptr, osage->external_name_index); } } io_position_push(s, exh.blocks_offset, SEEK_SET); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: @@ -1741,9 +1745,9 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (sk->bones) { io_position_push(s, sh.bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(&sk->bones[i].name)); + for (uint32_t i = 0; i < sk->bones_count; i++) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, string_data(&sk->bones[i].name)); io_write_int32_t(s, (int32_t)str_offset); } io_position_pop(s); @@ -1754,15 +1758,15 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { if (ex->blocks_count > 0) { io_position_push(s, exh.bone_names_offset, SEEK_SET); - for (string* i = bone_names.begin; i != bone_names.end; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(i)); + for (std::string& i : bone_names) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, i.c_str()); io_write_int32_t(s, (int32_t)str_offset); } io_position_pop(s); io_position_push(s, exh.osage_nodes_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_nodes_count; i++) { + for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; io_write_uint32_t(s, osage_node->name_index); io_write_float_t(s, osage_node->length); @@ -1771,7 +1775,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_position_pop(s); io_position_push(s, exh.osage_sibling_infos_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { obj_skin_osage_sibling_info* osage_sibling_info = &ex->osage_sibling_infos[i]; io_write_uint32_t(s, osage_sibling_info->name_index); io_write_uint32_t(s, osage_sibling_info->sibling_name_index); @@ -1782,12 +1786,12 @@ 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)vector_old_length(osage_names); + exh.osage_count = (int32_t)osage_names.size(); 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++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(i)); + for (std::string& i : osage_names) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, i.c_str()); io_write_int32_t(s, (int32_t)str_offset); } io_position_pop(s); @@ -1797,17 +1801,22 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_write_int32_t(s, exh.osage_count); io_write_int32_t(s, ex->osage_nodes_count); io_write(s, 0x04); - io_write_int32_t(s, (int32_t)exh.osage_nodes_offset); - io_write_int32_t(s, (int32_t)exh.osage_names_offset); - io_write_int32_t(s, (int32_t)exh.blocks_offset); + io_write_uint32_t(s, (uint32_t)exh.osage_nodes_offset); + io_write_uint32_t(s, (uint32_t)exh.osage_names_offset); + io_write_uint32_t(s, (uint32_t)exh.blocks_offset); io_write_int32_t(s, exh.bone_names_count); - io_write_int32_t(s, (int32_t)exh.bone_names_offset); - io_write_int32_t(s, (int32_t)exh.osage_sibling_infos_offset); + io_write_uint32_t(s, (uint32_t)exh.bone_names_offset); + io_write_uint32_t(s, (uint32_t)exh.osage_sibling_infos_offset); io_write_int32_t(s, exh.cloth_count); - io_write(s, 0x1C); + io_write_uint32_t(s, (uint32_t)ex->field_24); + io_write_uint32_t(s, (uint32_t)ex->field_28); + io_write_uint32_t(s, (uint32_t)ex->field_2C); + io_write_uint32_t(s, (uint32_t)ex->field_30); + io_write_uint32_t(s, (uint32_t)ex->field_34); + io_write_uint32_t(s, (uint32_t)ex->field_38); + io_write_uint32_t(s, (uint32_t)ex->field_3C); + io_write_uint32_t(s, (uint32_t)ex->field_40); io_position_pop(s); - - vector_old_string_free(&osage_names, string_free); } io_position_push(s, base_offset, SEEK_SET); @@ -1819,17 +1828,13 @@ static void obj_classic_write_skin(obj* obj, stream* s, ssize_t base_offset) { io_write_int32_t(s, (int32_t)sh.bone_parent_ids_offset); io_write(s, 0x0C); io_position_pop(s); - - vector_old_string_free(&strings, string_free); - vector_old_ssize_t_free(&string_offsets, 0); - vector_old_string_free(&bone_names, string_free); } static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, stream* s, char** str) { int32_t mesh_name_offset = io_read_int32_t(s); int32_t backface_mesh_name_offset = io_read_int32_t(s); - b->field_08 = io_read_int32_t(s); + b->field_8 = io_read_int32_t(s); b->count = io_read_int32_t(s); b->field_10 = io_read_int32_t(s); b->field_14 = io_read_int32_t(s); @@ -1846,7 +1851,7 @@ static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, if (field_18_offset) { io_position_push(s, field_18_offset, SEEK_SET); - for (int32_t i = 0; i < 32; i++) { + for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; @@ -1878,10 +1883,10 @@ static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, b->field_1C = 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_1C* f = &b->field_1C[i]; - f->field_00 = io_read_float_t(s); - f->field_04 = io_read_float_t(s); - f->field_08 = io_read_float_t(s); - f->field_0C = io_read_float_t(s); + f->field_0 = io_read_float_t(s); + f->field_4 = io_read_float_t(s); + f->field_8 = io_read_float_t(s); + f->field_C = io_read_float_t(s); f->field_10 = io_read_float_t(s); f->field_14 = io_read_float_t(s); f->field_18 = io_read_float_t(s); @@ -1889,7 +1894,7 @@ static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, f->field_20 = io_read_uint32_t(s); f->field_24 = io_read_uint32_t(s); - for (int32_t j = 0; j < 4; j++) + for (uint32_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); @@ -1900,7 +1905,7 @@ 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]; - for (int32_t j = 0; j < 10; j++) + for (uint32_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); @@ -1924,17 +1929,17 @@ static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, } static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, - ssize_t* field_18_offset, ssize_t* field_1C_offset, ssize_t* field_20_offset, - ssize_t* field_24_offset, ssize_t* field_28_offset) { - ssize_t mesh_name_offset = obj_skin_strings_get_string_offset(strings, + stream* s, std::vector& strings, std::vector& string_offsets, + int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, + int64_t* field_24_offset, int64_t* field_28_offset) { + int64_t mesh_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->mesh_name)); - ssize_t backface_mesh_name_offset = obj_skin_strings_get_string_offset(strings, + int64_t backface_mesh_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->backface_mesh_name)); io_write_int32_t(s, (int32_t)mesh_name_offset); io_write_int32_t(s, (int32_t)backface_mesh_name_offset); - io_write_int32_t(s, b->field_08); + io_write_int32_t(s, b->field_8); io_write_int32_t(s, b->count); io_write_int32_t(s, b->field_10); io_write_int32_t(s, b->field_14); @@ -1948,7 +1953,7 @@ static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, if (b->field_10) { io_position_push(s, *field_18_offset, SEEK_SET); - for (int32_t i = 0; i < 32; i++) { + for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; @@ -1978,10 +1983,10 @@ static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, io_position_push(s, *field_1C_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_1C* f = &b->field_1C[i]; - io_write_float_t(s, f->field_00); - io_write_float_t(s, f->field_04); - io_write_float_t(s, f->field_08); - io_write_float_t(s, f->field_0C); + io_write_float_t(s, f->field_0); + io_write_float_t(s, f->field_4); + io_write_float_t(s, f->field_8); + io_write_float_t(s, f->field_C); io_write_float_t(s, f->field_10); io_write_float_t(s, f->field_14); io_write_float_t(s, f->field_18); @@ -1989,7 +1994,7 @@ static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, io_write_uint32_t(s, f->field_20); io_write_uint32_t(s, f->field_24); - for (int32_t j = 0; j < 4; j++) + for (uint32_t j = 0; j < 4; j++) obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data[j], s, strings, string_offsets); } @@ -2002,7 +2007,7 @@ 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]; - for (int32_t j = 0; j < 10; j++) + for (uint32_t j = 0; j < 10; j++) obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data[j], s, strings, string_offsets); } @@ -2033,25 +2038,25 @@ static void obj_classic_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_ io_read_string_null_terminated_offset(s, bone_name_offset, &sub->bone_name); sub->weight = io_read_float_t(s); sub->matrix_index = io_read_uint32_t(s); - sub->field_0C = io_read_uint32_t(s); + sub->field_C = io_read_uint32_t(s); } static void obj_classic_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets) { - ssize_t bone_name_offset = obj_skin_strings_get_string_offset(strings, + stream* s, std::vector& strings, std::vector& string_offsets) { + int64_t bone_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&sub->bone_name)); io_write_int32_t(s, (int32_t)bone_name_offset); io_write_float_t(s, sub->weight); io_write_uint32_t(s, sub->matrix_index); - io_write_uint32_t(s, sub->field_0C); + io_write_uint32_t(s, sub->field_C); } static void obj_classic_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, stream* s, char** str) { - sub->field_00 = io_read_uint32_t(s); - sub->field_04 = io_read_float_t(s); - sub->field_08 = io_read_float_t(s); - sub->field_0C = io_read_float_t(s); + sub->field_0 = io_read_uint32_t(s); + sub->field_4 = io_read_float_t(s); + sub->field_8 = io_read_float_t(s); + sub->field_C = io_read_float_t(s); sub->field_10 = io_read_float_t(s); sub->field_14 = io_read_float_t(s); sub->field_18 = io_read_float_t(s); @@ -2062,11 +2067,11 @@ static void obj_classic_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_ } static void obj_classic_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets) { - io_write_uint32_t(s, sub->field_00); - io_write_float_t(s, sub->field_04); - io_write_float_t(s, sub->field_08); - io_write_float_t(s, sub->field_0C); + stream* s, std::vector& strings, std::vector& string_offsets) { + io_write_uint32_t(s, sub->field_0); + io_write_float_t(s, sub->field_4); + io_write_float_t(s, sub->field_8); + io_write_float_t(s, sub->field_C); io_write_float_t(s, sub->field_10); io_write_float_t(s, sub->field_14); io_write_float_t(s, sub->field_18); @@ -2141,10 +2146,10 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, } static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names, ssize_t* offsets) { + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* offsets) { obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); - ssize_t type_offset = 0; + int64_t type_offset = 0; switch (b->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: type_offset = offsets[0]; @@ -2161,13 +2166,13 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b } io_write_int32_t(s, (int32_t)type_offset); - ssize_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, + int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); io_write_int32_t(s, (int32_t)name_offset); io_write_int32_t(s, b->coupling); - ssize_t source_node_name_offset = obj_skin_strings_get_string_offset(strings, + int64_t source_node_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->source_node_name)); io_write_int32_t(s, (int32_t)source_node_name_offset); @@ -2217,7 +2222,7 @@ static void obj_classic_read_skin_block_constraint_attach_point(obj_skin_block_c } static void obj_classic_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets) { + stream* s, std::vector& strings, std::vector& string_offsets) { io_write_int32_t(s, ap->affected_by_orientation ? 1 : 0); io_write_int32_t(s, ap->affected_by_scaling ? 1 : 0); io_write_float_t(s, ap->offset.x); @@ -2241,7 +2246,7 @@ static void obj_classic_read_skin_block_constraint_up_vector_old(obj_skin_block_ } static void obj_classic_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets) { + stream* s, std::vector& strings, std::vector& string_offsets) { io_write_int32_t(s, up->active ? 1 : 0); io_write_float_t(s, up->roll); io_write_float_t(s, up->affected_axis.x); @@ -2251,7 +2256,7 @@ static void obj_classic_write_skin_block_constraint_up_vector_old(obj_skin_block io_write_float_t(s, up->point_at.y); io_write_float_t(s, up->point_at.z); - ssize_t name_offset = obj_skin_strings_get_string_offset(strings, + int64_t name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&up->name)); io_write_int32_t(s, (int32_t)name_offset); } @@ -2273,32 +2278,32 @@ static void obj_classic_read_skin_block_expression(obj_skin_block_expression* b, b->expressions_count = io_read_int32_t(s); b->expressions_count = min(b->expressions_count, 9); - for (int32_t i = 0; i < b->expressions_count; i++) { + for (uint32_t i = 0; i < b->expressions_count; i++) { int32_t expression_offset = io_read_int32_t(s); if (expression_offset) io_read_string_null_terminated_offset(s, expression_offset, &b->expressions[i]); } - for (int32_t i = b->expressions_count; i < 9; i++) + for (uint32_t i = b->expressions_count; i < 9; i++) b->expressions[i] = string_empty; } static void obj_classic_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names) { + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names) { obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); - ssize_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, + int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); io_write_int32_t(s, (int32_t)name_offset); io_write_int32_t(s, min(b->expressions_count, 9)); - for (int32_t i = 0; i < b->expressions_count && i < 9; i++) { - ssize_t expression_offset = obj_skin_strings_get_string_offset(strings, + for (uint32_t i = 0; i < b->expressions_count && i < 9; i++) { + int64_t expression_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->expressions[i])); io_write_int32_t(s, (int32_t)expression_offset); } - for (int32_t i = b->expressions_count; i < 9; i++) + for (uint32_t i = b->expressions_count; i < 9; i++) io_write_int32_t(s, 0); } @@ -2330,14 +2335,14 @@ static void obj_classic_read_skin_block_motion(obj_skin_block_motion* b, if (bone_names_offset) { io_position_push(s, bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) + for (uint32_t i = 0; i < b->nodes_count; i++) b->nodes[i].name_index = io_read_uint32_t(s); io_position_pop(s); } if (bone_matrices_offset) { io_position_push(s, bone_matrices_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) { + for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; mat.row0.x = io_read_float_t(s); mat.row1.x = io_read_float_t(s); @@ -2361,11 +2366,11 @@ static void obj_classic_read_skin_block_motion(obj_skin_block_motion* b, } static void obj_classic_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, - char** bone_names, ssize_t* bone_names_offset, ssize_t* bone_matrices_offset) { + stream* s, std::vector& strings, std::vector& string_offsets, + char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset) { obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); - ssize_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, + int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); io_write_int32_t(s, (int32_t)name_offset); io_write_int32_t(s, b->nodes_count); @@ -2377,13 +2382,13 @@ static void obj_classic_write_skin_block_motion(obj_skin_block_motion* b, if (b->nodes) { io_position_push(s, *bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) + for (uint32_t i = 0; i < b->nodes_count; i++) io_write_uint32_t(s, b->nodes[i].name_index); io_position_pop(s); *bone_names_offset += b->nodes_count * sizeof(uint32_t); io_position_push(s, *bone_matrices_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) { + for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; io_write_float_t(s, mat.row0.x); io_write_float_t(s, mat.row1.x); @@ -2424,8 +2429,8 @@ static void obj_classic_read_skin_block_node(obj_skin_block_node* b, } static void obj_classic_write_skin_block_node(obj_skin_block_node* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets) { - ssize_t parent_name_offset = obj_skin_strings_get_string_offset(strings, + stream* s, std::vector& strings, std::vector& string_offsets) { + int64_t parent_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->parent_name)); io_write_int32_t(s, (int32_t)parent_name_offset); @@ -2511,7 +2516,7 @@ static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, } else { io_set_position(s, offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) { + for (uint32_t i = 0; i < b->nodes_count; i++) { obj_skin_osage_node* node = &b->nodes[i]; node->name_index = io_read_uint32_t(s); node->length = io_read_float_t(s); @@ -2525,7 +2530,7 @@ static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, } static void obj_classic_write_skin_block_osage(obj_skin_block_osage* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, ssize_t* nodes_offset) { + stream* s, std::vector& strings, std::vector& string_offsets, int64_t* nodes_offset) { int32_t nodes_offset_i32 = (int32_t)*nodes_offset; if (b->root_init) { nodes_offset_i32 = (int32_t)io_get_position(s); @@ -2577,10 +2582,9 @@ static void obj_classic_write_skin_block_osage(obj_skin_block_osage* b, io_write_int32_t(s, nodes_offset_i32); io_write(s, 0x14); - if (!b->root_init && b->nodes) { io_position_push(s, *nodes_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) { + for (uint32_t i = 0; i < b->nodes_count; i++) { obj_skin_osage_node* node = &b->nodes[i]; io_write_uint32_t(s, node->name_index); io_write_float_t(s, node->length); @@ -2593,8 +2597,8 @@ static void obj_classic_write_skin_block_osage(obj_skin_block_osage* b, } } -static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, - ssize_t base_offset, int32_t vertex_count, obj_vertex_attrib_type attrib_type) { +static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, obj_mesh* mesh, + int64_t base_offset, uint32_t vertex_count, obj_vertex_attrib_type attrib_type) { obj_vertex_flags vertex_flags = OBJ_VERTEX_NONE; if (attrib_type & OBJ_VERTEX_ATTRIB_POSITION) enum_or(vertex_flags, OBJ_VERTEX_POSITION); @@ -2636,7 +2640,7 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets enum_or(vertex_flags, OBJ_VERTEX_UNKNOWN); obj_vertex_data* vtx = force_malloc_s(obj_vertex_data, vertex_count); - for (int32_t i = 0; i < 20; i++) { + for (uint32_t i = 0; i < 20; i++) { obj_vertex_attrib_type attribute = (obj_vertex_attrib_type)(1 << i); if (~attrib_type & attribute) continue; @@ -2644,21 +2648,21 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets io_set_position(s, base_offset + attrib_offsets[i], SEEK_SET); switch (attribute) { case OBJ_VERTEX_ATTRIB_POSITION: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].position.x = io_read_float_t(s); vtx[j].position.y = io_read_float_t(s); vtx[j].position.z = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_NORMAL: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].normal.x = io_read_float_t(s); vtx[j].normal.y = io_read_float_t(s); vtx[j].normal.z = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_TANGENT: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].tangent.x = io_read_float_t(s); vtx[j].tangent.y = io_read_float_t(s); vtx[j].tangent.z = io_read_float_t(s); @@ -2666,38 +2670,38 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets } break; case OBJ_VERTEX_ATTRIB_BINORMAL: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].binormal.x = io_read_float_t(s); vtx[j].binormal.y = io_read_float_t(s); vtx[j].binormal.z = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_TEXCOORD0: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].texcoord0.x = io_read_float_t(s); vtx[j].texcoord0.y = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_TEXCOORD1: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].texcoord1.x = io_read_float_t(s); vtx[j].texcoord1.y = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_TEXCOORD2: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].texcoord2.x = io_read_float_t(s); vtx[j].texcoord2.y = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_TEXCOORD3: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].texcoord3.x = io_read_float_t(s); vtx[j].texcoord3.y = io_read_float_t(s); } break; case OBJ_VERTEX_ATTRIB_COLOR0: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].color0.x = io_read_float_t(s); vtx[j].color0.y = io_read_float_t(s); vtx[j].color0.z = io_read_float_t(s); @@ -2705,7 +2709,7 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets } break; case OBJ_VERTEX_ATTRIB_COLOR1: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].color1.x = io_read_float_t(s); vtx[j].color1.y = io_read_float_t(s); vtx[j].color1.z = io_read_float_t(s); @@ -2713,7 +2717,7 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets } break; case OBJ_VERTEX_ATTRIB_BONE_WEIGHT: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].bone_weight.x = io_read_float_t(s); vtx[j].bone_weight.y = io_read_float_t(s); vtx[j].bone_weight.z = io_read_float_t(s); @@ -2721,7 +2725,7 @@ 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++) { + for (uint32_t j = 0; j < vertex_count; j++) { 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); @@ -2729,7 +2733,7 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets } break; case OBJ_VERTEX_ATTRIB_UNKNOWN: - for (int32_t j = 0; j < vertex_count; j++) { + for (uint32_t j = 0; j < vertex_count; j++) { vtx[j].unknown.x = io_read_float_t(s); vtx[j].unknown.y = io_read_float_t(s); vtx[j].unknown.z = io_read_float_t(s); @@ -2743,14 +2747,14 @@ static void obj_classic_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets mesh->vertex_flags = vertex_flags; } -static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, - ssize_t base_offset, int32_t* vertex_count, obj_vertex_attrib_type* attrib_type, int32_t* vertex_size) { +static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offsets, obj_mesh* mesh, + int64_t base_offset, uint32_t* vertex_count, obj_vertex_attrib_type* attrib_type, uint32_t* vertex_size) { obj_vertex_data* vtx = mesh->vertex; - int32_t _vertex_count = mesh->vertex_count; + uint32_t _vertex_count = mesh->vertex_count; obj_vertex_flags vertex_flags = mesh->vertex_flags; obj_vertex_attrib_type _attrib_type = (obj_vertex_attrib_type)0; - int32_t _vertex_size = 0; + uint32_t _vertex_size = 0; if (vertex_flags & OBJ_VERTEX_POSITION) { enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_POSITION); _vertex_size += 0x0C; @@ -2816,7 +2820,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_POSITION) { attrib_offsets[0] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].position.x); io_write_float_t(s, vtx[i].position.y); io_write_float_t(s, vtx[i].position.z); @@ -2825,7 +2829,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_NORMAL) { attrib_offsets[1] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].normal.x); io_write_float_t(s, vtx[i].normal.y); io_write_float_t(s, vtx[i].normal.z); @@ -2834,7 +2838,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_TANGENT) { attrib_offsets[2] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].tangent.x); io_write_float_t(s, vtx[i].tangent.y); io_write_float_t(s, vtx[i].tangent.z); @@ -2844,7 +2848,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_BINORMAL) { attrib_offsets[3] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].binormal.x); io_write_float_t(s, vtx[i].binormal.y); io_write_float_t(s, vtx[i].binormal.z); @@ -2853,7 +2857,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD0) { attrib_offsets[4] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].texcoord0.x); io_write_float_t(s, vtx[i].texcoord0.y); } @@ -2861,7 +2865,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_BONE_WEIGHT) { attrib_offsets[10] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].bone_weight.x); io_write_float_t(s, vtx[i].bone_weight.y); io_write_float_t(s, vtx[i].bone_weight.z); @@ -2871,7 +2875,7 @@ 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++) { + for (uint32_t i = 0; i < _vertex_count; i++) { 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); @@ -2881,7 +2885,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD1) { attrib_offsets[5] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].texcoord1.x); io_write_float_t(s, vtx[i].texcoord1.y); } @@ -2889,7 +2893,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD2) { attrib_offsets[6] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].texcoord2.x); io_write_float_t(s, vtx[i].texcoord2.y); } @@ -2897,7 +2901,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD3) { attrib_offsets[7] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].texcoord3.x); io_write_float_t(s, vtx[i].texcoord3.y); } @@ -2905,7 +2909,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_COLOR0) { attrib_offsets[8] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].color0.x); io_write_float_t(s, vtx[i].color0.y); io_write_float_t(s, vtx[i].color0.z); @@ -2915,7 +2919,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_COLOR1) { attrib_offsets[9] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].color1.x); io_write_float_t(s, vtx[i].color1.y); io_write_float_t(s, vtx[i].color1.z); @@ -2925,7 +2929,7 @@ static void obj_classic_write_vertex(obj* obj, stream* s, ssize_t* attrib_offset if (_attrib_type & OBJ_VERTEX_ATTRIB_UNKNOWN) { attrib_offsets[12] = io_get_position(s) - base_offset; - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { io_write_float_t(s, vtx[i].unknown.x); io_write_float_t(s, vtx[i].unknown.y); io_write_float_t(s, vtx[i].unknown.z); @@ -2990,54 +2994,53 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { os->objects = force_malloc_s(obj, os->objects_count); - ssize_t* objects_offsets = 0; + int64_t* objects_offsets = 0; if (osh.objects_offset) { - objects_offsets = force_malloc_s(ssize_t, os->objects_count); + objects_offsets = force_malloc_s(int64_t, os->objects_count); io_set_position(&s_mosd, osh.objects_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) objects_offsets[i] = io_read_offset_f2(&s_mosd, st.header.length); else - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) objects_offsets[i] = io_read_offset_x(&s_mosd); } - ssize_t* object_skins_offsets = 0; + int64_t* object_skins_offsets = 0; if (osh.object_skins_offset) { - object_skins_offsets = force_malloc_s(ssize_t, os->objects_count); + object_skins_offsets = force_malloc_s(int64_t, os->objects_count); io_set_position(&s_mosd, osh.object_skins_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) object_skins_offsets[i] = io_read_offset_f2(&s_mosd, st.header.length); else - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) object_skins_offsets[i] = io_read_offset_x(&s_mosd); } - ssize_t* object_names_offsets = 0; + int64_t* object_names_offsets = 0; if (osh.object_names_offset) { - object_names_offsets = force_malloc_s(ssize_t, os->objects_count); + object_names_offsets = force_malloc_s(int64_t, os->objects_count); io_set_position(&s_mosd, osh.object_names_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) object_names_offsets[i] = io_read_offset_f2(&s_mosd, st.header.length); else - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) object_names_offsets[i] = io_read_offset_x(&s_mosd); } if (osh.objects_offset) - for (int32_t i = 0; i < os->objects_count; i++) { + for (uint32_t i = 0; i < os->objects_count; i++) { obj* obj = &os->objects[i]; if (osh.object_names_offset && object_names_offsets[i]) io_read_string_null_terminated_offset(&s_mosd, object_names_offsets[i], &obj->name); } - if (osh.object_ids_offset) { io_set_position(&s_mosd, osh.object_ids_offset, SEEK_SET); - for (int32_t i = 0; i < os->objects_count; i++) + for (uint32_t i = 0; i < os->objects_count; i++) os->objects[i].id = io_read_uint32_t_stream_reverse_endianness(&s_mosd); } @@ -3048,7 +3051,7 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { if (osh.texture_ids_offset) { io_set_position(&s_mosd, osh.texture_ids_offset, SEEK_SET); os->texture_ids = force_malloc_s(uint32_t, os->texture_ids_count); - for (int32_t i = 0; i < os->texture_ids_count; i++) + for (uint32_t i = 0; i < os->texture_ids_count; i++) os->texture_ids[i] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); } @@ -3132,7 +3135,7 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { memset(&osh, 0, sizeof(obj_set_header)); osh.max_object_id = -1; - int32_t count = os->objects_count; + uint32_t count = os->objects_count; if (!is_x) { ee = { 0, 1, 44, 1 }; @@ -3218,43 +3221,43 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { osh.objects_offset = io_get_position(&s_mosd); if (!is_x) - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_f2(&s_mosd, 0, 0x20); else - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_x(&s_mosd, 0); io_align_write(&s_mosd, 0x10); osh.object_skins_offset = io_get_position(&s_mosd); if (!is_x) - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_f2(&s_mosd, 0, 0x20); else - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_x(&s_mosd, 0); io_align_write(&s_mosd, 0x10); osh.object_names_offset = io_get_position(&s_mosd); if (!is_x) - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); else - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_x_pof_add(&s_mosd, 0, &pof); io_align_write(&s_mosd, 0x10); osh.object_ids_offset = io_get_position(&s_mosd); - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_uint32_t(&s_mosd, os->objects[i].id); io_align_write(&s_mosd, 0x10); osh.texture_ids_offset = io_get_position(&s_mosd); - for (int32_t i = 0; i < os->texture_ids_count; i++) + for (uint32_t i = 0; i < os->texture_ids_count; i++) io_write_uint32_t(&s_mosd, os->texture_ids[i]); io_align_write(&s_mosd, 0x10); - ssize_t* object_names_offsets = force_malloc_s(ssize_t, count); - for (int32_t i = 0; i < count; i++) { + int64_t* object_names_offsets = force_malloc_s(int64_t, count); + for (uint32_t i = 0; i < count; i++) { object_names_offsets[i] = (int32_t)io_get_position(&s_mosd); io_write_string_null_terminated(&s_mosd, &os->objects[i].name); } @@ -3262,10 +3265,10 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { io_position_push(&s_mosd, osh.object_names_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_f2(&s_mosd, object_names_offsets[i], 0x20); else - for (int32_t i = 0; i < count; i++) + for (uint32_t i = 0; i < count; i++) io_write_offset_x(&s_mosd, object_names_offsets[i]); io_position_pop(&s_mosd); free(object_names_offsets); @@ -3300,7 +3303,7 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { io_position_pop(&s_mosd); f2_struct st; - for (int32_t i = 0; i < count; i++) { + for (uint32_t i = 0; i < count; i++) { obj* obj = &os->objects[i]; st.sub_structs.push_back({}); @@ -3360,19 +3363,19 @@ static void obj_modern_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh) { uint32_t* indices = force_malloc_s(uint32_t, sub_mesh->indices_count); switch (sub_mesh->index_format) { case OBJ_INDEX_U8: - for (int32_t i = 0; i < sub_mesh->indices_count; i++) { + for (uint32_t i = 0; i < sub_mesh->indices_count; i++) { uint8_t idx = io_read_uint8_t(s); indices[i] = tri_strip && idx == 0xFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U16: - for (int32_t i = 0; i < sub_mesh->indices_count; i++) { + for (uint32_t i = 0; i < sub_mesh->indices_count; i++) { uint16_t idx = io_read_uint16_t_stream_reverse_endianness(s); indices[i] = tri_strip && idx == 0xFFFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U32: - for (int32_t i = 0; i < sub_mesh->indices_count; i++) + for (uint32_t i = 0; i < sub_mesh->indices_count; i++) indices[i] = io_read_uint32_t_stream_reverse_endianness(s); break; } @@ -3418,25 +3421,25 @@ static void obj_modern_write_index(obj* obj, stream* s, bool is_x, } uint32_t* indices = sub_mesh->indices; - int32_t _indices_count = sub_mesh->indices_count; + uint32_t _indices_count = sub_mesh->indices_count; switch (sub_mesh->index_format) { case OBJ_INDEX_U8: - for (int32_t i = 0; i < _indices_count; i++) + for (uint32_t i = 0; i < _indices_count; i++) io_write_uint8_t(s, (uint8_t)indices[i]); break; case OBJ_INDEX_U16: - for (int32_t i = 0; i < _indices_count; i++) + for (uint32_t i = 0; i < _indices_count; i++) io_write_uint16_t(s, (uint16_t)indices[i]); break; case OBJ_INDEX_U32: - for (int32_t i = 0; i < _indices_count; i++) + for (uint32_t i = 0; i < _indices_count; i++) io_write_uint32_t(s, indices[i]); break; } io_align_write(s, 0x04); } -static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, +static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, uint32_t header_length, bool is_x, stream* s_oidx, stream* s_ovtx) { const size_t mesh_size = is_x ? 0x130 : 0xD8; const size_t sub_mesh_size = is_x ? 0x80 : 0x70; @@ -3474,7 +3477,7 @@ static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, if (oh.meshes_offset > 0) { obj->meshes = force_malloc_s(obj_mesh, obj->meshes_count); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; io_set_position(s, base_offset + oh.meshes_offset + mesh_size * i, SEEK_SET); @@ -3493,10 +3496,10 @@ static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, mh.vertex_count = io_read_int32_t_stream_reverse_endianness(s); if (!is_x) - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) mh.attrib_offsets[j] = io_read_offset_f2(s, 0); else - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) mh.attrib_offsets[j] = io_read_offset_x(s); mesh->flags = (obj_mesh_flags)io_read_uint32_t_stream_reverse_endianness(s); @@ -3507,7 +3510,7 @@ static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, if (mh.sub_meshes_offset) { mesh->sub_meshes = force_malloc_s(obj_sub_mesh, mesh->sub_meshes_count); - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; io_set_position(s, base_offset + mh.sub_meshes_offset + sub_mesh_size * j, SEEK_SET); @@ -3548,7 +3551,7 @@ static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, io_read(s, sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); if (s->is_big_endian) { uint16_t* bone_indices = sub_mesh->bone_indices; - for (int32_t k = 0; k < sub_mesh->bone_indices_count; k++) + for (uint32_t k = 0; k < sub_mesh->bone_indices_count; k++) bone_indices[k] = reverse_endianness_uint16_t(bone_indices[k]); } } @@ -3570,13 +3573,13 @@ static void obj_modern_read_model(obj* obj, stream* s, ssize_t base_offset, obj->materials = force_malloc_s(obj_material_data, obj->materials_count); io_read(s, obj->materials, obj->materials_count * sizeof(obj_material_data)); if (s->is_big_endian) - for (int32_t i = 0; i < obj->materials_count; i++) + for (uint32_t i = 0; i < obj->materials_count; i++) obj_material_texture_enrs_table.apply(&obj->materials[i]); } } static void obj_modern_write_model(obj* obj, stream* s, - ssize_t base_offset, bool is_x, f2_struct* omdl) { + int64_t base_offset, bool is_x, f2_struct* omdl) { const size_t mesh_size = is_x ? 0x130 : 0xD8; const size_t sub_mesh_size = is_x ? 0x80 : 0x70; @@ -3630,7 +3633,7 @@ static void obj_modern_write_model(obj* obj, stream* s, } uint32_t total_sub_meshes = 0; - for (int32_t i = 0; i < obj->meshes_count; i++) + for (uint32_t i = 0; i < obj->meshes_count; i++) total_sub_meshes += obj->meshes[i].sub_meshes_count; if (!is_x) { @@ -3679,9 +3682,9 @@ static void obj_modern_write_model(obj* obj, stream* s, } int32_t total_bone_indices_count = 0; - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[i]; if (sub_mesh->bones_per_vertex == 4) total_bone_indices_count += sub_mesh->bone_indices_count; @@ -3744,7 +3747,7 @@ static void obj_modern_write_model(obj* obj, stream* s, obj_mesh_header* mhs = force_malloc_s(obj_mesh_header, obj->meshes_count); obj_sub_mesh_header** smhss = force_malloc_s(obj_sub_mesh_header*, obj->meshes_count); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; io_write(s, 0x04); @@ -3759,10 +3762,10 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write_int32_t(s, 0); if (!is_x) - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) io_write_offset_f2(s, 0, 0); else - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) io_write_offset_x(s, 0); io_write_int32_t(s, 0); @@ -3771,14 +3774,14 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write(s, sizeof(mesh->name)); } - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; obj_mesh_header* mh = &mhs[i]; mh->attrib_type = OBJ_VERTEX_ATTRIB_MODERN_STORAGE; if (mesh->sub_meshes_count) { mh->sub_meshes_offset = io_get_position(s) - base_offset; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { io_write(s, 0x04); io_write_float_t(s, 0.0f); io_write_float_t(s, 0.0f); @@ -3813,7 +3816,7 @@ static void obj_modern_write_model(obj* obj, stream* s, &mh->attrib_flags, &mh->vertex_count, &mh->vertex_size, ovtx); } - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; obj_mesh_header* mh = &mhs[i]; obj_sub_mesh_header* smhs = 0; @@ -3821,7 +3824,7 @@ static void obj_modern_write_model(obj* obj, stream* s, if (mesh->sub_meshes_count) { smhs = force_malloc_s(obj_sub_mesh_header, mesh->sub_meshes_count); smhss[i] = smhs; - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; obj_sub_mesh_header* smh = &smhs[j]; @@ -3837,14 +3840,14 @@ static void obj_modern_write_model(obj* obj, stream* s, } io_align_write(s, is_x ? 0x10 : 0x04); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; obj_mesh_header* mh = &mhs[i]; obj_sub_mesh_header* smhs = smhss[i]; if (mesh->sub_meshes_count) { io_position_push(s, base_offset + mh->sub_meshes_offset, SEEK_SET); - for (int32_t j = 0; j < mesh->sub_meshes_count; j++) { + for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; obj_sub_mesh_header* smh = &smhs[j]; @@ -3872,7 +3875,7 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write_float_t(s, sub_mesh->bounding_box.size.z); uint32_t index_max = 0; - for (int32_t k = 0; k < sub_mesh->indices_count; k++) + for (uint32_t k = 0; k < sub_mesh->indices_count; k++) if (index_max < sub_mesh->indices[k]) index_max = sub_mesh->indices[k]; @@ -3898,7 +3901,7 @@ static void obj_modern_write_model(obj* obj, stream* s, } io_position_push(s, base_offset + oh.meshes_offset, SEEK_SET); - for (int32_t i = 0; i < obj->meshes_count; i++) { + for (uint32_t i = 0; i < obj->meshes_count; i++) { obj_mesh* mesh = &obj->meshes[i]; obj_mesh_header* mh = &mhs[i]; @@ -3916,10 +3919,10 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write_int32_t(s, mh->vertex_count); if (!is_x) - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) io_write_offset_f2(s, mh->attrib_offsets[j], 0); else - for (int32_t j = 0; j < 20; j++) + for (uint32_t j = 0; j < 20; j++) io_write_offset_x(s, mh->attrib_offsets[j]); io_write_int32_t(s, mesh->flags); @@ -3935,7 +3938,7 @@ static void obj_modern_write_model(obj* obj, stream* s, if (obj->materials) { oh.materials_offset = io_get_position(s) - base_offset; - for (int32_t i = 0; i < obj->materials_count; i++) + for (uint32_t i = 0; i < obj->materials_count; i++) io_write(s, &obj->materials[i], sizeof(obj_material_data)); } io_align_write(s, 0x10); @@ -3992,7 +3995,7 @@ static void obj_modern_write_model(obj* obj, stream* s, ovtx->header.use_section_size = true; } -static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, +static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, uint32_t header_length, bool is_x) { obj_skin* sk = &obj->skin; obj->skin_init = true; @@ -4022,30 +4025,29 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, if (sh.bone_ids_offset) { sk->bones = force_malloc_s(obj_skin_bone, sk->bones_count); - ssize_t* bone_names_offsets = 0; + int64_t* bone_names_offsets = 0; if (sh.bone_names_offset) { - bone_names_offsets = force_malloc_s(ssize_t, sk->bones_count); + bone_names_offsets = force_malloc_s(int64_t, sk->bones_count); io_set_position(s, sh.bone_names_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) bone_names_offsets[i] = io_read_offset_f2(s, header_length); else - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) bone_names_offsets[i] = io_read_offset_x(s); } - if (sh.bone_ids_offset) { obj_skin_bone bone; memset(&bone, 0, sizeof(obj_skin_bone)); io_set_position(s, sh.bone_ids_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) sk->bones[i].id = io_read_uint32_t_stream_reverse_endianness(s); if (sh.bone_matrices_offset) { io_set_position(s, sh.bone_matrices_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; mat.row0.x = io_read_float_t_stream_reverse_endianness(s); mat.row1.x = io_read_float_t_stream_reverse_endianness(s); @@ -4067,13 +4069,13 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, } if (sh.bone_names_offset) - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) io_read_string_null_terminated_offset(s, bone_names_offsets[i], &sk->bones[i].name); if (sh.bone_parent_ids_offset) { io_set_position(s, sh.bone_parent_ids_offset, SEEK_SET); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) sk->bones[i].parent = io_read_uint32_t_stream_reverse_endianness(s); } } @@ -4098,7 +4100,14 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, exh.bone_names_offset = io_read_offset_f2(s, header_length); exh.osage_sibling_infos_offset = io_read_offset_f2(s, header_length); exh.cloth_count = io_read_int32_t_stream_reverse_endianness(s); - io_read(s, 0, 0x1C); + ex->field_24 = io_read_offset_f2(s, header_length); + ex->field_28 = io_read_offset_f2(s, header_length); + ex->field_2C = io_read_offset_f2(s, header_length); + ex->field_30 = io_read_offset_f2(s, header_length); + ex->field_34 = io_read_offset_f2(s, header_length); + ex->field_38 = io_read_offset_f2(s, header_length); + ex->field_3C = io_read_offset_f2(s, header_length); + ex->field_40 = io_read_offset_f2(s, header_length); } else { exh.osage_count = io_read_int32_t_stream_reverse_endianness(s); @@ -4111,50 +4120,53 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, exh.bone_names_offset = io_read_offset_x(s); exh.osage_sibling_infos_offset = io_read_offset_x(s); exh.cloth_count = io_read_int32_t_stream_reverse_endianness(s); - io_read(s, 0, 0x04); - io_read(s, 0, 0x38); + ex->field_24 = io_read_offset_x(s); + ex->field_28 = io_read_offset_x(s); + ex->field_2C = io_read_offset_x(s); + ex->field_30 = io_read_offset_x(s); + ex->field_34 = io_read_offset_x(s); + ex->field_38 = io_read_offset_x(s); + ex->field_3C = io_read_offset_x(s); + ex->field_40 = io_read_offset_x(s); } if (exh.bone_names_offset) { - vector_old_string bone_names = vector_old_empty(string); - vector_old_string_reserve(&bone_names, exh.bone_names_count); - ssize_t* strings_offsets = force_malloc_s(ssize_t, exh.bone_names_count); + std::vector bone_names; + bone_names.reserve(exh.bone_names_count); + int32_t* strings_offsets = force_malloc_s(int32_t, exh.bone_names_count); io_set_position(s, exh.bone_names_offset, SEEK_SET); - if (!is_x) - for (int32_t i = 0; i < exh.bone_names_count; i++) - strings_offsets[i] = io_read_offset_f2(s, header_length); - else - for (int32_t i = 0; i < exh.bone_names_count; i++) - strings_offsets[i] = io_read_offset_x(s); + for (uint32_t i = 0; i < exh.bone_names_count; i++) + strings_offsets[i] = io_read_int32_t(s); size_t buf_size = 0; - for (int32_t i = 0; i < exh.bone_names_count; i++) { - string* str = vector_old_string_reserve_back(&bone_names); - if (strings_offsets[i]) - io_read_string_null_terminated_offset(s, strings_offsets[i], str); + for (uint32_t i = 0; i < exh.bone_names_count; i++) { + if (strings_offsets[i]) { + std::string str; + io_read_string_null_terminated_offset(s, strings_offsets[i], &str); + bone_names.push_back(str); + } else - *str = string_empty; - buf_size += str->length + 1; + bone_names.push_back({}); + buf_size += bone_names.back().size() + 1; } free(strings_offsets); - if (bone_names.begin) { + if (bone_names.size()) { ex->bone_names_buf = force_malloc_s(char, buf_size); ex->bone_names = force_malloc_s(char*, buf_size + 1); ex->bone_names_count = exh.bone_names_count; char* bone_names_buf = ex->bone_names_buf; char** bone_names_ptr = ex->bone_names; - for (int32_t i = 0; i < exh.bone_names_count; i++) { - string* str = &bone_names.begin[i]; + for (uint32_t i = 0; i < exh.bone_names_count; i++) { + std::string* str = &bone_names.data()[i]; *bone_names_ptr++ = bone_names_buf; - memcpy(bone_names_buf, string_data(str), str->length); - bone_names_buf[str->length] = 0; - bone_names_buf += str->length + 1; + memcpy(bone_names_buf, str->c_str(), str->size()); + bone_names_buf[str->size()] = 0; + bone_names_buf += str->size() + 1; } *bone_names_ptr = 0; } - vector_old_string_free(&bone_names, string_free); } else { ex->bone_names_buf = 0; @@ -4170,7 +4182,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, ex->osage_nodes = force_malloc_s(obj_skin_osage_node, ex->osage_nodes_count); io_set_position(s, exh.osage_nodes_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_nodes_count; i++) { + for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; osage_node->name_index = io_read_uint32_t_stream_reverse_endianness(s); @@ -4196,29 +4208,27 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, obj_skin_block_header* bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); io_set_position(s, exh.blocks_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { bhs[i].block_signature_offset = io_read_offset_f2(s, header_length); bhs[i].block_offset = io_read_offset_f2(s, header_length); } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { bhs[i].block_signature_offset = io_read_offset_x(s); bhs[i].block_offset = io_read_offset_x(s); } ex->blocks = force_malloc_s(obj_skin_block, ex->blocks_count); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; - string block_signature = string_empty; + std::string block_signature; io_read_string_null_terminated_offset(s, bhs[i].block_signature_offset, &block_signature); - if (block_signature.length != 3) { - string_free(&block_signature); + if (block_signature.size() != 3) continue; - } - uint32_t signature = load_reverse_endianness_uint32_t(string_data(&block_signature)); + uint32_t signature = load_reverse_endianness_uint32_t(block_signature.c_str()); switch (signature) { case 'CLS\0': block->type = OBJ_SKIN_BLOCK_CLOTH; @@ -4253,7 +4263,6 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, default: break; } - string_free(&block_signature); } free(bhs); } @@ -4270,7 +4279,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, obj_skin_osage_sibling_info, ex->osage_sibling_infos_count); ex->osage_sibling_infos = osis; io_set_position(s, exh.blocks_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { osis[i].name_index = io_read_uint32_t_stream_reverse_endianness(s); osis[i].sibling_name_index = io_read_uint32_t_stream_reverse_endianness(s); osis[i].max_distance = io_read_float_t_stream_reverse_endianness(s); @@ -4282,7 +4291,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, ssize_t base_offset, } static void obj_modern_write_skin(obj* obj, stream* s, - ssize_t base_offset, bool is_x, f2_struct* oskn) { + int64_t base_offset, bool is_x, f2_struct* oskn) { obj_skin* sk = &obj->skin; uint32_t off; @@ -4350,21 +4359,21 @@ static void obj_modern_write_skin(obj* obj, stream* s, off = align_val(off, 0x10); } - vector_old_string strings = vector_old_empty(string); - vector_old_ssize_t string_offsets = vector_old_empty(ssize_t); - vector_old_string bone_names = vector_old_empty(string); + std::vector strings; + std::vector string_offsets; + std::vector bone_names; obj_skin_ex_data_header exh; memset(&exh, 0, sizeof(obj_skin_ex_data_header)); obj_skin_block_header* bhs = 0; - ssize_t motion_block_node_mats = 0; - ssize_t motion_block_node_name_offset = 0; - ssize_t field_18 = 0; - ssize_t field_1C = 0; - ssize_t field_20 = 0; - ssize_t field_24 = 0; - ssize_t field_28 = 0; + int64_t motion_block_node_mats = 0; + int64_t motion_block_node_name_offset = 0; + int64_t field_18 = 0; + int64_t field_1C = 0; + int64_t field_20 = 0; + int64_t field_24 = 0; + int64_t field_28 = 0; int32_t expressions_count = 0; int32_t motion_count = 0; int32_t motion_nodes_count = 0; @@ -4373,97 +4382,97 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_ex_data* ex = &sk->ex_data; char** bone_names_ptr = ex->bone_names; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(&strings, string_data(&cloth->mesh_name)); - obj_skin_strings_push_back_check(&strings, string_data(&cloth->backface_mesh_name)); + obj_skin_strings_push_back_check(strings, string_data(&cloth->mesh_name)); + 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]; - for (int32_t l = 0; l < 4; l++) - obj_skin_strings_push_back_check(&strings, + for (uint32_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"); + obj_skin_strings_push_back_check(strings, "CLS"); } break; case OBJ_SKIN_BLOCK_CONSTRAINT: { obj_skin_block_constraint* constraint = &block->constraint; - obj_skin_strings_push_back_check(&strings, string_data(&constraint->base.parent_name)); - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check(strings, string_data(&constraint->base.parent_name)); + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, constraint->name_index); - obj_skin_strings_push_back_check(&strings, string_data(&constraint->source_node_name)); + obj_skin_strings_push_back_check(strings, string_data(&constraint->source_node_name)); switch (constraint->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - obj_skin_strings_push_back_check(&strings, "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, + 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, + obj_skin_strings_push_back_check(strings, "Position"); + 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, + 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"); + obj_skin_strings_push_back_check(strings, "CNS"); - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, constraint->name_index); } break; case OBJ_SKIN_BLOCK_EXPRESSION: { obj_skin_block_expression* expression = &block->expression; - for (int32_t j = 0; j < expression->expressions_count; j++) - obj_skin_strings_push_back_check(&strings, string_data(&expression->expressions[j])); - obj_skin_strings_push_back_check(&strings, string_data(&expression->base.parent_name)); - obj_skin_strings_push_back_check_by_index(&strings, + for (uint32_t j = 0; j < expression->expressions_count; j++) + obj_skin_strings_push_back_check(strings, string_data(&expression->expressions[j])); + obj_skin_strings_push_back_check(strings, string_data(&expression->base.parent_name)); + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, expression->name_index); - obj_skin_strings_push_back_check(&strings, "EXP"); + obj_skin_strings_push_back_check(strings, "EXP"); - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, expression->name_index); } break; case OBJ_SKIN_BLOCK_MOTION: { obj_skin_block_motion* motion = &block->motion; - obj_skin_strings_push_back_check(&strings, string_data(&motion->base.parent_name)); - obj_skin_strings_push_back_check(&strings, string_data(&motion->name)); - for (int32_t j = 0; j < motion->nodes_count; j++) - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check(strings, string_data(&motion->base.parent_name)); + obj_skin_strings_push_back_check(strings, string_data(&motion->name)); + for (uint32_t j = 0; j < motion->nodes_count; j++) + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, motion->nodes[j].name_index); - obj_skin_strings_push_back_check(&strings, "MOT"); + obj_skin_strings_push_back_check(strings, "MOT"); if (!is_x) - obj_skin_strings_push_back_check(&bone_names, string_data(&motion->name)); - for (int32_t j = 0; j < motion->nodes_count; j++) - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check(bone_names, string_data(&motion->name)); + for (uint32_t j = 0; j < motion->nodes_count; j++) + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, motion->nodes[j].name_index); } break; case OBJ_SKIN_BLOCK_OSAGE: { obj_skin_block_osage* osage = &block->osage; - obj_skin_strings_push_back_check(&strings, string_data(&osage->base.parent_name)); - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check(strings, string_data(&osage->base.parent_name)); + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage->name_index); - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage->external_name_index); obj_skin_osage_node* osage_node = &ex->osage_nodes[osage->start_index]; - for (int32_t j = 0; j < osage->count; j++) { - obj_skin_strings_push_back_check_by_index(&strings, + for (uint32_t j = 0; j < osage->count; j++) { + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage_node->name_index); int32_t name_index = osage->name_index; obj_skin_osage_sibling_info* osage_sibling_infos = ex->osage_sibling_infos; - for (int32_t k = 0; k < ex->osage_sibling_infos_count; k++) { + for (uint32_t k = 0; k < ex->osage_sibling_infos_count; k++) { if (name_index == osage_sibling_infos->name_index) { - obj_skin_strings_push_back_check_by_index(&strings, + obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage_sibling_infos->sibling_name_index); break; } @@ -4471,20 +4480,20 @@ static void obj_modern_write_skin(obj* obj, stream* s, } osage_node++; } - obj_skin_strings_push_back_check(&strings, "OSG"); + obj_skin_strings_push_back_check(strings, "OSG"); - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage->external_name_index); osage_node = &ex->osage_nodes[osage->start_index]; - for (int32_t j = 0; j < osage->count; j++) { - obj_skin_strings_push_back_check_by_index(&bone_names, + for (uint32_t j = 0; j < osage->count; j++) { + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage_node->name_index); int32_t name_index = osage->name_index; obj_skin_osage_sibling_info* osage_sibling_infos = ex->osage_sibling_infos; - for (int32_t k = 0; k < ex->osage_sibling_infos_count; k++) { + for (uint32_t k = 0; k < ex->osage_sibling_infos_count; k++) { if (name_index == osage_sibling_infos->name_index) { - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage_sibling_infos->sibling_name_index); break; } @@ -4492,7 +4501,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, } osage_node++; } - obj_skin_strings_push_back_check_by_index(&bone_names, + obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, osage->name_index); } break; } @@ -4500,7 +4509,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, exh.cloth_count = 0; exh.osage_count = 0; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) exh.cloth_count++; @@ -4514,7 +4523,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, exh.osage_count++; } - exh.bone_names_count = (int32_t)vector_old_length(bone_names); + exh.bone_names_count = (int32_t)bone_names.size(); } if (sk->ex_data_init) { @@ -4659,7 +4668,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, int32_t constraint_count = 0; obj_skin_block_constraint_type cns_type = OBJ_SKIN_BLOCK_CONSTRAINT_NONE; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; @@ -4788,10 +4797,10 @@ static void obj_modern_write_skin(obj* obj, stream* s, int32_t field_20_count = 0; int32_t field_24_count = 0; int32_t field_28_count = 0; - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) { - for (int32_t j = 0; j < 32; j++) + for (uint32_t j = 0; j < 32; j++) if (block->cloth.field_10 & (1 << j)) field_18_count++; @@ -4883,30 +4892,30 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (sk->bones_count) { sh.bone_ids_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) io_write_int32_t(s, sk->bones[i].id); io_align_write(s, 0x10); sh.bone_parent_ids_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) + for (uint32_t i = 0; i < sk->bones_count; i++) io_write_int32_t(s, sk->bones[i].parent); io_align_write(s, 0x10); sh.bone_names_offset = io_get_position(s); if (!is_x) - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - obj_skin_strings_push_back_check(&strings, string_data(&sk->bones[i].name)); + obj_skin_strings_push_back_check(strings, string_data(&sk->bones[i].name)); } else - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { io_write_offset_x_pof_add(s, 0, &pof); - obj_skin_strings_push_back_check(&strings, string_data(&sk->bones[i].name)); + obj_skin_strings_push_back_check(strings, string_data(&sk->bones[i].name)); } io_align_write(s, 0x10); sh.bone_matrices_offset = io_get_position(s); - for (int32_t i = 0; i < sk->bones_count; i++) { + for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; io_write_float_t(s, mat.row0.x); io_write_float_t(s, mat.row1.x); @@ -4943,7 +4952,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_int32_t(s, 0); - io_write(s, 0x1C); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } else { io_write_int32_t(s, 0); @@ -4956,14 +4971,19 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); io_write_int32_t(s, 0); - io_write(s, 0x04); - io_write(s, 0x38); + io_write_offset_x_pof_add(s, 0, &pof); + io_write_offset_x_pof_add(s, 0, &pof); + io_write_offset_x_pof_add(s, 0, &pof); + io_write_offset_x_pof_add(s, 0, &pof); + io_write_offset_x_pof_add(s, 0, &pof); + io_write_offset_x_pof_add(s, 0, &pof); + io_write_offset_x_pof_add(s, 0, &pof); } io_align_write(s, 0x10); if (ex->osage_nodes_count) { exh.osage_nodes_offset = io_get_position(s); - for (int32_t i = 0; i < ex->osage_nodes_count; i++) { + for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -4971,7 +4991,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); exh.osage_sibling_infos_offset = io_get_position(s); - for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -4985,17 +5005,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (exh.osage_count || exh.cloth_count) { exh.osage_names_offset = io_get_position(s); if (!is_x) { - for (int32_t i = 0; i < exh.osage_count; i++) + for (uint32_t i = 0; i < exh.osage_count; i++) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - for (int32_t i = 0; i < exh.cloth_count; i++) + for (uint32_t i = 0; i < exh.cloth_count; i++) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } else { - for (int32_t i = 0; i < exh.osage_count; i++) + for (uint32_t i = 0; i < exh.osage_count; i++) io_write_offset_x_pof_add(s, 0, &pof); - for (int32_t i = 0; i < exh.cloth_count; i++) + for (uint32_t i = 0; i < exh.cloth_count; i++) io_write_offset_x_pof_add(s, 0, &pof); } io_align_write(s, 0x10); @@ -5003,17 +5023,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, exh.bone_names_offset = io_get_position(s); if (!is_x) - for (string* i = bone_names.begin; i != bone_names.end; i++) + for (std::string& i : bone_names) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); else - for (string* i = bone_names.begin; i != bone_names.end; i++) + for (std::string& i : bone_names) io_write_offset_x_pof_add(s, 0, &pof); io_align_write(s, 0x10); if (ex->blocks_count > 0) { exh.blocks_offset = io_get_position(s); if (!is_x) { - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } @@ -5021,7 +5041,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2(s, 0, 0x20); } else { - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); } @@ -5032,7 +5052,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; @@ -5043,7 +5063,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write(s, 0x24); } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; @@ -5064,7 +5084,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; @@ -5077,14 +5097,14 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write(s, 0x04); - for (int32_t j = 0; j < expression->expressions_count && j < 9; j++) + for (uint32_t j = 0; j < expression->expressions_count && j < 9; j++) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - for (int32_t j = expression->expressions_count; j < 9; j++) + for (uint32_t j = expression->expressions_count; j < 9; j++) io_write(s, 0x04); } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; @@ -5096,16 +5116,16 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_x_pof_add(s, 0, &pof); io_write(s, 0x08); - for (int32_t j = 0; j < expression->expressions_count && j < 9; j++) + for (uint32_t j = 0; j < expression->expressions_count && j < 9; j++) io_write_offset_x_pof_add(s, 0, &pof); - for (int32_t j = expression->expressions_count; j < 9; j++) + for (uint32_t j = expression->expressions_count; j < 9; j++) io_write(s, 0x08); } io_align_write(s, 0x10); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5142,7 +5162,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write(s, 0x08); } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5181,7 +5201,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; @@ -5218,7 +5238,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, } } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; @@ -5259,7 +5279,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -5273,7 +5293,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -5290,7 +5310,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (motion_count) { motion_block_node_mats = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -5301,7 +5321,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); motion_block_node_name_offset = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; @@ -5314,13 +5334,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (exh.cloth_count) { field_18 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - for (int32_t j = 0; j < 32; j++) + for (uint32_t j = 0; j < 32; j++) if (cloth->field_10 & (1 << j)) io_write(s, sizeof(mat4)); } @@ -5328,7 +5348,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, field_1C = io_get_position(s); if (!is_x) - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5338,7 +5358,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, + 4 * (sizeof(int32_t) + 3 * sizeof(int32_t))) * cloth->count); } else - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5350,7 +5370,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); field_20 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5361,7 +5381,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); field_24 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5372,7 +5392,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_align_write(s, 0x10); field_28 = io_get_position(s); - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; @@ -5386,110 +5406,109 @@ static void obj_modern_write_skin(obj* obj, stream* s, } if (sk->bones || sk->ex_data_init) { - quicksort_string(strings.begin, vector_old_length(strings)); - vector_old_ssize_t_reserve(&string_offsets, vector_old_length(strings)); - for (string* i = strings.begin; i != strings.end; i++) { - ssize_t off = io_get_position(s); - io_write_string_null_terminated(s, i); - vector_old_ssize_t_push_back(&string_offsets, &off); + quicksort_string(strings.data(), strings.size()); + string_offsets.reserve(strings.size()); + for (std::string& i : strings) { + string_offsets.push_back(io_get_position(s)); + io_write_string_null_terminated(s, &i); } } io_align_write(s, 0x10); - vector_old_string osage_names = vector_old_empty(string); + std::vector osage_names; if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; - ssize_t cls_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "CLS"); - ssize_t cns_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "CNS"); - ssize_t exp_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "EXP"); - ssize_t mot_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "MOT"); - ssize_t osg_offset = obj_skin_strings_get_string_offset(&strings, &string_offsets, "OSG"); + int64_t cls_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "CLS"); + int64_t cns_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "CNS"); + int64_t exp_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "EXP"); + int64_t mot_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "MOT"); + int64_t osg_offset = obj_skin_strings_get_string_offset(strings, string_offsets, "OSG"); if (ex->blocks_count > 0) { - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); - obj_modern_write_skin_block_cloth(&block->cloth, s, &strings, &string_offsets, + obj_modern_write_skin_block_cloth(&block->cloth, s, strings, string_offsets, is_x, &field_18, &field_1C, &field_20, &field_24, &field_28); io_position_pop(s); } - ssize_t constraint_type_name_offsets[4]; - constraint_type_name_offsets[0] = obj_skin_strings_get_string_offset(&strings, - &string_offsets, "Orientation"); - 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"); + int64_t constraint_type_name_offsets[4]; + constraint_type_name_offsets[0] = obj_skin_strings_get_string_offset(strings, + string_offsets, "Orientation"); + 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++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_constraint(&block->constraint, - s, &strings, &string_offsets, bone_names_ptr, is_x, constraint_type_name_offsets); + s, strings, string_offsets, bone_names_ptr, is_x, constraint_type_name_offsets); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_expression(&block->expression, - s, &strings, &string_offsets, bone_names_ptr, is_x); + s, strings, string_offsets, bone_names_ptr, is_x); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_motion(&block->motion, - s, &strings, &string_offsets, is_x, bone_names_ptr, + s, strings, string_offsets, is_x, bone_names_ptr, &motion_block_node_name_offset, &motion_block_node_mats); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; io_position_push(s, bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_osage(&block->osage, - s, &strings, &string_offsets, is_x); + s, strings, string_offsets, is_x); io_position_pop(s); } - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(&osage_names, string_data(&cloth->mesh_name)); + obj_skin_strings_push_back_check(osage_names, string_data(&cloth->mesh_name)); } else if (block->type == OBJ_SKIN_BLOCK_OSAGE) { obj_skin_block_osage* osage = &block->osage; - obj_skin_strings_push_back_check_by_index(&osage_names, + obj_skin_strings_push_back_check_by_index(osage_names, bone_names_ptr, osage->external_name_index); } } io_position_push(s, exh.blocks_offset, SEEK_SET); if (!is_x) { - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: @@ -5522,7 +5541,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2(s, 0, 0); } else { - for (int32_t i = 0; i < ex->blocks_count; i++) { + for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: @@ -5562,15 +5581,15 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (sk->bones) { io_position_push(s, sh.bone_names_offset, SEEK_SET); if (!is_x) - for (int32_t i = 0; i < sk->bones_count; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(&sk->bones[i].name)); + for (uint32_t i = 0; i < sk->bones_count; i++) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, string_data(&sk->bones[i].name)); io_write_offset_f2(s, str_offset, 0x20); } else - for (int32_t i = 0; i < sk->bones_count; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(&sk->bones[i].name)); + for (uint32_t i = 0; i < sk->bones_count; i++) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, string_data(&sk->bones[i].name)); io_write_offset_x(s, str_offset); } io_position_pop(s); @@ -5582,21 +5601,21 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (ex->blocks_count > 0) { io_position_push(s, exh.bone_names_offset, SEEK_SET); if (!is_x) - for (string* i = bone_names.begin; i != bone_names.end; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(i)); + for (std::string& i : bone_names) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, i.c_str()); io_write_offset_f2(s, str_offset, 0x20); } else - for (string* i = bone_names.begin; i != bone_names.end; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(i)); + for (std::string& i : bone_names) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, i.c_str()); io_write_offset_x(s, str_offset); } io_position_pop(s); io_position_push(s, exh.osage_nodes_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_nodes_count; i++) { + for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; io_write_uint32_t(s, osage_node->name_index); io_write_float_t(s, osage_node->length); @@ -5605,7 +5624,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_position_pop(s); io_position_push(s, exh.osage_sibling_infos_offset, SEEK_SET); - for (int32_t i = 0; i < ex->osage_sibling_infos_count; i++) { + for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { obj_skin_osage_sibling_info* osage_sibling_info = &ex->osage_sibling_infos[i]; io_write_uint32_t(s, osage_sibling_info->name_index); io_write_uint32_t(s, osage_sibling_info->sibling_name_index); @@ -5616,19 +5635,19 @@ 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)vector_old_length(osage_names); + exh.osage_count = (int32_t)osage_names.size(); exh.osage_count -= exh.cloth_count; io_position_push(s, exh.osage_names_offset, SEEK_SET); if (!is_x) - for (string* i = osage_names.begin; i != osage_names.end; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(i)); + for (std::string& i : osage_names) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, i.c_str()); io_write_offset_f2(s, str_offset, 0x20); } else - for (string* i = osage_names.begin; i != osage_names.end; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(&strings, - &string_offsets, string_data(i)); + for (std::string& i : osage_names) { + size_t str_offset = obj_skin_strings_get_string_offset(strings, + string_offsets, i.c_str()); io_write_offset_x(s, str_offset); } io_position_pop(s); @@ -5646,7 +5665,14 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2(s, exh.bone_names_offset, 0x20); io_write_offset_f2(s, exh.osage_sibling_infos_offset, 0x20); io_write_int32_t(s, exh.cloth_count); - io_write(s, 0x1C); + io_write_offset_f2(s, ex->field_24, 0x20); + io_write_offset_f2(s, ex->field_28, 0x20); + io_write_offset_f2(s, ex->field_2C, 0x20); + io_write_offset_f2(s, ex->field_30, 0x20); + io_write_offset_f2(s, ex->field_34, 0x20); + io_write_offset_f2(s, ex->field_38, 0x20); + io_write_offset_f2(s, ex->field_3C, 0x20); + io_write_offset_f2(s, ex->field_40, 0x20); } else { io_write_int32_t(s, exh.osage_count); @@ -5659,12 +5685,16 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_x(s, exh.bone_names_offset); io_write_offset_x(s, exh.osage_sibling_infos_offset); io_write_int32_t(s, exh.cloth_count); - io_write(s, 0x04); - io_write(s, 0x38); + io_write_offset_x(s, ex->field_24); + io_write_offset_x(s, ex->field_28); + io_write_offset_x(s, ex->field_2C); + io_write_offset_x(s, ex->field_30); + io_write_offset_x(s, ex->field_34); + io_write_offset_x(s, ex->field_38); + io_write_offset_x(s, ex->field_3C); + io_write_offset_x(s, ex->field_40); } io_position_pop(s); - - vector_old_string_free(&osage_names, string_free); } io_position_push(s, base_offset, SEEK_SET); @@ -5688,42 +5718,38 @@ static void obj_modern_write_skin(obj* obj, stream* s, } io_position_pop(s); - vector_old_string_free(&strings, string_free); - vector_old_ssize_t_free(&string_offsets, 0); - vector_old_string_free(&bone_names, string_free); - oskn->enrs = e; oskn->pof = pof; } static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, stream* s, uint32_t header_length, char** str, bool is_x) { - ssize_t mesh_name_offset = io_read_offset(s, header_length, is_x); + int64_t mesh_name_offset = io_read_offset(s, header_length, is_x); io_read_string_null_terminated_offset(s, mesh_name_offset, &b->mesh_name); - ssize_t backface_mesh_name_offset = io_read_offset(s, header_length, is_x); + int64_t backface_mesh_name_offset = io_read_offset(s, header_length, is_x); io_read_string_null_terminated_offset(s, backface_mesh_name_offset, &b->backface_mesh_name); - b->field_08 = io_read_int32_t_stream_reverse_endianness(s); + b->field_8 = io_read_int32_t_stream_reverse_endianness(s); b->count = io_read_int32_t_stream_reverse_endianness(s); b->field_10 = io_read_int32_t_stream_reverse_endianness(s); b->field_14 = io_read_int32_t_stream_reverse_endianness(s); - ssize_t field_18_offset = io_read_offset(s, header_length, is_x); - ssize_t field_1C_offset = io_read_offset(s, header_length, is_x); + int64_t field_18_offset = io_read_offset(s, header_length, is_x); + int64_t field_1C_offset = io_read_offset(s, header_length, is_x); b->field_1C = 0; b->field_20 = 0; b->field_24 = 0; b->field_28 = 0; - ssize_t field_20_offset = io_read_offset(s, header_length, is_x); - ssize_t field_24_offset = io_read_offset(s, header_length, is_x); - ssize_t field_28_offset = io_read_offset(s, header_length, is_x); + int64_t field_20_offset = io_read_offset(s, header_length, is_x); + int64_t field_24_offset = io_read_offset(s, header_length, is_x); + int64_t field_28_offset = io_read_offset(s, header_length, is_x); b->field_2C = io_read_uint32_t_stream_reverse_endianness(s); b->field_30 = io_read_uint32_t_stream_reverse_endianness(s); if (field_18_offset) { io_position_push(s, field_18_offset, SEEK_SET); - for (int32_t i = 0; i < 32; i++) { + for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; @@ -5753,10 +5779,10 @@ static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, b->field_1C = 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_1C* f = &b->field_1C[i]; - f->field_00 = io_read_float_t_stream_reverse_endianness(s); - f->field_04 = io_read_float_t_stream_reverse_endianness(s); - f->field_08 = io_read_float_t_stream_reverse_endianness(s); - f->field_0C = io_read_float_t_stream_reverse_endianness(s); + f->field_0 = io_read_float_t_stream_reverse_endianness(s); + f->field_4 = io_read_float_t_stream_reverse_endianness(s); + f->field_8 = io_read_float_t_stream_reverse_endianness(s); + f->field_C = io_read_float_t_stream_reverse_endianness(s); f->field_10 = io_read_float_t_stream_reverse_endianness(s); f->field_14 = io_read_float_t_stream_reverse_endianness(s); f->field_18 = io_read_float_t_stream_reverse_endianness(s); @@ -5764,7 +5790,7 @@ static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, f->field_20 = io_read_uint32_t_stream_reverse_endianness(s); f->field_24 = io_read_uint32_t_stream_reverse_endianness(s); - for (int32_t j = 0; j < 4; j++) + for (uint32_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); } @@ -5776,7 +5802,7 @@ static void obj_modern_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]; - for (int32_t j = 0; j < 10; j++) + for (uint32_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); } @@ -5812,18 +5838,18 @@ static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, } static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x, - ssize_t* field_18_offset, ssize_t* field_1C_offset, ssize_t* field_20_offset, - ssize_t* field_24_offset, ssize_t* field_28_offset) { - ssize_t mesh_name_offset = obj_skin_strings_get_string_offset(strings, + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, + int64_t* field_24_offset, int64_t* field_28_offset) { + int64_t mesh_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->mesh_name)); - ssize_t backface_mesh_name_offset = obj_skin_strings_get_string_offset(strings, + int64_t backface_mesh_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->backface_mesh_name)); if (!is_x) { io_write_offset_f2(s, mesh_name_offset, 0x20); io_write_offset_f2(s, backface_mesh_name_offset, 0x20); - io_write_int32_t(s, b->field_08); + io_write_int32_t(s, b->field_8); io_write_int32_t(s, b->count); io_write_int32_t(s, b->field_10); io_write_int32_t(s, b->field_14); @@ -5838,7 +5864,7 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, else { io_write_offset_x(s, mesh_name_offset); io_write_offset_x(s, backface_mesh_name_offset); - io_write_int32_t(s, b->field_08); + io_write_int32_t(s, b->field_8); io_write_int32_t(s, b->count); io_write_int32_t(s, b->field_10); io_write_int32_t(s, b->field_14); @@ -5853,7 +5879,7 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, if (b->field_10) { io_position_push(s, *field_18_offset, SEEK_SET); - for (int32_t i = 0; i < 32; i++) { + for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; @@ -5883,10 +5909,10 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, io_position_push(s, *field_1C_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_1C* f = &b->field_1C[i]; - io_write_float_t(s, f->field_00); - io_write_float_t(s, f->field_04); - io_write_float_t(s, f->field_08); - io_write_float_t(s, f->field_0C); + io_write_float_t(s, f->field_0); + io_write_float_t(s, f->field_4); + io_write_float_t(s, f->field_8); + io_write_float_t(s, f->field_C); io_write_float_t(s, f->field_10); io_write_float_t(s, f->field_14); io_write_float_t(s, f->field_18); @@ -5894,7 +5920,7 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, io_write_uint32_t(s, f->field_20); io_write_uint32_t(s, f->field_24); - for (int32_t j = 0; j < 4; j++) + for (uint32_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); } @@ -5911,7 +5937,7 @@ 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]; - for (int32_t j = 0; j < 10; j++) + for (uint32_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); } @@ -5938,33 +5964,33 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, static void obj_modern_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, stream* s, uint32_t header_length, char** str, bool is_x) { - ssize_t bone_name_offset = io_read_offset(s, header_length, is_x); + int64_t bone_name_offset = io_read_offset(s, header_length, is_x); io_read_string_null_terminated_offset(s, bone_name_offset, &sub->bone_name); sub->weight = io_read_float_t_stream_reverse_endianness(s); sub->matrix_index = io_read_uint32_t_stream_reverse_endianness(s); - sub->field_0C = io_read_uint32_t_stream_reverse_endianness(s); + sub->field_C = io_read_uint32_t_stream_reverse_endianness(s); if (is_x) io_read(s, 0, 0x04); } static void obj_modern_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x) { - ssize_t bone_name_offset = obj_skin_strings_get_string_offset(strings, + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { + int64_t bone_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&sub->bone_name)); io_write_offset(s, bone_name_offset, 0x20, is_x); io_write_float_t(s, sub->weight); io_write_uint32_t(s, sub->matrix_index); - io_write_uint32_t(s, sub->field_0C); + io_write_uint32_t(s, sub->field_C); if (is_x) io_write(s, 0x04); } static void obj_modern_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, stream* s, uint32_t header_length, char** str, bool is_x) { - sub->field_00 = io_read_uint32_t_stream_reverse_endianness(s); - sub->field_04 = io_read_float_t_stream_reverse_endianness(s); - sub->field_08 = io_read_float_t_stream_reverse_endianness(s); - sub->field_0C = io_read_float_t_stream_reverse_endianness(s); + sub->field_0 = io_read_uint32_t_stream_reverse_endianness(s); + sub->field_4 = io_read_float_t_stream_reverse_endianness(s); + sub->field_8 = io_read_float_t_stream_reverse_endianness(s); + sub->field_C = io_read_float_t_stream_reverse_endianness(s); sub->field_10 = io_read_float_t_stream_reverse_endianness(s); sub->field_14 = io_read_float_t_stream_reverse_endianness(s); sub->field_18 = io_read_float_t_stream_reverse_endianness(s); @@ -5975,11 +6001,11 @@ static void obj_modern_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_f } static void obj_modern_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x) { - io_write_uint32_t(s, sub->field_00); - io_write_float_t(s, sub->field_04); - io_write_float_t(s, sub->field_08); - io_write_float_t(s, sub->field_0C); + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { + io_write_uint32_t(s, sub->field_0); + io_write_float_t(s, sub->field_4); + io_write_float_t(s, sub->field_8); + io_write_float_t(s, sub->field_C); io_write_float_t(s, sub->field_10); io_write_float_t(s, sub->field_14); io_write_float_t(s, sub->field_18); @@ -5993,10 +6019,10 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, stream* s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - ssize_t type_offset = io_read_offset(s, header_length, is_x); + int64_t type_offset = io_read_offset(s, header_length, is_x); char* type = io_read_utf8_string_null_terminated_offset(s, type_offset); - ssize_t name_offset = io_read_offset(s, header_length, is_x); + int64_t name_offset = io_read_offset(s, header_length, is_x); char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); b->name_index = 0; @@ -6009,7 +6035,7 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, b->coupling = (obj_skin_block_constraint_coupling)io_read_int32_t_stream_reverse_endianness(s); - ssize_t source_node_name_offset = io_read_offset(s, header_length, is_x); + int64_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, "Orientation")) { @@ -6054,11 +6080,11 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, } static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names, - bool is_x, ssize_t* offsets) { + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, + bool is_x, int64_t* offsets) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); - ssize_t type_offset = 0; + int64_t type_offset = 0; switch (b->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: type_offset = offsets[0]; @@ -6075,13 +6101,13 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, } io_write_offset(s, type_offset, 0x20, is_x); - ssize_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, + int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); io_write_offset(s, name_offset, 0x20, is_x); io_write_int32_t(s, b->coupling); - ssize_t source_node_name_offset = obj_skin_strings_get_string_offset(strings, + int64_t source_node_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->source_node_name)); io_write_offset(s, source_node_name_offset, 0x20, is_x); @@ -6131,7 +6157,7 @@ static void obj_modern_read_skin_block_constraint_attach_point(obj_skin_block_co } static void obj_modern_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x) { + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { io_write_int32_t(s, ap->affected_by_orientation ? 1 : 0); io_write_int32_t(s, ap->affected_by_scaling ? 1 : 0); io_write_float_t(s, ap->offset.x); @@ -6150,12 +6176,12 @@ static void obj_modern_read_skin_block_constraint_up_vector_old(obj_skin_block_c up->point_at.y = io_read_float_t_stream_reverse_endianness(s); up->point_at.z = io_read_float_t_stream_reverse_endianness(s); - ssize_t name_offset = io_read_offset(s, header_length, is_x); + int64_t name_offset = io_read_offset(s, header_length, is_x); io_read_string_null_terminated_offset(s, name_offset, &up->name); } static void obj_modern_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x) { + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { io_write_int32_t(s, up->active ? 1 : 0); io_write_float_t(s, up->roll); io_write_float_t(s, up->affected_axis.x); @@ -6165,7 +6191,7 @@ static void obj_modern_write_skin_block_constraint_up_vector_old(obj_skin_block_ io_write_float_t(s, up->point_at.y); io_write_float_t(s, up->point_at.z); - ssize_t name_offset = obj_skin_strings_get_string_offset(strings, + int64_t name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&up->name)); io_write_offset(s, name_offset, 0x20, is_x); } @@ -6174,7 +6200,7 @@ static void obj_modern_read_skin_block_expression(obj_skin_block_expression* b, stream* s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - ssize_t name_offset = io_read_offset(s, header_length, is_x); + int64_t name_offset = io_read_offset(s, header_length, is_x); char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); b->name_index = 0; @@ -6188,49 +6214,49 @@ static void obj_modern_read_skin_block_expression(obj_skin_block_expression* b, b->expressions_count = io_read_int32_t_stream_reverse_endianness(s); b->expressions_count = min(b->expressions_count, 9); if (!is_x) - for (int32_t i = 0; i < b->expressions_count; i++) { - ssize_t expression_offset = io_read_offset_f2(s, header_length); + for (uint32_t i = 0; i < b->expressions_count; i++) { + int64_t expression_offset = io_read_offset_f2(s, header_length); if (expression_offset) io_read_string_null_terminated_offset(s, expression_offset, &b->expressions[i]); } else - for (int32_t i = 0; i < b->expressions_count; i++) { - ssize_t expression_offset = io_read_offset_x(s); + for (uint32_t i = 0; i < b->expressions_count; i++) { + int64_t expression_offset = io_read_offset_x(s); if (expression_offset) io_read_string_null_terminated_offset(s, expression_offset, &b->expressions[i]); } - for (int32_t i = b->expressions_count; i < 9; i++) + for (uint32_t i = b->expressions_count; i < 9; i++) b->expressions[i] = string_empty; } static void obj_modern_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, char** bone_names, bool is_x) { + stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); - ssize_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, + int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); io_write_offset(s, name_offset, 0x20, is_x); io_write_int32_t(s, min(b->expressions_count, 9)); if (!is_x) { - for (int32_t i = 0; i < b->expressions_count && i < 9; i++) { - ssize_t expression_offset = obj_skin_strings_get_string_offset(strings, + for (uint32_t i = 0; i < b->expressions_count && i < 9; i++) { + int64_t expression_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->expressions[i])); io_write_offset_f2(s, (int32_t)expression_offset, 0x20); } - for (int32_t i = b->expressions_count; i < 9; i++) + for (uint32_t i = b->expressions_count; i < 9; i++) io_write_offset_f2(s, 0, 0x20); } else { - for (int32_t i = 0; i < b->expressions_count && i < 9; i++) { - ssize_t expression_offset = obj_skin_strings_get_string_offset(strings, + for (uint32_t i = 0; i < b->expressions_count && i < 9; i++) { + int64_t expression_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->expressions[i])); io_write_offset_x(s, expression_offset); } - for (int32_t i = b->expressions_count; i < 9; i++) + for (uint32_t i = b->expressions_count; i < 9; i++) io_write_offset_x(s, 0); } } @@ -6239,10 +6265,10 @@ static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, stream* s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - ssize_t name_offset = io_read_offset(s, header_length, is_x); + int64_t name_offset = io_read_offset(s, header_length, is_x); b->nodes_count = io_read_int32_t_stream_reverse_endianness(s); - ssize_t bone_names_offset = io_read_offset(s, header_length, is_x); - ssize_t bone_matrices_offset = io_read_offset(s, header_length, is_x); + int64_t bone_names_offset = io_read_offset(s, header_length, is_x); + int64_t bone_matrices_offset = io_read_offset(s, header_length, is_x); if (!is_x) { b->name_index = 0; @@ -6266,14 +6292,14 @@ static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, if (bone_names_offset) { io_position_push(s, bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) + for (uint32_t i = 0; i < b->nodes_count; i++) b->nodes[i].name_index = io_read_uint32_t_stream_reverse_endianness(s); io_position_pop(s); } if (bone_matrices_offset) { io_position_push(s, bone_matrices_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) { + for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; mat.row0.x = io_read_float_t_stream_reverse_endianness(s); mat.row1.x = io_read_float_t_stream_reverse_endianness(s); @@ -6297,11 +6323,11 @@ static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, } static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x, - char** bone_names, ssize_t* bone_names_offset, ssize_t* bone_matrices_offset) { + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); - ssize_t name_offset; + int64_t name_offset; if (!is_x) name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); @@ -6315,13 +6341,13 @@ static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, if (b->nodes) { io_position_push(s, *bone_names_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) + for (uint32_t i = 0; i < b->nodes_count; i++) io_write_uint32_t(s, b->nodes[i].name_index); io_position_pop(s); *bone_names_offset += b->nodes_count * sizeof(uint32_t); io_position_push(s, *bone_matrices_offset, SEEK_SET); - for (int32_t i = 0; i < b->nodes_count; i++) { + for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; io_write_float_t(s, mat.row0.x); io_write_float_t(s, mat.row1.x); @@ -6347,7 +6373,7 @@ static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, static void obj_modern_read_skin_block_node(obj_skin_block_node* b, stream* s, uint32_t header_length, char** str, bool is_x) { - ssize_t parent_name = io_read_offset(s, header_length, is_x); + int64_t parent_name = io_read_offset(s, header_length, is_x); io_read_string_null_terminated_offset(s, parent_name, &b->parent_name); b->position.x = io_read_float_t_stream_reverse_endianness(s); @@ -6364,8 +6390,8 @@ static void obj_modern_read_skin_block_node(obj_skin_block_node* b, } static void obj_modern_write_skin_block_node(obj_skin_block_node* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x) { - ssize_t parent_name_offset = obj_skin_strings_get_string_offset(strings, + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { + int64_t parent_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->parent_name)); io_write_offset(s, parent_name_offset, 0x20, is_x); @@ -6395,7 +6421,7 @@ static void obj_modern_read_skin_block_osage(obj_skin_block_osage* b, io_read(s, 0, 0x14); else { io_read(s, 0, 0x08); - ssize_t motion_node_name_offset = io_read_offset_x(s); + int64_t motion_node_name_offset = io_read_offset_x(s); io_read_string_null_terminated_offset(s, motion_node_name_offset, &b->motion_node_name); io_read(s, 0, 0x18); } @@ -6405,7 +6431,7 @@ static void obj_modern_read_skin_block_osage(obj_skin_block_osage* b, } static void obj_modern_write_skin_block_osage(obj_skin_block_osage* b, - stream* s, vector_old_string* strings, vector_old_ssize_t* string_offsets, bool is_x) { + stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); io_write_int32_t(s, b->start_index); @@ -6417,15 +6443,15 @@ static void obj_modern_write_skin_block_osage(obj_skin_block_osage* b, io_write(s, 0x14); else { io_write(s, 0x08); - ssize_t motion_node_name_offset = obj_skin_strings_get_string_offset(strings, + int64_t motion_node_name_offset = obj_skin_strings_get_string_offset(strings, string_offsets, string_data(&b->motion_node_name)); io_write_offset_x(s, motion_node_name_offset); io_write(s, 0x18); } } -static void obj_modern_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, obj_mesh* mesh, - const uint32_t attrib_flags, int32_t vertex_count, int32_t vertex_size) { +static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, obj_mesh* mesh, + const uint32_t attrib_flags, uint32_t vertex_count, uint32_t vertex_size) { obj_vertex_flags vertex_flags = (obj_vertex_flags)(OBJ_VERTEX_POSITION | OBJ_VERTEX_NORMAL | OBJ_VERTEX_TANGENT @@ -6440,12 +6466,12 @@ static void obj_modern_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, else if (attrib_flags == 0x04) enum_or(vertex_flags, OBJ_VERTEX_BONE_DATA); - ssize_t vtx_offset = attrib_offsets[13]; + int64_t vtx_offset = attrib_offsets[13]; bool has_tangents = false; obj_vertex_data* vtx = force_malloc_s(obj_vertex_data, vertex_count); - for (int32_t i = 0; i < vertex_count; i++) { - io_set_position(s, vtx_offset + (ssize_t)vertex_size * i, SEEK_SET); + for (uint32_t i = 0; i < vertex_count; i++) { + io_set_position(s, vtx_offset + (int64_t)vertex_size * i, SEEK_SET); vec3 position; position.x = io_read_float_t_stream_reverse_endianness(s); @@ -6541,11 +6567,11 @@ static void obj_modern_read_vertex(obj* obj, stream* s, ssize_t* attrib_offsets, } static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, - ssize_t* attrib_offsets, obj_mesh* mesh, uint32_t* attrib_flags, - int32_t* vertex_count, int32_t* vertex_size, f2_struct* ovtx) { + int64_t* attrib_offsets, obj_mesh* mesh, uint32_t* attrib_flags, + uint32_t* vertex_count, uint32_t* vertex_size, f2_struct* ovtx) { obj_vertex_data* vtx = mesh->vertex; - int32_t _vertex_count = mesh->vertex_count; + uint32_t _vertex_count = mesh->vertex_count; obj_vertex_flags vertex_flags = mesh->vertex_flags; uint32_t _attrib_flags = 0x02; @@ -6590,7 +6616,7 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, bool has_tangents = false; attrib_offsets[13] = io_get_position(s); - for (int32_t i = 0; i < _vertex_count; i++) { + for (uint32_t i = 0; i < _vertex_count; i++) { vec3 position = vtx[i].position; io_write_float_t(s, position.x); io_write_float_t(s, position.y); @@ -6665,56 +6691,55 @@ inline static void obj_skin_block_node_free(obj_skin_block_node* b) { string_free(&b->parent_name); } -inline static uint32_t obj_skin_strings_get_string_index(vector_old_string* vec, const char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return (uint32_t)(0x8000 | i - vec->begin); +inline static uint32_t obj_skin_strings_get_string_index(std::vector& vec, const char* str) { + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) + return (uint32_t)(0x8000 | &i - vec.data()); return 0x8000; } -inline static ssize_t obj_skin_strings_get_string_offset(vector_old_string* vec, - vector_old_ssize_t* vec_off, const char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return vec_off->begin[i - vec->begin]; +inline static int64_t obj_skin_strings_get_string_offset(std::vector& vec, + std::vector& vec_off, const char* str) { + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) + return vec_off[&i - vec.data()]; return 0; } -inline static ssize_t obj_skin_strings_get_string_offset_by_index(vector_old_string* vec, - vector_old_ssize_t* vec_off, char** strings, uint32_t index) { +inline static int64_t obj_skin_strings_get_string_offset_by_index(std::vector& vec, + std::vector& vec_off, char** strings, uint32_t index) { if (~index & 0x8000) return 0; char* str = strings[index & 0x7FFF]; - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) - return vec_off->begin[i - vec->begin]; + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) + return vec_off[&i - vec.data()]; return 0; } -inline static void obj_skin_strings_push_back_check(vector_old_string* vec, const char* str) { - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) +inline static void obj_skin_strings_push_back_check(std::vector& vec, const char* str) { + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) return; - string* s = vector_old_string_reserve_back(vec); - string_init_length(s, str, len); + vec.push_back(std::string(str, len)); } -inline static void obj_skin_strings_push_back_check_by_index(vector_old_string* vec, char** strings, uint32_t index) { +inline static void obj_skin_strings_push_back_check_by_index(std::vector& vec, + char** strings, uint32_t index) { if (~index & 0x8000) return; char* str = strings[index & 0x7FFF]; - ssize_t len = utf8_length(str); - for (string* i = vec->begin; i != vec->end; i++) - if (!memcmp(str, string_data(i), min(len, i->length) + 1)) + size_t len = utf8_length(str); + for (std::string& i : vec) + if (!memcmp(str, i.c_str(), min(len, i.size()) + 1)) return; - string* s = vector_old_string_reserve_back(vec); - string_init_length(s, str, len); + vec.push_back(std::string(str, len)); } diff --git a/src/KKdLib/obj.h b/src/KKdLib/obj.hpp similarity index 93% rename from src/KKdLib/obj.h rename to src/KKdLib/obj.hpp index 253482dd..a1d2a74b 100644 --- a/src/KKdLib/obj.h +++ b/src/KKdLib/obj.hpp @@ -295,7 +295,7 @@ struct obj_material { obj_bounding_sphere reserved_sphere; char name[64]; float_t bump_depth; - int32_t reserved[15]; + uint32_t reserved[15]; }; struct obj_material_data { @@ -308,12 +308,12 @@ struct obj_sub_mesh { uint32_t material_index; uint8_t texcoord_indices[8]; uint16_t* bone_indices; - int32_t bone_indices_count; + uint32_t bone_indices_count; uint32_t bones_per_vertex; obj_primitive_type primitive_type; obj_index_format index_format; uint32_t* indices; - int32_t indices_count; + uint32_t indices_count; obj_sub_mesh_flags flags; union { obj_axis_aligned_bounding_box axis_aligned_bounding_box; @@ -343,10 +343,10 @@ struct obj_vertex_data { struct obj_mesh { obj_bounding_sphere bounding_sphere; obj_sub_mesh* sub_meshes; - int32_t sub_meshes_count; + uint32_t sub_meshes_count; obj_vertex_data* vertex; - int32_t vertex_count; - int32_t vertex_size; + uint32_t vertex_count; + uint32_t vertex_size; obj_vertex_flags vertex_flags; obj_mesh_flags flags; char name[0x40]; @@ -356,14 +356,14 @@ struct obj_skin_block_cloth_field_1C_sub { string bone_name; float_t weight; uint32_t matrix_index; - uint32_t field_0C; + uint32_t field_C; }; struct obj_skin_block_cloth_field_1C { - float_t field_00; - float_t field_04; - float_t field_08; - float_t field_0C; + float_t field_0; + float_t field_4; + float_t field_8; + float_t field_C; float_t field_10; float_t field_14; float_t field_18; @@ -374,10 +374,10 @@ struct obj_skin_block_cloth_field_1C { }; struct obj_skin_block_cloth_field_20_sub { - uint32_t field_00; - float_t field_04; - float_t field_08; - float_t field_0C; + uint32_t field_0; + float_t field_4; + float_t field_8; + float_t field_C; float_t field_10; float_t field_14; float_t field_18; @@ -401,7 +401,7 @@ struct obj_skin_block_node { struct obj_skin_block_cloth { string mesh_name; string backface_mesh_name; - uint32_t field_08; + uint32_t field_8; uint32_t count; uint32_t field_10; uint32_t field_14; @@ -470,7 +470,7 @@ struct obj_skin_block_constraint { struct obj_skin_block_expression { obj_skin_block_node base; uint32_t name_index; - int32_t expressions_count; + uint32_t expressions_count; string expressions[9]; }; @@ -486,7 +486,7 @@ struct obj_skin_block_motion { uint32_t name_index; }; obj_skin_motion_node* nodes; - int32_t nodes_count; + uint32_t nodes_count; }; struct obj_skin_osage_node { @@ -524,10 +524,10 @@ struct obj_skin_osage_root_node { struct obj_skin_block_osage { obj_skin_block_node base; - int32_t start_index; - int32_t count; + uint32_t start_index; + uint32_t count; obj_skin_osage_node* nodes; - int32_t nodes_count; + uint32_t nodes_count; obj_skin_osage_root_node root; bool root_init; uint32_t external_name_index; @@ -555,14 +555,22 @@ struct obj_skin_osage_sibling_info { struct obj_skin_ex_data { obj_skin_osage_node* osage_nodes; - int32_t osage_nodes_count; + uint32_t osage_nodes_count; obj_skin_block* blocks; - int32_t blocks_count; + uint32_t blocks_count; char* bone_names_buf; char** bone_names; - int32_t bone_names_count; + uint32_t bone_names_count; obj_skin_osage_sibling_info* osage_sibling_infos; - int32_t osage_sibling_infos_count; + uint32_t osage_sibling_infos_count; + int64_t field_24; + int64_t field_28; + int64_t field_2C; + int64_t field_30; + int64_t field_34; + int64_t field_38; + int64_t field_3C; + int64_t field_40; }; struct obj_skin_bone { @@ -574,7 +582,7 @@ struct obj_skin_bone { struct obj_skin { obj_skin_bone* bones; - int32_t bones_count; + uint32_t bones_count; obj_skin_ex_data ex_data; bool ex_data_init; }; @@ -582,9 +590,9 @@ struct obj_skin { struct obj { obj_bounding_sphere bounding_sphere; obj_mesh* meshes; - int32_t meshes_count; + uint32_t meshes_count; obj_material_data* materials; - int32_t materials_count; + uint32_t materials_count; uint8_t flags; obj_skin skin; bool skin_init; @@ -599,13 +607,13 @@ struct obj_set { bool is_x; obj* objects; - int32_t objects_count; + uint32_t objects_count; uint32_t* texture_ids; - int32_t texture_ids_count; + uint32_t texture_ids_count; obj_set(); virtual ~obj_set(); - void pack_file(void** data, size_t* length); - void unpack_file(void* data, size_t length, bool modern); + void pack_file(void** data, size_t* size); + void unpack_file(void* data, size_t size, bool modern); }; diff --git a/src/KKdLib/pv_db.c b/src/KKdLib/pv_db.cpp similarity index 73% rename from src/KKdLib/pv_db.c rename to src/KKdLib/pv_db.cpp index 96a97b3b..c9d48c56 100644 --- a/src/KKdLib/pv_db.c +++ b/src/KKdLib/pv_db.cpp @@ -3,4 +3,4 @@ GitHub/GitLab: korenkonder */ -#include "pv_db.h" +#include "pv_db.hpp" diff --git a/src/KKdLib/pv_db.h b/src/KKdLib/pv_db.h deleted file mode 100644 index 38984c8d..00000000 --- a/src/KKdLib/pv_db.h +++ /dev/null @@ -1,1088 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "default.h" -#include "string.h" -#include "vector.h" - -enum pv_db_chara { - PV_DB_CHARA_MIK = 0, - PV_DB_CHARA_RIN = 1, - PV_DB_CHARA_LEN = 2, - PV_DB_CHARA_LUK = 3, - PV_DB_CHARA_NER = 4, - PV_DB_CHARA_HAK = 5, - PV_DB_CHARA_KAI = 6, - PV_DB_CHARA_MEI = 7, - PV_DB_CHARA_SAK = 8, - PV_DB_CHARA_TET = 9, -}; - -enum pv_db_chreff_type { - PV_DB_CHARA_EFFECT_AUTH3D = 0, - PV_DB_CHARA_EFFECT_AUTH3D_OBJ = 1, -}; - -enum pv_db_format { - PV_DB_NONE, - PV_DB_AC101, - PV_DB_AC110, - PV_DB_AC120, - PV_DB_AC130, - PV_DB_AC200, - PV_DB_AC210, - PV_DB_AC211, - PV_DB_AC220, - PV_DB_AC221, - PV_DB_AC301, - PV_DB_AC310, - PV_DB_AC320, - PV_DB_AC401, - PV_DB_AC402, - PV_DB_AC410, - PV_DB_AC500, - PV_DB_AC510, - PV_DB_AC511, - PV_DB_AC520, - PV_DB_AC521, - PV_DB_AC600, - PV_DB_AFT101, - PV_DB_AFT110, - PV_DB_AFT120, - PV_DB_AFT200, - PV_DB_AFT210, - PV_DB_AFT220, - PV_DB_AFT300, - PV_DB_AFT310, - PV_DB_AFT400, - PV_DB_AFT410, - PV_DB_AFT500, - PV_DB_AFT501, - PV_DB_AFT510, - PV_DB_AFT600, - PV_DB_AFT601, - PV_DB_AFT610, - PV_DB_AFT620, - PV_DB_AFT621, - PV_DB_AFT622, - PV_DB_AFT701, - PV_DB_AFT710, - PV_DB_FT, -}; - -enum pv_db_duet_type { - PV_DB_DUET_USER_SETTING = 0, - PV_DB_DUET_FIXED_SIZE = 1, - PV_DB_DUET_FIXED_SUB = 2, - PV_DB_DUET_FIXED_ALL = 3, - PV_DB_DUET_PSEUDO_DEFAULT = 4, - PV_DB_DUET_PSEUDO_SAME = 5, - PV_DB_DUET_PSEUDO_SWIM = 6, - PV_DB_DUET_PSEUDO_SWIM_S = 7, -}; - -enum pv_db_eyes_base_adjust_type { - PV_DB_EYES_BASE_ADJUST_DIRECTION = 0, - PV_DB_EYES_BASE_ADJUST_CLEARANCE = 1, - PV_DB_EYES_BASE_ADJUST_OFF = 2, -}; - -enum pv_db_frame_texture_type { - PV_DB_FRAME_TEXTURE_PRE_PP = 0, - PV_DB_FRAME_TEXTURE_POST_PP = 1, - PV_DB_FRAME_TEXTURE_FB = 2, -}; - -enum pv_db_movie_surface { - PV_DB_MOVIE_SURFACE_BACK = 0, - PV_DB_MOVIE_SURFACE_FRONT = 1, -}; - -enum pv_db_performer_size { - PV_DB_PERFORMER_SIZE_NORMAL = 0, - PV_DB_PERFORMER_SIZE_PLAY_CHARA = 1, - PV_DB_PERFORMER_SIZE_PV_CHARA = 2, - PV_DB_PERFORMER_SIZE_SHORT = 3, - PV_DB_PERFORMER_SIZE_TALL = 4, -}; - -enum pv_db_performer_type { - PV_DB_PERFORMER_VOCAL = 0, - PV_DB_PERFORMER_PSEUDO_DEFAULT = 1, - PV_DB_PERFORMER_PSEUDO_SAME = 2, - PV_DB_PERFORMER_PSEUDO_SWIM = 3, - PV_DB_PERFORMER_PSEUDO_SWIM_S = 4, - PV_DB_PERFORMER_PSEUDO_MYCHARA = 5, - PV_DB_PERFORMER_GUEST = 6, -}; - -enum pv_db_pv_level { - PV_DB_PV_LV_00_0 = 0, - PV_DB_PV_LV_00_5 = 1, - PV_DB_PV_LV_01_0 = 2, - PV_DB_PV_LV_01_5 = 3, - PV_DB_PV_LV_02_0 = 4, - PV_DB_PV_LV_02_5 = 5, - PV_DB_PV_LV_03_0 = 6, - PV_DB_PV_LV_03_5 = 7, - PV_DB_PV_LV_04_0 = 8, - PV_DB_PV_LV_04_5 = 9, - PV_DB_PV_LV_05_0 = 10, - PV_DB_PV_LV_05_5 = 11, - PV_DB_PV_LV_06_0 = 12, - PV_DB_PV_LV_06_5 = 13, - PV_DB_PV_LV_07_0 = 14, - PV_DB_PV_LV_07_5 = 15, - PV_DB_PV_LV_08_0 = 16, - PV_DB_PV_LV_08_5 = 17, - PV_DB_PV_LV_09_0 = 18, - PV_DB_PV_LV_09_5 = 19, - PV_DB_PV_LV_10_0 = 20, -}; - -struct pv_db_another_song_aft310 { - string name; - string song_file_name; -}; - -struct pv_db_another_song_aft500 { - string name; - string name_en; // FT/M39 - string song_file_name; - string vocal_chara_num; // FT/M39 - string vocal_disp_name; // FT/M39 - string vocal_disp_name_en; // FT/M39 -}; - -struct pv_db_auth_replace_by_module { - null_int32_t id; - null_int32_t module_id; - string name; - string org_name; -}; - -null(pv_db_chara) - -struct pv_db_chrcam { - null_pv_db_chara chara; - - null_int32_t id; - string name; - string org_name; -}; - -null(pv_db_chreff_type) - -struct pv_db_chreff_data { - null_pv_db_chreff_type type; - - string Name; -}; - -vector_old(pv_db_chreff_data) - -struct pv_db_chreff { - vector_old_pv_db_chreff_data data; - - null_int32_t id; - string name; -}; - -struct pv_db_chrmot { - null_pv_db_chara chara; - - null_int32_t id; - string name; - string org_name; -}; - -struct pv_db_disp2d_ac200 { - string set_name; - null_int32_t target_shadow_type; - null_int32_t title_end_2d_field; - null_int32_t title_end_2d_low_field; // not AC200 - null_int32_t title_end_3d_field; - null_int32_t title_start_2d_field; - null_int32_t title_start_2d_low_field; // not AC200 - null_int32_t title_start_3d_field; -}; - -struct pv_db_disp2d_aft210 { - string set_name; - null_int32_t target_shadow_type; - null_int32_t title_2d_layer; - null_int32_t title_end_2d_field; - null_int32_t title_end_2d_low_field; - null_int32_t title_end_3d_field; - null_int32_t title_start_2d_field; - null_int32_t title_start_2d_low_field; - null_int32_t title_start_3d_field; -}; - -null(pv_db_duet_type) - -struct pv_db_duet { - null_pv_db_duet_type type; - null_int32_t num; -}; - -struct pv_db_eyes_rot_rate { - null_pv_db_chara chr; - null_float_t xn_rate; - null_float_t xp_rate; -}; - -struct pv_db_ex_auth { - string name; - string org_name; -}; - -struct pv_db_ex_song_ac101 { - null_pv_db_chara chara; - - string file; - string name; -}; - -struct pv_db_ex_song_aft101 { - null_pv_db_chara chara; - null_pv_db_chara chara2P; // not AFT101 - null_pv_db_chara chara3P; // not AFT101 - null_pv_db_chara chara4P; // not AFT101 - - string file; - string name; -}; - -vector_old(pv_db_ex_auth) - -struct pv_db_ex_song_aft300 { - vector_old_pv_db_ex_auth ex_auth; // AFT621/AFT622/AFT701/FT/M39 - - null_pv_db_chara chara; - null_pv_db_chara chara2P; - null_pv_db_chara chara3P; - null_pv_db_chara chara4P; - null_pv_db_chara chara5P; // not AFT300/AFT310/AFT400 - null_pv_db_chara chara6P; // not AFT300/AFT310/AFT400 - - string file; - string name; -}; - -struct pv_db_field_ac101 { - string aet_back; - string aet_front; - string aet_id_back; - string aet_id_front; - string auth_3d; - string spr_set_back; - string stage; -}; - -struct pv_db_field_ac200 { - vector_old_string auth_3d_list; // not AC200/AC210/AC211 - vector_old_int32_t auth_3d_frame_list; // AC520/AC521/AC600 - vector_old_string ex_auth_3d_list; // AC510/AC511/AC520/AC521/AC600 - - string aet_back; - string aet_front; - string aet_front_low; // not AC200 - string aet_id_back; - string aet_id_front; - string aet_id_front_low; // not AC200 - string auth_3d; - string ex_auth_3d; // AC510/AC511/AC520/AC521/AC600 - string ex_stage; // AC500/AC510/AC511/AC520/AC521/AC600 - string spr_set_back; - string stage; - null_int32_t stage_flag; // AC520/AC521/AC600 -}; - -struct pv_db_field_ac500 { - vector_old_string auth_3d_list; - - string aet_back; - string aet_front; - string aet_front_low; - string aet_id_back; - string aet_id_front; - string aet_id_front_low; - string auth_3d; - string ex_auth_3d; // not AC500 - string ex_stage; - string spr_set_back; - string stage; - null_int32_t stage_flag; // AC520/AC521/AC600 -}; - -struct pv_db_field_aft101 { - vector_old_string auth_3d_list; - vector_old_int32_t auth_3d_frame_list; - vector_old_string ex_auth_3d_list; - - string aet_back; - string aet_front; - string aet_front_low; - string aet_id_back; - string aet_id_front; - string aet_id_front_low; - string auth_3d; - null_int32_t cam_blur; // AFT110/AFT120/AFT200 - string ex_auth_3d; - string ex_stage; - string light; // AFT100 - null_int32_t npr_type; // AFT110/AFT120/AFT200 - null_int32_t sdw_off; // AFT110/AFT120/AFT200 - string spr_set_back; - string stage; - null_int32_t stage_flag; -}; - -struct pv_db_field_aft210 { - vector_old_int32_t aet_back_frame_list; - vector_old_string aet_back_list; - vector_old_int32_t aet_front_frame_list; - vector_old_string aet_front_list; - vector_old_int32_t aet_front_low_frame_list; - vector_old_string aet_front_low_list; - vector_old_string aet_id_back_list; - vector_old_string aet_id_front_list; - vector_old_string aet_id_front_low_list; - vector_old_int32_t auth_3d_frame_list; - vector_old_string auth_3d_list; - vector_old_string ex_auth_3d_list; - vector_old_string effect_rs_list; // AFT410 - vector_old_string play_eff_list; // AFT410 - vector_old_string stop_eff_list; // AFT410 - - string aet_back; - int32_t aet_back_frame; - string aet_front; - int32_t aet_front_frame; - string aet_front_low; - int32_t aet_front_low_frame; - string aet_id_back; - string aet_id_front; - string aet_id_front_low; - string auth_3d; - null_int32_t cam_blur; - string ex_auth_3d; - string ex_stage; - string light; - null_int32_t light_frame; - null_int32_t npr_type; - null_int32_t sdw_off; - string spr_set_back; - string stage; - null_int32_t stage_flag; -}; - -struct pv_db_field_aft500 { - vector_old_int32_t aet_back_frame_list; - vector_old_string aet_back_list; - vector_old_int32_t aet_front_frame_list; - vector_old_string aet_front_list; - vector_old_int32_t aet_front_3d_surf_frame_list; - vector_old_string aet_front_3d_surf_list; - vector_old_int32_t aet_front_low_frame_list; - vector_old_string aet_front_low_list; - vector_old_string aet_id_back_list; - vector_old_string aet_id_front_list; - vector_old_string aet_id_front_3d_surf_list; - vector_old_string aet_id_front_low_list; - vector_old_int32_t auth_3d_frame_list; - vector_old_string auth_3d_list; - vector_old_string ex_auth_3d_list; - vector_old_string effect_emision_rs_list; - vector_old_string effect_rs_list; - vector_old_string play_eff_list; - vector_old_string stop_eff_list; - - string aet_back; - int32_t aet_back_frame; - string aet_front; - string aet_front_3d_surf; - int32_t aet_front_3d_surf_frame; - int32_t aet_front_frame; - string aet_front_low; - int32_t aet_front_low_frame; - string aet_id_back; - string aet_id_front; - string aet_id_front_3d_surf; - string aet_id_front_low; - string auth_3d; - null_int32_t cam_blur; - string ex_auth_3d; - string ex_stage; - string light; - null_int32_t light_frame; - null_int32_t npr_type; - null_int32_t sdw_off; - string spr_set_back; - string stage; - null_int32_t stage_flag; -}; - -struct pv_db_mdata_ac110 { - string directory; - null_int32_t flag; - string gam_aet; - string gam_aet_id; - string gam_spr; - string sel_spr; - string sel_spr_cmn; - string target_shadow_type; -}; - -struct pv_db_mdata_ac200 { - string directory; - null_int32_t flag; -}; - -struct pv_db_osage_init { - null_int32_t frame; - string motion; - string stage; -}; - -null(pv_db_performer_size) -null(pv_db_performer_type) - -struct pv_db_performer_aft101 { - null_pv_db_chara chara; - null_pv_db_performer_size size; - null_pv_db_performer_type type; - - null_int32_t costume; - null_int32_t exclude; - null_int32_t fixed; - null_int32_t item_back; - null_int32_t item_face; - null_int32_t item_neck; - null_int32_t item_zujo; - null_int32_t pv_costume; -}; - -struct pv_db_performer_aft500 { - null_pv_db_chara chara; - null_pv_db_performer_size size; - null_pv_db_performer_type type; - - null_int32_t costume; - null_int32_t exclude; - null_int32_t fixed; - null_int32_t item_back; - null_int32_t item_face; - null_int32_t item_kami; // FT - null_int32_t item_neck; - null_int32_t item_zujo; - null_int32_t pv_costume; - null_int32_t pseudo_same_id; -}; - -struct pv_db_pv_expression { - string file_name; -}; - -struct pv_db_sabi { - null_float_t play_time; - null_float_t start_time; -}; - -struct pv_db_sel_2d { - string bg; - string jk; - string logo; - string plate; -}; - -struct pv_db_song_info_ac101 { - string arranger; - string guitar_player; // AC130 - string lyrics; - string manipulator; - string music; - string pv_editor; -}; - -struct pv_db_song_info_ac200 { - string arranger; - string guitar_player; - string lyrics; - string manipulator; - string music; - string pv_editor; - string ex_info0key; - string ex_info0val; - string ex_info1key; - string ex_info1val; - string ex_info2key; - string ex_info2val; - string ex_info3key; - string ex_info3val; -}; - -struct pv_db_stage_param_ac200 { - string collision_file; - string stage; - string wind_file; -}; - -struct pv_db_stage_param_aft210 { - string collision_file; - null_int32_t mhd_id; - string stage; - string wind_file; -}; - -struct pv_db_title_image_ac101 { - vector_old_string file; // AC101 - vector_old_string file_name; // AC101 - - string aet_name; - null_float_t time; -}; - -struct pv_db_title_image_ac200 { - string aet_name; - null_float_t end_time; - null_float_t time; -}; - -vector_old(pv_db_field_ac101) - -struct pv_db_diff_ac101 { - vector_old_pv_db_field_ac101 field; - - vector_old_string motion; - - pv_db_sel_2d sel_2d; // AC101 - pv_db_song_info_ac101 song_info; - pv_db_title_image_ac101 title_image; - - null_int32_t level; - string movie_file_name; - string script_file_name; - string se_name; - null_int32_t version; -}; - -vector_old(pv_db_field_ac200) - -struct pv_db_diff_ac200 { - vector_old_pv_db_field_ac200 field; - - vector_old_string edit_effect; - vector_old_string hand_item; - vector_old_string motion; - vector_old_string motion2P; - vector_old_string pv_item; // not AC200/AC210/AC211 - - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - null_float_t edit_chara_scale; - null_int32_t level; - string movie_file_name; - string script_file_name; - string se_name; - null_int32_t version; -}; - -null(pv_db_movie_surface) - -vector_old(pv_db_field_aft101) - -struct pv_db_diff_aft101 { - vector_old_pv_db_field_aft101 field; - - vector_old_string edit_effect; - vector_old_string hand_item; - vector_old_string motion; - vector_old_string motion2P; - vector_old_string motion3P; - vector_old_string motion4P; - vector_old_string pv_item; - - pv_db_pv_level level; - null_pv_db_movie_surface movie_surface; - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_float_t edit_chara_scale; - string effect_se_file_name; - null_int32_t level_sort_index; - string movie_file_name; - string pvbranch_success_se_name; - string script_file_name; - string script_format; - string se_name; - string slide_name; - string slidertouch_name; - null_int32_t version; -}; - -struct pv_db_diff_attr { - null_int32_t extra; - null_int32_t original; - null_int32_t slide; -}; - -vector_old(pv_db_field_aft210) -vector_old(pv_db_performer_aft101) - -struct pv_db_diff_aft300 { - vector_old_pv_db_field_aft210 field; - vector_old_pv_db_performer_aft101 performer; - - vector_old_string edit_effect; - vector_old_string edit_effect_low_field; - vector_old_string effect_se_name_list; - vector_old_string hand_item; - vector_old_string motion; - vector_old_string motion2P; - vector_old_string motion3P; - vector_old_string motion4P; - vector_old_string motion5P; // AFT410 - vector_old_string motion6P; // AFT410 - vector_old_string movie_list; - vector_old_string pv_item; - - pv_db_diff_attr attribute; - pv_db_pv_level level; - null_pv_db_movie_surface movie_surface; - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_int32_t edition; - null_int32_t is_ps4dlc; // FT/M39 - null_float_t edit_chara_scale; - string effect_se_file_name; - null_float_t hidden_timing; - null_float_t high_speed_rate; - null_int32_t level_sort_index; - string movie_file_name; - string pvbranch_success_se_name; - string script_file_name; - string script_format; - string se_name; - string slide_name; - string slidertouch_name; - null_float_t sudden_timing; - null_int32_t version; -}; - -vector_old(pv_db_diff_aft300) - -struct pv_db_difficulty_aft300 { - vector_old_pv_db_diff_aft300 diff[5]; - pv_db_diff_attr attribute; -}; - -vector_old(pv_db_field_aft500) -vector_old(pv_db_performer_aft500) - -struct pv_db_diff_aft500 { - vector_old_pv_db_field_aft500 field; - vector_old_pv_db_performer_aft500 performer; - - vector_old_string edit_effect; - vector_old_string edit_effect_low_field; - vector_old_string effect_se_name_list; - vector_old_string hand_item; - vector_old_string motion; - vector_old_string motion2P; - vector_old_string motion3P; - vector_old_string motion4P; - vector_old_string motion5P; - vector_old_string motion6P; - vector_old_string movie_list; - vector_old_string pv_item; - - pv_db_diff_attr attribute; - pv_db_pv_level level; - null_pv_db_movie_surface movie_surface; - pv_db_song_info_ac200 song_info_en; // FT/M39 - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_int32_t edition; - null_float_t edit_chara_scale; - string effect_se_file_name; - null_float_t hidden_timing; - null_float_t high_speed_rate; - null_int32_t is_ps4_dlc; // FT/M39 - null_int32_t level_sort_index; - string movie_file_name; - string pvbranch_success_se_name; - string script_file_name; - string script_format; - string se_name; - string slide_name; - string slidertouch_name; - null_float_t sudden_timing; - null_int32_t version; -}; - -vector_old(pv_db_diff_aft500) - -struct pv_db_difficulty_aft500 { - vector_old_pv_db_diff_aft500 diff[5]; - pv_db_diff_attr attribute; -}; - -vector_old(pv_db_ex_song_ac101) -vector_old(pv_db_osage_init) - -struct pv_db_pv_ac101 { - vector_old_pv_db_ex_song_ac101 ex_song; - vector_old_pv_db_field_ac200 field; - vector_old_pv_db_osage_init osage_init; // AC120/AC130 - - vector_old_string lyric; - vector_old_string motion; - - pv_db_diff_ac101 difficulty[5]; - pv_db_mdata_ac110 mdata; // AC110/AC120/AC130 - pv_db_sabi sabi; - pv_db_sel_2d sel_2d; // AC101 - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - null_pv_db_chara unlock; - - null_int32_t bpm; - null_int32_t date; - null_int32_t demo_flag; // AC110/AC120/AC130 - null_int32_t m_data_flag; // AC101 - string movie_file_name; - string se_name; - string song_file_name; - string song_name; - string song_name_reading; -}; - -vector_old(pv_db_stage_param_ac200) - -struct pv_db_pv_ac200 { - vector_old_pv_db_ex_song_ac101 ex_song; - vector_old_pv_db_field_ac200 field; - vector_old_pv_db_osage_init osage_init; - vector_old_pv_db_stage_param_ac200 stage_param; - - vector_old_string edit_effect; - vector_old_string hand_item; - vector_old_string lyric; - vector_old_string motion; - vector_old_string motion2P; - vector_old_string pv_item; // not AC200/AC210/AC211 - - pv_db_diff_ac200 difficulty[5]; - pv_db_disp2d_ac200 disp2d; - pv_db_duet duet; - pv_db_mdata_ac200 mdata; - pv_db_sabi sabi; - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - null_pv_db_chara unlock1p; - null_pv_db_chara unlock2p; - - null_int32_t bpm; - null_int32_t date; - null_int32_t edit; - null_float_t edit_chara_scale; - string movie_file_name; - null_int32_t remix_parent; - string se_name; - string song_file_name; - string song_name; - string song_name_reading; - null_bool use_osage_play_data; // not AC200 -}; - -null(pv_db_eyes_base_adjust_type) - -vector_old(pv_db_chreff) -vector_old(pv_db_ex_song_aft101) -vector_old(pv_db_eyes_rot_rate) - -struct pv_db_pv_aft101 { - vector_old_pv_db_chreff chreff; - vector_old_pv_db_ex_song_aft101 ex_song; - vector_old_pv_db_eyes_rot_rate eyes_rot_rate; // AFT200 - vector_old_pv_db_field_aft101 field; - vector_old_pv_db_osage_init osage_init; - vector_old_pv_db_performer_aft101 performer; - vector_old_pv_db_stage_param_ac200 stage_param; - - vector_old_string edit_effect; - vector_old_string effect_se_name_list; - vector_old_string hand_item; - vector_old_string lyric; - vector_old_string motion; - vector_old_string motion2p; - vector_old_string motion3p; - vector_old_string motion4p; - vector_old_string pv_item; - - pv_db_diff_aft101 difficulty[5]; - pv_db_disp2d_ac200 disp2d; - null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; // AFT200 - pv_db_mdata_ac200 mdata; - null_pv_db_movie_surface movie_surface; - pv_db_pv_expression pv_expression; - pv_db_sabi sabi; - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - null_int32_t bpm; - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_int32_t date; - null_int32_t disable_calc_motfrm_limit; - string effect_se_file_name; - null_int32_t edit; - null_float_t edit_chara_scale; - null_int32_t eyes_xrot_adjust; - null_int32_t is_old_pv; // AFT200 - string movie_file_name; - string pvbranch_success_se_name; - null_int32_t remix_parent; - string se_name; - string slide_name; - string slidertouch_name; - string song_file_name; - string song_name; - string song_name_reading; - null_bool use_osage_play_data; -}; - -vector_old(pv_db_stage_param_aft210) - -struct pv_db_pv_aft210 { - vector_old_pv_db_chreff chreff; - vector_old_pv_db_ex_song_aft101 ex_song; - vector_old_pv_db_eyes_rot_rate eyes_rot_rate; - vector_old_pv_db_field_aft210 field; - vector_old_pv_db_osage_init osage_init; - vector_old_pv_db_performer_aft101 performer; - vector_old_pv_db_stage_param_aft210 stage_param; - - vector_old_string edit_effect; - vector_old_string effect_se_name_list; - vector_old_string hand_item; - vector_old_string lyric; - vector_old_string motion; - vector_old_string motion2p; - vector_old_string motion3p; - vector_old_string motion4p; - vector_old_string pv_item; - - pv_db_diff_aft101 difficulty[5]; - pv_db_disp2d_aft210 disp2d; - null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; - pv_db_mdata_ac200 mdata; - null_pv_db_movie_surface movie_surface; - pv_db_pv_expression pv_expression; - pv_db_sabi sabi; - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - null_int32_t bpm; - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_int32_t date; - null_int32_t disable_calc_motfrm_limit; - string effect_se_file_name; - null_int32_t edit; - null_float_t edit_chara_scale; - null_int32_t eyes_xrot_adjust; - null_int32_t is_old_pv; - string movie_file_name; - string pvbranch_success_se_name; - null_int32_t remix_parent; - string se_name; - string slide_name; - string slidertouch_name; - string song_file_name; - string song_name; - string song_name_reading; - null_bool use_osage_play_data; -}; - -vector_old(pv_db_another_song_aft310) -vector_old(pv_db_chrcam) -vector_old(pv_db_ex_song_aft300) - -struct pv_db_pv_aft300 { - vector_old_pv_db_another_song_aft310 another_song; // not AFT300 - vector_old_pv_db_chrcam chrcam; // not AFT300 - vector_old_pv_db_chreff chreff; - vector_old_pv_db_ex_song_aft300 ex_song; - vector_old_pv_db_eyes_rot_rate eyes_rot_rate; - vector_old_pv_db_field_aft210 field; - vector_old_pv_db_osage_init osage_init; - vector_old_pv_db_performer_aft101 performer; - vector_old_pv_db_stage_param_aft210 stage_param; - - vector_old_string edit_effect; - vector_old_string edit_effect_low_field; // not AFT300 - vector_old_string effect_se_name_list; - vector_old_string hand_item; - vector_old_string lyric; - vector_old_string motion; - vector_old_string motion2p; - vector_old_string motion3p; - vector_old_string motion4p; - vector_old_string motion5p; // AFT410 - vector_old_string motion6p; // AFT410 - vector_old_string pv_item; - - pv_db_difficulty_aft300 difficulty; - pv_db_disp2d_aft210 disp2d; - null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; - pv_db_mdata_ac200 mdata; - null_pv_db_movie_surface movie_surface; - pv_db_pv_expression pv_expression; - pv_db_sabi sabi; - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - null_int32_t bpm; - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_int32_t date; - null_int32_t disable_calc_motfrm_limit; - string effect_se_file_name; - null_int32_t edit; - null_float_t edit_chara_scale; - null_int32_t eyes_xrot_adjust; - null_float_t hidden_timing; - null_float_t high_speed_rate; - null_int32_t is_old_pv; - string movie_file_name; - string pvbranch_success_se_name; - null_int32_t pre_play_script; // AFT410 - null_int32_t remix_parent; - string se_name; - string slide_name; - string slidertouch_name; - string song_file_name; - string song_name; - string song_name_reading; - null_float_t sudden_timing; - null_bool use_osage_play_data; -}; - -null(pv_db_frame_texture_type) - -vector_old(pv_db_another_song_aft500) -vector_old(pv_db_auth_replace_by_module) -vector_old(pv_db_chrmot) - -struct pv_db_pv_aft500 { - vector_old_pv_db_another_song_aft500 another_song; - vector_old_pv_db_auth_replace_by_module auth_replace_by_module; // AFT600/AFT601/AFT610/AFT620/AFT621/AFT622/AFT701/FT/M39 - vector_old_pv_db_chrcam chrcam; - vector_old_pv_db_chreff chreff; - vector_old_pv_db_chrmot chrmot; // AFT620/AFT621/AFT622/AFT701/FT/M39 - vector_old_pv_db_ex_song_aft300 ex_song; - vector_old_pv_db_eyes_rot_rate eyes_rot_rate; - vector_old_pv_db_field_aft500 field; - vector_old_pv_db_osage_init osage_init; - vector_old_pv_db_performer_aft500 performer; - vector_old_pv_db_stage_param_aft210 stage_param; - - vector_old_string edit_effect; - vector_old_string edit_effect_low_field; - vector_old_string effect_se_name_list; - vector_old_string hand_item; - vector_old_string lyric; - vector_old_string lyric_en; // FT/M39 - vector_old_string motion; - vector_old_string motion2P; - vector_old_string motion3P; - vector_old_string motion4P; - vector_old_string motion5P; - vector_old_string motion6P; - vector_old_string movie_list; - vector_old_string pv_item; - - pv_db_difficulty_aft300 difficulty; - pv_db_disp2d_aft210 disp2d; - null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; - null_pv_db_frame_texture_type frame_texture_a_type; - null_pv_db_frame_texture_type frame_texture_b_type; - null_pv_db_frame_texture_type frame_texture_c_type; - null_pv_db_frame_texture_type frame_texture_d_type; - null_pv_db_frame_texture_type frame_texture_e_type; - null_pv_db_frame_texture_type frame_texture_type; - pv_db_mdata_ac200 mdata; - null_pv_db_movie_surface movie_surface; - pv_db_pv_expression pv_expression; - pv_db_sabi sabi; - pv_db_song_info_ac200 song_info_en; // FT/M39 - pv_db_song_info_ac200 song_info; - pv_db_title_image_ac200 title_image; - - null_int32_t bpm; - string chainslide_failure_name; - string chainslide_first_name; - string chainslide_sub_name; - string chainslide_success_name; - null_int32_t date; - null_int32_t disable_calc_motfrm_limit; - string effect_se_file_name; - null_int32_t edit; - null_float_t edit_chara_scale; - null_int32_t eyes_xrot_adjust; - string frame_texture; - string frame_texture_a; - string frame_texture_b; - string frame_texture_c; - string frame_texture_d; - string frame_texture_e; - null_float_t hidden_timing; - null_float_t high_speed_rate; - null_int32_t is_old_pv; - string movie_file_name; - string pvbranch_success_se_name; - null_int32_t pack; // FT/M39 - null_int32_t pre_play_script; - null_int32_t rank_board_id; // FT/M39 - null_int32_t remix_parent; - null_float_t resolution_scale; // FT/M39 - null_float_t resolution_scale_neo; // FT/M39 - string se_name; - string slide_name; - string slidertouch_name; - string song_file_name; - string song_name; - string song_name_en; // FT/M39 - string song_name_reading; - string song_name_reading_en; // FT/M39 - null_float_t sudden_timing; - null_bool use_osage_play_data; -}; diff --git a/src/KKdLib/pv_db.hpp b/src/KKdLib/pv_db.hpp new file mode 100644 index 00000000..39740c4a --- /dev/null +++ b/src/KKdLib/pv_db.hpp @@ -0,0 +1,1030 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include "default.h" +#include "database/item_table.hpp" + +enum pv_db_chreff_type { + PV_DB_CHARA_EFFECT_AUTH3D = 0, + PV_DB_CHARA_EFFECT_AUTH3D_OBJ = 1, +}; + +enum pv_db_format { + PV_DB_NONE, + PV_DB_AC101, + PV_DB_AC110, + PV_DB_AC120, + PV_DB_AC130, + PV_DB_AC200, + PV_DB_AC210, + PV_DB_AC211, + PV_DB_AC220, + PV_DB_AC221, + PV_DB_AC301, + PV_DB_AC310, + PV_DB_AC320, + PV_DB_AC401, + PV_DB_AC402, + PV_DB_AC410, + PV_DB_AC500, + PV_DB_AC510, + PV_DB_AC511, + PV_DB_AC520, + PV_DB_AC521, + PV_DB_AC600, + PV_DB_AFT101, + PV_DB_AFT110, + PV_DB_AFT120, + PV_DB_AFT200, + PV_DB_AFT210, + PV_DB_AFT220, + PV_DB_AFT300, + PV_DB_AFT310, + PV_DB_AFT400, + PV_DB_AFT410, + PV_DB_AFT500, + PV_DB_AFT501, + PV_DB_AFT510, + PV_DB_AFT600, + PV_DB_AFT601, + PV_DB_AFT610, + PV_DB_AFT620, + PV_DB_AFT621, + PV_DB_AFT622, + PV_DB_AFT701, + PV_DB_AFT710, + PV_DB_FT, +}; + +enum pv_db_duet_type { + PV_DB_DUET_USER_SETTING = 0, + PV_DB_DUET_FIXED_SIZE = 1, + PV_DB_DUET_FIXED_SUB = 2, + PV_DB_DUET_FIXED_ALL = 3, + PV_DB_DUET_PSEUDO_DEFAULT = 4, + PV_DB_DUET_PSEUDO_SAME = 5, + PV_DB_DUET_PSEUDO_SWIM = 6, + PV_DB_DUET_PSEUDO_SWIM_S = 7, +}; + +enum pv_db_eyes_base_adjust_type { + PV_DB_EYES_BASE_ADJUST_DIRECTION = 0, + PV_DB_EYES_BASE_ADJUST_CLEARANCE = 1, + PV_DB_EYES_BASE_ADJUST_OFF = 2, +}; + +enum pv_db_frame_texture_type { + PV_DB_FRAME_TEXTURE_PRE_PP = 0, + PV_DB_FRAME_TEXTURE_POST_PP = 1, + PV_DB_FRAME_TEXTURE_FB = 2, +}; + +enum pv_db_movie_surface { + PV_DB_MOVIE_SURFACE_BACK = 0, + PV_DB_MOVIE_SURFACE_FRONT = 1, +}; + +enum pv_db_performer_size { + PV_DB_PERFORMER_SIZE_NORMAL = 0, + PV_DB_PERFORMER_SIZE_PLAY_CHARA = 1, + PV_DB_PERFORMER_SIZE_PV_CHARA = 2, + PV_DB_PERFORMER_SIZE_SHORT = 3, + PV_DB_PERFORMER_SIZE_TALL = 4, +}; + +enum pv_db_performer_type { + PV_DB_PERFORMER_VOCAL = 0, + PV_DB_PERFORMER_PSEUDO_DEFAULT = 1, + PV_DB_PERFORMER_PSEUDO_SAME = 2, + PV_DB_PERFORMER_PSEUDO_SWIM = 3, + PV_DB_PERFORMER_PSEUDO_SWIM_S = 4, + PV_DB_PERFORMER_PSEUDO_MYCHARA = 5, + PV_DB_PERFORMER_GUEST = 6, +}; + +enum pv_db_pv_level { + PV_DB_PV_LV_00_0 = 0, + PV_DB_PV_LV_00_5 = 1, + PV_DB_PV_LV_01_0 = 2, + PV_DB_PV_LV_01_5 = 3, + PV_DB_PV_LV_02_0 = 4, + PV_DB_PV_LV_02_5 = 5, + PV_DB_PV_LV_03_0 = 6, + PV_DB_PV_LV_03_5 = 7, + PV_DB_PV_LV_04_0 = 8, + PV_DB_PV_LV_04_5 = 9, + PV_DB_PV_LV_05_0 = 10, + PV_DB_PV_LV_05_5 = 11, + PV_DB_PV_LV_06_0 = 12, + PV_DB_PV_LV_06_5 = 13, + PV_DB_PV_LV_07_0 = 14, + PV_DB_PV_LV_07_5 = 15, + PV_DB_PV_LV_08_0 = 16, + PV_DB_PV_LV_08_5 = 17, + PV_DB_PV_LV_09_0 = 18, + PV_DB_PV_LV_09_5 = 19, + PV_DB_PV_LV_10_0 = 20, +}; + +struct pv_db_another_song_aft310 { + std::string name; + std::string song_file_name; +}; + +struct pv_db_another_song_aft500 { + std::string name; + std::string name_en; // FT/M39 + std::string song_file_name; + std::string vocal_chara_num; // FT/M39 + std::string vocal_disp_name; // FT/M39 + std::string vocal_disp_name_en; // FT/M39 +}; + +struct pv_db_auth_replace_by_module { + null_int32_t id; + null_int32_t module_id; + std::string name; + std::string org_name; +}; + +null(chara_index) + +struct pv_db_chrcam { + null_chara_index chara; + + null_int32_t id; + std::string name; + std::string org_name; +}; + +null(pv_db_chreff_type) + +struct pv_db_chreff_data { + null_pv_db_chreff_type type; + + std::string Name; +}; + +struct pv_db_chreff { + std::vector data; + + null_int32_t id; + std::string name; +}; + +struct pv_db_chrmot { + null_chara_index chara; + + null_int32_t id; + std::string name; + std::string org_name; +}; + +struct pv_db_disp2d_ac200 { + std::string set_name; + null_int32_t target_shadow_type; + null_int32_t title_end_2d_field; + null_int32_t title_end_2d_low_field; // not AC200 + null_int32_t title_end_3d_field; + null_int32_t title_start_2d_field; + null_int32_t title_start_2d_low_field; // not AC200 + null_int32_t title_start_3d_field; +}; + +struct pv_db_disp2d_aft210 { + std::string set_name; + null_int32_t target_shadow_type; + null_int32_t title_2d_layer; + null_int32_t title_end_2d_field; + null_int32_t title_end_2d_low_field; + null_int32_t title_end_3d_field; + null_int32_t title_start_2d_field; + null_int32_t title_start_2d_low_field; + null_int32_t title_start_3d_field; +}; + +null(pv_db_duet_type) + +struct pv_db_duet { + null_pv_db_duet_type type; + null_int32_t num; +}; + +struct pv_db_eyes_rot_rate { + null_chara_index chr; + null_float_t xn_rate; + null_float_t xp_rate; +}; + +struct pv_db_ex_auth { + std::string name; + std::string org_name; +}; + +struct pv_db_ex_song_ac101 { + null_chara_index chara; + + std::string file; + std::string name; +}; + +struct pv_db_ex_song_aft101 { + null_chara_index chara; + null_chara_index chara2P; // not AFT101 + null_chara_index chara3P; // not AFT101 + null_chara_index chara4P; // not AFT101 + + std::string file; + std::string name; +}; + +struct pv_db_ex_song_aft300 { + std::vector ex_auth; // AFT621/AFT622/AFT701/FT/M39 + + null_chara_index chara; + null_chara_index chara2P; + null_chara_index chara3P; + null_chara_index chara4P; + null_chara_index chara5P; // not AFT300/AFT310/AFT400 + null_chara_index chara6P; // not AFT300/AFT310/AFT400 + + std::string file; + std::string name; +}; + +struct pv_db_field_ac101 { + std::string aet_back; + std::string aet_front; + std::string aet_id_back; + std::string aet_id_front; + std::string auth_3d; + std::string spr_set_back; + std::string stage; +}; + +struct pv_db_field_ac200 { + std::vector auth_3d_list; // not AC200/AC210/AC211 + std::vector auth_3d_frame_list; // AC520/AC521/AC600 + std::vector ex_auth_3d_list; // AC510/AC511/AC520/AC521/AC600 + + std::string aet_back; + std::string aet_front; + std::string aet_front_low; // not AC200 + std::string aet_id_back; + std::string aet_id_front; + std::string aet_id_front_low; // not AC200 + std::string auth_3d; + std::string ex_auth_3d; // AC510/AC511/AC520/AC521/AC600 + std::string ex_stage; // AC500/AC510/AC511/AC520/AC521/AC600 + std::string spr_set_back; + std::string stage; + null_int32_t stage_flag; // AC520/AC521/AC600 +}; + +struct pv_db_field_ac500 { + std::vector auth_3d_list; + + std::string aet_back; + std::string aet_front; + std::string aet_front_low; + std::string aet_id_back; + std::string aet_id_front; + std::string aet_id_front_low; + std::string auth_3d; + std::string ex_auth_3d; // not AC500 + std::string ex_stage; + std::string spr_set_back; + std::string stage; + null_int32_t stage_flag; // AC520/AC521/AC600 +}; + +struct pv_db_field_aft101 { + std::vector auth_3d_list; + std::vector auth_3d_frame_list; + std::vector ex_auth_3d_list; + + std::string aet_back; + std::string aet_front; + std::string aet_front_low; + std::string aet_id_back; + std::string aet_id_front; + std::string aet_id_front_low; + std::string auth_3d; + null_int32_t cam_blur; // AFT110/AFT120/AFT200 + std::string ex_auth_3d; + std::string ex_stage; + std::string light; // AFT100 + null_int32_t npr_type; // AFT110/AFT120/AFT200 + null_int32_t sdw_off; // AFT110/AFT120/AFT200 + std::string spr_set_back; + std::string stage; + null_int32_t stage_flag; +}; + +struct pv_db_field_aft210 { + std::vector aet_back_frame_list; + std::vector aet_back_list; + std::vector aet_front_frame_list; + std::vector aet_front_list; + std::vector aet_front_low_frame_list; + std::vector aet_front_low_list; + std::vector aet_id_back_list; + std::vector aet_id_front_list; + std::vector aet_id_front_low_list; + std::vector auth_3d_frame_list; + std::vector auth_3d_list; + std::vector ex_auth_3d_list; + std::vector effect_rs_list; // AFT410 + std::vector play_eff_list; // AFT410 + std::vector stop_eff_list; // AFT410 + + std::string aet_back; + int32_t aet_back_frame; + std::string aet_front; + int32_t aet_front_frame; + std::string aet_front_low; + int32_t aet_front_low_frame; + std::string aet_id_back; + std::string aet_id_front; + std::string aet_id_front_low; + std::string auth_3d; + null_int32_t cam_blur; + std::string ex_auth_3d; + std::string ex_stage; + std::string light; + null_int32_t light_frame; + null_int32_t npr_type; + null_int32_t sdw_off; + std::string spr_set_back; + std::string stage; + null_int32_t stage_flag; +}; + +struct pv_db_field_aft500 { + std::vector aet_back_frame_list; + std::vector aet_back_list; + std::vector aet_front_frame_list; + std::vector aet_front_list; + std::vector aet_front_3d_surf_frame_list; + std::vector aet_front_3d_surf_list; + std::vector aet_front_low_frame_list; + std::vector aet_front_low_list; + std::vector aet_id_back_list; + std::vector aet_id_front_list; + std::vector aet_id_front_3d_surf_list; + std::vector aet_id_front_low_list; + std::vector auth_3d_frame_list; + std::vector auth_3d_list; + std::vector ex_auth_3d_list; + std::vector effect_emision_rs_list; + std::vector effect_rs_list; + std::vector play_eff_list; + std::vector stop_eff_list; + + std::string aet_back; + int32_t aet_back_frame; + std::string aet_front; + std::string aet_front_3d_surf; + int32_t aet_front_3d_surf_frame; + int32_t aet_front_frame; + std::string aet_front_low; + int32_t aet_front_low_frame; + std::string aet_id_back; + std::string aet_id_front; + std::string aet_id_front_3d_surf; + std::string aet_id_front_low; + std::string auth_3d; + null_int32_t cam_blur; + std::string ex_auth_3d; + std::string ex_stage; + std::string light; + null_int32_t light_frame; + null_int32_t npr_type; + null_int32_t sdw_off; + std::string spr_set_back; + std::string stage; + null_int32_t stage_flag; +}; + +struct pv_db_mdata_ac110 { + std::string directory; + null_int32_t flag; + std::string gam_aet; + std::string gam_aet_id; + std::string gam_spr; + std::string sel_spr; + std::string sel_spr_cmn; + std::string target_shadow_type; +}; + +struct pv_db_mdata_ac200 { + std::string directory; + null_int32_t flag; +}; + +struct pv_db_osage_init { + null_int32_t frame; + std::string motion; + std::string stage; +}; + +null(pv_db_performer_size) +null(pv_db_performer_type) + +struct pv_db_performer_aft101 { + null_chara_index chara; + null_pv_db_performer_size size; + null_pv_db_performer_type type; + + null_int32_t costume; + null_int32_t exclude; + null_int32_t fixed; + null_int32_t item_back; + null_int32_t item_face; + null_int32_t item_neck; + null_int32_t item_zujo; + null_int32_t pv_costume; +}; + +struct pv_db_performer_aft500 { + null_chara_index chara; + null_pv_db_performer_size size; + null_pv_db_performer_type type; + + null_int32_t costume; + null_int32_t exclude; + null_int32_t fixed; + null_int32_t item_back; + null_int32_t item_face; + null_int32_t item_kami; // FT + null_int32_t item_neck; + null_int32_t item_zujo; + null_int32_t pv_costume; + null_int32_t pseudo_same_id; +}; + +struct pv_db_pv_expression { + std::string file_name; +}; + +struct pv_db_sabi { + null_float_t play_time; + null_float_t start_time; +}; + +struct pv_db_sel_2d { + std::string bg; + std::string jk; + std::string logo; + std::string plate; +}; + +struct pv_db_song_info_ac101 { + std::string arranger; + std::string guitar_player; // AC130 + std::string lyrics; + std::string manipulator; + std::string music; + std::string pv_editor; +}; + +struct pv_db_song_info_ac200 { + std::string arranger; + std::string guitar_player; + std::string lyrics; + std::string manipulator; + std::string music; + std::string pv_editor; + std::pair ex_info[4]; +}; + +struct pv_db_stage_param_ac200 { + std::string collision_file; + std::string stage; + std::string wind_file; +}; + +struct pv_db_stage_param_aft210 { + std::string collision_file; + null_int32_t mhd_id; + std::string stage; + std::string wind_file; +}; + +struct pv_db_title_image_ac101 { + std::vector file; // AC101 + std::vector file_name; // AC101 + + std::string aet_name; + null_float_t time; +}; + +struct pv_db_title_image_ac200 { + std::string aet_name; + null_float_t end_time; + null_float_t time; +}; + +struct pv_db_diff_ac101 { + std::vector field; + + std::vector motion; + + pv_db_sel_2d sel_2d; // AC101 + pv_db_song_info_ac101 song_info; + pv_db_title_image_ac101 title_image; + + null_int32_t level; + std::string movie_file_name; + std::string script_file_name; + std::string se_name; + null_int32_t version; +}; + +struct pv_db_diff_ac200 { + std::vector field; + + std::vector edit_effect; + std::vector hand_item; + std::vector motion; + std::vector motion2P; + std::vector pv_item; // not AC200/AC210/AC211 + + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + null_float_t edit_chara_scale; + null_int32_t level; + std::string movie_file_name; + std::string script_file_name; + std::string se_name; + null_int32_t version; +}; + +null(pv_db_movie_surface) + +struct pv_db_diff_aft101 { + std::vector field; + + std::vector edit_effect; + std::vector hand_item; + std::vector motion; + std::vector motion2P; + std::vector motion3P; + std::vector motion4P; + std::vector pv_item; + + pv_db_pv_level level; + null_pv_db_movie_surface movie_surface; + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_float_t edit_chara_scale; + std::string effect_se_file_name; + null_int32_t level_sort_index; + std::string movie_file_name; + std::string pvbranch_success_se_name; + std::string script_file_name; + std::string script_format; + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + null_int32_t version; +}; + +struct pv_db_diff_attr { + null_int32_t extra; + null_int32_t original; + null_int32_t slide; +}; + +struct pv_db_diff_aft300 { + std::vector field; + std::vector performer; + + std::vector edit_effect; + std::vector edit_effect_low_field; + std::vector effect_se_name_list; + std::vector hand_item; + std::vector motion; + std::vector motion2P; + std::vector motion3P; + std::vector motion4P; + std::vector motion5P; // AFT410 + std::vector motion6P; // AFT410 + std::vector movie_list; + std::vector pv_item; + + pv_db_diff_attr attribute; + pv_db_pv_level level; + null_pv_db_movie_surface movie_surface; + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_int32_t edition; + null_int32_t is_ps4dlc; // FT/M39 + null_float_t edit_chara_scale; + std::string effect_se_file_name; + null_float_t hidden_timing; + null_float_t high_speed_rate; + null_int32_t level_sort_index; + std::string movie_file_name; + std::string pvbranch_success_se_name; + std::string script_file_name; + std::string script_format; + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + null_float_t sudden_timing; + null_int32_t version; +}; + +struct pv_db_difficulty_aft300 { + std::vector diff[5]; + pv_db_diff_attr attribute; +}; + +struct pv_db_diff_aft500 { + std::vector field; + std::vector performer; + + std::vector edit_effect; + std::vector edit_effect_low_field; + std::vector effect_se_name_list; + std::vector hand_item; + std::vector motion; + std::vector motion2P; + std::vector motion3P; + std::vector motion4P; + std::vector motion5P; + std::vector motion6P; + std::vector movie_list; + std::vector pv_item; + + pv_db_diff_attr attribute; + pv_db_pv_level level; + null_pv_db_movie_surface movie_surface; + pv_db_song_info_ac200 song_info_en; // FT/M39 + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_int32_t edition; + null_float_t edit_chara_scale; + std::string effect_se_file_name; + null_float_t hidden_timing; + null_float_t high_speed_rate; + null_int32_t is_ps4_dlc; // FT/M39 + null_int32_t level_sort_index; + std::string movie_file_name; + std::string pvbranch_success_se_name; + std::string script_file_name; + std::string script_format; + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + null_float_t sudden_timing; + null_int32_t version; +}; + +struct pv_db_difficulty_aft500 { + std::vector diff[5]; + pv_db_diff_attr attribute; +}; + +struct pv_db_pv_ac101 { + std::vector ex_song; + std::vector field; + std::vector osage_init; // AC120/AC130 + + std::vector lyric; + std::vector motion; + + pv_db_diff_ac101 difficulty[5]; + pv_db_mdata_ac110 mdata; // AC110/AC120/AC130 + pv_db_sabi sabi; + pv_db_sel_2d sel_2d; // AC101 + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + null_chara_index unlock; + + null_int32_t bpm; + null_int32_t date; + null_int32_t demo_flag; // AC110/AC120/AC130 + null_int32_t m_data_flag; // AC101 + std::string movie_file_name; + std::string se_name; + std::string song_file_name; + std::string song_name; + std::string song_name_reading; +}; + +struct pv_db_pv_ac200 { + std::vector ex_song; + std::vector field; + std::vector osage_init; + std::vector stage_param; + + std::vector edit_effect; + std::vector hand_item; + std::vector lyric; + std::vector motion; + std::vector motion2P; + std::vector pv_item; // not AC200/AC210/AC211 + + pv_db_diff_ac200 difficulty[5]; + pv_db_disp2d_ac200 disp2d; + pv_db_duet duet; + pv_db_mdata_ac200 mdata; + pv_db_sabi sabi; + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + null_chara_index unlock1p; + null_chara_index unlock2p; + + null_int32_t bpm; + null_int32_t date; + null_int32_t edit; + null_float_t edit_chara_scale; + std::string movie_file_name; + null_int32_t remix_parent; + std::string se_name; + std::string song_file_name; + std::string song_name; + std::string song_name_reading; + null_bool use_osage_play_data; // not AC200 +}; + +null(pv_db_eyes_base_adjust_type) + +struct pv_db_pv_aft101 { + std::vector chreff; + std::vector ex_song; + std::vector eyes_rot_rate; // AFT200 + std::vector field; + std::vector osage_init; + std::vector performer; + std::vector stage_param; + + std::vector edit_effect; + std::vector effect_se_name_list; + std::vector hand_item; + std::vector lyric; + std::vector motion; + std::vector motion2p; + std::vector motion3p; + std::vector motion4p; + std::vector pv_item; + + pv_db_diff_aft101 difficulty[5]; + pv_db_disp2d_ac200 disp2d; + null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; // AFT200 + pv_db_mdata_ac200 mdata; + null_pv_db_movie_surface movie_surface; + pv_db_pv_expression pv_expression; + pv_db_sabi sabi; + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + null_int32_t bpm; + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_int32_t date; + null_int32_t disable_calc_motfrm_limit; + std::string effect_se_file_name; + null_int32_t edit; + null_float_t edit_chara_scale; + null_int32_t eyes_xrot_adjust; + null_int32_t is_old_pv; // AFT200 + std::string movie_file_name; + std::string pvbranch_success_se_name; + null_int32_t remix_parent; + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + std::string song_file_name; + std::string song_name; + std::string song_name_reading; + null_bool use_osage_play_data; +}; + +struct pv_db_pv_aft210 { + std::vector chreff; + std::vector ex_song; + std::vector eyes_rot_rate; + std::vector field; + std::vector osage_init; + std::vector performer; + std::vector stage_param; + + std::vector edit_effect; + std::vector effect_se_name_list; + std::vector hand_item; + std::vector lyric; + std::vector motion; + std::vector motion2p; + std::vector motion3p; + std::vector motion4p; + std::vector pv_item; + + pv_db_diff_aft101 difficulty[5]; + pv_db_disp2d_aft210 disp2d; + null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; + pv_db_mdata_ac200 mdata; + null_pv_db_movie_surface movie_surface; + pv_db_pv_expression pv_expression; + pv_db_sabi sabi; + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + null_int32_t bpm; + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_int32_t date; + null_int32_t disable_calc_motfrm_limit; + std::string effect_se_file_name; + null_int32_t edit; + null_float_t edit_chara_scale; + null_int32_t eyes_xrot_adjust; + null_int32_t is_old_pv; + std::string movie_file_name; + std::string pvbranch_success_se_name; + null_int32_t remix_parent; + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + std::string song_file_name; + std::string song_name; + std::string song_name_reading; + null_bool use_osage_play_data; +}; + +struct pv_db_pv_aft300 { + std::vector another_song; // not AFT300 + std::vector chrcam; // not AFT300 + std::vector chreff; + std::vector ex_song; + std::vector eyes_rot_rate; + std::vector field; + std::vector osage_init; + std::vector performer; + std::vector stage_param; + + std::vector edit_effect; + std::vector edit_effect_low_field; // not AFT300 + std::vector effect_se_name_list; + std::vector hand_item; + std::vector lyric; + std::vector motion; + std::vector motion2p; + std::vector motion3p; + std::vector motion4p; + std::vector motion5p; // AFT410 + std::vector motion6p; // AFT410 + std::vector pv_item; + + pv_db_difficulty_aft300 difficulty; + pv_db_disp2d_aft210 disp2d; + null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; + pv_db_mdata_ac200 mdata; + null_pv_db_movie_surface movie_surface; + pv_db_pv_expression pv_expression; + pv_db_sabi sabi; + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + null_int32_t bpm; + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_int32_t date; + null_int32_t disable_calc_motfrm_limit; + std::string effect_se_file_name; + null_int32_t edit; + null_float_t edit_chara_scale; + null_int32_t eyes_xrot_adjust; + null_float_t hidden_timing; + null_float_t high_speed_rate; + null_int32_t is_old_pv; + std::string movie_file_name; + std::string pvbranch_success_se_name; + null_int32_t pre_play_script; // AFT410 + null_int32_t remix_parent; + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + std::string song_file_name; + std::string song_name; + std::string song_name_reading; + null_float_t sudden_timing; + null_bool use_osage_play_data; +}; + +null(pv_db_frame_texture_type) + +struct pv_db_pv_aft500 { + std::vector another_song; + std::vector auth_replace_by_module; // AFT600/AFT601/AFT610/AFT620/AFT621/AFT622/AFT701/FT/M39 + std::vector chrcam; + std::vector chreff; + std::vector chrmot; // AFT620/AFT621/AFT622/AFT701/FT/M39 + std::vector ex_song; + std::vector eyes_rot_rate; + std::vector field; + std::vector osage_init; + std::vector performer; + std::vector stage_param; + + std::vector edit_effect; + std::vector edit_effect_low_field; + std::vector effect_se_name_list; + std::vector hand_item; + std::vector lyric; + std::vector lyric_en; // FT/M39 + std::vector motion; + std::vector motion2P; + std::vector motion3P; + std::vector motion4P; + std::vector motion5P; + std::vector motion6P; + std::vector movie_list; + std::vector pv_item; + + pv_db_difficulty_aft300 difficulty; + pv_db_disp2d_aft210 disp2d; + null_pv_db_eyes_base_adjust_type eyes_base_adjust_type; + null_pv_db_frame_texture_type frame_texture_a_type; + null_pv_db_frame_texture_type frame_texture_b_type; + null_pv_db_frame_texture_type frame_texture_c_type; + null_pv_db_frame_texture_type frame_texture_d_type; + null_pv_db_frame_texture_type frame_texture_e_type; + null_pv_db_frame_texture_type frame_texture_type; + pv_db_mdata_ac200 mdata; + null_pv_db_movie_surface movie_surface; + pv_db_pv_expression pv_expression; + pv_db_sabi sabi; + pv_db_song_info_ac200 song_info_en; // FT/M39 + pv_db_song_info_ac200 song_info; + pv_db_title_image_ac200 title_image; + + null_int32_t bpm; + std::string chainslide_failure_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + null_int32_t date; + null_int32_t disable_calc_motfrm_limit; + std::string effect_se_file_name; + null_int32_t edit; + null_float_t edit_chara_scale; + null_int32_t eyes_xrot_adjust; + std::string frame_texture; + std::string frame_texture_a; + std::string frame_texture_b; + std::string frame_texture_c; + std::string frame_texture_d; + std::string frame_texture_e; + null_float_t hidden_timing; + null_float_t high_speed_rate; + null_int32_t is_old_pv; + std::string movie_file_name; + std::string pvbranch_success_se_name; + null_int32_t pack; // FT/M39 + null_int32_t pre_play_script; + null_int32_t rank_board_id; // FT/M39 + null_int32_t remix_parent; + null_float_t resolution_scale; // FT/M39 + null_float_t resolution_scale_neo; // FT/M39 + std::string se_name; + std::string slide_name; + std::string slidertouch_name; + std::string song_file_name; + std::string song_name; + std::string song_name_en; // FT/M39 + std::string song_name_reading; + std::string song_name_reading_en; // FT/M39 + null_float_t sudden_timing; + null_bool use_osage_play_data; +}; diff --git a/src/KKdLib/pvpp.c b/src/KKdLib/pvpp.cpp similarity index 75% rename from src/KKdLib/pvpp.c rename to src/KKdLib/pvpp.cpp index dad02571..587c210b 100644 --- a/src/KKdLib/pvpp.c +++ b/src/KKdLib/pvpp.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "pvpp.h" -#include "f2/struct.h" +#include "pvpp.hpp" +#include "f2/struct.hpp" #include "io/path.h" #include "io/stream.h" -#include "hash.h" +#include "hash.hpp" #include "str_utils.h" static void pvpp_a3da_read(pvpp_a3da* a3d, stream* s); @@ -18,6 +18,7 @@ static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s); static void pvpp_effect_read(pvpp_effect* eff, stream* s); static void pvpp_glitter_read(pvpp_glitter* glt, stream* s); static void pvpp_motion_read(pvpp_motion* mot, stream* s); +static void pvpp_object_set_read(pvpp_object_set* objset, stream* s); static void pvpp_read_inner(pvpp* pp, stream* s); pvpp::pvpp() : ready() { @@ -58,31 +59,28 @@ void pvpp::read(const wchar_t* path) { free(path_pvpp); } -void pvpp::read(const void* data, size_t length) { - if (!data || !length) +void pvpp::read(const void* data, size_t size) { + if (!data || !size) return; stream s; - io_open(&s, data, length); + io_open(&s, data, size); pvpp_read_inner(this, &s); io_free(&s); } -bool pvpp::load_file(void* data, const char* path, const char* file, uint32_t hash) { +bool pvpp::load_file(void* data, const char* path, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); const char* t = strrchr(file, '.'); if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); pvpp* pp = (pvpp*)data; - pp->read(string_data(&s)); + pp->read(s.c_str()); - string_free(&s); return pp->ready; } @@ -94,7 +92,7 @@ pvpp_a3da::~pvpp_a3da() { } -pvpp_chara::pvpp_chara() { +pvpp_chara::pvpp_chara() : chara_effect_init() { } @@ -110,8 +108,8 @@ pvpp_chara_effect::~pvpp_chara_effect() { } -pvpp_chara_effect_a3da::pvpp_chara_effect_a3da() : u00(), -u01(), chara_index(), u03(), u04(), u05(), u06(), u07() { +pvpp_chara_effect_a3da::pvpp_chara_effect_a3da() : has_object_set(), +u00(), u01(), u02(), u03(), u04(), u05(), u06(), u07() { } @@ -151,6 +149,14 @@ pvpp_motion::~pvpp_motion() { } +pvpp_object_set::pvpp_object_set() : hash(hash_murmurhash_empty) { + +} + +pvpp_object_set::~pvpp_object_set() { + +} + 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); @@ -158,14 +164,14 @@ static void pvpp_a3da_read(pvpp_a3da* a3d, stream* s) { } 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); + int8_t u00 = io_read_int8_t(s); + int8_t u01 = io_read_int8_t(s); + int8_t motion_count = io_read_int8_t(s); + int8_t a3da_count = io_read_int8_t(s); + int8_t item_count = io_read_int8_t(s); + int8_t u05 = io_read_int8_t(s); + int8_t glitter_count = io_read_int8_t(s); + int8_t u07 = io_read_int8_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); @@ -173,12 +179,13 @@ static void pvpp_chara_read(pvpp_chara* chr, stream* s) { size_t glitter_offset = io_read_offset_x(s); size_t o30 = io_read_offset_x(s); - chr->chara_effect.resize(chr_eff_count); - - io_position_push(s, chr_eff_offset, SEEK_SET); - for (pvpp_chara_effect& i : chr->chara_effect) - pvpp_chara_effect_read(&i, s); - io_position_pop(s); + chr->chara_effect_init = false; + if (chr_eff_offset) { + io_position_push(s, chr_eff_offset, SEEK_SET); + pvpp_chara_effect_read(&chr->chara_effect, s); + chr->chara_effect_init = true; + io_position_pop(s); + } chr->motion.resize(motion_count); @@ -214,7 +221,7 @@ static void pvpp_chara_read(pvpp_chara* chr, stream* s) { static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream* s) { chr_eff->base_chara = (pvpp_chara_type)io_read_uint8_t(s); - uint8_t pv_effects_count = io_read_uint8_t(s); + int8_t pv_effects_count = io_read_int8_t(s); chr_eff->chara_index = (pvpp_chara_index)io_read_uint8_t(s); size_t pv_effects_offstet = io_read_offset_x(s); @@ -229,22 +236,30 @@ static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream* s) { 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->chara_index = 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); + size_t source_a3da_offset = 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); + + chr_eff_a3da->has_object_set = false; + if (source_a3da_offset) { + io_position_push(s, source_a3da_offset, SEEK_SET); + pvpp_object_set_read(&chr_eff_a3da->object_set, s); + chr_eff_a3da->has_object_set = true; + io_position_pop(s); + } } static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s) { - uint8_t a3das_count = io_read_uint8_t(s); + int8_t a3das_count = io_read_int8_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); @@ -263,11 +278,11 @@ static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s) { } static void pvpp_effect_read(pvpp_effect* eff, stream* s) { - uint8_t a3das_count = io_read_uint8_t(s); - uint8_t effects_count = io_read_uint8_t(s); + int8_t a3das_count = io_read_int8_t(s); + int8_t glitters_count = io_read_int8_t(s); eff->chara_index = (pvpp_chara_type)io_read_uint8_t(s); - ssize_t a3das_offset = io_read_offset_x(s); - ssize_t effects_offset = io_read_offset_x(s); + int64_t a3das_offset = io_read_offset_x(s); + int64_t glitters_offset = io_read_offset_x(s); eff->a3da.resize(a3das_count); @@ -276,9 +291,9 @@ static void pvpp_effect_read(pvpp_effect* eff, stream* s) { pvpp_a3da_read(&i, s); io_position_pop(s); - eff->glitter.resize(effects_count); + eff->glitter.resize(glitters_count); - io_position_push(s, effects_offset, SEEK_SET); + io_position_push(s, glitters_offset, SEEK_SET); for (pvpp_glitter& i : eff->glitter) pvpp_glitter_read(&i, s); io_position_pop(s); @@ -297,6 +312,12 @@ static void pvpp_motion_read(pvpp_motion* mot, stream* s) { io_align_read(s, 0x08); } +static void pvpp_object_set_read(pvpp_object_set* objset, stream* s) { + io_read_string_null_terminated_offset(s, io_read_offset_x(s), &objset->name); + objset->hash = io_read_uint32_t_stream_reverse_endianness(s); + io_align_read(s, 0x08); +} + static void pvpp_read_inner(pvpp* pp, stream* s) { f2_struct st; st.read(s); @@ -308,9 +329,9 @@ static void pvpp_read_inner(pvpp* pp, stream* s) { 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); + int8_t chara_count = io_read_int8_t(&s_pvpp); + int64_t effect_offset = io_read_offset_x(&s_pvpp); + int64_t chara_offset = io_read_offset_x(&s_pvpp); io_read_offset_x(&s_pvpp); pp->chara.resize(chara_count); @@ -322,7 +343,7 @@ static void pvpp_read_inner(pvpp* pp, stream* s) { 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); + int8_t efffect_count = io_read_int8_t(&s_pvpp); effect_offset = io_read_offset_x(&s_pvpp); io_position_pop(&s_pvpp); diff --git a/src/KKdLib/pvpp.h b/src/KKdLib/pvpp.hpp similarity index 88% rename from src/KKdLib/pvpp.h rename to src/KKdLib/pvpp.hpp index 43003b2c..e7271d4d 100644 --- a/src/KKdLib/pvpp.h +++ b/src/KKdLib/pvpp.hpp @@ -40,11 +40,21 @@ struct pvpp_a3da { ~pvpp_a3da(); }; +struct pvpp_object_set { + uint32_t hash; + std::string name; + + pvpp_object_set(); + ~pvpp_object_set(); +}; + struct pvpp_chara_effect_a3da { pvpp_a3da a3da; + pvpp_object_set object_set; + bool has_object_set; uint8_t u00; uint8_t u01; - uint8_t chara_index; + uint8_t u02; uint8_t u03; uint8_t u04; uint8_t u05; @@ -102,7 +112,8 @@ struct pvpp_effect { struct pvpp_chara { std::vector a3da; std::vector item; - std::vector chara_effect; + pvpp_chara_effect chara_effect; + bool chara_effect_init; std::vector glitter; std::vector motion; @@ -121,7 +132,7 @@ struct pvpp { void read(const char* path); void read(const wchar_t* path); - void read(const void* data, size_t length); + void read(const void* data, size_t size); static bool load_file(void* data, const char* path, const char* file, uint32_t hash); }; diff --git a/src/KKdLib/pvsr.c b/src/KKdLib/pvsr.cpp similarity index 87% rename from src/KKdLib/pvsr.c rename to src/KKdLib/pvsr.cpp index 2740866c..c54d2182 100644 --- a/src/KKdLib/pvsr.c +++ b/src/KKdLib/pvsr.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "pvsr.h" -#include "f2/struct.h" +#include "pvsr.hpp" +#include "f2/struct.hpp" #include "io/path.h" #include "io/stream.h" -#include "hash.h" +#include "hash.hpp" #include "str_utils.h" static void pvsr_a3da_read(pvsr_a3da* a3d, stream* s); @@ -17,8 +17,8 @@ static void pvsr_glitter_read(pvsr_glitter* glt, stream* s); static void pvsr_read_inner(pvsr* sr, stream* s); static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream* s); static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, int32_t x00); -static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream* s, ssize_t offset); -static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream* s, ssize_t offset); +static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream* s, int64_t offset); +static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream* s, int64_t offset); pvsr::pvsr() : ready(), stage_change_effect_init() { @@ -65,14 +65,11 @@ bool pvsr::load_file(void* data, const char* path, const char* file, uint32_t ha if (t) file_len = t - file; - string s; - string_init(&s, path); - string_add_length(&s, file, file_len); + std::string s = path + std::string(file, file_len); pvsr* sr = (pvsr*)data; - sr->read(string_data(&s)); + sr->read(s.c_str()); - string_free(&s); return sr->ready; } @@ -181,18 +178,18 @@ static void pvsr_read_inner(pvsr* sr, stream* s) { uint8_t x0d = io_read_uint8_t(&s_pvsr); uint8_t x0e = io_read_uint8_t(&s_pvsr); uint8_t x0f = io_read_uint8_t(&s_pvsr); - ssize_t x10 = io_read_offset_x(&s_pvsr); - ssize_t stage_effect_offset = io_read_offset_x(&s_pvsr); - ssize_t stage_change_effect_offset = io_read_offset_x(&s_pvsr); - ssize_t stage_effect_env_offset = io_read_offset_x(&s_pvsr); + int64_t x10 = io_read_offset_x(&s_pvsr); + int64_t stage_effect_offset = io_read_offset_x(&s_pvsr); + int64_t stage_change_effect_offset = io_read_offset_x(&s_pvsr); + int64_t stage_effect_env_offset = io_read_offset_x(&s_pvsr); io_position_push(&s_pvsr, x10, SEEK_SET); int8_t unknown_count = io_read_int8_t(&s_pvsr); int8_t effect_count = io_read_int8_t(&s_pvsr); int8_t emcs_count = io_read_int8_t(&s_pvsr); - ssize_t unknown_offset = io_read_offset_x(&s_pvsr); - ssize_t effect_offset = io_read_offset_x(&s_pvsr); - ssize_t emcs_offset = io_read_offset_x(&s_pvsr); + int64_t unknown_offset = io_read_offset_x(&s_pvsr); + int64_t effect_offset = io_read_offset_x(&s_pvsr); + int64_t emcs_offset = io_read_offset_x(&s_pvsr); io_position_pop(&s_pvsr); sr->effect.resize(effect_count); @@ -224,7 +221,7 @@ static void pvsr_read_inner(pvsr* sr, stream* s) { io_position_push(&s_pvsr, stage_change_effect_offset, SEEK_SET); for (int32_t i = 0; i < PVSR_STAGE_CHANGE_EFFECT_COUNT; i++) for (int32_t j = 0; j < PVSR_STAGE_CHANGE_EFFECT_COUNT; j++) { - ssize_t offset = io_read_offset_x(&s_pvsr); + int64_t offset = io_read_offset_x(&s_pvsr); if (offset <= 0) continue; @@ -253,8 +250,8 @@ static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream* s) { uint8_t u02 = io_read_uint8_t(s); uint8_t u03 = io_read_uint8_t(s); stg_eff->bar_count = io_read_uint8_t(s); - ssize_t a3da_offset = io_read_offset_x(s); - ssize_t glitter_offset = io_read_offset_x(s); + int64_t a3da_offset = io_read_offset_x(s); + int64_t glitter_offset = io_read_offset_x(s); io_read_offset_x(s); uint8_t a3da_count; @@ -284,15 +281,15 @@ static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream* s) { } static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, int32_t x00) { - ssize_t set_name_offset = io_read_offset_x(s); - ssize_t front_offset = io_read_offset_x(s); - ssize_t front_low_offset = io_read_offset_x(s); - ssize_t back_offset = io_read_offset_x(s); - ssize_t sub1_offset = io_read_offset_x(s); - ssize_t sub2a_offset = io_read_offset_x(s); - ssize_t sub2b_offset = io_read_offset_x(s); - ssize_t sub2c_offset = io_read_offset_x(s); - ssize_t sub2d_offset = io_read_offset_x(s); + int64_t set_name_offset = io_read_offset_x(s); + int64_t front_offset = io_read_offset_x(s); + int64_t front_low_offset = io_read_offset_x(s); + int64_t back_offset = io_read_offset_x(s); + int64_t sub1_offset = io_read_offset_x(s); + int64_t sub2a_offset = io_read_offset_x(s); + int64_t sub2b_offset = io_read_offset_x(s); + int64_t sub2c_offset = io_read_offset_x(s); + int64_t sub2d_offset = io_read_offset_x(s); aet->u48 = io_read_uint16_t_stream_reverse_endianness(s); aet->u4a = io_read_uint16_t_stream_reverse_endianness(s); aet->u4c = io_read_uint16_t_stream_reverse_endianness(s); @@ -306,19 +303,19 @@ static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, in aet->u5c = io_read_uint16_t_stream_reverse_endianness(s); aet->u5e = io_read_uint16_t_stream_reverse_endianness(s); aet->u60 = io_read_uint16_t_stream_reverse_endianness(s); - uint8_t front_count = io_read_uint8_t(s); - uint8_t front_low_count = io_read_uint8_t(s); - uint8_t back_count = io_read_uint8_t(s); + int8_t front_count = io_read_int8_t(s); + int8_t front_low_count = io_read_int8_t(s); + int8_t back_count = io_read_int8_t(s); io_align_read(s, 0x08); - ssize_t o68 = 0; - ssize_t o70 = 0; - uint8_t u78 = 0; - uint8_t u79 = 0; + int64_t o68 = 0; + int64_t o70 = 0; + int8_t u78 = 0; + int8_t u79 = 0; if (x00 & 0x100) { o68 = io_read_offset_x(s); o70 = io_read_offset_x(s); - u78 = io_read_uint8_t(s); - u79 = io_read_uint8_t(s); + u78 = io_read_int8_t(s); + u79 = io_read_int8_t(s); io_align_read(s, 0x08); } @@ -368,7 +365,7 @@ static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, in } } -static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream* s, ssize_t offset) { +static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream* s, int64_t offset) { if (offset <= 0) return false; @@ -381,7 +378,7 @@ static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1 return true; } -static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream* s, ssize_t offset) { +static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream* s, int64_t offset) { if (offset <= 0) return false; diff --git a/src/KKdLib/pvsr.h b/src/KKdLib/pvsr.hpp similarity index 100% rename from src/KKdLib/pvsr.h rename to src/KKdLib/pvsr.hpp diff --git a/src/KKdLib/sort.c b/src/KKdLib/sort.cpp similarity index 99% rename from src/KKdLib/sort.c rename to src/KKdLib/sort.cpp index fcdd029f..f0675a0f 100644 --- a/src/KKdLib/sort.c +++ b/src/KKdLib/sort.cpp @@ -5,7 +5,7 @@ Code is from web. I don't really remember wnere I got it */ -#include "sort.h" +#include "sort.hpp" #include #include "str_utils.h" diff --git a/src/KKdLib/sort.h b/src/KKdLib/sort.hpp similarity index 100% rename from src/KKdLib/sort.h rename to src/KKdLib/sort.hpp diff --git a/src/KKdLib/str_utils.c b/src/KKdLib/str_utils.c index ee2b0e72..303c0a54 100644 --- a/src/KKdLib/str_utils.c +++ b/src/KKdLib/str_utils.c @@ -535,9 +535,9 @@ size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, return -1; } -bool str_utils_text_file_parse(void* data, size_t length, +bool str_utils_text_file_parse(void* data, size_t size, char** buf, char*** lines, size_t* count) { - if (!data || !length || !buf || !lines || !count) + if (!data || !size || !buf || !lines || !count) return false; char* d = (char*)data; @@ -549,36 +549,36 @@ bool str_utils_text_file_parse(void* data, size_t length, if ((uint8_t)d[0] == 0x00) return false; else if (d[0] == 0xFF) { - if (length == 1 || (uint8_t)d[1] != 0xFE || length == 2) + if (size == 1 || (uint8_t)d[1] != 0xFE || size == 2) return false; wchar_t* w_d = (wchar_t*)data + 1; d = utf16_to_utf8(w_d); - length = utf8_length(d); + size = utf8_length(d); del = true; goto decode_utf8_ansi; } else if ((uint8_t)d[0] == 0xFE) { - if (length == 1 || (uint8_t)d[1] != 0xFF || length == 2) + if (size == 1 || (uint8_t)d[1] != 0xFF || size == 2) return false; - length /= 2; + size /= 2; wchar_t* w_d = (wchar_t*)data + 1; w_d = str_utils_copy(w_d); - for (size_t i = 0; i < length; i++) + for (size_t i = 0; i < size; i++) w_d[i] = (wchar_t)reverse_endianness_uint16_t((uint16_t)w_d[i]); d = utf16_to_utf8(w_d); - length = utf8_length(d); + size = utf8_length(d); del = true; free(w_d); goto decode_utf8_ansi; } else if ((uint8_t)d[0] == 0xEF) { - if (length == 1 || (uint8_t)d[1] != 0xBB || length == 2 || (uint8_t)d[2] != 0xBF || length == 3) + if (size == 1 || (uint8_t)d[1] != 0xBB || size == 2 || (uint8_t)d[2] != 0xBF || size == 3) return false; d += 3; - length -= 3; + size -= 3; goto decode_utf8_ansi; } else { @@ -591,11 +591,11 @@ bool str_utils_text_file_parse(void* data, size_t length, t = d; ch = 0; - size_t buf_len = length; - for (size_t i = 0, l = 0, m = 0; i < length; i++) { + size_t buf_len = size; + for (size_t i = 0, l = 0, m = 0; i < size; i++) { ch = *t++; if (ch == '\r') { - if (i + 1 < length && *t == '\n') { + if (i + 1 < size && *t == '\n') { i++; t++; l++; @@ -631,7 +631,7 @@ bool str_utils_text_file_parse(void* data, size_t length, 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') { + if (i + 1 < size && *t == '\n') { i++; t++; l++; @@ -641,7 +641,7 @@ bool str_utils_text_file_parse(void* data, size_t length, else if (ch == '\n') lf = true; - if (i >= length || lf) { + if (i >= size || lf) { temp_lines[j] = b; if (l) { memcpy(b, d + i - l, m); diff --git a/src/KKdLib/str_utils.h b/src/KKdLib/str_utils.h index 065fd50b..e1ad74c7 100644 --- a/src/KKdLib/str_utils.h +++ b/src/KKdLib/str_utils.h @@ -48,5 +48,5 @@ extern size_t str_utils_get_substring_offset(const char* str0, size_t str0_len, size_t str0_off, const char* str1, size_t str1_len); extern size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, size_t str0_off, const wchar_t* str1, size_t str1_len); -extern bool str_utils_text_file_parse(void* data, size_t length, +extern bool str_utils_text_file_parse(void* data, size_t size, char** buf, char*** lines, size_t* count); diff --git a/src/KKdLib/txp.c b/src/KKdLib/txp.cpp similarity index 97% rename from src/KKdLib/txp.c rename to src/KKdLib/txp.cpp index aa9b5dc9..c078b678 100644 --- a/src/KKdLib/txp.c +++ b/src/KKdLib/txp.cpp @@ -3,8 +3,8 @@ GitHub/GitLab: korenkonder */ -#include "txp.h" -#include "f2/struct.h" +#include "txp.hpp" +#include "f2/struct.hpp" #include "io/stream.h" txp_mipmap::txp_mipmap() : width(), height(), format(), size() { @@ -78,16 +78,16 @@ txp_set::~txp_set() { } -bool txp_set::pack_file(void** data, size_t* length, bool big_endian) { +bool txp_set::pack_file(void** data, size_t* size, bool big_endian) { size_t l; txp* tex; txp_mipmap* tex_mipmap; - if (!data) + if (!data || !size) return false; *data = 0; - *length = 0; + *size = 0; size_t count = textures.size(); if (count < 1) @@ -154,7 +154,7 @@ bool txp_set::pack_file(void** data, size_t* length, bool big_endian) { io_set_position(&s, 0, SEEK_END); io_align_write(&s, 0x10); - io_copy(&s, data, length); + io_copy(&s, data, size); io_free(&s); for (size_t i = 0; i < count; i++) @@ -250,11 +250,11 @@ bool txp_set::pack_file(std::vector* data, bool big_endian) { return true; } -bool txp_set::pack_file_modern(void** data, size_t* length, bool big_endian) { +bool txp_set::pack_file_modern(void** data, size_t* size, bool big_endian) { f2_struct st; if (!pack_file(&st.data, big_endian)) { *data = 0; - *length = 0; + *size = 0; return false; } @@ -264,7 +264,7 @@ bool txp_set::pack_file_modern(void** data, size_t* length, bool big_endian) { st.header.length = 0x20; st.header.use_big_endian = big_endian; st.header.use_section_size = true; - st.write(data, length, true, false); + st.write(data, size, true, false); return true; } @@ -396,7 +396,6 @@ bool txp_set::unpack_file(void* data, bool big_endian) { sign = *(uint32_t*)mipmap_d; } - if (big_endian) { tex_mipmap->width = load_reverse_endianness_uint32_t((void*)(mipmap_d + 4)); tex_mipmap->height = load_reverse_endianness_uint32_t((void*)(mipmap_d + 8)); @@ -421,10 +420,10 @@ bool txp_set::unpack_file(void* data, bool big_endian) { return true; } -bool txp_set::unpack_file_modern(void* data, size_t length) { +bool txp_set::unpack_file_modern(void* data, size_t size) { bool ret = false; f2_struct st; - st.read(data, length); + st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('MTXD')) ret = unpack_file(st.data.data(), st.header.use_big_endian); return ret; diff --git a/src/KKdLib/txp.h b/src/KKdLib/txp.hpp similarity index 83% rename from src/KKdLib/txp.h rename to src/KKdLib/txp.hpp index 8616ae13..20a9bfcc 100644 --- a/src/KKdLib/txp.h +++ b/src/KKdLib/txp.hpp @@ -7,7 +7,7 @@ #include #include "default.h" -#include "f2/enrs.h" +#include "f2/enrs.hpp" enum txp_format { TXP_A8 = 0, @@ -57,10 +57,10 @@ struct txp_set { txp_set(); ~txp_set(); - bool pack_file(void** data, size_t* length, bool big_endian); + bool pack_file(void** data, size_t* size, bool big_endian); bool pack_file(std::vector* data, bool big_endian); - bool pack_file_modern(void** data, size_t* length, bool big_endian); + bool pack_file_modern(void** data, size_t* size, bool big_endian); bool produce_enrs(enrs* enrs); bool unpack_file(void* data, bool big_endian); - bool unpack_file_modern(void* data, size_t length); + bool unpack_file_modern(void* data, size_t size); };