From 62370dcb02b4e68b5cdf91347658c47c95283ceb Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 21 May 2022 21:50:45 +0300 Subject: [PATCH] Temp commit. Song Effect Attach Fixes --- src/CLOUD/classes/data_test/auth_3d_test.c | 15 +- src/CLOUD/classes/data_view/auth_3d.c | 2 +- src/CLOUD/classes/data_view/draw_task.c | 21 +- src/CLOUD/classes/glitter_editor.c | 33 +- src/CLOUD/render.c | 21 +- src/CLOUD/x_pv_game.cpp | 241 +- src/CLOUD/x_pv_game.hpp | 4 +- src/CRE/Glitter/effect.cpp | 16 +- src/CRE/Glitter/effect_group.cpp | 13 +- src/CRE/Glitter/effect_inst.cpp | 127 +- src/CRE/Glitter/emitter.cpp | 18 +- src/CRE/Glitter/emitter_inst.cpp | 11 +- src/CRE/Glitter/file_reader.cpp | 42 +- src/CRE/Glitter/glitter.hpp | 17 +- src/CRE/Glitter/particle.cpp | 20 +- src/CRE/Glitter/particle_inst.cpp | 128 +- src/CRE/Glitter/particle_manager.cpp | 3 +- src/CRE/Glitter/render_group.cpp | 49 +- src/CRE/Glitter/render_scene.cpp | 76 +- src/CRE/auth_3d.cpp | 82 +- src/CRE/auth_3d.hpp | 3 +- src/CRE/draw_object.c | 594 ++-- src/CRE/draw_pass.c | 4 +- src/CRE/draw_task.c | 60 +- src/CRE/fbo.cpp | 12 +- src/CRE/file_handler.cpp | 38 +- src/CRE/file_handler.hpp | 8 +- src/CRE/item_table.cpp | 9 +- src/CRE/light_param.cpp | 82 +- src/CRE/light_param.hpp | 5 +- src/CRE/light_param/light.c | 16 +- src/CRE/object.cpp | 586 ++-- src/CRE/object.hpp | 29 +- src/CRE/post_process/dof.cpp | 8 +- src/CRE/render_context.cpp | 32 +- src/CRE/render_context.hpp | 6 +- src/CRE/rob.cpp | 2985 ++++++++++++++------ src/CRE/rob.hpp | 300 +- src/CRE/stage.cpp | 43 +- src/CRE/stage.hpp | 2 + src/CRE/stage_modern.cpp | 45 +- src/CRE/stage_modern.hpp | 2 + src/CRE/texture.cpp | 2 +- src/DivaGL/bone_data.c | 2 +- src/KKdLib/a3da.cpp | 2 +- src/KKdLib/database/bone.cpp | 56 +- src/KKdLib/database/item_table.cpp | 84 +- src/KKdLib/database/item_table.hpp | 4 +- src/KKdLib/database/object.cpp | 24 +- src/KKdLib/database/texture.cpp | 8 +- src/KKdLib/dsc.cpp | 2 +- src/KKdLib/f2/enrs.cpp | 8 + src/KKdLib/f2/enrs.hpp | 3 + src/KKdLib/f2/struct.cpp | 2 +- src/KKdLib/key_val.cpp | 7 +- src/KKdLib/light_param/wind.cpp | 7 +- src/KKdLib/mat.h | 2 +- src/KKdLib/mot.cpp | 40 +- src/KKdLib/msgpack.cpp | 42 +- src/KKdLib/obj.cpp | 1871 ++++++------ src/KKdLib/obj.hpp | 329 ++- src/KKdLib/pv_exp.cpp | 234 ++ src/KKdLib/pv_exp.hpp | 47 + src/KKdLib/str_utils.c | 8 +- src/KKdLib/txp.cpp | 10 +- 65 files changed, 5374 insertions(+), 3228 deletions(-) create mode 100644 src/KKdLib/pv_exp.cpp create mode 100644 src/KKdLib/pv_exp.hpp diff --git a/src/CLOUD/classes/data_test/auth_3d_test.c b/src/CLOUD/classes/data_test/auth_3d_test.c index 9dc58dce..54bc3ea4 100644 --- a/src/CLOUD/classes/data_test/auth_3d_test.c +++ b/src/CLOUD/classes/data_test/auth_3d_test.c @@ -237,34 +237,31 @@ void data_test_auth_3d_test_ctrl(class_data* data) { } } - string obj = string_empty; + std::string obj; for (size_t i = 0; i < name_len && name_len - i >= 8; i++) if (!memcmp(&name_str[i], "STGPV", 5)) { - string_free(&obj); - string_init_length(&obj, &name_str[i], 8); + obj = std::string(&name_str[i], 8); break; } for (size_t i = 0; i < name_len && name_len - i >= 10; i++) if (!memcmp(&name_str[i], "STGD2PV", 7)) { - string_free(&obj); - string_init_length(&obj, &name_str[i], 10); + obj = std::string(&name_str[i], 10); break; } - uint32_t set_id = obj_db->get_object_set_id(string_data(&obj)); + uint32_t set_id = obj_db->get_object_set_id(obj.c_str()); if (set_id != (uint32_t)-1) { object_storage_load_set(aft_data, obj_db, set_id); vector_old_uint32_t_push_back(&auth_3d_test->obj_set_id, &set_id); } - string_add_length(&obj, "HRC", 3); - uint32_t hrc_set_id = obj_db->get_object_set_id(string_data(&obj)); + obj += "HRC"; + uint32_t hrc_set_id = obj_db->get_object_set_id(obj.c_str()); if (hrc_set_id != (uint32_t)-1) { object_storage_load_set(aft_data, obj_db, hrc_set_id); vector_old_uint32_t_push_back(&auth_3d_test->obj_set_id, &hrc_set_id); } - string_free(&obj); } auth_3d_data_load_category(cat->name); diff --git a/src/CLOUD/classes/data_view/auth_3d.c b/src/CLOUD/classes/data_view/auth_3d.c index d6da1283..d19d764d 100644 --- a/src/CLOUD/classes/data_view/auth_3d.c +++ b/src/CLOUD/classes/data_view/auth_3d.c @@ -918,7 +918,7 @@ static void data_view_auth_3d_imgui_auth_3d_object_texture_transform(auth_3d_obj if (ott->flags & AUTH_3D_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_U) data_view_auth_3d_imgui_auth_3d_key(&ott->translate_frame_u, "Translate Frame U:", false); if (ott->flags & AUTH_3D_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_V) - data_view_auth_3d_imgui_auth_3d_key(&ott->translate_frame_v, "Translate Frame V:", false);; + data_view_auth_3d_imgui_auth_3d_key(&ott->translate_frame_v, "Translate Frame V:", false); ImGui::TreePop(); } diff --git a/src/CLOUD/classes/data_view/draw_task.c b/src/CLOUD/classes/data_view/draw_task.c index 68e4f57d..c569ca46 100644 --- a/src/CLOUD/classes/data_view/draw_task.c +++ b/src/CLOUD/classes/data_view/draw_task.c @@ -6,6 +6,7 @@ #include "draw_task.h" #include "../../../CRE/render_context.hpp" #include "../../../KKdLib/hash.hpp" +#include "../../../KKdLib/sort.hpp" #include "../imgui_helper.h" static const char* draw_object_type_name[] = { @@ -63,6 +64,7 @@ extern int32_t height; const char* data_view_draw_task_window_title = "Draw Task##Data Viewer"; +static int draw_task_sort_sort(void const* src1, void const* src2); static void data_view_draw_task_imgui_draw_object(draw_object* object); bool data_view_draw_task_init(class_data* data, render_context* rctx) { @@ -134,18 +136,13 @@ void data_view_draw_task_imgui(class_data* data) { for (draw_task*& j : draw_tasks) { draw_task_sort draw_task; draw_task.first = j; - draw_task.second.first = hash_murmurhash((void*)j, 8, 0, true); + draw_task.second.first = hash_murmurhash(&j, 8, 0, true); draw_task.second.second = (uint32_t)(&j - draw_tasks.data()); draw_tasks_sort.push_back(draw_task); } - for (auto i = draw_tasks_sort.begin(); i != draw_tasks_sort.end() - 1; i++) - for (auto j = i + 1; j != draw_tasks_sort.end(); j++) - if (*i > *j) { - draw_task_sort temp = *i; - *i = *j; - *j = temp; - } + quicksort_custom(draw_tasks_sort.data(), draw_tasks_sort.size(), + sizeof(draw_task_sort), draw_task_sort_sort); ImGui::Text(" Hash; Index; Type"); @@ -229,7 +226,13 @@ data_view_draw_task::~data_view_draw_task() { } +static int draw_task_sort_sort(void const* src1, void const* src2) { + float_t d1 = ((draw_task_sort*)src1)->first->depth; + float_t d2 = ((draw_task_sort*)src2)->first->depth; + return d1 > d2 ? -1 : (d1 < d2 ? 1 : 0); +} + static void data_view_draw_task_imgui_draw_object(draw_object* object) { ImGui::Text("Mesh Name: %s", object->mesh->name); - ImGui::Text("Sub Mesh Index: %lld", object->sub_mesh - object->mesh->sub_meshes); + ImGui::Text("Sub Mesh Index: %lld", object->sub_mesh - object->mesh->submesh_array); } \ No newline at end of file diff --git a/src/CLOUD/classes/glitter_editor.c b/src/CLOUD/classes/glitter_editor.c index 22424e5c..d673034e 100644 --- a/src/CLOUD/classes/glitter_editor.c +++ b/src/CLOUD/classes/glitter_editor.c @@ -4046,9 +4046,9 @@ 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 (uint32_t i = 0; i < set->objects_count; i++) - if (set->objects[i].id == obj_id) { - obj = &set->objects[i]; + for (uint32_t i = 0; i < set->obj_num; i++) + if (set->obj_data[i].id == obj_id) { + obj = &set->obj_data[i]; break; } } @@ -4058,8 +4058,8 @@ 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 (uint32_t i = 0; i < set->objects_count; i++) - if (set->objects[i].id == obj_id) { + for (uint32_t i = 0; i < set->obj_num; i++) + if (set->obj_data[i].id == obj_id) { obj_index = i; break; } @@ -4071,9 +4071,9 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla obj_index = -1; ImGui::PopID(); - for (uint32_t i = 0; i < set->objects_count; i++) { + for (uint32_t i = 0; i < set->obj_num; i++) { ImGui::PushID(i); - ::obj* obj = &set->objects[i]; + ::obj* obj = &set->obj_data[i]; if (ImGui::Selectable(string_data(&obj->name), obj->id == obj_id) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (ImGui::IsItemFocused() && obj->id != obj_id)) @@ -4081,10 +4081,10 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla ImGui::PopID(); } - if (obj_index == -1 || obj_index >= set->objects_count) + if (obj_index == -1 || obj_index >= set->obj_num) obj_id = -1; else - obj_id = set->objects[obj_index].id; + obj_id = set->obj_data[obj_index].id; if (mesh->object_name_hash != obj_id) { mesh->object_name_hash = obj_id; @@ -6869,24 +6869,23 @@ 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 (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; if (object_data->object_culling && !object_bounding_sphere_check_visibility( &mesh->bounding_sphere, object_data, rctx->camera, &mat)) continue; - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; - if (sub_mesh->flags & OBJ_SUB_MESH_FLAG_8) + if (sub_mesh->attrib.m.flag_3) continue; if (object_data->object_culling) { int32_t v32 = object_bounding_sphere_check_visibility( &sub_mesh->bounding_sphere, object_data, rctx->camera, &mat); - if (v32 != 2 || (~mesh->flags & OBJ_MESH_BILLBOARD && - ~mesh->flags & OBJ_MESH_BILLBOARD_Y_AXIS)) { + if (v32 != 2 || (!mesh->attrib.m.billboard && !mesh->attrib.m.billboard_y_axis)) { if (v32 == 2) { if (object_data->object_bounding_sphere_check_func) v32 = 1; @@ -6922,7 +6921,7 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl GLuint array_buffer = obj_mesh_vertex_buffer_get_buffer(&obj_vertex_buffer[i]); gl_state_bind_array_buffer(array_buffer); glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, mesh->vertex_size, (void*)0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, mesh->size_vertex, (void*)0); gl_state_bind_array_buffer(0); GLuint element_array_buffer = obj_index_buffer[i].buffer; diff --git a/src/CLOUD/render.c b/src/CLOUD/render.c index ba36d0fc..7e0a8bd3 100644 --- a/src/CLOUD/render.c +++ b/src/CLOUD/render.c @@ -744,12 +744,12 @@ static render_context* render_load() { charas[0] = CHARA_MEIKO; int32_t modules[6]; - modules[5] = 186; - modules[1] = 46; - modules[2] = 39; + modules[5] = 168; + modules[1] = 0;//46; + modules[2] = 0;//39; modules[3] = 41; modules[4] = 40; - modules[0] = 31; + modules[0] = 0;//31; x_pv_game_data.Load(822, 22, charas, modules); shader_env_vert_set_ptr(&shaders_ft, 3, (vec4*)&vec4_identity); @@ -831,7 +831,6 @@ static void render_ctrl(render_context* rctx) { camera_roll(cam, input_roll); } } - camera_update(cam); classes_process_ctrl(classes, classes_count); @@ -903,7 +902,6 @@ static void cube_line_draw(shader_glsl* shader, camera* cam, vec3* trans, float_ } static int cube_line_points_sort(void const* src1, void const* src2) { - std::pair* t2 = (std::pair*)src2; float_t d1 = ((std::pair*)src1)->second; float_t d2 = ((std::pair*)src2)->second; return d1 > d2 ? -1 : (d1 < d2 ? 1 : 0); @@ -951,6 +949,8 @@ static void render_draw(render_context* rctx) { glClearBufferfv(GL_COLOR, 0, (GLfloat*)&color); } + camera_update(cam); + rctx->disp(); int32_t screen_x_offset = (width - internal_2d_res.x) / 2 + (width - internal_2d_res.x) % 2; @@ -1070,8 +1070,10 @@ static void render_dispose(render_context* rctx) { ImGui::DestroyContext(imgui_context); lock_free(&imgui_context_lock); + task_rob_manager_free_task(); x_pv_game_data.SetDest(); Glitter::glt_particle_manager.SetDest(); + task_auth_3d_free_task(); //rob_chara_array_free_chara_id(0); timer_reset(&render_timer); @@ -1127,15 +1129,12 @@ static void render_imgui(render_context* rctx) { } static bool render_load_shaders(void* data, const char* path, const char* file, uint32_t hash) { - string s; - string_init(&s, path); - string_add(&s, file); + std::string s = path + std::string(file); farc f; - f.read(string_data(&s), true, false); + f.read(s.c_str(), true, false); shader_ft_load((shader_set_data*)data, &f, false); - string_free(&s); return true; } diff --git a/src/CLOUD/x_pv_game.cpp b/src/CLOUD/x_pv_game.cpp index dd82a85f..216f466c 100644 --- a/src/CLOUD/x_pv_game.cpp +++ b/src/CLOUD/x_pv_game.cpp @@ -10,6 +10,7 @@ #include "x_pv_game.hpp" #include "../CRE/Glitter/glitter.hpp" #include "../CRE/light_param/light.h" +#include "../CRE/light_param.hpp" #include "../CRE/data.hpp" #include "../CRE/object.hpp" #include "../CRE/stage_modern.hpp" @@ -193,8 +194,10 @@ static int32_t expression_id_to_mottbl_index(int32_t expression_id); 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 void x_pv_game_change_field(x_pv_game* xpvgm, int32_t field, int64_t dsc_time, int64_t curr_time); 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_reset_field(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, @@ -275,9 +278,10 @@ bool x_pv_game::Init() { } bool x_pv_game::Ctrl() { - if (state == 0) + switch (state) { + case 0: return false; - else if (state == 1) { + case 1: { bool wait_load = false; for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) if (rob_chara_ids[i] != -1) @@ -285,80 +289,11 @@ bool x_pv_game::Ctrl() { if (!wait_load) state = 2; - } - else if (state == 2) { - bool pv_glt = pv_glitter->hash != hash_murmurhash_empty; - bool stg_glt = stage_glitter->hash != hash_murmurhash_empty; - if ((!pv_glt || Glitter::glt_particle_manager.CheckNoFileReaders(pv_glitter->hash)) - && (!stg_glt || Glitter::glt_particle_manager.CheckNoFileReaders(stage_glitter->hash))) { - data_struct* x_data = &data_list[DATA_X]; - - bool wait_load = false; - if (pv_glt) { - Glitter::EffectGroup* pv_eff_group - = Glitter::glt_particle_manager.GetEffectGroup(pv_glitter->hash); - if (pv_eff_group && pv_eff_group->CheckModel()) { - pv_eff_group->LoadModel(x_data); - wait_load = true; - } - } - - if (stg_glt) { - Glitter::EffectGroup* stage_eff_group - = Glitter::glt_particle_manager.GetEffectGroup(stage_glitter->hash); - if (stage_eff_group && stage_eff_group->CheckModel()) { - stage_eff_group->LoadModel(x_data); - wait_load = true; - } - } - - state = wait_load ? 3 : 4; - } - } - else if (state == 3) { - bool wait_load = false; - Glitter::EffectGroup* pv_eff_group - = Glitter::glt_particle_manager.GetEffectGroup(pv_glitter->hash); - if (pv_eff_group && pv_eff_group->CheckLoadModel()) - wait_load = true; - - Glitter::EffectGroup* stage_eff_group - = Glitter::glt_particle_manager.GetEffectGroup(stage_glitter->hash); - if (stage_eff_group && stage_eff_group->CheckLoadModel()) - wait_load = true; - - if (!wait_load) - state = 4; - } - else if (state == 4) { - 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) { - for (uint32_t& i : objset_load) { - obj_set* set = object_storage_get_obj_set(i); - if (!set) - continue; - - 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))) - *(vec3*)&material->specular = vec3_null; - else if (memcmp(&material->specular, &vec3_null, sizeof(vec3))) - *(vec3*)&material->specular = { 0.1f, 0.1f, 0.1f }; - } - } - } - + } break; + case 2: { data_struct* x_data = &data_list[DATA_X]; + light_param_storage_data_set_pv_id(pv_id); task_stage_modern_set_data(x_data, &obj_db, &tex_db, &stage_data); task_stage_modern_set_stage_hashes(&stage_hashes, &stages_data); @@ -371,18 +306,76 @@ bool x_pv_game::Ctrl() { 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) { + + bool pv_glt = pv_glitter->hash != hash_murmurhash_empty; + bool stg_glt = stage_glitter->hash != hash_murmurhash_empty; + if (pv_glt && Glitter::glt_particle_manager.CheckNoFileReaders(pv_glitter->hash) + || stg_glt && Glitter::glt_particle_manager.CheckNoFileReaders(stage_glitter->hash)) { + if (pv_glt) { + Glitter::EffectGroup* pv_eff_group + = Glitter::glt_particle_manager.GetEffectGroup(pv_glitter->hash); + if (pv_eff_group && pv_eff_group->CheckModel()) + pv_eff_group->LoadModel(x_data); + } + + if (stg_glt) { + Glitter::EffectGroup* stage_eff_group + = Glitter::glt_particle_manager.GetEffectGroup(stage_glitter->hash); + if (stage_eff_group && stage_eff_group->CheckModel()) + stage_eff_group->LoadModel(x_data); + } + } + state = 3; + } break; + case 3: { + bool wait_load = task_stage_modern_check_not_loaded(); + + 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)) + wait_load = true; + for (std::pair& i : category_load) if (!auth_3d_data_check_category_loaded(i.second)) - return false; + wait_load = true; if (!auth_3d_data_check_category_loaded(light_category.c_str())) - return false; + wait_load = true; + Glitter::EffectGroup* pv_eff_group + = Glitter::glt_particle_manager.GetEffectGroup(pv_glitter->hash); + if (pv_eff_group && pv_eff_group->CheckLoadModel()) + wait_load = true; + + Glitter::EffectGroup* stage_eff_group + = Glitter::glt_particle_manager.GetEffectGroup(stage_glitter->hash); + if (stage_eff_group && stage_eff_group->CheckLoadModel()) + wait_load = true; + + if (!wait_load) + state = 9; + } break; + case 9: { data_struct* x_data = &data_list[DATA_X]; + for (uint32_t& i : objset_load) { + obj_set* set = object_storage_get_obj_set(i); + if (!set) + continue; + + for (uint32_t i = 0; i < set->obj_num; i++) { + obj* obj = &set->obj_data[i]; + for (uint32_t j = 0; j < obj->num_material; j++) { + obj_material* material = &obj->material_array[j].material; + vec3 spec = { 0.5f, 0.5f, 0.5f }; + if (!memcmp(&material->color.specular, &spec, sizeof(vec3))) + *(vec3*)&material->color.specular = vec3_null; + else if (memcmp(&material->color.specular, &vec3_null, sizeof(vec3))) + *(vec3*)&material->color.specular = { 0.1f, 0.1f, 0.1f }; + } + } + } + for (std::string i : pv_auth_3d_names) { uint32_t hash = hash_string_murmurhash(&i); int32_t id = auth_3d_data_load_hash(hash, pv_category_hash, @@ -584,6 +577,15 @@ bool x_pv_game::Ctrl() { stage_effect, bar_count + bar_count_change, bar }); prev_stage_effect = stage_effect; } break; + case DSC_X_SONG_EFFECT_ATTACH: { + int32_t effect_id = (int32_t)data[0]; + int32_t chara_id = (int32_t)data[1]; + + auto elem = pv_auth_3d_chara_count.find(effect_id); + if (elem == pv_auth_3d_chara_count.end()) + elem = pv_auth_3d_chara_count.insert({ effect_id, {} }).first; + elem->second.insert(chara_id); + } break; } } @@ -649,7 +651,7 @@ bool x_pv_game::Ctrl() { if (rob_chr) { playdata[i].rob_chr = rob_chr; rob_chr->frame_speed = anim_frame_speed; - rob_chr->data.adjust.step_data.step = anim_frame_speed; + rob_chr->data.motion.step_data.step = anim_frame_speed; //sub_1404F3000(i, rob_chr, anim_frame_speed); } sub_140122770(this, i); @@ -664,6 +666,8 @@ bool x_pv_game::Ctrl() { state = 10; + x_pv_game_change_field(this, 1, -1, -1); + Glitter::glt_particle_manager.SetPause(false); extern float_t frame_speed; frame_speed = 1.0f; @@ -736,6 +740,7 @@ bool x_pv_game::Ctrl() { 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_req_frame(&id, -1.0f); auth_3d_data_set_frame_rate(&id, &diva_pv_frame_rate); } } @@ -746,8 +751,8 @@ bool x_pv_game::Ctrl() { } else pause = true; - } - else if (state == 10) { + } break; + case 10: { if (step_frame) if (pause) pause = false; @@ -783,10 +788,11 @@ bool x_pv_game::Ctrl() { if (!play || pv_end) state = 11; - } - else if (state == 11) { + } break; + case 11: { Glitter::glt_particle_manager.FreeScenes(); SetDest(); + } break; } return false; } @@ -801,6 +807,14 @@ bool x_pv_game::Dest() { Unload(); task_stage_modern_unload(); + light_param_storage_data_reset(); + post_process_tone_map_set_saturate_coeff(rctx_ptr->post_process.tone_map, 1.0f); + post_process_tone_map_set_scene_fade(rctx_ptr->post_process.tone_map, (vec4*)&vec4_null); + post_process_tone_map_set_scene_fade_blend_func(rctx_ptr->post_process.tone_map, 0); + rctx_ptr->post_process.dof->data.pv.enable = false; + rctx_ptr->object_data.object_culling = true; + rctx_ptr->draw_pass.shadow_ptr->range = 1.0f; + Glitter::glt_particle_manager.SetPause(false); extern float_t frame_speed; frame_speed = 1.0f; @@ -1050,6 +1064,7 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int for (pvpp_chara& i : pp->chara) { if (i.motion.size()) { rob_chara_pv_data pv_data; + pv_data.chara_size_index = chara_init_data_get_chara_size_index(charas[chara_index]); 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) @@ -1063,6 +1078,7 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int if (pv_id == 826) for (int32_t i = (int32_t)pp->chara.size(); i < ROB_CHARA_COUNT; i++) { rob_chara_pv_data pv_data; + pv_data.chara_size_index = chara_init_data_get_chara_size_index(charas[i]); 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; @@ -1137,6 +1153,8 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int stage_effects_ptr = 0; stage_effects_ptr_end = 0; + pv_auth_3d_chara_count.clear(); + dsc_time = 0; dsc_data_ptr = 0; dsc_data_ptr_end = 0; @@ -1281,6 +1299,8 @@ void x_pv_game::Unload() { stage_effects_ptr = 0; stage_effects_ptr_end = 0; + pv_auth_3d_chara_count.clear(); + dsc_time = 0; dsc_data_ptr = 0; dsc_data_ptr_end = 0; @@ -1431,6 +1451,10 @@ static void sub_140122B60(x_pv_game* a1, int32_t chara_id, int32_t motion_index, } } +static void x_pv_game_change_field(x_pv_game* xpvgm, int32_t field, int64_t dsc_time, int64_t curr_time) { + light_param_storage_data_set_pv_cut(field); +} + static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { dsc_x_func func = (dsc_x_func)a1->dsc_data_ptr->func; uint32_t* data = a1->dsc_m.get_func_data(a1->dsc_data_ptr); @@ -1522,8 +1546,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { 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_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; + rob_chr->bone_data->disable_eye_motion = i.disable_eye_motion; + rob_chr->data.motion.step_data.step = i.frame_speed; //if (v45) // pv_expression_array_set_motion(a1->chara_id, i.motion_id); //if (!a1->pv_game->data.pv->disable_calc_motfrm_limit) @@ -1658,7 +1682,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { v519.duration = duration; v519.field_10 = v11; v519.blend_type = MOTION_BLEND_CROSS; - v519.field_18 = true; + v519.disable_eye_motion = true; v519.motion_index = motion_index; v519.dsc_time = v56 ? v56->time : a1->dsc_time; v519.dsc_frame = dsc_frame; @@ -1670,8 +1694,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { 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; + rob_chr->bone_data->disable_eye_motion = true; + rob_chr->data.motion.step_data.step = v519.frame_speed; //if (v84) // pv_expression_array_set_motion(a1->chara_id, motion_id); //if (!a1->pv_game->data.pv->disable_calc_motfrm_limit) @@ -1680,7 +1704,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { else { playdata->set_motion.clear(); playdata->set_motion.push_back(v519); - rob_chr->data.adjust.step_data.step = v519.frame_speed; + rob_chr->data.motion.step_data.step = v519.frame_speed; } } break; case DSC_X_SET_PLAYDATA: { @@ -1729,7 +1753,11 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_CHANGE_FIELD: { - + int32_t field = (int32_t)data[0]; + if (field > 0) + x_pv_game_change_field(a1, field, a1->dsc_time, curr_time); + else + x_pv_game_reset_field(a1); } break; case DSC_X_HIDE_FIELD: { @@ -2221,9 +2249,16 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { 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 == 1) { + chara_index chara_index = CHARA_MIKU; + if (a1->chara_id < a1->pp->chara.size()) + chara_index = (::chara_index)a1->pp->chara[a1->chara_id].chara_effect.base_chara; + else if (a1->pv_id == 826) + chara_index = rob_chara_array_get(a1->chara_id)->chara_index; + + //chara_index chara_index = pv_db_pv::get_performer_chara(a1->pv_game->data.pv, a1->chara_id); + chara_size_index = chara_init_data_get_chara_size_index(chara_index); + } else if (chara_size == 2) chara_size_index = 1; else if (chara_size == 3) @@ -2496,7 +2531,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { for (pvsr_glitter& i : effect.glitter) { uint32_t effect_hash = hash_string_murmurhash(&i.name); - Glitter::glt_particle_manager.LoadScene(hash_murmurhash_empty, effect_hash, true); + Glitter::glt_particle_manager.LoadScene(hash_murmurhash_empty, effect_hash); Glitter::glt_particle_manager.SetSceneName(hash, a1->stage_glitter->name.c_str()); Glitter::glt_particle_manager.SetSceneEffectName( hash_murmurhash_empty, effect_hash, i.name.c_str()); @@ -2531,7 +2566,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { for (pvpp_glitter& i : effect.glitter) { uint32_t effect_hash = hash_string_murmurhash(&i.name); - Glitter::glt_particle_manager.LoadScene(hash_murmurhash_empty, effect_hash, true); + Glitter::glt_particle_manager.LoadScene(hash_murmurhash_empty, effect_hash); Glitter::glt_particle_manager.SetSceneName(hash, a1->pv_glitter->name.c_str()); Glitter::glt_particle_manager.SetSceneEffectName( hash_murmurhash_empty, effect_hash, i.name.c_str()); @@ -2557,7 +2592,9 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (effect_id >= a1->pp->effect.size()) break; - uint32_t hash = a1->pv_glitter->hash; + auto elem = a1->pv_auth_3d_chara_count.find(effect_id); + if (elem != a1->pv_auth_3d_chara_count.end() && elem->second.size()) + chara_id = -1; pvpp_effect& effect = a1->pp->effect[effect_id]; for (pvpp_a3da& i : effect.a3da) { @@ -2999,11 +3036,15 @@ static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { 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_reset_field(x_pv_game* xpvgm) { + task_stage_modern_info v14; + task_stage_modern_set_stage(&v14); + Glitter::glt_particle_manager.FreeScenes(); +} + static void x_pv_game_stage_effect_ctrl(x_pv_game* xpvgm) { x_pv_game_stage_effect& stage_effect = xpvgm->stage_effect; @@ -3088,7 +3129,7 @@ static void x_pv_game_stage_effect_start(x_pv_game* xpvgm, pvsr_stage_effect* st for (pvsr_glitter& i : stage_effect->glitter) { uint32_t effect_hash = hash_string_murmurhash(&i.name); - Glitter::glt_particle_manager.LoadScene(hash_murmurhash_empty, effect_hash, true); + Glitter::glt_particle_manager.LoadScene(hash_murmurhash_empty, effect_hash); Glitter::glt_particle_manager.SetSceneName(hash, xpvgm->stage_glitter->name.c_str()); Glitter::glt_particle_manager.SetSceneEffectName( hash_murmurhash_empty, effect_hash, i.name.c_str()); diff --git a/src/CLOUD/x_pv_game.hpp b/src/CLOUD/x_pv_game.hpp index e849c858..533a071f 100644 --- a/src/CLOUD/x_pv_game.hpp +++ b/src/CLOUD/x_pv_game.hpp @@ -35,7 +35,7 @@ struct pv_play_data_set_motion { float_t duration; bool field_10; MotionBlendType blend_type; - bool field_18; + bool disable_eye_motion; int32_t motion_index; int64_t dsc_time; float_t dsc_frame; @@ -210,6 +210,8 @@ public: x_pv_game_stage_effect_init* stage_effects_ptr; x_pv_game_stage_effect_init* stage_effects_ptr_end; + std::map> pv_auth_3d_chara_count; + bool play; bool success; int32_t chara_id; diff --git a/src/CRE/Glitter/effect.cpp b/src/CRE/Glitter/effect.cpp index 667548a3..b47b9c3a 100644 --- a/src/CRE/Glitter/effect.cpp +++ b/src/CRE/Glitter/effect.cpp @@ -93,34 +93,34 @@ static bool glitter_effect_pack_file(GLT, f2_struct* st, glitter_effect* a2) { enrs_entry ee; ee = { 0, 2, 56, 1 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 12, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 12, ENRS_DWORD); e.vec.push_back(ee); l += o = 56; if (a2->version == 7) { ee = { 0, 1, 4, 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); l += o = 4; } ee = { 0, 1, 4, 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); l += o = 4; if (~a2->data.flags & EFFECT_LOCAL && ext_anim) if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA_ANIM) { ee = { 0, 1, 12, 1 }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); l += o = 12; } else { ee = { 0, 2, 140, 1 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); l += o = 140; } @@ -144,7 +144,7 @@ static bool glitter_effect_pack_file(GLT, f2_struct* st, glitter_effect* a2) { *(uint64_t*)d = GLT_VAL != Glitter::FT ? hash_utf8_murmurhash(a2->name) - : hash_utf8_fnv1a64m(a2->name);; + : hash_utf8_fnv1a64m(a2->name); *(int32_t*)(d + 8) = a2->data.appear_time; *(int32_t*)(d + 12) = a2->data.life_time; *(int32_t*)(d + 16) = a2->data.start_time; diff --git a/src/CRE/Glitter/effect_group.cpp b/src/CRE/Glitter/effect_group.cpp index cdfaa4b5..f76e003b 100644 --- a/src/CRE/Glitter/effect_group.cpp +++ b/src/CRE/Glitter/effect_group.cpp @@ -55,12 +55,13 @@ namespace Glitter { if (!set) continue; - 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* mat = &obj->materials[j].material; - if (!memcmp(&mat->emission, &vec3_null, sizeof(vec3)) && mat->emission.w == 1.0f) - mat->emission = vec4u_identity; + for (uint32_t i = 0; i < set->obj_num; i++) { + obj* obj = &set->obj_data[i]; + for (uint32_t j = 0; j < obj->num_material; j++) { + obj_material* mat = &obj->material_array[j].material; + if (!memcmp(&mat->color.emission, &vec3_null, sizeof(vec3)) + && mat->color.emission.w == 1.0f) + mat->color.emission = vec4u_identity; } } } diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index 0ce881f0..c272c8d0 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -24,6 +24,7 @@ namespace Glitter { mat = mat4_identity; flags = (EffectInstFlag)0; random = 0; + min_color = vec4u_null; if (appear_now) data.appear_time = 0; @@ -313,7 +314,7 @@ namespace Glitter { mat4 mat; int32_t chara_id; - if (this->flags & EFFECT_INST_CHARA_ANIM) { + if (flags & EFFECT_INST_CHARA_ANIM) { rob_chara* rob_chr = rob_chara_array_get(ext_anim->chara_index); if (!rob_chr) return; @@ -322,13 +323,13 @@ namespace Glitter { vec3 scale; mat4_get_scale(&mat, &scale); - vec3_sub_scalar(scale, 1.0f, this->ext_anim_scale); - this->ext_anim_scale.z = 0.0f; - enum_or(this->flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); + vec3_sub_scalar(scale, 1.0f, ext_anim_scale); + ext_anim_scale.z = 0.0f; + enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); int32_t bone_index = ext_anim->bone_index; if (bone_index == -1) { - if (this->flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { + if (flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { ext_anim->mat = mat4_identity; mat4_get_translation(&mat, &ext_anim->translation); } @@ -341,7 +342,7 @@ namespace Glitter { return; mat4_mult(bone_mat, &mat, &mat); - if (this->flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { + if (flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { ext_anim->mat = mat4_identity; mat4_get_translation(&mat, &ext_anim->translation); } @@ -351,7 +352,7 @@ namespace Glitter { goto SetFlags; } - if (~this->flags & EFFECT_INST_GET_EXT_ANIM_MAT) { + if (~flags & EFFECT_INST_GET_EXT_ANIM_MAT) { if (ext_anim->mesh_index == -1) { if (!ext_anim->mesh_name) return; @@ -397,9 +398,9 @@ namespace Glitter { vec3 scale; mat4_get_scale(&mat, &scale); - vec3_sub_scalar(scale, 1.0f, this->ext_anim_scale); - this->ext_anim_scale.z = 0.0f; - enum_or(this->flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); + vec3_sub_scalar(scale, 1.0f, ext_anim_scale); + ext_anim_scale.z = 0.0f; + enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); } } @@ -421,7 +422,7 @@ namespace Glitter { } else { mat4_mult(obj_mat, &mat, &mat); - if (this->flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { + if (flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { ext_anim->mat = mat4_identity; mat4_get_translation(&mat, &ext_anim->translation); } @@ -432,9 +433,9 @@ namespace Glitter { return; SetFlags: - if (this->flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT) { - enum_and(this->flags, ~EFFECT_INST_HAS_EXT_ANIM_NON_INIT); - enum_or(this->flags, EFFECT_INST_HAS_EXT_ANIM_TRANS); + if (flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT) { + enum_and(flags, ~EFFECT_INST_HAS_EXT_ANIM_NON_INIT); + enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_TRANS); } } @@ -450,51 +451,82 @@ namespace Glitter { switch (curve->type) { case CURVE_TRANSLATION_X: - this->translation.x = value; + translation.x = value; break; case CURVE_TRANSLATION_Y: - this->translation.y = value; + translation.y = value; break; case CURVE_TRANSLATION_Z: - this->translation.z = value; + translation.z = value; break; case CURVE_ROTATION_X: - this->rotation.x = value; + rotation.x = value; break; case CURVE_ROTATION_Y: - this->rotation.y = value; + rotation.y = value; break; case CURVE_ROTATION_Z: - this->rotation.z = value; + rotation.z = value; break; case CURVE_SCALE_X: - this->scale.x = value; + scale.x = value; break; case CURVE_SCALE_Y: - this->scale.y = value; + scale.y = value; break; case CURVE_SCALE_Z: - this->scale.z = value; + scale.z = value; break; case CURVE_SCALE_ALL: - this->scale_all = value; + scale_all = value; break; //case CURVE_COLOR_R: - // this->color.x = value; + // color.x = value; // break; //case CURVE_COLOR_G: - // this->color.y = value; + // color.y = value; // break; //case CURVE_COLOR_B: - // this->color.z = value; + // color.z = value; // break; //case CURVE_COLOR_A: - // this->color.w = value; + // color.w = value; // break; } } } + void F2EffectInst::SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a) { + if (~flags & EFFECT_INST_SET_ADD_MIN_COLOR) + return; + + if (flags & EFFECT_INST_SET_MIN_COLOR) { + if (min_color.x >= 0.0f) + r = min_color.x; + if (min_color.y >= 0.0f) + g = min_color.y; + if (min_color.z >= 0.0f) + b = min_color.z; + if (min_color.w >= 0.0f) + a = min_color.w; + } + else { + r = min_color.x + r; + g = min_color.y + g; + b = min_color.z + b; + a = min_color.w + a; + } + + if (r < 0.0f) + r = 0.0f; + if (g < 0.0f) + g = 0.0f; + if (b < 0.0f) + b = 0.0f; + if (a < 0.0f) + a = 0.0f; + } + int32_t EffectInst::GetExtAnimBoneIndex(EffectExtAnimCharaNode node) { if (node < EFFECT_EXT_ANIM_CHARA_HEAD || node > EFFECT_EXT_ANIM_CHARA_RIGHT_TOE) return -1; @@ -527,9 +559,9 @@ namespace Glitter { "kl_toe_r_wj" }; - const char* bone_name = bone_names[node]; + uint64_t bone_name_hash = hash_utf8_fnv1a64m(bone_names[node]); for (std::string& i : *motion_bone_names) - if (!str_utils_compare(bone_name, i.c_str())) + if (bone_name_hash == hash_string_fnv1a64m(&i)) return (int32_t)(&i - motion_bone_names->data()); return -1; } @@ -1026,4 +1058,39 @@ namespace Glitter { enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_TRANS); this->flags = flags; } + + void XEffectInst::SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a) { + if (~flags & EFFECT_INST_SET_ADD_MIN_COLOR) + return; + + if (flags & EFFECT_INST_SET_MIN_COLOR) { + if (min_color.x >= 0.0f) + r = min_color.x; + if (min_color.y >= 0.0f) + g = min_color.y; + if (min_color.z >= 0.0f) + b = min_color.z; + if (min_color.w >= 0.0f) + a = min_color.w; + } + else { + if (min_color.x >= 0.0f) + r *= min_color.x; + if (min_color.y >= 0.0f) + g *= min_color.y; + if (min_color.z >= 0.0f) + b *= min_color.z; + if (min_color.w >= 0.0f) + a *= min_color.w; + } + + if (r < 0.0f) + r = 0.0f; + if (g < 0.0f) + g = 0.0f; + if (b < 0.0f) + b = 0.0f; + if (a < 0.0f) + a = 0.0f; + } } diff --git a/src/CRE/Glitter/emitter.cpp b/src/CRE/Glitter/emitter.cpp index 3cf7b78b..6cbf5042 100644 --- a/src/CRE/Glitter/emitter.cpp +++ b/src/CRE/Glitter/emitter.cpp @@ -72,36 +72,36 @@ static bool glitter_emitter_pack_file(GLT, f2_struct* st, glitter_emitter* a2) { enrs_entry ee; ee = { 0, 5, 96, 1 }; - ee.sub.push_back({ 0, 5, ENRS_DWORD }); - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 2, ENRS_DWORD }); - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 15, ENRS_DWORD }); + ee.append(0, 5, ENRS_DWORD); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 2, ENRS_DWORD); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 15, ENRS_DWORD); e.vec.push_back(ee); l += o = 96; switch (a2->data.type) { case EMITTER_BOX: ee = { o, 1, 12, 1 }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); l += o = 12; break; case EMITTER_CYLINDER: ee = { o, 1, 20, 1 }; - ee.sub.push_back({ 0, 5, ENRS_DWORD }); + ee.append(0, 5, ENRS_DWORD); e.vec.push_back(ee); l += o = 20; break; case EMITTER_SPHERE: ee = { o, 1, 16, 1 }; - ee.sub.push_back({ 0, 4, ENRS_DWORD }); + ee.append(0, 4, ENRS_DWORD); e.vec.push_back(ee); l += o = 16; break; case EMITTER_POLYGON: ee = { o, 1, 8, 1 }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_DWORD); e.vec.push_back(ee); l += o = 8; break; diff --git a/src/CRE/Glitter/emitter_inst.cpp b/src/CRE/Glitter/emitter_inst.cpp index b014811a..3e7a8943 100644 --- a/src/CRE/Glitter/emitter_inst.cpp +++ b/src/CRE/Glitter/emitter_inst.cpp @@ -4,6 +4,7 @@ */ #include "glitter.hpp" +#include "../render_context.hpp" namespace Glitter { EmitterInst::EmitterInst(Emitter* emit, Random* random) : emission_timer(), flags(), random() { @@ -142,7 +143,7 @@ namespace Glitter { mat4 dir_mat; switch (data.direction) { case DIRECTION_BILLBOARD: - mat4_from_mat3(&GPM_VAL->cam_inv_view_mat3, &dir_mat); + mat4_from_mat3(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &dir_mat); mat4_mult(&eff_inst->mat, &dir_mat, &dir_mat); mat4_clear_trans(&dir_mat, &dir_mat); break; @@ -156,7 +157,7 @@ namespace Glitter { mat4_rotate_z((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam_rotation_y, &dir_mat); + mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat); break; default: mult = false; @@ -575,7 +576,7 @@ namespace Glitter { switch (data.direction) { case DIRECTION_BILLBOARD: if (eff_inst->data.flags & EFFECT_LOCAL) { - dir_mat = GPM_VAL->cam_view; + dir_mat = ((render_context*)GPM_VAL->rctx)->camera->view; mat4_clear_trans(&dir_mat, &dir_mat); mat4_mult(&dir_mat, &mat, &dir_mat); } @@ -583,7 +584,7 @@ namespace Glitter { dir_mat = mat; mat4 inv_view_mat; - mat4_from_mat3(&GPM_VAL->cam_inv_view_mat3, &inv_view_mat); + mat4_from_mat3(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &inv_view_mat); mat4_mult(&dir_mat, &inv_view_mat, &dir_mat); mat4_clear_trans(&dir_mat, &dir_mat); break; @@ -594,7 +595,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam_rotation_y, &dir_mat); + mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat); break; default: mult = false; diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index 72e96007..fba1801b 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -292,8 +292,8 @@ namespace Glitter { enrs_entry ee; ee = { 0, 2, 32, 1 }; - ee.sub.push_back({ 0, 4, ENRS_DWORD }); - ee.sub.push_back({ 0, 3, ENRS_WORD }); + ee.append(0, 4, ENRS_DWORD); + ee.append(0, 3, ENRS_WORD); e.vec.push_back(ee); l += o = 32; @@ -1123,14 +1123,14 @@ namespace Glitter { key_type = keys->front().type; if (key_type == KEY_HERMITE) { ee = { 0, 2, 20, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 4, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 4, ENRS_DWORD); l = 20; } else { ee = { 0, 2, 12, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 2, ENRS_DWORD); l = 12; } @@ -1151,13 +1151,13 @@ namespace Glitter { o = (uint32_t)((key_type == KEY_HERMITE ? 20 : 12) * count); if (i->type == KEY_HERMITE) { ee = { o, 2, 20, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 4, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 4, ENRS_DWORD); } else { ee = { o, 2, 12, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 2, ENRS_DWORD); } key_type = i->type; } @@ -1166,14 +1166,14 @@ namespace Glitter { key_type = keys->front().type; if (key_type == KEY_HERMITE) { ee = { 0, 2, 16, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 3, ENRS_DWORD); l = 16; } else { ee = { 0, 2, 8, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 1, ENRS_DWORD); l = 8; } @@ -1194,13 +1194,13 @@ namespace Glitter { o = (uint32_t)((key_type == KEY_HERMITE ? 16 : 8) * count); if (i->type == KEY_HERMITE) { ee = { o, 2, 16, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 3, ENRS_DWORD); } else { ee = { o, 2, 8, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 1, ENRS_DWORD); } key_type = i->type; } @@ -1354,7 +1354,7 @@ namespace Glitter { enrs_entry ee; ee = { 0, 1, 4, 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); length = 0; @@ -1511,8 +1511,8 @@ namespace Glitter { enrs_entry ee; ee = { 0, 2, (uint32_t)(8 + count * 8), 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, (uint32_t)count, ENRS_QWORD }); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, (uint32_t)count, ENRS_QWORD); e.vec.push_back(ee); l += 8 + count * 8; diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 948e1a42..b8cb7955 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -772,6 +772,7 @@ namespace Glitter { EffectInstFlag flags; size_t id; uint32_t random; + vec4u min_color; EffectInst(GPM, GLT, Effect* eff, size_t id, float_t emission, bool appear_now); @@ -837,6 +838,7 @@ namespace Glitter { void CtrlInit(GPM, GLT, float_t emission); void GetExtAnim(); void GetValue(GLT); + void SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a); }; class XEffectInst : public EffectInst { @@ -890,6 +892,7 @@ namespace Glitter { void GetExtAnim(); void GetValue(); void SetExtAnim(mat4* a2, mat4* a3, vec3* trans, bool set_flags); + void SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a); }; class Emitter : public Node { @@ -1191,10 +1194,12 @@ namespace Glitter { void Emit(GPM, GLT, int32_t dup_count, int32_t count, float_t emission); void EmitParticle(GPM, GLT, RenderElement* rend_elem, F2EmitterInst* emit_inst, F2ParticleInst::Data* ptcl_inst_data, int32_t index, Random* random); - void GetValue(GLT, RenderElement* rend_elem, float_t frame, Random* random); + void GetColor(Glitter::RenderElement* rend_elem); + bool GetValue(GLT, RenderElement* rend_elem, float_t frame, Random* random); void Free(bool free); bool HasEnded(bool a2); void Reset(); + void SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a); void StepUVParticle(GLT, RenderElement* rend_elem, float_t delta_frame, Random* random); }; @@ -1226,10 +1231,12 @@ namespace Glitter { void Emit(int32_t dup_count, int32_t count, float_t emission); void EmitParticle(RenderElement* rend_elem, XEmitterInst* emit_inst, XParticleInst::Data* ptcl_inst_data, int32_t index, uint8_t step, Random* random); - void GetValue(RenderElement* rend_elem, float_t frame, Random* random, float_t* color_scale); + void GetColor(Glitter::RenderElement* rend_elem, float_t color_scale); + bool GetValue(RenderElement* rend_elem, float_t frame, Random* random, float_t* color_scale); void Free(bool free); bool HasEnded(bool a2); void Reset(); + void SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a); void StepUVParticle(RenderElement* rend_elem, float_t delta_frame, Random* random); }; @@ -1404,12 +1411,6 @@ namespace Glitter { uint32_t texture_counter; Random random; uint32_t counter; - mat4 cam_projection; - mat4 cam_view; - mat4 cam_inv_view; - mat3 cam_inv_view_mat3; - vec3 cam_view_point; - float_t cam_rotation_y; bool draw_all; bool draw_all_mesh; bool draw_selected; diff --git a/src/CRE/Glitter/particle.cpp b/src/CRE/Glitter/particle.cpp index ab756b3a..9cfb46cd 100644 --- a/src/CRE/Glitter/particle.cpp +++ b/src/CRE/Glitter/particle.cpp @@ -88,33 +88,33 @@ static bool glitter_particle_pack_file(GLT, enrs_entry ee; ee = { 0, 1, 204, 1 }; - ee.sub.push_back({ 0, 51, ENRS_DWORD }); + ee.append(0, 51, ENRS_DWORD); e.vec.push_back(ee); l += o = 204; if (a3->version == 3) { ee = { o, 1, 8, 1 }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_DWORD); e.vec.push_back(ee); l += o = 8; } if (a3->data.type == PARTICLE_LOCUS || a3->data.type == PARTICLE_MESH) { ee = { o, 1, 4, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); + ee.append(0, 2, ENRS_WORD); e.vec.push_back(ee); l += o = 4; } ee = { o, 4, 44, 1 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 4, 5, ENRS_DWORD }); - ee.sub.push_back({ 0, 2, ENRS_WORD }); - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(4, 5, ENRS_DWORD); + ee.append(0, 2, ENRS_WORD); + ee.append(0, 2, ENRS_DWORD); if (a1->version >= 7) { ee.count++; ee.size += 4; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append.push_back(0, 1, ENRS_DWORD); e.vec.push_back(ee); l += o = 48; } @@ -124,8 +124,8 @@ static bool glitter_particle_pack_file(GLT, } ee = { o, 2, 12, 1 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append.push_back(0, 1, ENRS_QWORD); + ee.append.push_back(0, 1, ENRS_DWORD); e.vec.push_back(ee); l += o = 12; diff --git a/src/CRE/Glitter/particle_inst.cpp b/src/CRE/Glitter/particle_inst.cpp index 7f66c19d..3cb7aca7 100644 --- a/src/CRE/Glitter/particle_inst.cpp +++ b/src/CRE/Glitter/particle_inst.cpp @@ -130,6 +130,13 @@ namespace Glitter { } } + void F2ParticleInst::SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a) { + if (data.effect) + data.effect->SetMinColor(r, g, b, a); + else if (data.parent && data.parent->data.effect) + data.parent->data.effect->SetMinColor(r, g, b, a); + } + void F2ParticleInst::Copy(F2ParticleInst* dst, float_t emission) { dst->data.flags = data.flags; if (data.render_group && dst->data.render_group) @@ -289,7 +296,35 @@ namespace Glitter { i->Free(free); } - void F2ParticleInst::GetValue(GLT, RenderElement* rend_elem, float_t frame, Random* random) { + void F2ParticleInst::GetColor(Glitter::RenderElement* rend_elem) { + float_t r = rend_elem->color.x; + if (r < 0.0f) + r = data.data.color.x; + + float_t g = rend_elem->color.y; + if (g < 0.0f) + g = data.data.color.y; + + float_t b = rend_elem->color.z; + if (b < 0.0f) + b = data.data.color.z; + + float_t a = rend_elem->color.w; + if (a < 0.0f) + a = data.data.color.w; + + SetMinColor(r, g, b, a); + + rend_elem->color.x = r; + rend_elem->color.y = g; + rend_elem->color.z = b; + rend_elem->color.w = a; + + if (a < 0.01f) + rend_elem->disp = false; + } + + bool F2ParticleInst::GetValue(GLT, RenderElement* rend_elem, float_t frame, Random* random) { float_t value = 0.0f; bool has_translation = false; vec3 translation = vec3_null; @@ -349,7 +384,7 @@ namespace Glitter { rend_elem->color.w = value; if (value < 0.01f) { rend_elem->disp = false; - return; + return false; } break; case CURVE_U_SCROLL: @@ -367,6 +402,7 @@ namespace Glitter { mat4_mult_vec3_trans(&rend_elem->mat, &translation, &translation); rend_elem->translation = translation; } + return true; } bool F2ParticleInst::HasEnded(bool a2) { @@ -552,8 +588,31 @@ namespace Glitter { rend_elem->speed = max(speed, 0.0f); } - void XParticleInst::Copy(XParticleInst* dst, float_t emission) { + void XParticleInst::SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a) { + if (data.effect) + data.effect->SetMinColor(r, g, b, a); + else if (data.parent && data.parent->data.effect) + data.parent->data.effect->SetMinColor(r, g, b, a); + } + void XParticleInst::Copy(XParticleInst* dst, float_t emission) { + dst->data.flags = data.flags; + if (data.render_group && dst->data.render_group) + data.render_group->Copy(dst->data.render_group); + + for (XParticleInst*& i : dst->data.children) + if (i) { + delete i; + i = 0; + } + dst->data.children.clear(); + + for (XParticleInst*& i : data.children) + if (i) { + XParticleInst* child = new XParticleInst(this, emission); + dst->data.children.push_back(child); + i->Copy(child, emission); + } } void XParticleInst::Emit(int32_t dup_count, int32_t count, float_t emission) { @@ -706,7 +765,47 @@ namespace Glitter { random->XStepValue(); } - void XParticleInst::GetValue(RenderElement* rend_elem, float_t frame, Random* random, float_t* color_scale) { + void XParticleInst::GetColor(Glitter::RenderElement* rend_elem, float_t color_scale) { + float_t r = rend_elem->color.x; + if (r < 0.0f) + r = data.data.color.x; + + float_t g = rend_elem->color.y; + if (g < 0.0f) + g = data.data.color.y; + + float_t b = rend_elem->color.z; + if (b < 0.0f) + b = data.data.color.z; + + float_t a = rend_elem->color.w; + if (a < 0.0f) + a = data.data.color.w; + + if (color_scale >= 0.0f) { + r *= color_scale; + g *= color_scale; + b *= color_scale; + } + + if (rend_elem->fade_out_frames > 0.0f + && rend_elem->life_time < (rend_elem->frame + rend_elem->fade_out_frames)) + a *= (rend_elem->life_time - rend_elem->frame) / rend_elem->fade_out_frames; + else if (rend_elem->fade_in_frames > 0.0f && rend_elem->frame < rend_elem->fade_in_frames) + a *= rend_elem->frame / rend_elem->fade_in_frames; + + SetMinColor(r, g, b, a); + + rend_elem->color.x = r; + rend_elem->color.y = g; + rend_elem->color.z = b; + rend_elem->color.w = a; + + if (a < 0.01f) + rend_elem->disp = false; + } + + bool XParticleInst::GetValue(RenderElement* rend_elem, float_t frame, Random* random, float_t* color_scale) { float_t value = 0.0f; vec3 translation = vec3_null; bool has_translation = false; @@ -742,15 +841,31 @@ namespace Glitter { break; case CURVE_SCALE_X: rend_elem->scale.x = value; + if (fabsf(value) <= 0.000001f) { + rend_elem->disp = false; + return false; + } break; case CURVE_SCALE_Y: rend_elem->scale.y = value; + if (fabsf(value) <= 0.000001f) { + rend_elem->disp = false; + return false; + } break; case CURVE_SCALE_Z: rend_elem->scale.z = value; + if (fabsf(value) <= 0.000001f) { + rend_elem->disp = false; + return false; + } break; case CURVE_SCALE_ALL: rend_elem->scale_all = value; + if (fabsf(value) <= 0.000001f) { + rend_elem->disp = false; + return false; + } break; case CURVE_COLOR_R: rend_elem->color.x = value; @@ -763,8 +878,10 @@ namespace Glitter { break; case CURVE_COLOR_A: rend_elem->color.w = value; - if (value < 0.01f) + if (value < 0.01f) { rend_elem->disp = false; + return false; + } break; case CURVE_COLOR_RGB_SCALE: *color_scale = value; @@ -790,6 +907,7 @@ namespace Glitter { mat4_mult_vec3_trans(&rend_elem->mat, &translation, &translation); rend_elem->translation = translation; } + return true; } void XParticleInst::Free(bool free) { diff --git a/src/CRE/Glitter/particle_manager.cpp b/src/CRE/Glitter/particle_manager.cpp index a4e85478..067e1057 100644 --- a/src/CRE/Glitter/particle_manager.cpp +++ b/src/CRE/Glitter/particle_manager.cpp @@ -8,8 +8,7 @@ namespace Glitter { GltParticleManager::GltParticleManager() :scene(), effect(), emitter(), particle(), rctx(), bone_data(), frame_rate(), flags(), scene_load_counter(), emission(1.5f), delta_frame(2.0f), - texture_counter(), random(), counter(), cam_projection(), cam_view(), cam_inv_view(), cam_inv_view_mat3(), - cam_view_point(), cam_rotation_y(), draw_all(true), draw_all_mesh(true), draw_selected() { + texture_counter(), random(), counter(), draw_all(true), draw_all_mesh(true), draw_selected() { scenes.reserve(0x100); file_readers.reserve(0x100); } diff --git a/src/CRE/Glitter/render_group.cpp b/src/CRE/Glitter/render_group.cpp index 7e4d7576..da36f4a6 100644 --- a/src/CRE/Glitter/render_group.cpp +++ b/src/CRE/Glitter/render_group.cpp @@ -205,25 +205,15 @@ namespace Glitter { vec2_add(rend_elem->uv_scroll, uv_scroll, rend_elem->uv_scroll); particle->StepUVParticle(GLT_VAL, rend_elem, delta_frame, random_ptr); - rend_elem->color = { -1.0f, -1.0f, -1.0f, -1.0f }; rend_elem->disp = true; + rend_elem->color = { -1.0f, -1.0f, -1.0f, -1.0f }; + bool disp = true; if (particle->data.data.sub_flags & PARTICLE_SUB_USE_CURVE) - particle->GetValue(GLT_VAL, rend_elem, rend_elem->frame, random_ptr); + disp = particle->GetValue(GLT_VAL, rend_elem, rend_elem->frame, random_ptr); - if (rend_elem->disp) { - if (rend_elem->color.x < 0.0f) - rend_elem->color.x = particle->data.data.color.x; - if (rend_elem->color.y < 0.0f) - rend_elem->color.y = particle->data.data.color.y; - if (rend_elem->color.z < 0.0f) - rend_elem->color.z = particle->data.data.color.z; - if (rend_elem->color.w < 0.0f) - rend_elem->color.w = particle->data.data.color.w; - - if (rend_elem->color.w < 0.01f) - rend_elem->disp = false; - } + if (disp) + particle->GetColor(rend_elem); if (particle->data.data.type == PARTICLE_LOCUS) rend_elem->locus_history->Append(rend_elem, particle); @@ -559,35 +549,16 @@ namespace Glitter { } particle->StepUVParticle(rend_elem, delta_frame, random_ptr); - rend_elem->color = { -1.0f, -1.0f, -1.0f, -1.0f }; rend_elem->disp = true; + rend_elem->color = { -1.0f, -1.0f, -1.0f, -1.0f }; + bool disp = true; float_t color_scale = -1.0f; if (particle->data.data.sub_flags & PARTICLE_SUB_USE_CURVE) - particle->GetValue(rend_elem, rend_elem->frame, random_ptr, &color_scale); + disp = particle->GetValue(rend_elem, rend_elem->frame, random_ptr, &color_scale); - if (rend_elem->disp) { - if (rend_elem->color.x < 0.0f) - rend_elem->color.x = particle->data.data.color.x; - if (rend_elem->color.y < 0.0f) - rend_elem->color.y = particle->data.data.color.y; - if (rend_elem->color.z < 0.0f) - rend_elem->color.z = particle->data.data.color.z; - if (rend_elem->color.w < 0.0f) - rend_elem->color.w = particle->data.data.color.w; - - if (color_scale >= 0.0f) - vec3_mult_scalar(*(vec3*)&rend_elem->color, color_scale, *(vec3*)&rend_elem->color); - - if (rend_elem->fade_out_frames > 0.0 - && (rend_elem->life_time - rend_elem->frame) < rend_elem->fade_out_frames) - rend_elem->color.w *= (rend_elem->life_time - rend_elem->frame) / rend_elem->fade_out_frames; - else if (rend_elem->fade_in_frames > 0.0 && rend_elem->frame < rend_elem->fade_in_frames) - rend_elem->color.w *= rend_elem->frame / rend_elem->fade_in_frames; - - if (rend_elem->color.w < 0.01f) - rend_elem->disp = false; - } + if (disp) + particle->GetColor(rend_elem, color_scale); if (particle->data.data.type == PARTICLE_LOCUS) rend_elem->locus_history->Append(rend_elem, particle); diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index bae281a1..7428f595 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -281,9 +281,9 @@ namespace Glitter { vec3 x_vec = { 1.0f, 0.0f, 0.0f }; if (rend_group->flags & PARTICLE_LOCAL) { mat4 mat; - mat4_mult(&GPM_VAL->cam_inv_view, &rend_group->mat, &mat); - mat4_mult(&GPM_VAL->cam_view, &mat, &mat); - mat4_mult(&mat, &GPM_VAL->cam_inv_view, &rend_group->mat_draw); + mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat, &mat); + mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->view, &mat, &mat); + mat4_mult(&mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw); } else rend_group->mat_draw = mat4_identity; @@ -311,7 +311,7 @@ namespace Glitter { else model_mat = mat3_identity; - mat3_mult_vec(&GPM_VAL->cam_inv_view_mat3, &x_vec, &x_vec); + mat3_mult_vec(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &x_vec, &x_vec); gl_state_bind_array_buffer(rend_group->vbo); Buffer* buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); @@ -411,13 +411,13 @@ namespace Glitter { if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { model_mat = rend_group->mat; mat4_normalize_rotation(&model_mat, &view_mat); - mat4_mult(&view_mat, &GPM_VAL->cam_view, &view_mat); + mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->view, &view_mat); mat4_inverse(&view_mat, &inv_view_mat); } else { model_mat = mat4_identity; - view_mat = GPM_VAL->cam_view; - inv_view_mat = GPM_VAL->cam_inv_view; + view_mat = ((render_context*)GPM_VAL->rctx)->camera->view; + inv_view_mat = ((render_context*)GPM_VAL->rctx)->camera->inv_view; } if (rend_group->flags & PARTICLE_LOCAL) { @@ -426,7 +426,7 @@ namespace Glitter { mat4_inverse(&view_mat, &inv_view_mat); } - mat4_mult(&view_mat, &GPM_VAL->cam_inv_view, &rend_group->mat_draw); + mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw); mat4 dir_mat; switch (rend_group->draw_type) { @@ -456,7 +456,7 @@ namespace Glitter { mat4_rotate_z((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam_rotation_y, &dir_mat); + mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat); break; default: dir_mat = mat4_identity; @@ -607,7 +607,7 @@ namespace Glitter { if (fabsf(rend_group->z_offset) > 0.000001f) { use_z_offset = true; mat4_get_translation(model_mat, &dist_to_cam); - vec3_sub(GPM_VAL->cam_view_point, dist_to_cam, dist_to_cam); + vec3_sub(((render_context*)GPM_VAL->rctx)->camera->view_point, dist_to_cam, dist_to_cam); if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { mat4_normalize_rotation(model_mat, &z_offset_inv_mat); mat4_inverse(&z_offset_inv_mat, &z_offset_inv_mat); @@ -1007,7 +1007,8 @@ namespace Glitter { shader_state_material_set_emission(&shaders_ft, false, emission, emission, emission, 1.0f); shader_state_matrix_set_mvp_separate(&shaders_ft, - &rend_group->mat_draw, &GPM_VAL->cam_view, &GPM_VAL->cam_projection); + &rend_group->mat_draw, &((render_context*)GPM_VAL->rctx)->camera->view, + &((render_context*)GPM_VAL->rctx)->camera->projection); shader_state_matrix_set_texture(&shaders_ft, 0, (mat4*)&mat4_identity); shader_state_matrix_set_texture(&shaders_ft, 1, (mat4*)&mat4_identity); shader_env_vert_set_ptr(&shaders_ft, 3, (vec4*)&vec4_identity); @@ -1254,9 +1255,9 @@ namespace Glitter { vec3 x_vec = { 1.0f, 0.0f, 0.0f }; if (rend_group->flags & PARTICLE_LOCAL) { mat4 mat; - mat4_mult(&GPM_VAL->cam_inv_view, &rend_group->mat, &mat); - mat4_mult(&GPM_VAL->cam_view, &mat, &mat); - mat4_mult(&mat, &GPM_VAL->cam_inv_view, &rend_group->mat_draw); + mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat, &mat); + mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->view, &mat, &mat); + mat4_mult(&mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw); } else rend_group->mat_draw = mat4_identity; @@ -1282,7 +1283,7 @@ namespace Glitter { else model_mat = mat3_identity; - mat3_mult_vec(&GPM_VAL->cam_inv_view_mat3, &x_vec, &x_vec); + mat3_mult_vec(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &x_vec, &x_vec); gl_state_bind_array_buffer(rend_group->vbo); Buffer* buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); @@ -1385,7 +1386,7 @@ namespace Glitter { if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { model_mat = rend_group->mat; mat4_normalize_rotation(&model_mat, &view_mat); - mat4_mult(&view_mat, &GPM_VAL->cam_view, &view_mat); + mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->view, &view_mat); mat4_inverse(&view_mat, &inv_view_mat); emitter_local = true; @@ -1398,8 +1399,8 @@ namespace Glitter { } else { model_mat = mat4_identity; - view_mat = GPM_VAL->cam_view; - inv_view_mat = GPM_VAL->cam_inv_view; + view_mat = ((render_context*)GPM_VAL->rctx)->camera->view; + inv_view_mat = ((render_context*)GPM_VAL->rctx)->camera->inv_view; } bool draw_local = false; @@ -1409,7 +1410,7 @@ namespace Glitter { mat4_inverse(&view_mat, &inv_view_mat); draw_local = true; } - mat4_mult(&view_mat, &GPM_VAL->cam_inv_view, &rend_group->mat_draw); + mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw); mat4 dir_mat = mat4_identity; vec3 up_vec = { 0.0f, 0.0f, 1.0f }; @@ -1440,7 +1441,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam_rotation_y, &dir_mat); + mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat); break; case DIRECTION_EMITTER_ROTATION: emitter_rotation = true; @@ -1514,19 +1515,19 @@ namespace Glitter { object_data->texture_pattern_count = 0; int32_t ttc = 0; texture_transform_struct* tt = object_data->texture_transform_array; - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; - 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 (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; + obj_material* material = &obj->material_array[sub_mesh->material_index].material; 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) + for (obj_material_texture_data& k : material->texdata) { + obj_material_texture_data* texture = &k; + if (texture->shader_info.m.tex_type != OBJ_MATERIAL_TEXTURE_COLOR) continue; - tt->id = texture->texture_id; + tt->id = texture->tex_index; tt->mat = uv_mat[l]; ttc++; tt++; @@ -1545,7 +1546,7 @@ namespace Glitter { object_data->texture_transform_count = ttc; if (rend_group->flags & PARTICLE_LOCAL) - mat4_mult(&mat, &GPM_VAL->cam_inv_view, &mat); + mat4_mult(&mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &mat); vec4u color = elem->color; if (draw_task_add_draw_object_by_object_info_color(rctx, &mat, @@ -1576,13 +1577,13 @@ namespace Glitter { mat4_clear_rot(&rend_group->mat, &view_mat); else mat4_normalize_rotation(&rend_group->mat, &view_mat); - mat4_mult(&view_mat, &GPM_VAL->cam_view, &view_mat); + mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->view, &view_mat); mat4_inverse(&view_mat, &inv_view_mat); } else { model_mat = mat4_identity; - view_mat = GPM_VAL->cam_view; - inv_view_mat = GPM_VAL->cam_inv_view; + view_mat = ((render_context*)GPM_VAL->rctx)->camera->view; + inv_view_mat = ((render_context*)GPM_VAL->rctx)->camera->inv_view; } if (rend_group->flags & PARTICLE_LOCAL) { @@ -1590,7 +1591,7 @@ namespace Glitter { mat4_mult(&view_mat, &inv_view_mat, &view_mat); mat4_inverse(&view_mat, &inv_view_mat); } - mat4_mult(&view_mat, &GPM_VAL->cam_inv_view, &rend_group->mat_draw); + mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw); switch (rend_group->draw_type) { case DIRECTION_BILLBOARD: @@ -1608,7 +1609,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam_rotation_y, &dir_mat); + mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat); break; default: dir_mat = mat4_identity; @@ -1760,7 +1761,7 @@ namespace Glitter { if (fabsf(rend_group->z_offset) > 0.000001f) { use_z_offset = true; mat4_get_translation(model_mat, &dist_to_cam); - vec3_sub(GPM_VAL->cam_view_point, dist_to_cam, dist_to_cam); + vec3_sub(((render_context*)GPM_VAL->rctx)->camera->view_point, dist_to_cam, dist_to_cam); if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { mat4_normalize_rotation(model_mat, &z_offset_inv_mat); mat4_inverse(&z_offset_inv_mat, &z_offset_inv_mat); @@ -2153,7 +2154,8 @@ namespace Glitter { shader_state_material_set_emission(&shaders_ft, false, emission, emission, emission, 1.0f); shader_state_matrix_set_mvp_separate(&shaders_ft, - &rend_group->mat_draw, &GPM_VAL->cam_view, &GPM_VAL->cam_projection); + &rend_group->mat_draw, &((render_context*)GPM_VAL->rctx)->camera->view, + &((render_context*)GPM_VAL->rctx)->camera->projection); shader_state_matrix_set_texture(&shaders_ft, 0, (mat4*)&mat4_identity); shader_state_matrix_set_texture(&shaders_ft, 1, (mat4*)&mat4_identity); diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index 45481395..e5c0c897 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -9,6 +9,7 @@ #include "../KKdLib/str_utils.h" #include "draw_task.h" #include "object.hpp" +#include "rob.hpp" namespace auth_3d_detail { class TaskAuth3d : public Task { @@ -1187,7 +1188,7 @@ void auth_3d_object::reset() { children_object_hrc.shrink_to_fit(); model_transform.reset(); morph.reset(); - object_info = ::object_info(); + object_info = {}; object_hash = (uint32_t)-1; name.clear(); name.shrink_to_fit(); @@ -1256,7 +1257,7 @@ void auth_3d_object_hrc::reset() { i.reset(); node.clear(); node.shrink_to_fit(); - object_info = ::object_info(); + object_info = {}; object_hash = (uint32_t)-1; parent_name.clear(); parent_name.shrink_to_fit(); @@ -1285,7 +1286,7 @@ void auth_3d_object_instance::reset() { name.shrink_to_fit(); object_bone_indices.clear(); object_bone_indices.shrink_to_fit(); - object_info = ::object_info(); + object_info = {}; object_hash = (uint32_t)-1; shadow = false; uid_name.clear(); @@ -1366,7 +1367,7 @@ auth_3d_object_texture_transform::~auth_3d_object_texture_transform() { } void auth_3d_object_texture_transform::reset() { - flags = (auth_3d_object_texture_transform_flags)0;; + flags = (auth_3d_object_texture_transform_flags)0; coverage_u.reset(); coverage_v.reset(); mat = mat4u_identity; @@ -2229,10 +2230,6 @@ void auth_3d_data_unload_category(uint32_t category_hash) { auth_3d_data_struct_unload_category(auth_3d_data, category_hash); } -void task_auth_3d_append_task() { - TaskWork::AppendTask(&task_auth_3d, "AUTH_3D"); -} - void auth_3d_data_unload_id(int32_t id, render_context* rctx) { if (id < 0 || (id & 0x7FFF) >= AUTH_3D_DATA_COUNT) return; @@ -2257,6 +2254,14 @@ void auth_3d_data_free() { delete auth_3d_data; } +void task_auth_3d_append_task() { + TaskWork::AppendTask(&task_auth_3d, "AUTH_3D"); +} + +void task_auth_3d_free_task() { + task_auth_3d.SetDest(); +} + auth_3d_detail::TaskAuth3d::TaskAuth3d() { } @@ -3324,7 +3329,7 @@ static void auth_3d_material_list_load(auth_3d* auth, auth_3d_material_list* ml, static void auth_3d_material_list_restore_prev_value(auth_3d_material_list* ml) { if (ml->flags_init & AUTH_3D_MATERIAL_LIST_INCANDESCENCE) { if (ml->material) - ml->material->emission = ml->incandescence_init; + ml->material->color.emission = ml->incandescence_init; } material_change_storage_unload(ml->name.c_str()); } @@ -3350,7 +3355,7 @@ static void auth_3d_material_list_set(auth_3d_material_list* ml) { if (ml->flags & AUTH_3D_MATERIAL_LIST_INCANDESCENCE) { if (~ml->flags_init & AUTH_3D_MATERIAL_LIST_INCANDESCENCE) { if (ml->material) - ml->incandescence_init = ml->material->emission; + ml->incandescence_init = ml->material->color.emission; else ml->incandescence_init = vec4_identity; enum_or(ml->flags_init, AUTH_3D_MATERIAL_LIST_INCANDESCENCE); @@ -3366,7 +3371,7 @@ static void auth_3d_material_list_set(auth_3d_material_list* ml) { if (ml->incandescence.flags & AUTH_3D_RGBA_A) incandescence.w = ml->incandescence.value.w; if (ml->material) - ml->material->emission = incandescence; + ml->material->color.emission = incandescence; } material_change* mat_chg = material_change_storage_get(ml->name.c_str()); @@ -3446,15 +3451,33 @@ static void auth_3d_object_curve_load(auth_3d* auth, auth_3d_object_curve* oc, } static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context* rctx) { - if (!auth->visible || !o->model_transform.visible) + if (!o->model_transform.visible) return; + if (!auth->visible) { + for (auth_3d_object*& i : o->children_object) + auth_3d_object_disp(i, auth, rctx); + for (auth_3d_object_hrc*& i : o->children_object_hrc) + auth_3d_object_hrc_disp(i, auth, rctx); + return; + } + mat4 mat = o->model_transform.mat; object_data* object_data = &rctx->object_data; object_database* obj_db = auth->obj_db; texture_database* tex_db = auth->tex_db; + if (auth->chara_id >= 0 && auth->chara_id < ROB_CHARA_COUNT) + if (rob_chara_pv_data_array_check_chara_id(auth->chara_id)) { + rob_chara* rob_chr = rob_chara_array_get(auth->chara_id); + mat4 m; + mat4_mult(&rob_chr->data.miku_rot.field_6C, + &rob_chr->data.adjust_data.mat, (mat4u*)&m); + mat4_mult(&m, &mat, &mat); + object_data->set_shadow_type(auth->chara_id ? SHADOW_STAGE : SHADOW_CHARA); + } + draw_task_flags flags = (draw_task_flags)0; if (auth->shadow) enum_or(flags, DRAW_TASK_4 | DRAW_TASK_SHADOW); @@ -3642,11 +3665,20 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende if (auth->alpha < 1.0f) enum_or(flags, auth->draw_task_flags); - object_data->set_draw_task_flags((draw_task_flags)flags); + object_data->set_draw_task_flags(flags); object_data->set_shadow_type(SHADOW_CHARA); - shadow* shad = rctx->draw_pass.shadow_ptr; - if (shad && flags & DRAW_TASK_SHADOW) { + mat4 mat = mat4_identity; + if (auth->chara_id >= 0 && auth->chara_id < ROB_CHARA_COUNT) { + if (rob_chara_pv_data_array_check_chara_id(auth->chara_id)) { + rob_chara* rob_chr = rob_chara_array_get(auth->chara_id); + mat4_mult(&rob_chr->data.miku_rot.field_6C, + &rob_chr->data.adjust_data.mat, (mat4u*)&mat); + if (auth->chara_id) + object_data->set_shadow_type(SHADOW_STAGE); + } + } + else if (flags & DRAW_TASK_SHADOW) { object_data->set_shadow_type(SHADOW_STAGE); mat4u* m = &oh->node[0].model_transform.mat; @@ -3656,16 +3688,17 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende break; } - vec3 pos = *(vec3*)&m->row3; - pos.y -= 0.2f; - shad->field_1D0[SHADOW_STAGE].push_back(pos); + shadow* shad = rctx->draw_pass.shadow_ptr; + if (shad) { + vec3 pos = *(vec3*)&m->row3; + pos.y -= 0.2f; + shad->field_1D0[SHADOW_STAGE].push_back(pos); + } } - if (oh->mats.size() > 0) { - mat4 mat = mat4_identity; + if (oh->mats.size() > 0) draw_task_add_draw_object_by_object_info_object_skin(rctx, oh->object_info, 0, 0, auth->alpha, oh->mats.data(), 0, 0, &mat); - } object_data->set_draw_task_flags(); object_data->set_shadow_type(SHADOW_CHARA); @@ -4276,7 +4309,8 @@ static void auth_3d_data_struct_unload_category( return; auth_3d_farc_unload(&elem->second); - auth_3d_data->farcs_modern.erase(elem); + if (elem->second.load_count <= 0) + auth_3d_data->farcs_modern.erase(elem); } static void auth_3d_farc_free_data(auth_3d_farc* a3da_farc) { @@ -4330,7 +4364,7 @@ static void auth_3d_farc_read_file(auth_3d_farc* a3da_farc, const char* mdata_di 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, + a3da_farc->file_handler.set_callback_data(0, (void(*)(void*, void*, size_t))auth_3d_farc_read_func, a3da_farc); else a3da_farc->state = 2; @@ -4347,7 +4381,7 @@ static void auth_3d_farc_read_file_modern(auth_3d_farc* a3da_farc, void* data) { 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, + a3da_farc->file_handler.set_callback_data(0, (void(*)(void*, void*, size_t))auth_3d_farc_read_func, a3da_farc); else a3da_farc->state = 2; diff --git a/src/CRE/auth_3d.hpp b/src/CRE/auth_3d.hpp index 3fcea882..791bd283 100644 --- a/src/CRE/auth_3d.hpp +++ b/src/CRE/auth_3d.hpp @@ -747,7 +747,7 @@ struct auth_3d_farc { size_t size; auth_3d_farc(); - ~auth_3d_farc(); + virtual ~auth_3d_farc(); }; struct auth_3d_uid_file { @@ -839,3 +839,4 @@ extern void auth_3d_data_unload_id(int32_t id, render_context* rctx); extern void auth_3d_data_free(); extern void task_auth_3d_append_task(); +extern void task_auth_3d_free_task(); diff --git a/src/CRE/draw_object.c b/src/CRE/draw_object.c index a5523c99..950db506 100644 --- a/src/CRE/draw_object.c +++ b/src/CRE/draw_object.c @@ -40,7 +40,7 @@ void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, if (draw->mats) { mat4u* mats = draw->mats; if (draw->mat_count == 2) { - mat4 mat = *mats;; + mat4 mat = *mats; shader_state_matrix_set_program(&shaders_ft, 7, &mat); } @@ -49,22 +49,23 @@ void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, mat4_transpose(&mat, &mat); shader_buffer_set_ptr_array(&shaders_ft, (size_t)i * 3, 3, (vec4*)&mat); } + + shader_state_matrix_set_modelview(&shaders_ft, 0, &rctx->view_mat, true); + shader_state_matrix_set_program(&shaders_ft, 6, (mat4*)&mat4_identity); uniform_value[U_BONE_MAT] = 1; } else { - for (int32_t i = 0; i < SHADER_MAX_PROGRAM_BUFFER_PARAMETERS / 3; i++) - shader_buffer_set_ptr_array(&shaders_ft, (size_t)i * 3, 3, (vec4*)&mat4_identity); + mat4 mat; + if (draw->mesh->attrib.m.billboard) + model_mat_face_camera_view(&rctx->camera->inv_view_rot, model, &mat); + else if (draw->mesh->attrib.m.billboard_y_axis) + model_mat_face_camera_position(&rctx->camera->view, model, &mat); + else + mat = *model; + draw_object_model_mat_load(rctx, &mat); uniform_value[U_BONE_MAT] = 0; } - mat4 mat; - if (draw->mesh->flags & OBJ_MESH_BILLBOARD) - model_mat_face_camera_view(&rctx->camera->inv_view_rot, model, &mat); - else if (draw->mesh->flags & OBJ_MESH_BILLBOARD_Y_AXIS) - model_mat_face_camera_position(&rctx->camera->view, model, &mat); - else - mat = *model; - draw_object_model_mat_load(rctx, &mat); if (!show_vector) draw_object_func(rctx, draw); @@ -120,19 +121,19 @@ void draw_object_draw_default(render_context* rctx, draw_object* draw) { } void draw_object_draw_sss(render_context* rctx, draw_object* draw) { - obj_material_blend_flags blend_flags = draw->material->material.blend_flags; - uniform_value[U_ALPHA_TEST] = (!blend_flags.flag_28 && (draw->blend_color.w < 1.0f - || (blend_flags.alpha_texture || blend_flags.alpha_material) && !blend_flags.punch_through - || draw->sub_mesh->flags & OBJ_SUB_MESH_TRANSPARENT) - || blend_flags.punch_through) ? 1 : 0; + obj_material_attrib_member attrib = draw->material->material.attrib.m; + uniform_value[U_ALPHA_TEST] = (!attrib.flag_28 && (draw->blend_color.w < 1.0f + || (attrib.alpha_texture || attrib.alpha_material) && !attrib.punch_through + || draw->sub_mesh->attrib.m.transparent) + || attrib.punch_through) ? 1 : 0; uniform_value[U26] = 1; bool aniso = false; obj_material_data* material = draw->material; switch (material->material.shader.index) { case SHADER_FT_CLOTH: - if (!rctx->draw_pass.npr_param && material->material.ambient.w < 1.0f - && (material->material.shader_flags.aniso_direction & 0x03) == OBJ_MATERIAL_ANISO_DIRECTION_NORMAL) + if (!rctx->draw_pass.npr_param && material->material.color.ambient.w < 1.0f + && material->material.shader_info.m.aniso_direction == OBJ_MATERIAL_ANISO_DIRECTION_NORMAL) aniso = true; break; case SHADER_FT_TIGHTS: @@ -163,8 +164,8 @@ void draw_object_draw_sss(render_context* rctx, draw_object* draw) { void draw_object_draw_reflect(render_context* rctx, draw_object* draw) { obj_material_data* material = draw->material; draw_object_vertex_attrib_set_reflect(draw); - obj_material_shader_lighting_type lighting_type = - obj_material_shader_get_lighting_type(&material->material.shader_flags); + obj_material_shader_lighting_type lighting_type + = material->material.shader_info.get_lighting_type(); bool disable_fog = draw_object_blend_set(rctx, draw, lighting_type); draw_object_chara_color_fog_set(rctx, draw, disable_fog); draw_object_material_set_reflect(rctx, draw); @@ -207,11 +208,11 @@ void draw_object_draw_reflect_reflect_map(render_context* rctx, draw_object* dra } void draw_object_draw_shadow(render_context* rctx, draw_object* draw) { - obj_material_blend_flags blend_flags = draw->material->material.blend_flags; - if (!blend_flags.flag_28 && (draw->blend_color.w < 1.0f - || (blend_flags.alpha_texture || blend_flags.alpha_material) && !blend_flags.punch_through - || draw->sub_mesh->flags & OBJ_SUB_MESH_TRANSPARENT) - || blend_flags.punch_through) { + obj_material_attrib_member attrib = draw->material->material.attrib.m; + if (!attrib.flag_28 && (draw->blend_color.w < 1.0f + || (attrib.alpha_texture || attrib.alpha_material) && !attrib.punch_through + || draw->sub_mesh->attrib.m.transparent) + || attrib.punch_through) { uniform_value[U_ALPHA_TEST] = 1; draw_object_draw_translucent(rctx, draw); } @@ -225,39 +226,39 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* draw) { obj_material_data* material = draw->material; std::vector* textures = draw->textures; if (rctx->draw_state.shader_index != -1) { - vec4 emission = material->material.emission; + vec4 emission = material->material.color.emission; shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); draw_object_material_set_uniform(rctx, material, 0); - if (material->material.blend_flags.alpha_texture) + if (material->material.attrib.m.alpha_texture) uniform_value[U_TEXTURE_COUNT] = 0; shader_set(&shaders_ft, rctx->draw_state.shader_index); } draw_object_vertex_attrib_set_default(draw); - if (draw->material->material.blend_flags.double_sided) + if (draw->material->material.attrib.m.double_sided) gl_state_disable_cull_face(); GLuint tex_id = -1; int32_t tex_index = 0; - if (material->material.blend_flags.alpha_texture) { - obj_material_texture* mat_tex = material->material.textures; + if (material->material.attrib.m.alpha_texture) { + obj_material_texture_data* texdata = material->material.texdata; uint32_t texture_id = -1; uint32_t texture_index = -1; - if (~material->material.flags & OBJ_MATERIAL_TRANSPARENCY) { - for (int32_t i = 0; i < 8; i++, mat_tex++) - if (mat_tex->texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) { - texture_id = mat_tex->texture_id; - texture_index = mat_tex->texture_index; + if (~material->material.shader_compo.m.transparency) { + for (int32_t i = 0; i < 8; i++, texdata++) + if (texdata->shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) { + texture_id = texdata->tex_index; + texture_index = texdata->texture_index; break; } tex_index = 0; } else { - for (int32_t i = 0; i < 8; i++, mat_tex++) - if (mat_tex->texture_flags.type == OBJ_MATERIAL_TEXTURE_TRANSPARENCY) { - if (mat_tex->sampler_flags.flag_29) { - texture_id = mat_tex->texture_id; - texture_index = mat_tex->texture_index; + for (int32_t i = 0; i < 8; i++, texdata++) + if (texdata->shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_TRANSPARENCY) { + if (texdata->attrib.m.flag_29) { + texture_id = texdata->tex_index; + texture_index = texdata->texture_index; } break; } @@ -274,7 +275,7 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* draw) { } if (tex_id == -1) - tex_id = (*textures)[mat_tex->texture_index]; + tex_id = (*textures)[texdata->texture_index]; if (tex_id == -1) tex_id = 0; @@ -403,12 +404,12 @@ static bool draw_object_blend_set(render_context* rctx, }; obj_material_data* material = draw->material; - obj_material_blend_flags blend_flags = material->material.blend_flags; - if ((!blend_flags.alpha_texture && !blend_flags.alpha_material) || blend_flags.punch_through) + obj_material_attrib_member attrib = material->material.attrib.m; + if ((!attrib.alpha_texture && !attrib.alpha_material) || attrib.punch_through) return false; - GLenum src_blend_factor = blend_factor_table[blend_flags.src_blend_factor & 0xF]; - GLenum dst_blend_factor = blend_factor_table[blend_flags.dst_blend_factor & 0xF]; + GLenum src_blend_factor = blend_factor_table[attrib.src_blend_factor]; + GLenum dst_blend_factor = blend_factor_table[attrib.dst_blend_factor]; if (draw->chara_color) { light_set* set = &rctx->light_set_data[LIGHT_SET_MAIN]; light_data* chara_color = &set->lights[LIGHT_CHARA_COLOR]; @@ -455,10 +456,10 @@ static void draw_object_chara_color_fog_set(render_context* rctx, draw_object* d uniform_value[U_CHARA_COLOR] = 1; } - obj_material_blend_flags blend_flags = draw->material->material.blend_flags; - if (!blend_flags.no_fog && !disable_fog) { - if (blend_flags.has_fog_height) - uniform_value[U_FOG_HEIGHT] = 2 + blend_flags.fog_height; + obj_material_attrib_member attrib = draw->material->material.attrib.m; + if (!attrib.no_fog && !disable_fog) { + if (attrib.has_fog_height) + uniform_value[U_FOG_HEIGHT] = 2 + attrib.fog_height; else uniform_value[U_FOG_HEIGHT] = 1; uniform_value[U_FOG] = rctx->draw_state.fog_height ? 2 : 1; @@ -468,8 +469,8 @@ static void draw_object_chara_color_fog_set(render_context* rctx, draw_object* d static void draw_object_material_reset_default(obj_material_data* mat_data) { if (mat_data) { gl_state_enable_cull_face(); - obj_material_blend_flags blend_flags = mat_data->material.blend_flags; - if ((blend_flags.alpha_texture || blend_flags.alpha_material) && !blend_flags.punch_through) + obj_material_attrib_member attrib = mat_data->material.attrib.m; + if ((attrib.alpha_texture || attrib.alpha_material) && !attrib.punch_through) gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } uniform_value_reset(); @@ -485,7 +486,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* std::vector* textures = draw->textures; obj_material_data* material = draw->material; obj_material_shader_lighting_type lighting_type = - obj_material_shader_get_lighting_type(&material->material.shader_flags); + material->material.shader_info.get_lighting_type(); bool disable_fog = draw_object_blend_set(rctx, draw, lighting_type); draw_object_material_set_uniform(rctx, material, false); if (!rctx->draw_state.light) @@ -493,18 +494,18 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* else if (draw->self_shadow) uniform_value[U_LIGHT_0] = draw->self_shadow ? 1 : 1; else - uniform_value[U_LIGHT_0] = draw->sub_mesh->flags & OBJ_SUB_MESH_RECIEVE_SHADOW ? 1 : 0; + uniform_value[U_LIGHT_0] = draw->sub_mesh->attrib.m.recieve_shadow ? 1 : 0; uniform_value[U_SHADOW] = 0; uniform_value[U_SELF_SHADOW] = rctx->draw_state.self_shadow ? 1 : 0; - obj_material_texture* mat_tex = material->material.textures; + obj_material_texture_data* texdata = material->material.texdata; uniform_value[U_SHADOW] = draw->shadow > SHADOW_CHARA; - for (int32_t i = 0, j = 0; i < 8; i++, mat_tex++) { - if (mat_tex->texture_id == -1) + for (int32_t i = 0, j = 0; i < 8; i++, texdata++) { + if (texdata->tex_index == -1) continue; GLuint tex_id = -1; - uint32_t texture_id = mat_tex->texture_id; + uint32_t texture_id = texdata->tex_index; for (int32_t j = 0; j < draw->texture_pattern_count; j++) if (draw->texture_pattern_array[j].src == ::texture_id(0, texture_id)) { texture* tex = texture_storage_get_texture(draw->texture_pattern_array[j].dst); @@ -514,20 +515,20 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* } if (tex_id == -1) - tex_id = (*textures)[mat_tex->texture_index]; + tex_id = (*textures)[texdata->texture_index]; if (tex_id == -1) continue; - int32_t tex_index = obj_material_texture_type_get_texture_index(mat_tex->texture_flags.type, j); + int32_t tex_index = obj_material_texture_type_get_texture_index(texdata->shader_info.m.tex_type, j); if (tex_index < 0) continue; - obj_material_texture_type tex_type = mat_tex->texture_flags.type; + obj_material_texture_type tex_type = texdata->shader_info.m.tex_type; if (tex_type == OBJ_MATERIAL_TEXTURE_COLOR) j++; - if (mat_tex->sampler_flags.flag_29) { + if (texdata->attrib.m.flag_29) { switch (tex_type) { case OBJ_MATERIAL_TEXTURE_NORMAL: uniform_value[U_NORMAL] = 0; @@ -551,15 +552,15 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* gl_state_active_bind_texture_2d(tex_index, tex_id); GLenum wrap_s = 0; - if (mat_tex->sampler_flags.mirror_u) + if (texdata->attrib.m.mirror_u) wrap_s = GL_MIRRORED_REPEAT; - else if (mat_tex->sampler_flags.repeat_u) + else if (texdata->attrib.m.repeat_u) wrap_s = GL_REPEAT; GLenum wrap_t = 0; - if (mat_tex->sampler_flags.mirror_v) + if (texdata->attrib.m.mirror_v) wrap_t = GL_MIRRORED_REPEAT; - else if (mat_tex->sampler_flags.repeat_v) + else if (texdata->attrib.m.repeat_v) wrap_t = GL_REPEAT; if (wrap_s) @@ -573,7 +574,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* if (tex_index == 1) uni_type = U_TEX_1_TYPE; - texture* tex = texture_storage_get_texture(mat_tex->texture_id); + texture* tex = texture_storage_get_texture(texdata->tex_index); if (!tex) uniform_value[uni_type] = 1; else if (tex->internal_format == GL_COMPRESSED_RED_RGTC1_EXT) @@ -584,26 +585,25 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* uniform_value[uni_type] = 1; } - int32_t texture_blend = obj_material_texture_get_blend(mat_tex); if (tex_index == 0 || tex_index == 1) - uniform_value[U_TEXTURE_BLEND] = texture_blend; + uniform_value[U_TEXTURE_BLEND] = texdata->attrib.get_blend(); } - if (material->material.blend_flags.double_sided) { + if (material->material.attrib.m.double_sided) { gl_state_disable_cull_face(); - if (!material->material.blend_flags.normal_direction_light) + if (!material->material.attrib.m.normal_dir_light) uniform_value[U0B] = 1; } vec4 ambient; - *(vec3*)&ambient = *(vec3*)&material->material.ambient; + *(vec3*)&ambient = *(vec3*)&material->material.color.ambient; if (rctx->draw_pass.sss_data.enable) - ambient.w = material->material.ambient.w; + ambient.w = material->material.color.ambient.w; else ambient.w = 1.0f; - vec4 diffuse = material->material.diffuse; - vec4 emission = material->material.emission; + vec4 diffuse = material->material.color.diffuse; + vec4 emission = material->material.color.emission; draw_object_chara_color_fog_set(rctx, draw, disable_fog); shader_state_material_set_ambient_ptr(&shaders_ft, false, &ambient); shader_state_material_set_diffuse_ptr(&shaders_ft, false, &diffuse); @@ -611,7 +611,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* float_t line_light; if (lighting_type == OBJ_MATERIAL_SHADER_LIGHTING_PHONG) { - vec4 specular = material->material.specular; + vec4 specular = material->material.color.specular; shader_state_material_set_specular_ptr(&shaders_ft, false, &specular); float_t luma; @@ -622,10 +622,10 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* else uniform_value[U_SPECULAR_IBL] = 0; - if (!material->material.shader_flags.fresnel) + if (!material->material.shader_info.m.fresnel_type) uniform_value[U_TRANSLUCENCY] = 0; - line_light = (float_t)material->material.shader_flags.line_light * (float_t)(1.0 / 9.0); + line_light = (float_t)material->material.shader_info.m.line_light * (float_t)(1.0 / 9.0); } else line_light = 0.0; @@ -652,12 +652,12 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* if (material->material.shader.index == SHADER_FT_EYEBALL) shininess = 10.0f; else { - shininess = (material->material.shininess - 16.0f) * (float_t)(1.0 / 112.0); + shininess = (material->material.color.shininess - 16.0f) * (float_t)(1.0 / 112.0); shininess = max(shininess, 0.0f); } shader_state_material_set_shininess(&shaders_ft, false, shininess, 0.0f, 0.0f, 1.0f); - float_t fresnel = (float_t)material->material.shader_flags.fresnel; + float_t fresnel = (float_t)material->material.shader_info.m.fresnel_type; if (fresnel > 9.0) fresnel = 9.0; else if (fresnel == 0.0f) @@ -667,7 +667,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* shader_local_vert_set(&shaders_ft, 0, fresnel, 0.18f, line_light, 0.0f); shader_local_frag_set(&shaders_ft, 9, fresnel, 0.18f, line_light, 0.0f); - shininess = max(material->material.shininess, 1.0f); + shininess = max(material->material.color.shininess, 1.0f); shader_local_vert_set(&shaders_ft, 1, shininess, 0.0f, 0.0f, 0.0f); shader_local_frag_set(&shaders_ft, 3, shininess, 0.0f, 0.0f, 0.0f); @@ -711,14 +711,14 @@ static void draw_object_material_set_parameter(render_context* rctx, obj_materia refract_uv_scale = rctx->draw_state.refract_uv_scale; inv_bump_depth = (1.0f - rctx->draw_state.bump_depth) * 64.0f + 1.0f; - vec4 specular = mat_data->material.specular; + vec4 specular = mat_data->material.color.specular; specular.w = rctx->draw_state.specular_alpha; shader_state_material_set_specular_ptr(&shaders_ft, false, &specular); } else { bump_depth = mat_data->material.bump_depth; reflect_uv_scale = 0.1f; - intensity = mat_data->material.intensity; + intensity = mat_data->material.color.intensity; refract_uv_scale = 0.1f; inv_bump_depth = (1.0f - bump_depth) * 256.0f + 1.0f; } @@ -734,20 +734,20 @@ static void draw_object_material_set_parameter(render_context* rctx, obj_materia vec4 specular; shader_env_vert_get_ptr(&shaders_ft, 17, &specular); - vec3_mult(*(vec3*)&specular, *(vec3*)&mat_data->material.specular, *(vec3*)&specular); + vec3_mult(*(vec3*)&specular, *(vec3*)&mat_data->material.color.specular, *(vec3*)&specular); shader_env_vert_set_ptr(&shaders_ft, 18, &specular); } static void draw_object_material_set_reflect(render_context* rctx, draw_object* draw) { obj_material_data* material = draw->material; std::vector* textures = draw->textures; - if (material->material.blend_flags.double_sided) + if (material->material.attrib.m.double_sided) gl_state_disable_cull_face(); - obj_material_texture* mat_tex = material->material.textures; - for (int32_t i = 0; i < 1; i++, mat_tex++) { - uint32_t texture_id = mat_tex->texture_id; - if (mat_tex->texture_id == -1) + obj_material_texture_data* texdata = material->material.texdata; + for (int32_t i = 0; i < 1; i++, texdata++) { + uint32_t texture_id = texdata->tex_index; + if (texdata->tex_index == -1) break; GLuint tex_id = -1; @@ -760,7 +760,7 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* } if (tex_id == -1) - tex_id = (*textures)[mat_tex->texture_index]; + tex_id = (*textures)[texdata->texture_index]; if (tex_id == -1) tex_id = 0; @@ -768,15 +768,15 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* gl_state_active_bind_texture_2d(i, tex_id); GLenum wrap_s = 0; - if (mat_tex->sampler_flags.mirror_u) + if (texdata->attrib.m.mirror_u) wrap_s = GL_MIRRORED_REPEAT; - else if (mat_tex->sampler_flags.repeat_u) + else if (texdata->attrib.m.repeat_u) wrap_s = GL_REPEAT; GLenum wrap_t = 0; - if (mat_tex->sampler_flags.mirror_v) + if (texdata->attrib.m.mirror_v) wrap_t = GL_MIRRORED_REPEAT; - else if (mat_tex->sampler_flags.repeat_v) + else if (texdata->attrib.m.repeat_v) wrap_t = GL_REPEAT; if (wrap_s) @@ -791,15 +791,15 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* vec4 specular; if (material->material.shader.index == -1) { ambient = vec4_identity; - diffuse = material->material.diffuse; + diffuse = material->material.color.diffuse; emission = vec4_identity; - specular = material->material.specular; + specular = material->material.color.specular; } else { - ambient = material->material.ambient; - diffuse = material->material.diffuse; - emission = material->material.emission; - specular = material->material.specular; + ambient = material->material.color.ambient; + diffuse = material->material.color.diffuse; + emission = material->material.color.emission; + specular = material->material.color.specular; } draw_object_material_set_uniform(rctx, material, true); @@ -812,19 +812,19 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* } static void draw_object_material_set_uniform(render_context* rctx, obj_material_data* mat_data, bool disable_color_l) { - int32_t flags = mat_data->material.flags; - obj_material_shader_flags shader_flags = mat_data->material.shader_flags; + obj_shader_compo_member shader_compo = mat_data->material.shader_compo.m; + obj_material_shader_attrib_member shader_info = mat_data->material.shader_info.m; if (disable_color_l) { - if (flags & OBJ_MATERIAL_COLOR) - flags &= ~OBJ_MATERIAL_COLOR_L1; - flags &= ~OBJ_MATERIAL_COLOR_L2; + if (shader_compo.color) + shader_compo.color_l1 = 0; + shader_compo.color_l2 = 0; } int32_t v4 = 0; - if (flags & OBJ_MATERIAL_COLOR) { - if (~flags & OBJ_MATERIAL_COLOR_L2) - if (flags & OBJ_MATERIAL_COLOR_L1) { + if (shader_compo.color) { + if (!shader_compo.color_l2) + if (shader_compo.color_l1) { uniform_value[U_TEXTURE_COUNT] = 2; v4 = 3; } @@ -833,30 +833,30 @@ static void draw_object_material_set_uniform(render_context* rctx, obj_material_ v4 = 1; } } - else if (flags & OBJ_MATERIAL_COLOR_L1 && ~flags & OBJ_MATERIAL_COLOR_L2) { + else if (shader_compo.color_l1 && !shader_compo.color_l2) { uniform_value[U_TEXTURE_COUNT] = 1; v4 = 1; } else uniform_value[U_TEXTURE_COUNT] = 0; - if (flags & OBJ_MATERIAL_NORMAL) + if (shader_compo.normal_01) uniform_value[U_NORMAL] = 1; - if (flags & OBJ_MATERIAL_SPECULAR) + if (shader_compo.specular) uniform_value[U_SPECULAR] = 1; - if (flags & OBJ_MATERIAL_TRANSPARENCY) { + if (shader_compo.transparency) { uniform_value[U_TRANSPARENCY] = 1; v4 |= 2; } - if (flags & OBJ_MATERIAL_TRANSLUCENCY) { + if (shader_compo.transparency) { uniform_value[U_TRANSLUCENCY] = 1; v4 |= 2; } - if (flags & OBJ_MATERIAL_OVERRIDE_IBL) + if (shader_compo.override_ibl) uniform_value[U_ENV_MAP] = 1; - if ((shader_flags.aniso_direction & 0x03) != OBJ_MATERIAL_ANISO_DIRECTION_NORMAL) - uniform_value[U_ANISO] = shader_flags.aniso_direction & 0x03; + if (shader_info.aniso_direction != OBJ_MATERIAL_ANISO_DIRECTION_NORMAL) + uniform_value[U_ANISO] = shader_info.aniso_direction; if (v4 == 1) uniform_value[U45] = 0; @@ -866,9 +866,9 @@ static void draw_object_material_set_uniform(render_context* rctx, obj_material_ static void draw_object_vertex_attrib_reset_default(draw_object* draw) { obj_mesh* mesh = draw->mesh; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + obj_vertex_format vertex_format = mesh->vertex_format; - if (mesh->flags & OBJ_MESH_COMPRESSED) { + if (mesh->attrib.m.compressed) { draw_object_vertex_attrib_reset_default_compressed(draw); return; } @@ -879,7 +879,7 @@ static void draw_object_vertex_attrib_reset_default(draw_object* draw) { draw->vertex_attrib_array[i] = false; } - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) uniform_value[U_BONE_MAT] = 0; if (draw->morph_array_buffer) { @@ -896,7 +896,7 @@ static void draw_object_vertex_attrib_reset_default(draw_object* draw) { static void draw_object_vertex_attrib_reset_default_compressed(draw_object* draw) { obj_mesh* mesh = draw->mesh; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + obj_vertex_format vertex_format = mesh->vertex_format; for (int32_t i = 0; i < 16; i++) { if (draw->vertex_attrib_array[i]) @@ -904,7 +904,7 @@ static void draw_object_vertex_attrib_reset_default_compressed(draw_object* draw draw->vertex_attrib_array[i] = false; } - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) uniform_value[U_BONE_MAT] = 0; if (draw->morph_array_buffer) { @@ -921,9 +921,9 @@ static void draw_object_vertex_attrib_reset_default_compressed(draw_object* draw static void draw_object_vertex_attrib_reset_reflect(draw_object* draw) { obj_mesh* mesh = draw->mesh; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + obj_vertex_format vertex_format = mesh->vertex_format; - if (mesh->flags & OBJ_MESH_COMPRESSED) { + if (mesh->attrib.m.compressed) { draw_object_vertex_attrib_reset_reflect_compressed(draw); return; } @@ -934,7 +934,7 @@ static void draw_object_vertex_attrib_reset_reflect(draw_object* draw) { draw->vertex_attrib_array[i] = false; } - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) uniform_value[U_BONE_MAT] = 0; if (draw->morph_array_buffer) { @@ -949,7 +949,7 @@ static void draw_object_vertex_attrib_reset_reflect(draw_object* draw) { inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_object* draw) { obj_mesh* mesh = draw->mesh; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + obj_vertex_format vertex_format = mesh->vertex_format; for (int32_t i = 0; i < 16; i++) { if (draw->vertex_attrib_array[i]) @@ -957,7 +957,7 @@ inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_objec draw->vertex_attrib_array[i] = false; } - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) uniform_value[U_BONE_MAT] = 0; if (draw->morph_array_buffer) { @@ -973,10 +973,10 @@ inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_objec static void draw_object_vertex_attrib_set_default(draw_object* draw) { obj_mesh* mesh = draw->mesh; obj_sub_mesh* sub_mesh = draw->sub_mesh; - GLsizei vertex_size = (GLsizei)mesh->vertex_size; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + GLsizei size_vertex = (GLsizei)mesh->size_vertex; + obj_vertex_format vertex_format = mesh->vertex_format; - if (mesh->flags & OBJ_MESH_COMPRESSED) { + if (mesh->attrib.m.compressed) { draw_object_vertex_attrib_set_default_compressed(draw); return; } @@ -984,62 +984,62 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(0, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(2); - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(2, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { enable_vertex_attrib_array(6); - glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(5, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BINORMAL) + if (vertex_format & OBJ_VERTEX_FORMAT_BINORMAL) offset += 12; bool texcoord_mat_set[4] = { false }; obj_material_data* material = draw->material; for (int32_t i = 0, j = 0, l = 0; i < 4; i++) { - if (material->material.textures[i].texture_id == -1) + if (material->material.texdata[i].tex_index == -1) continue; int32_t texcoord_index = obj_material_texture_type_get_texcoord_index( - material->material.textures[i].texture_flags.type, j); + material->material.texdata[i].shader_info.m.tex_type, j); if (texcoord_index < 0) continue; - if (material->material.textures[i].texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) + if (material->material.texdata[i].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) j++; - if (vertex_flags & (OBJ_VERTEX_TEXCOORD0 << sub_mesh->texcoord_indices[l])) { + if (vertex_format & (OBJ_VERTEX_FORMAT_TEXCOORD0 << sub_mesh->uv_index[l])) { enable_vertex_attrib_array(8 + texcoord_index); glVertexAttribPointer(8 + texcoord_index, 2, GL_FLOAT, GL_FALSE, - vertex_size, (void*)(offset + 8ULL * sub_mesh->texcoord_indices[l])); + size_vertex, (void*)(offset + 8ULL * sub_mesh->uv_index[l])); } l++; if (texcoord_mat_set[texcoord_index]) continue; - int32_t texture_id = material->material.textures[i].texture_id; + int32_t texture_id = material->material.texdata[i].tex_index; - mat4 mat = material->material.textures[i].tex_coord_mat; + mat4 mat = material->material.texdata[i].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); - if (material->material.textures[i].texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) + if (material->material.texdata[i].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) for (int32_t k = 0; k < draw->texture_transform_count; k++) if (draw->texture_transform_array[k].id == texture_id) { mat = draw->texture_transform_array[k].mat; @@ -1053,35 +1053,35 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { if (!draw->vertex_attrib_array[8 + i]) glVertexAttrib4f(8 + i, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 8; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { enable_vertex_attrib_array(3); - glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(3, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_COLOR1) + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR1) offset += 16; - if (vertex_flags & OBJ_VERTEX_BONE_DATA) { + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { uniform_value[U_BONE_MAT] = 1; enable_vertex_attrib_array(1); - glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; enable_vertex_attrib_array(15); - glVertexAttribPointer(15, 4, GL_INT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(15, 4, GL_INT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else { @@ -1089,9 +1089,9 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { glVertexAttrib4f(15, 0.0f, 0.0f, 0.0f, 1.0f); } - if (vertex_flags & OBJ_VERTEX_UNKNOWN) { + if (vertex_format & OBJ_VERTEX_FORMAT_UNKNOWN) { enable_vertex_attrib_array(7); - glVertexAttribPointer(7, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(7, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else @@ -1103,71 +1103,71 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(10); - glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(10, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(11); - glVertexAttribPointer(11, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(11, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(11, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { enable_vertex_attrib_array(12); - glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(12, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BINORMAL) + if (vertex_format & OBJ_VERTEX_FORMAT_BINORMAL) offset += 12; - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { enable_vertex_attrib_array(13); - glVertexAttribPointer(13, 2, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(13, 2, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(13, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { enable_vertex_attrib_array(14); - glVertexAttribPointer(14, 2, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(14, 2, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(14, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 8; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { uniform_value[U_MORPH_COLOR] = 1; enable_vertex_attrib_array(5); - glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(5, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_COLOR1) + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR1) offset += 16; - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) offset += 32; - if (vertex_flags & OBJ_VERTEX_UNKNOWN) + if (vertex_format & OBJ_VERTEX_FORMAT_UNKNOWN) offset += 16; shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); @@ -1183,31 +1183,31 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* draw) { obj_mesh* mesh = draw->mesh; obj_sub_mesh* sub_mesh = draw->sub_mesh; - GLsizei vertex_size = (GLsizei)mesh->vertex_size; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + GLsizei size_vertex = (GLsizei)mesh->size_vertex; + obj_vertex_format vertex_format = mesh->vertex_format; gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(0, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(2); - glVertexAttribPointer(2, 3, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(2, 3, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(2, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { enable_vertex_attrib_array(6); - glVertexAttribPointer(6, 4, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(6, 4, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else @@ -1216,34 +1216,34 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* bool texcoord_mat_set[4] = { false }; obj_material_data* material = draw->material; for (int32_t i = 0, j = 0, l = 0; i < 4; i++) { - if (material->material.textures[i].texture_id == -1) + if (material->material.texdata[i].tex_index == -1) continue; int32_t texcoord_index = obj_material_texture_type_get_texcoord_index( - material->material.textures[i].texture_flags.type, j); + material->material.texdata[i].shader_info.m.tex_type, j); if (texcoord_index < 0) continue; - if (material->material.textures[i].texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) + if (material->material.texdata[i].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) j++; - if (vertex_flags & (OBJ_VERTEX_TEXCOORD0 << sub_mesh->texcoord_indices[l])) { + if (vertex_format & (OBJ_VERTEX_FORMAT_TEXCOORD0 << sub_mesh->uv_index[l])) { enable_vertex_attrib_array(8 + texcoord_index); glVertexAttribPointer(8 + texcoord_index, 2, GL_HALF_FLOAT, GL_FALSE, - vertex_size, (void*)(offset + 4ULL * sub_mesh->texcoord_indices[l])); + size_vertex, (void*)(offset + 4ULL * sub_mesh->uv_index[l])); } l++; if (texcoord_mat_set[texcoord_index]) continue; - int32_t texture_id = material->material.textures[i].texture_id; + int32_t tex_index = material->material.texdata[i].tex_index; - mat4 mat = material->material.textures[i].tex_coord_mat; + mat4 mat = material->material.texdata[i].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); - if (material->material.textures[i].texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) + if (material->material.texdata[i].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) for (int32_t k = 0; k < draw->texture_transform_count; k++) - if (draw->texture_transform_array[k].id == texture_id) { + if (draw->texture_transform_array[k].id == tex_index) { mat = draw->texture_transform_array[k].mat; shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); texcoord_mat_set[texcoord_index] = true; @@ -1255,32 +1255,32 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* if (!draw->vertex_attrib_array[8 + i]) glVertexAttrib4f(8 + i, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 4; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { enable_vertex_attrib_array(3); - glVertexAttribPointer(3, 4, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(3, 4, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(3, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BONE_DATA) { + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { uniform_value[U_BONE_MAT] = 1; enable_vertex_attrib_array(1); - glVertexAttribPointer(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; enable_vertex_attrib_array(15); - glVertexAttribPointer(15, 4, GL_UNSIGNED_SHORT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(15, 4, GL_UNSIGNED_SHORT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else { @@ -1294,62 +1294,62 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(10); - glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(10, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(11); - glVertexAttribPointer(11, 3, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(11, 3, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(11, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { enable_vertex_attrib_array(12); - glVertexAttribPointer(12, 4, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(12, 4, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(12, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { enable_vertex_attrib_array(13); - glVertexAttribPointer(13, 2, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(13, 2, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 4; } else glVertexAttrib4f(13, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { enable_vertex_attrib_array(14); - glVertexAttribPointer(14, 2, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(14, 2, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 4; } else glVertexAttrib4f(14, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 4; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { uniform_value[U_MORPH_COLOR] = 1; enable_vertex_attrib_array(5); - glVertexAttribPointer(5, 4, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(5, 4, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(5, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) offset += 16; shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); @@ -1365,10 +1365,10 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { obj_mesh* mesh = draw->mesh; obj_sub_mesh* sub_mesh = draw->sub_mesh; - GLsizei vertex_size = (GLsizei)mesh->vertex_size; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + GLsizei size_vertex = (GLsizei)mesh->size_vertex; + obj_vertex_format vertex_format = mesh->vertex_format; - if (mesh->flags & OBJ_MESH_COMPRESSED) { + if (mesh->attrib.m.compressed) { draw_object_vertex_attrib_set_reflect_compressed(draw); return; } @@ -1376,45 +1376,45 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(0, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(2); - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(2, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) offset += 16; - if (vertex_flags & OBJ_VERTEX_BINORMAL) + if (vertex_format & OBJ_VERTEX_FORMAT_BINORMAL) offset += 12; obj_material_data* material = draw->material; - if (material->material.textures[0].texture_id != -1) { - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { + if (material->material.texdata[0].tex_index != -1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { enable_vertex_attrib_array(8); glVertexAttribPointer(8, 2, GL_FLOAT, GL_FALSE, - vertex_size, (void*)(offset + 8ULL * sub_mesh->texcoord_indices[0])); + size_vertex, (void*)(offset + 8ULL * sub_mesh->uv_index[0])); } else glVertexAttrib4f(8, 0.0f, 0.0f, 0.0f, 1.0f); - int32_t texture_id = material->material.textures[0].texture_id; + int32_t tex_index = material->material.texdata[0].tex_index; - mat4 mat = material->material.textures[0].tex_coord_mat; + mat4 mat = material->material.texdata[0].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); - if (material->material.textures[0].texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) + if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) for (int32_t j = 0; j < draw->texture_transform_count; j++) - if (draw->texture_transform_array[j].id == texture_id) { + if (draw->texture_transform_array[j].id == tex_index) { mat = draw->texture_transform_array[j].mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); break; @@ -1424,35 +1424,35 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { for (int32_t i = 1; i < 4; i++) glVertexAttrib4f(8 + i, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 8; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { enable_vertex_attrib_array(3); - glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(3, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_COLOR1) + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR1) offset += 16; - if (vertex_flags & OBJ_VERTEX_BONE_DATA) { + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { uniform_value[U_BONE_MAT] = 1; enable_vertex_attrib_array(1); - glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; enable_vertex_attrib_array(15); - glVertexAttribPointer(15, 4, GL_INT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(15, 4, GL_INT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else { @@ -1460,7 +1460,7 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { glVertexAttrib4f(15, 0.0f, 0.0f, 0.0f, 1.0f); } - if (vertex_flags & OBJ_VERTEX_UNKNOWN) + if (vertex_format & OBJ_VERTEX_FORMAT_UNKNOWN) offset += 16; if (draw->morph_array_buffer) { @@ -1469,71 +1469,71 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(10); - glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(10, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(11); - glVertexAttribPointer(11, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(11, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(11, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { enable_vertex_attrib_array(12); - glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(12, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BINORMAL) + if (vertex_format & OBJ_VERTEX_FORMAT_BINORMAL) offset += 12; - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { enable_vertex_attrib_array(13); - glVertexAttribPointer(13, 2, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(13, 2, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(13, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { enable_vertex_attrib_array(14); - glVertexAttribPointer(14, 2, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(14, 2, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(14, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 8; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 8; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { uniform_value[U_MORPH_COLOR] = 1; enable_vertex_attrib_array(5); - glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 16; } else glVertexAttrib4f(5, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_COLOR1) + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR1) offset += 16; - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) offset += 32; - if (vertex_flags & OBJ_VERTEX_UNKNOWN) + if (vertex_format & OBJ_VERTEX_FORMAT_UNKNOWN) offset += 16; shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); @@ -1546,48 +1546,48 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* draw) { obj_mesh* mesh = draw->mesh; obj_sub_mesh* sub_mesh = draw->sub_mesh; - GLsizei vertex_size = (GLsizei)mesh->vertex_size; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + GLsizei size_vertex = (GLsizei)mesh->size_vertex; + obj_vertex_format vertex_format = mesh->vertex_format; gl_state_bind_array_buffer(draw->array_buffer); size_t offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(0, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(2); - glVertexAttribPointer(2, 3, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(2, 3, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(2, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) offset += 8; obj_material_data* material = draw->material; - if (material->material.textures[0].texture_id != -1) { - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { + if (material->material.texdata[0].tex_index != -1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { enable_vertex_attrib_array(8); glVertexAttribPointer(8, 2, GL_HALF_FLOAT, GL_FALSE, - vertex_size, (void*)(offset + 4ULL * sub_mesh->texcoord_indices[0])); + size_vertex, (void*)(offset + 4ULL * sub_mesh->uv_index[0])); } else glVertexAttrib4f(8, 0.0f, 0.0f, 0.0f, 1.0f); - int32_t texture_id = material->material.textures[0].texture_id; + int32_t tex_index = material->material.texdata[0].tex_index; - mat4 mat = material->material.textures[0].tex_coord_mat; + mat4 mat = material->material.texdata[0].tex_coord_mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); - if (material->material.textures[0].texture_flags.type == OBJ_MATERIAL_TEXTURE_COLOR) + if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) for (int32_t j = 0; j < draw->texture_transform_count; j++) - if (draw->texture_transform_array[j].id == texture_id) { + if (draw->texture_transform_array[j].id == tex_index) { mat = draw->texture_transform_array[j].mat; shader_state_matrix_set_texture(&shaders_ft, 0, &mat); break; @@ -1597,32 +1597,32 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* for (int32_t i = 1; i < 4; i++) glVertexAttrib4f(8 + i, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 4; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { enable_vertex_attrib_array(3); - glVertexAttribPointer(3, 4, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(3, 4, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(3, 1.0f, 1.0f, 1.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BONE_DATA) { + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { uniform_value[U_BONE_MAT] = 1; enable_vertex_attrib_array(1); - glVertexAttribPointer(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; enable_vertex_attrib_array(15); - glVertexAttribPointer(15, 4, GL_UNSIGNED_SHORT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(15, 4, GL_UNSIGNED_SHORT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else { @@ -1636,62 +1636,62 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* gl_state_bind_array_buffer(draw->morph_array_buffer); offset = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { enable_vertex_attrib_array(10); - glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(10, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 12; } else glVertexAttrib4f(10, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { enable_vertex_attrib_array(11); - glVertexAttribPointer(11, 3, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(11, 3, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(11, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { enable_vertex_attrib_array(12); - glVertexAttribPointer(12, 4, GL_SHORT, GL_TRUE, vertex_size, (void*)offset); + glVertexAttribPointer(12, 4, GL_SHORT, GL_TRUE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(12, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { enable_vertex_attrib_array(13); - glVertexAttribPointer(13, 2, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(13, 2, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 4; } else glVertexAttrib4f(13, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { enable_vertex_attrib_array(14); - glVertexAttribPointer(14, 2, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(14, 2, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 4; } else glVertexAttrib4f(14, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) offset += 4; - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) offset += 4; - if (vertex_flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { uniform_value[U_MORPH_COLOR] = 1; enable_vertex_attrib_array(5); - glVertexAttribPointer(5, 4, GL_HALF_FLOAT, GL_FALSE, vertex_size, (void*)offset); + glVertexAttribPointer(5, 4, GL_HALF_FLOAT, GL_FALSE, size_vertex, (void*)offset); offset += 8; } else glVertexAttrib4f(5, 0.0f, 0.0f, 0.0f, 1.0f); - if (vertex_flags & OBJ_VERTEX_BONE_DATA) + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) offset += 16; shader_env_vert_set(&shaders_ft, 13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); diff --git a/src/CRE/draw_pass.c b/src/CRE/draw_pass.c index 5135a29f..3aaa57a6 100644 --- a/src/CRE/draw_pass.c +++ b/src/CRE/draw_pass.c @@ -211,7 +211,7 @@ static void draw_pass_shadow(render_context* rctx, draw_pass* a1) { glScissor(1, 1, tex->width - 2, tex->height - 2); float_t v15 = 0.0f; - float_t v16 = shad->field_170 * shad->field_174; + float_t v16 = shad->view_region * shad->range; vec3* interest; vec3* view_point; if (shad->field_2F5) { @@ -992,7 +992,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { rctx->draw_state.light = true; uniform_value[U_LIGHT_1] = shad->field_2EC > 1 ? 1 : 0; - float_t v7 = shad->field_170 * shad->field_174; + float_t v7 = shad->view_region * shad->range; for (int32_t i = 0; i < 2; i++) { float_t v6 = 0.0f; vec3* interest; diff --git a/src/CRE/draw_task.c b/src/CRE/draw_task.c index 1dca348a..64b66beb 100644 --- a/src/CRE/draw_task.c +++ b/src/CRE/draw_task.c @@ -285,16 +285,16 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, } object_data->passed.objects++; - for (uint32_t i = 0; i < object->meshes_count; i++) { - obj_mesh* mesh = &object->meshes[i]; + for (uint32_t i = 0; i < object->num_mesh; i++) { + obj_mesh* mesh = &object->mesh_array[i]; obj_mesh* mesh_morph = 0; if (obj_vertex_buf && obj_morph_vertex_buf) { if (obj_mesh_vertex_buffer_get_size(&obj_vertex_buf[i]) != obj_mesh_vertex_buffer_get_size(&obj_morph_vertex_buf[i])) continue; - if (object_morph && i < object_morph->meshes_count) - mesh_morph = &object_morph->meshes[i]; + if (object_morph && i < object_morph->num_mesh) + mesh_morph = &object_morph->mesh_array[i]; } if (object_data->object_culling && !instances_count && !bone_mat @@ -309,17 +309,16 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, draw_object* translucent_priority[40]; int32_t translucent_priority_count = 0; - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; obj_sub_mesh* sub_mesh_morph = 0; - if (sub_mesh->flags & OBJ_SUB_MESH_FLAG_8) + if (sub_mesh->attrib.m.flag_3) continue; if (object_data->object_culling && !instances_count && !bone_mat) { int32_t v32 = object_bounding_sphere_check_visibility( &sub_mesh->bounding_sphere, object_data, rctx->camera, mat); - if (v32 != 2 || (~mesh->flags & OBJ_MESH_BILLBOARD && - ~mesh->flags & OBJ_MESH_BILLBOARD_Y_AXIS)) { + if (v32 != 2 || (!mesh->attrib.m.billboard && !mesh->attrib.m.billboard_y_axis)) { if (v32 == 2) { if (object_data->object_bounding_sphere_check_func) v32 = 1; @@ -329,14 +328,14 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, } if (!v32) { - if (!mesh_morph || j >= mesh_morph->sub_meshes_count) { - object_data->culled.sub_meshes++; + if (!mesh_morph || j >= mesh_morph->num_submesh) { + object_data->culled.submesh_array++; continue; } - sub_mesh_morph = &mesh_morph->sub_meshes[j]; + sub_mesh_morph = &mesh_morph->submesh_array[j]; if (!sub_mesh_morph) { - object_data->culled.sub_meshes++; + object_data->culled.submesh_array++; continue; } @@ -351,13 +350,13 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, } if (!v32) { - object_data->culled.sub_meshes++; + object_data->culled.submesh_array++; continue; } } } } - object_data->passed.sub_meshes++; + object_data->passed.submesh_array++; int32_t bone_indices_count = sub_mesh->bone_indices_count; uint16_t* bone_indices = sub_mesh->bone_indices; @@ -377,7 +376,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, bone_indices_count = 0; } - obj_material_data* material = &object->materials[sub_mesh->material_index]; + obj_material_data* material = &object->material_array[sub_mesh->material_index]; draw_task* task = rctx->object_data.buffer.add_draw_task(DRAW_TASK_TYPE_OBJECT); if (!task) continue; @@ -412,14 +411,14 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, continue; } - obj_material_blend_flags blend_flags = material->material.blend_flags; + obj_material_attrib_member attrib = material->material.attrib.m; if (draw_task_flags & (DRAW_TASK_10000 | DRAW_TASK_20000 | DRAW_TASK_40000) && task->data.object.blend_color.w < 1.0f) { if (~draw_task_flags | DRAW_TASK_NO_TRANSLUCENCY) { - if (blend_flags.flag_28 || (blend_flags.punch_through - || !(blend_flags.alpha_texture | blend_flags.alpha_material)) - && ~sub_mesh->flags & OBJ_SUB_MESH_TRANSPARENT) { - if (!blend_flags.punch_through) { + if (attrib.flag_28 || (attrib.punch_through + || !(attrib.alpha_texture | attrib.alpha_material)) + && !sub_mesh->attrib.m.transparent) { + if (!attrib.punch_through) { if (draw_task_flags & DRAW_TASK_10000) draw_task_add(rctx, DRAW_OBJECT_OPAQUE_TYPE_20, task); else if (draw_task_flags & DRAW_TASK_20000) @@ -449,9 +448,9 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, } } else { - if (blend_flags.flag_28 || task->data.object.blend_color.w >= 1.0f - && (blend_flags.punch_through || !(blend_flags.alpha_texture | blend_flags.alpha_material)) - && ~sub_mesh->flags & OBJ_SUB_MESH_TRANSPARENT) { + if (attrib.flag_28 || task->data.object.blend_color.w >= 1.0f + && (attrib.punch_through || !(attrib.alpha_texture | attrib.alpha_material)) + && !sub_mesh->attrib.m.transparent) { if (draw_task_flags & DRAW_TASK_SHADOW) draw_task_add(rctx, (draw_object_type)(DRAW_OBJECT_SHADOW_CHARA + object_data->shadow_type), task); @@ -459,7 +458,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, if (draw_task_flags & DRAW_TASK_SSS) draw_task_add(rctx, DRAW_OBJECT_SSS, task); - if (material->material.blend_flags.punch_through) { + if (material->material.attrib.m.punch_through) { if (~draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY) draw_task_add(rctx, DRAW_OBJECT_TRANSPARENT, task); @@ -494,8 +493,8 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, continue; } else if (~draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY) { - if (!blend_flags.translucent_priority) - if (mesh->flags & OBJ_MESH_TRANSLUCENT_NO_SHADOW + if (!attrib.translucent_priority) + if (mesh->attrib.m.translucent_no_shadow || draw_task_flags & DRAW_TASK_TRANSLUCENT_NO_SHADOW) draw_task_add(rctx, DRAW_OBJECT_TRANSLUCENT_NO_SHADOW, task); else @@ -532,7 +531,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, for (int32_t j = 62; j; j--) for (int32_t k = 0; k < translucent_priority_count; k++) { draw_object* object = translucent_priority[k]; - if (object->material->material.blend_flags.translucent_priority != j) + if (object->material->material.attrib.m.translucent_priority != j) continue; object_translucent.objects[object_translucent.count] = object; @@ -682,10 +681,9 @@ void draw_task_sort(render_context* rctx, draw_object_type type, int32_t compare vec3 center; mat4_get_translation(&mat, ¢er); if (task->type == DRAW_TASK_TYPE_OBJECT) { - obj_mesh_flags mesh_flags = task->data.object.mesh->flags; - if (mesh_flags & OBJ_MESH_BILLBOARD) { + if (task->data.object.mesh->attrib.m.billboard) { model_mat_face_camera_view(&rctx->camera->view, &mat, &mat);} - else if (mesh_flags & OBJ_MESH_BILLBOARD_Y_AXIS) + else if (task->data.object.mesh->attrib.m.billboard_y_axis) model_mat_face_camera_position(&rctx->camera->view, &mat, &mat); else { obj_sub_mesh* sub_mesh = task->data.object.sub_mesh; diff --git a/src/CRE/fbo.cpp b/src/CRE/fbo.cpp index dbd708bc..a5f8fcc1 100644 --- a/src/CRE/fbo.cpp +++ b/src/CRE/fbo.cpp @@ -6,12 +6,13 @@ #include "fbo.hpp" #include "gl_state.h" -fbo::fbo() { +fbo::fbo() : flags(), width(), height(), buffer(), count(), textures() { } fbo::fbo(int32_t width, int32_t height, - GLuint* color_textures, int32_t count, GLuint depth_texture) : fbo() { + GLuint* color_textures, int32_t count, GLuint depth_texture) : flags(), + width(), height(), buffer(), count(), textures() { if (buffer) { glDeleteFramebuffers(1, &buffer); buffer = 0; @@ -56,8 +57,11 @@ fbo::~fbo() { glDeleteFramebuffers(1, &buffer); buffer = 0; } - free(textures); - textures = 0; + + if (textures) { + free(textures); + textures = 0; + } } void fbo::blit(GLuint src_fbo, GLuint dst_fbo, diff --git a/src/CRE/file_handler.cpp b/src/CRE/file_handler.cpp index 8d168947..55380148 100644 --- a/src/CRE/file_handler.cpp +++ b/src/CRE/file_handler.cpp @@ -51,7 +51,7 @@ static void file_handler_storage_ctrl_list(); static void file_handler_storage_thread_ctrl(); file_handler::file_handler() : count(), not_ready(true), -reading(), cache(), read_free_func(), size(), data(), ds() { +reading(), cache(), callback(), size(), data(), ds() { } @@ -59,20 +59,20 @@ file_handler::~file_handler() { free(data); } -void file_handler::call_read_free_func(int32_t index) { +void file_handler::call_callback(int32_t index) { if (index >= 2) return; std::unique_lock u_lock(mtx); void* data = this->data; - void(*read_free_func_func)(void*, void*, size_t) = this->read_free_func[index].func; - void* read_free_func_data = this->read_free_func[index].data; - bool ready = this->read_free_func[index].ready; - this->read_free_func[index].ready = true; + void(*callback_func)(void*, void*, size_t) = this->callback[index].func; + void* callback_data = this->callback[index].data; + bool ready = this->callback[index].ready; + this->callback[index].ready = true; u_lock.unlock(); - if (!ready && read_free_func_func) - read_free_func_func(read_free_func_data, data, this->size); + if (!ready && callback_func) + callback_func(callback_data, data, this->size); } void file_handler::set_file(const char* file) { @@ -94,12 +94,12 @@ void file_handler::set_path(const char* path) { u_lock.unlock(); } -void file_handler::set_read_free_func_data(int32_t index, void(* func)(void*, void*, size_t), void* data) { +void file_handler::set_callback_data(int32_t index, void(* func)(void*, void*, size_t), void* data) { std::unique_lock u_lock(mtx); if (index < 2) { - read_free_func[index].func = func; - read_free_func[index].data = data; - read_free_func[index].ready = false; + callback[index].func = func; + callback[index].data = data; + callback[index].ready = false; } u_lock.unlock(); } @@ -287,8 +287,8 @@ static void file_handler_storage_ctrl_list() { i = file_handler_storage_data->list.erase(i); } else { - if (!pfhndl->not_ready && !pfhndl->read_free_func[0].ready) - pfhndl->call_read_free_func(0); + if (!pfhndl->not_ready && !pfhndl->callback[0].ready) + pfhndl->call_callback(0); i++; } } @@ -339,7 +339,7 @@ p_file_handler::~p_file_handler() { void p_file_handler::call_free_func_free_data() { if (ptr) - ptr->call_read_free_func(1); + ptr->call_callback(1); free_data(); } @@ -349,7 +349,7 @@ bool p_file_handler::check_not_ready() { else if (ptr->not_ready) return true; else - return !ptr->read_free_func[0].ready; + return !ptr->callback[0].ready; } void p_file_handler::free_data() { @@ -358,7 +358,7 @@ void p_file_handler::free_data() { if (ptr->mtx.try_lock()) { for (int32_t i = 0; i < 2; i++) - ptr->read_free_func[i] = {}; + ptr->callback[i] = {}; ptr->mtx.unlock(); } ptr->free_data_lock(); @@ -479,7 +479,7 @@ void p_file_handler::read_now() { } } -void p_file_handler::set_read_free_func_data(int32_t index, void(*func)(void*, void*, size_t), void* data) { +void p_file_handler::set_callback_data(int32_t index, void(*func)(void*, void*, size_t), void* data) { if (ptr) - ptr->set_read_free_func_data(index, func, data); + ptr->set_callback_data(index, func, data); } diff --git a/src/CRE/file_handler.hpp b/src/CRE/file_handler.hpp index 735ad730..1478b764 100644 --- a/src/CRE/file_handler.hpp +++ b/src/CRE/file_handler.hpp @@ -28,7 +28,7 @@ struct file_handler { std::string farc_file; std::string file; bool cache; - file_handler_read_func_data read_free_func[2]; + file_handler_read_func_data callback[2]; ssize_t size; void* data; void* ds; @@ -36,12 +36,12 @@ struct file_handler { file_handler(); virtual ~file_handler(); - void call_read_free_func(int32_t index); + void call_callback(int32_t index); void free_data_lock(); void set_file(const char* file); void set_farc_file(const char* farc_file, bool cache); void set_path(const char* path); - void set_read_free_func_data(int32_t index, void(*func)(void*, void*, size_t), void* data); + void set_callback_data(int32_t index, void(*func)(void*, void*, size_t), void* data); }; struct p_file_handler { @@ -59,7 +59,7 @@ struct p_file_handler { bool read_file(void* data, const char* path, const char* file); bool read_file(void* data, const char* path, uint32_t hash, const char* ext); void read_now(); - void set_read_free_func_data(int32_t index, void(* func)(void*, void*, size_t), void* data); + void set_callback_data(int32_t index, void(* func)(void*, void*, size_t), void* data); }; extern void file_handler_storage_init(); diff --git a/src/CRE/item_table.cpp b/src/CRE/item_table.cpp index 0853e38a..65e5c8af 100644 --- a/src/CRE/item_table.cpp +++ b/src/CRE/item_table.cpp @@ -59,14 +59,9 @@ bool item_table_array_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); - bool ret = item_table_array_read((data_struct*)data, string_data(&s)); - - string_free(&s); - return ret; + return item_table_array_read((data_struct*)data, s.c_str()); } void item_table_array_free() { diff --git a/src/CRE/light_param.cpp b/src/CRE/light_param.cpp index e0ab9c22..3c5c584f 100644 --- a/src/CRE/light_param.cpp +++ b/src/CRE/light_param.cpp @@ -20,7 +20,10 @@ static void light_param_storage_load_stages(light_param_data_storage* a1, std::v static void light_param_storage_load_stages(light_param_data_storage* a1, std::vector* stage_hashes, stage_database* stage_data); static int32_t light_param_storage_load_file(light_param_data_storage* a1, bool read_now); +static void light_param_storage_reset(light_param_data_storage* a1); static void light_param_storage_set_default_light_param(light_param_data_storage* a1, int32_t stage_index); +static void light_param_storage_set_pv_cut(light_param_data_storage* a1, + std::map::iterator* elem, int32_t cut_id); static void light_param_storage_set_stage(light_param_data_storage* a1, std::map::iterator* elem, int32_t stage_index); @@ -28,7 +31,7 @@ light_param_data_storage* light_param_data_storage_data; extern render_context* rctx_ptr; -light_param_data::light_param_data() : not_loaded() { +light_param_data::light_param_data() : pv() { } @@ -37,7 +40,7 @@ light_param_data::~light_param_data() { } int32_t light_param_data_load_file() { - return light_param_storage_load_file(light_param_data_storage_data, 0); + return light_param_storage_load_file(light_param_data_storage_data, false); } light_param_data_storage::light_param_data_storage() : textures(), @@ -52,7 +55,7 @@ light_param_data_storage::~light_param_data_storage() { void light_param_data_storage::load(data_struct* data) { glGenTextures(5, light_param_data_storage_data->textures); light_param_storage_data_load_stage(0); - while (light_param_storage_load_file(light_param_data_storage_data, 1)); + while (light_param_storage_load_file(light_param_data_storage_data, true)); light_param_storage_set_default_light_param(light_param_data_storage_data, 0); } @@ -92,10 +95,23 @@ void light_param_storage_data_load_stages( light_param_storage_load_stages(light_param_data_storage_data, stage_hashes, stage_data); } +void light_param_storage_data_reset() { + light_param_storage_reset(light_param_data_storage_data); +} + void light_param_storage_data_set_default_light_param() { light_param_data_set(&light_param_data_storage_data->default_light_param, light_param_data_storage_data); } +void light_param_storage_data_set_pv_id(int32_t pv_id) { + light_param_data_storage_data->pv_id = pv_id; +} + +void light_param_storage_data_set_pv_cut(int32_t cut_id) { + std::map::iterator elem; + light_param_storage_set_pv_cut(light_param_data_storage_data, &elem, cut_id); +} + void light_param_storage_data_set_stage(int32_t stage_id) { std::map::iterator elem; light_param_storage_set_stage(light_param_data_storage_data, &elem, stage_id); @@ -172,7 +188,7 @@ static int32_t light_param_storage_load_file(light_param_data_storage* a1, bool static void light_param_data_get_stage_name_string(std::string* str, int32_t stage_index) { str->clear(); - str->shrink_to_fit();; + str->shrink_to_fit(); stage_database* data = &rctx_ptr->data->data_ft.stage_data; const char* stage_name = stage_index < data->stage_data.size() ? data->stage_data[stage_index].name.c_str() : 0; @@ -207,7 +223,7 @@ static void light_param_data_get_stage_name_string(std::string* str, int32_t sta static void light_param_data_get_stage_name_string(std::string* str, uint32_t stage_hash, stage_database* stage_data) { str->clear(); - str->shrink_to_fit();; + str->shrink_to_fit(); const char* stage_name = 0; for (stage_data_modern& i : stage_data->stage_modern) { if (i.hash != stage_hash) @@ -386,7 +402,14 @@ static void light_param_data_load_file_pv_cut(std::mapend()) light_param = &elem->second; else { - light_param = &tree->insert({ cut_id, *default_light_param }).first->second;; + light_param = &tree->insert({ cut_id, *default_light_param }).first->second; + light_param->ibl.ready = false; + light_param->light.ready = false; + light_param->fog.ready = false; + light_param->glow.ready = false; + light_param->wind.ready = false; + light_param->face.ready = false; + light_param->pv = true; light_param_data_load_pv_cut_file_names(light_param, cut_id, &pv_str); } @@ -500,10 +523,10 @@ static void light_param_storage_load_stages(light_param_data_storage* a1, std::v if (elem != a1->stage.end()) light_param = &elem->second; else - light_param = &a1->stage.insert({ i, a1->default_light_param }).first->second;; + light_param = &a1->stage.insert({ i, a1->default_light_param }).first->second; light_param_data_load_stage_file_names(light_param, &name); - light_param->not_loaded = 0; + light_param->pv = false; } a1->stage_light_param_iterator = a1->stage.begin(); a1->state = a1->stage.size() ? 1 : 0; @@ -533,15 +556,24 @@ static void light_param_storage_load_stages(light_param_data_storage* a1, if (elem != a1->stage.end()) light_param = &elem->second; else - light_param = &a1->stage.insert({ i, a1->default_light_param }).first->second;; + light_param = &a1->stage.insert({ i, a1->default_light_param }).first->second; light_param_data_load_stage_file_names(light_param, &name); - light_param->not_loaded = 0; + light_param->pv = false; } a1->stage_light_param_iterator = a1->stage.begin(); a1->state = a1->stage.size() ? 1 : 0; } +static void light_param_storage_reset(light_param_data_storage* a1) { + a1->stage.clear(); + a1->pv_cut.clear(); + a1->pv_id = 0; + for (p_file_handler& i : a1->file_handlers) + i.free_data(); + a1->farc_file_handler.free_data(); +} + static void light_param_storage_set_default_light_param(light_param_data_storage* a1, int32_t stage_index) { std::map::iterator elem; light_param_storage_set_stage(a1, &elem, stage_index); @@ -550,30 +582,34 @@ static void light_param_storage_set_default_light_param(light_param_data_storage } static void light_param_data_set(light_param_data* a1, light_param_data_storage* storage) { - if (!a1->not_loaded || a1->light.ready) + if (!a1->pv || a1->light.ready) rctx_ptr->light_param_data_light_set(&a1->light); - if (!a1->not_loaded || a1->fog.ready) + if (!a1->pv || a1->fog.ready) rctx_ptr->light_param_data_fog_set(&a1->fog); - if (!a1->not_loaded || a1->glow.ready) + if (!a1->pv || a1->glow.ready) rctx_ptr->light_param_data_glow_set(&a1->glow); - if (!a1->not_loaded || a1->ibl.ready) + if (!a1->pv || a1->ibl.ready) rctx_ptr->light_param_data_ibl_set(&a1->ibl, storage); - if (!a1->not_loaded) { + if (!a1->pv) { rctx_ptr->light_param_data_wind_set(&a1->wind); if (a1->face.ready) rctx_ptr->light_param_data_face_set(&a1->face); } } +static void light_param_storage_set_pv_cut(light_param_data_storage* a1, + std::map::iterator* elem, int32_t cut_id) { + *elem = a1->pv_cut.find(cut_id); + if (*elem != a1->pv_cut.end()) + light_param_data_set(&(*elem)->second, a1); +} + static void light_param_storage_set_stage(light_param_data_storage* a1, std::map::iterator* elem, int32_t stage_index) { - *elem = a1->stage.begin(); - if (a1->state == 0) { - *elem = a1->stage.find(stage_index); - if (*elem != a1->stage.end()) { - a1->stage_index = stage_index; - a1->name = (*elem)->second.name; - light_param_data_set(&(*elem)->second, a1); - } + *elem = a1->stage.find(stage_index); + if (*elem != a1->stage.end()) { + a1->stage_index = stage_index; + a1->name = (*elem)->second.name; + light_param_data_set(&(*elem)->second, a1); } } diff --git a/src/CRE/light_param.hpp b/src/CRE/light_param.hpp index 1c60cce7..c8438206 100644 --- a/src/CRE/light_param.hpp +++ b/src/CRE/light_param.hpp @@ -25,7 +25,7 @@ struct light_param_data { std::string name; std::string paths[6]; std::string files[6]; - bool not_loaded; + bool pv; light_param_light light; light_param_fog fog; light_param_glow glow; @@ -66,6 +66,9 @@ extern void light_param_storage_data_load_stage(uint32_t stage_hash, stage_datab extern void light_param_storage_data_load_stages(std::vector* stage_indices); extern void light_param_storage_data_load_stages( std::vector* stage_hashes, stage_database* stage_data); +extern void light_param_storage_data_reset(); extern void light_param_storage_data_set_default_light_param(); +extern void light_param_storage_data_set_pv_id(int32_t pv_id); +extern void light_param_storage_data_set_pv_cut(int32_t cut_id); extern void light_param_storage_data_set_stage(int32_t stage_id); extern void light_param_storage_data_free(); diff --git a/src/CRE/light_param/light.c b/src/CRE/light_param/light.c index be23a77e..ffbf3d7d 100644 --- a/src/CRE/light_param/light.c +++ b/src/CRE/light_param/light.c @@ -242,14 +242,16 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { } else shader_state_light_set_ambient(&shaders_ft, i, 0.0f, 0.0f, 0.0f, 1.0f); + vec4 diffuse = light->diffuse; vec4 specular = light->specular; shader_state_light_set_diffuse_ptr(&shaders_ft, i, &diffuse); shader_state_light_set_specular_ptr(&shaders_ft, i, &specular); - vec4 light_direction = light->position; - light_get_direction_from_position(&light_direction, light, 0); - shader_state_light_set_position_ptr(&shaders_ft, i, &light_direction); + vec4 light_position = light->position; + if (light->type == LIGHT_PARALLEL) + light_get_direction_from_position(&light_position, 0, true); + shader_state_light_set_position_ptr(&shaders_ft, i, &light_position); shader_state_light_set_attenuation(&shaders_ft, i, light->constant, light->linear, light->quadratic, light->spot_exponent); @@ -271,7 +273,7 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { vec4 ibl_direction; vec4 temp; light_get_position_vec4(&set->lights[LIGHT_CHARA], &position); - light_get_direction_from_position(&position, &set->lights[LIGHT_CHARA], 0); + light_get_direction_from_position(&position, &set->lights[LIGHT_CHARA], false); light_get_ibl_specular(&set->lights[LIGHT_CHARA], &ibl_specular); light_get_ibl_back(&set->lights[LIGHT_CHARA], &ibl_back); light_get_diffuse(&set->lights[LIGHT_CHARA], &diffuse); @@ -299,7 +301,7 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { shader_env_frag_set_ptr(&shaders_ft, 9, &temp); light_get_position_vec4(&set->lights[LIGHT_STAGE], &position); - light_get_direction_from_position(&position, &set->lights[LIGHT_STAGE], 0); + light_get_direction_from_position(&position, &set->lights[LIGHT_STAGE], false); light_get_ibl_specular(&set->lights[LIGHT_STAGE], &ibl_specular); light_get_diffuse(&set->lights[LIGHT_STAGE], &diffuse); light_get_specular(&set->lights[LIGHT_STAGE], &specular); @@ -348,7 +350,7 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { if (light_get_type(&set->lights[LIGHT_TONE_CURVE]) == LIGHT_PARALLEL) { uniform_value[U_TONE_CURVE] = 1; light_get_position_vec4(&set->lights[LIGHT_TONE_CURVE], &position); - light_get_direction_from_position(&position, &set->lights[LIGHT_TONE_CURVE], 0); + light_get_direction_from_position(&position, &set->lights[LIGHT_TONE_CURVE], false); light_get_ambient(&set->lights[LIGHT_TONE_CURVE], &ambient); light_get_diffuse(&set->lights[LIGHT_TONE_CURVE], &diffuse); light_get_specular(&set->lights[LIGHT_TONE_CURVE], &specular); @@ -392,7 +394,7 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { vec4 spot_direction; light_get_spot_direction(&set->lights[LIGHT_REFLECT], (vec3*)&spot_direction); vec3_negate(*(vec3*)&spot_direction, *(vec3*)&spot_direction); - light_get_direction_from_position(&spot_direction, &set->lights[LIGHT_REFLECT], 1); + light_get_direction_from_position(&spot_direction, &set->lights[LIGHT_REFLECT], true); light_get_position_vec4(&set->lights[LIGHT_REFLECT], &position); vec3_dot(*(vec3*)&position, *(vec3*)&spot_direction, spot_direction.w); spot_direction.w = -spot_direction.w; diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index 3f22a34b..ed123b53 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -42,36 +42,13 @@ static void obj_skin_block_constraint_up_vector_load( static void obj_skin_block_node_load(obj_skin_block_node* node, obj_skin_block_node* node_file); static void obj_skin_block_node_free(obj_skin_block_node* node); -static size_t obj_vertex_flags_get_vertex_size(obj_vertex_flags flags); -static size_t obj_vertex_flags_get_vertex_size_comp(obj_vertex_flags flags); +static size_t obj_vertex_format_get_vertex_size(obj_vertex_format format); +static size_t obj_vertex_format_get_vertex_size_comp(obj_vertex_format format); std::map material_change_storage_data; std::vector object_storage_data; std::list object_storage_data_modern; -inline obj_material_shader_lighting_type obj_material_shader_get_lighting_type( - obj_material_shader_flags* flags) { - if (!flags->lambert_shading && !flags->phong_shading) - return OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT; - else if (!flags->phong_shading) - return OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT; - else - return OBJ_MATERIAL_SHADER_LIGHTING_PHONG; -} - -inline int32_t obj_material_texture_get_blend(obj_material_texture* tex) { - switch (tex->sampler_flags.blend) { - case 4: - return 2; - case 6: - return 1; - case 16: - return 3; - default: - return 0; - } -} - inline int32_t obj_material_texture_type_get_texcoord_index( obj_material_texture_type type, int32_t index) { switch (type) { @@ -139,34 +116,30 @@ void obj_skin_set_matrix_buffer(obj_skin* s, mat4* matrices, mat4 temp; int32_t bone_id = s->bones[i].id; if (bone_id & 0x8000) - if (ex_data_matrices) - mat4_mult(mat, &ex_data_matrices[bone_id & 0x7FFF], &temp); - else - temp = *mat; + mat4_mult(mat, &ex_data_matrices[bone_id & 0x7FFF], &temp); else mat4_mult(mat, &matrices[bone_id], &temp); mat4_mult(&temp, global_mat, &temp); mat4 inv_bind_pose_mat = s->bones[i].inv_bind_pose_mat; - mat4_mult(&inv_bind_pose_mat, &temp, &matrix_buffer[i]); + mat4_mult(&inv_bind_pose_mat, &temp, &temp); + matrix_buffer[i] = temp; } else for (uint32_t i = 0; i < s->bones_count; i++) { mat4 temp; int32_t bone_id = s->bones[i].id; if (bone_id & 0x8000) - if (ex_data_matrices) - temp = ex_data_matrices[bone_id & 0x7FFF]; - else - temp = mat4_identity; + temp = ex_data_matrices[bone_id & 0x7FFF]; else temp = matrices[bone_id]; mat4_mult(&temp, global_mat, &temp); mat4 inv_bind_pose_mat = s->bones[i].inv_bind_pose_mat; - mat4_mult(&inv_bind_pose_mat, &temp, &matrix_buffer[i]); + mat4_mult(&inv_bind_pose_mat, &temp, &temp); + matrix_buffer[i] = temp; } } @@ -226,9 +199,9 @@ inline obj* object_storage_get_obj(object_info obj_info) { if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].id == obj_info.id) - return &set->objects[j]; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return &set->obj_data[j]; return 0; } @@ -238,9 +211,9 @@ inline obj* object_storage_get_obj(object_info obj_info) { if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].id == obj_info.id) - return &set->objects[j]; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return &set->obj_data[j]; return 0; } return 0; @@ -277,11 +250,11 @@ inline obj_material* object_storage_get_material(const char* name) { if (!set) continue; - for (uint32_t j = 0; j < set->objects_count; j++) { - obj* obj = &set->objects[j]; - 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; + for (uint32_t j = 0; j < set->obj_num; j++) { + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_material; k++) + if (hash_utf8_murmurhash(obj->material_array[k].material.name) == name_hash) + return &obj->material_array[k].material; } } @@ -290,11 +263,11 @@ inline obj_material* object_storage_get_material(const char* name) { if (!set) continue; - for (uint32_t j = 0; j < set->objects_count; j++) { - obj* obj = &set->objects[j]; - 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; + for (uint32_t j = 0; j < set->obj_num; j++) { + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_material; k++) + if (hash_utf8_murmurhash(obj->material_array[k].material.name) == name_hash) + return &obj->material_array[k].material; } } return 0; @@ -309,13 +282,13 @@ inline obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* m if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].id == obj_info.id) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - 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]; + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) + return &obj->mesh_array[k]; return 0; } return 0; @@ -329,13 +302,13 @@ inline obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* m if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].id == obj_info.id) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - 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]; + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) + return &obj->mesh_array[k]; return 0; } return 0; @@ -352,11 +325,11 @@ inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint if (!set) return 0; - 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 >= 0 && index < obj->meshes_count) - return &obj->meshes[index]; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) { + obj* obj = &set->obj_data[j]; + if (index >= 0 && index < obj->num_mesh) + return &obj->mesh_array[index]; return 0; } return 0; @@ -370,11 +343,11 @@ inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint if (!set) return 0; - 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 >= 0 && index < obj->meshes_count) - return &obj->meshes[index]; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) { + obj* obj = &set->obj_data[j]; + if (index >= 0 && index < obj->num_mesh) + return &obj->mesh_array[index]; return 0; } return 0; @@ -388,13 +361,13 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].hash == hash) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - 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]; + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) + return &obj->mesh_array[k]; return 0; } return 0; @@ -405,13 +378,13 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].hash == hash) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - 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]; + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) + return &obj->mesh_array[k]; return 0; } return 0; @@ -425,11 +398,11 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].hash == hash) { - obj* obj = &set->objects[j]; - if (index >= 0 && index < obj->meshes_count) - return &obj->meshes[index]; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].hash == hash) { + obj* obj = &set->obj_data[j]; + if (index >= 0 && index < obj->num_mesh) + return &obj->mesh_array[index]; return 0; } } @@ -439,11 +412,11 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, if (!set) return 0; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].hash == hash) { - obj* obj = &set->objects[j]; - if (index >= 0 && index < obj->meshes_count) - return &obj->meshes[index]; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].hash == hash) { + obj* obj = &set->obj_data[j]; + if (index >= 0 && index < obj->num_mesh) + return &obj->mesh_array[index]; return 0; } } @@ -459,12 +432,12 @@ inline uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const ch if (!set) return -1; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].id == obj_info.id) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - for (uint32_t k = 0; k < obj->meshes_count; k++) - if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) return k; return -1; } @@ -479,12 +452,12 @@ inline uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const ch if (!set) return -1; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].id == obj_info.id) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - for (uint32_t k = 0; k < obj->meshes_count; k++) - if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) return k; return -1; } @@ -499,12 +472,12 @@ inline uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const c if (!set) return -1; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].hash == hash) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - for (uint32_t k = 0; k < obj->meshes_count; k++) - if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) return k; return -1; } @@ -515,12 +488,12 @@ inline uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const c if (!set) return -1; - for (uint32_t j = 0; j < set->objects_count; j++) - if (set->objects[j].hash == hash) { + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].hash == hash) { uint32_t mesh_name_hash = hash_utf8_murmurhash(mesh_name); - obj* obj = &set->objects[j]; - for (uint32_t k = 0; k < obj->meshes_count; k++) - if (hash_utf8_murmurhash(obj->meshes[k].name) == mesh_name_hash) + obj* obj = &set->obj_data[j]; + for (uint32_t k = 0; k < obj->num_mesh; k++) + if (hash_utf8_murmurhash(obj->mesh_array[k].name) == mesh_name_hash) return k; return -1; } @@ -603,9 +576,9 @@ inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { if (!set) return 0; - 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; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return set->obj_data[j].skin_init ? &set->obj_data[j].skin : 0; return 0; } @@ -617,9 +590,9 @@ inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { if (!set) return 0; - 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; + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return set->obj_data[j].skin_init ? &set->obj_data[j].skin : 0; return 0; } return 0; @@ -627,36 +600,36 @@ inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { inline obj_index_buffer* object_storage_get_obj_index_buffers(uint32_t set_id) { obj_set_handler* handler = object_storage_get_obj_set_handler(set_id); - if (handler && handler->index_buffers) - return handler->index_buffers; + if (handler && handler->index_buffer_data) + return handler->index_buffer_data; return 0; } inline obj_mesh_index_buffer* object_storage_get_obj_mesh_index_buffer(object_info obj_info) { obj_set_handler* handler = object_storage_get_obj_set_handler(obj_info.set_id); - if (handler && handler->obj_set && handler->index_buffers) { + if (handler && handler->obj_set && handler->index_buffer_data) { obj_set* set = handler->obj_set; - for (uint32_t i = 0; i < set->objects_count; i++) - if (set->objects[i].id == obj_info.id) - return handler->index_buffers[i].meshes; + for (uint32_t i = 0; i < set->obj_num; i++) + if (set->obj_data[i].id == obj_info.id) + return handler->index_buffer_data[i].mesh_data; } return 0; } inline obj_vertex_buffer* object_storage_get_obj_vertex_buffers(uint32_t set_id) { obj_set_handler* handler = object_storage_get_obj_set_handler(set_id); - if (handler && handler->vertex_buffers) - return handler->vertex_buffers; + if (handler && handler->vertex_buffer_data) + return handler->vertex_buffer_data; return 0; } inline obj_mesh_vertex_buffer* object_storage_get_obj_mesh_vertex_buffer(object_info obj_info) { obj_set_handler* handler = object_storage_get_obj_set_handler(obj_info.set_id); - if (handler && handler->obj_set && handler->vertex_buffers) { + if (handler && handler->obj_set && handler->vertex_buffer_data) { obj_set* set = handler->obj_set; - for (uint32_t i = 0; i < set->objects_count; i++) - if (set->objects[i].id == obj_info.id) - return handler->vertex_buffers[i].meshes; + for (uint32_t i = 0; i < set->obj_num; i++) + if (set->obj_data[i].id == obj_info.id) + return handler->vertex_buffer_data[i].mesh_data; } return 0; } @@ -670,8 +643,8 @@ GLuint obj_database_get_obj_set_texture(int32_t set, uint32_t tex_id) { if (!handler) return -1; - std::pair* texture = handler->texture_ids.data(); - size_t length = handler->texture_ids.size(); + std::pair* texture = handler->tex_id_data.data(); + size_t length = handler->tex_id_data.size(); size_t temp; while (length > 0) if (tex_id < texture[temp = length / 2].first) @@ -681,7 +654,7 @@ GLuint obj_database_get_obj_set_texture(int32_t set, uint32_t tex_id) { length -= temp + 1; } - if (texture != handler->texture_ids.data() + handler->texture_ids.size()) + if (texture != handler->tex_id_data.data() + handler->tex_id_data.size()) return (*textures)[texture->second]; return -1; } @@ -689,7 +662,7 @@ GLuint obj_database_get_obj_set_texture(int32_t set, uint32_t tex_id) { inline std::vector* object_storage_get_obj_set_textures(int32_t set) { obj_set_handler* handler = object_storage_get_obj_set_handler(set); if (handler) - return &handler->textures; + return &handler->gentex; return 0; } @@ -819,9 +792,9 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id, return false; handler->obj_file_handler.free_data(); - handler->object_ids.reserve(set->objects_count); - for (uint32_t i = 0; i < set->objects_count; i++) - handler->object_ids.push_back({ set->objects[i].id, i }); + handler->obj_id_data.reserve(set->obj_num); + for (uint32_t i = 0; i < set->obj_num; i++) + handler->obj_id_data.push_back({ set->obj_data[i].id, i }); if (!obj_set_handler_vertex_buffer_load(handler) || !obj_set_handler_index_buffer_load(handler)) @@ -922,9 +895,9 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id, return false; handler->obj_file_handler.free_data(); - handler->object_ids.reserve(set->objects_count); - for (uint32_t i = 0; i < set->objects_count; i++) - handler->object_ids.push_back({ set->objects[i].id, i }); + handler->obj_id_data.reserve(set->obj_num); + for (uint32_t i = 0; i < set->obj_num; i++) + handler->obj_id_data.push_back({ set->obj_data[i].id, i }); if (!obj_set_handler_vertex_buffer_load(handler) || !obj_set_handler_index_buffer_load(handler)) @@ -954,17 +927,17 @@ inline void object_storage_unload_set(uint32_t set_id) { if (--handler->load_count > 0) return; - handler->object_ids.clear(); - handler->texture_ids.clear(); - handler->textures.clear(); + handler->obj_id_data.clear(); + handler->tex_id_data.clear(); + handler->gentex.clear(); - texture** texture_data = handler->texture_data; - int32_t textures_count = handler->textures_count; - for (int32_t i = 0; i < textures_count; i++) - texture_free(texture_data[i]); - free(texture_data); - handler->texture_data = 0; - handler->textures_count = 0; + texture** tex_data = handler->tex_data; + int32_t tex_num = handler->tex_num; + for (int32_t i = 0; i < tex_num; i++) + texture_free(tex_data[i]); + free(tex_data); + handler->tex_data = 0; + handler->tex_num = 0; obj_set_handler_index_buffer_free(handler); obj_set_handler_vertex_buffer_free(handler); @@ -993,8 +966,8 @@ 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 (uint32_t i = 0; i < mesh->sub_meshes_count; i++) - indices_count += mesh->sub_meshes[i].indices_count; + for (uint32_t i = 0; i < mesh->num_submesh; i++) + indices_count += mesh->submesh_array[i].indices_count; if (!indices_count) { buffer->buffer = 0; @@ -1003,8 +976,8 @@ 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 (uint32_t k = 0; k < mesh->sub_meshes_count; k++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[k]; + for (uint32_t k = 0; k < mesh->num_submesh; k++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[k]; int32_t indices_count = sub_mesh->indices_count; uint32_t* sub_mesh_indices = sub_mesh->indices; for (int32_t l = 0; l < indices_count; l++) @@ -1012,8 +985,8 @@ static bool obj_mesh_index_buffer_load(obj_mesh_index_buffer* buffer, obj_mesh* } _indices = indices; - for (uint32_t i = 0, offset = 0; i < mesh->sub_meshes_count; i++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[i]; + for (uint32_t i = 0, offset = 0; i < mesh->num_submesh; i++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[i]; sub_mesh->first_index = 0; sub_mesh->last_index = 0; @@ -1064,94 +1037,94 @@ static void obj_mesh_index_buffer_free(obj_mesh_index_buffer* buffer) { } static bool obj_mesh_vertex_buffer_load(obj_mesh_vertex_buffer* buffer, obj_mesh* mesh) { - if (!mesh->vertex_count || !mesh->vertex) + if (!mesh->num_vertex || !mesh->vertex) return false; - size_t vertex_size; - if (~mesh->flags & OBJ_MESH_COMPRESSED) - vertex_size = obj_vertex_flags_get_vertex_size(mesh->vertex_flags); + size_t size_vertex; + if (~mesh->attrib.m.compressed) + size_vertex = obj_vertex_format_get_vertex_size(mesh->vertex_format); else - vertex_size = obj_vertex_flags_get_vertex_size_comp(mesh->vertex_flags); + size_vertex = obj_vertex_format_get_vertex_size_comp(mesh->vertex_format); - void* vertex = force_malloc(vertex_size * mesh->vertex_count); + void* vertex = force_malloc(size_vertex * mesh->num_vertex); if (vertex) { - obj_vertex_flags flags = mesh->vertex_flags; + obj_vertex_format vertex_format = mesh->vertex_format; obj_vertex_data* vertex_file = mesh->vertex; - int32_t vertex_count = mesh->vertex_count; + int32_t num_vertex = mesh->num_vertex; size_t d = (size_t)vertex; - if (~mesh->flags & OBJ_MESH_COMPRESSED) { - for (int32_t i = 0; i < vertex_count; i++) { - if (flags & OBJ_VERTEX_POSITION) { + if (~mesh->attrib.m.compressed) { + for (int32_t i = 0; i < num_vertex; i++) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { *(vec3*)d = vertex_file[i].position; d += 12; } - if (flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { *(vec3*)d = vertex_file[i].normal; d += 12; } - if (flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { *(vec4u*)d = vertex_file[i].tangent; d += 16; } - if (flags & OBJ_VERTEX_BINORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_BINORMAL) { *(vec3*)d = vertex_file[i].binormal; d += 12; } - if (flags & OBJ_VERTEX_TEXCOORD0) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { *(vec2*)d = vertex_file[i].texcoord0; d += 8; } - if (flags & OBJ_VERTEX_TEXCOORD1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { *(vec2*)d = vertex_file[i].texcoord1; d += 8; } - if (flags & OBJ_VERTEX_TEXCOORD2) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) { *(vec2*)d = vertex_file[i].texcoord2; d += 8; } - if (flags & OBJ_VERTEX_TEXCOORD3) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) { *(vec2*)d = vertex_file[i].texcoord3; d += 8; } - if (flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { *(vec4u*)d = vertex_file[i].color0; d += 16; } - if (flags & OBJ_VERTEX_COLOR1) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR1) { *(vec4u*)d = vertex_file[i].color1; d += 16; } - if (flags & OBJ_VERTEX_BONE_DATA) { + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { *(vec4u*)d = vertex_file[i].bone_weight; d += 16; *(vec4iu*)d = vertex_file[i].bone_index; d += 16; } - if (flags & OBJ_VERTEX_UNKNOWN) { + if (vertex_format & OBJ_VERTEX_FORMAT_UNKNOWN) { *(vec4u*)d = vertex_file[i].unknown; d += 16; } } } else { - for (int32_t i = 0; i < vertex_count; i++) { - if (flags & OBJ_VERTEX_POSITION) { + for (int32_t i = 0; i < num_vertex; i++) { + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { *(vec3*)d = vertex_file[i].position; d += 12; } - if (flags & OBJ_VERTEX_NORMAL) { + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { vec3 normal; vec3_mult_scalar(vertex_file[i].normal, 32727.0f, normal); vec3_to_vec3i16(normal, *(vec3i16*)d); @@ -1159,40 +1132,40 @@ static bool obj_mesh_vertex_buffer_load(obj_mesh_vertex_buffer* buffer, obj_mesh d += 8; } - if (flags & OBJ_VERTEX_TANGENT) { + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { vec4 tangent = vertex_file[i].tangent; vec4_mult_scalar(tangent, 32727.0f, tangent); vec4_to_vec4i16(tangent, *(vec4i16*)d); d += 8; } - if (flags & OBJ_VERTEX_TEXCOORD0) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { vec2_to_vec2h(vertex_file[i].texcoord0, *(vec2h*)d); d += 4; } - if (flags & OBJ_VERTEX_TEXCOORD1) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { vec2_to_vec2h(vertex_file[i].texcoord1, *(vec2h*)d); d += 4; } - if (flags & OBJ_VERTEX_TEXCOORD2) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) { vec2_to_vec2h(vertex_file[i].texcoord2, *(vec2h*)d); d += 4; } - if (flags & OBJ_VERTEX_TEXCOORD3) { + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) { vec2_to_vec2h(vertex_file[i].texcoord3, *(vec2h*)d); d += 4; } - if (flags & OBJ_VERTEX_COLOR0) { + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { vec4 color0 = vertex_file[i].color0; vec4_to_vec4h(color0, *(vec4h*)d); d += 8; } - if (flags & OBJ_VERTEX_BONE_DATA) { + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { vec4 bone_weight = vertex_file[i].bone_weight; vec4_mult_scalar(bone_weight, 65535.0f, bone_weight); vec4_to_vec4u16(bone_weight, *(vec4u16*)d); @@ -1205,10 +1178,10 @@ static bool obj_mesh_vertex_buffer_load(obj_mesh_vertex_buffer* buffer, obj_mesh } } } - mesh->vertex_size = (int32_t)vertex_size; + mesh->size_vertex = (int32_t)size_vertex; - bool ret = obj_mesh_vertex_buffer_load_data(buffer, vertex_size * mesh->vertex_count, - vertex, mesh->flags & OBJ_MESH_FLAG_1 ? 2 : 1); + bool ret = obj_mesh_vertex_buffer_load_data(buffer, size_vertex * mesh->num_vertex, + vertex, mesh->attrib.m.flag_0 ? 2 : 1); free(vertex); return ret; } @@ -1235,15 +1208,15 @@ 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 (uint32_t i = 0; i < set->objects_count; i++) { - obj* obj = &set->objects[i]; - for (uint32_t j = 0; j < obj->meshes_count; j++) { - obj_mesh* mesh = &obj->meshes[j]; - for (uint32_t k = 0; k < mesh->sub_meshes_count; k++) { + for (uint32_t i = 0; i < set->obj_num; i++) { + obj* obj = &set->obj_data[i]; + for (uint32_t j = 0; j < obj->num_mesh; j++) { + obj_mesh* mesh = &obj->mesh_array[j]; + for (uint32_t k = 0; k < mesh->num_submesh; 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]; + obj_sub_mesh* sub_mesh = &mesh->submesh_array[k]; uint32_t* indices = (uint32_t*)sub_mesh->indices; uint32_t indices_count = sub_mesh->indices_count; obj_vertex_data* vertex = mesh->vertex; @@ -1277,31 +1250,30 @@ 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 (uint32_t i = 0; i < set->objects_count; i++) { - obj* obj = &set->objects[i]; - uint32_t materials_count = obj->materials_count; - for (uint32_t j = 0; j < materials_count; j++) { - obj_material_data* material_data = &obj->materials[j]; + for (uint32_t i = 0; i < set->obj_num; i++) { + obj* obj = &set->obj_data[i]; + uint32_t num_material = obj->num_material; + for (uint32_t j = 0; j < num_material; j++) { + obj_material_data* material_data = &obj->material_array[j]; obj_material* material = &material_data->material; - 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 (obj_material_texture& k : material->textures) { - obj_material_texture* texture = &k; - uint32_t texture_id = texture->texture_id; - texture->texture_id = 0; + for (obj_material_texture_data& k : material->texdata) { + obj_material_texture_data* texture = &k; + uint32_t texture_id = texture->tex_index; + texture->tex_index = 0; texture->texture_index = 0; - std::pair* texture_ids = handler->texture_ids.data(); - 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; + std::pair* tex_id_data = handler->tex_id_data.data(); + uint32_t tex_id_num = (uint32_t)handler->tex_id_data.size(); + for (uint32_t l = tex_id_num; l; l--, tex_id_data++) + if (tex_id_data->first == texture_id) { + texture->tex_index = texture_id; + texture->texture_index = tex_id_data->second; break; } } @@ -1311,44 +1283,44 @@ static void obj_set_handler_get_shader_index_texture_index(obj_set_handler* hand static bool obj_set_handler_index_buffer_load(obj_set_handler* handler) { obj_set* set = handler->obj_set; - handler->index_buffers_count = set->objects_count; - handler->index_buffers = force_malloc_s(obj_index_buffer, set->objects_count); - if (!handler->index_buffers) + handler->index_buffer_num = set->obj_num; + handler->index_buffer_data = force_malloc_s(obj_index_buffer, set->obj_num); + if (!handler->index_buffer_data) return true; - for (uint32_t i = 0; i < set->objects_count; i++) { - obj* obj = &set->objects[i]; - obj_index_buffer* buffer = &handler->index_buffers[i]; + for (uint32_t i = 0; i < set->obj_num; i++) { + obj* obj = &set->obj_data[i]; + obj_index_buffer* buffer = &handler->index_buffer_data[i]; - buffer->meshes_count = obj->meshes_count; - buffer->meshes = force_malloc_s(obj_mesh_index_buffer, obj->meshes_count); - if (!buffer->meshes) + buffer->mesh_num = obj->num_mesh; + buffer->mesh_data = force_malloc_s(obj_mesh_index_buffer, obj->num_mesh); + if (!buffer->mesh_data) return false; - for (uint32_t j = 0; j < buffer->meshes_count; j++) - if (!obj_mesh_index_buffer_load(&buffer->meshes[j], &obj->meshes[j])) + for (uint32_t j = 0; j < buffer->mesh_num; j++) + if (!obj_mesh_index_buffer_load(&buffer->mesh_data[j], &obj->mesh_array[j])) return false; } return true; } static void obj_set_handler_index_buffer_free(obj_set_handler* handler) { - if (!handler->index_buffers) + if (!handler->index_buffer_data) return; - for (uint32_t i = 0; i < handler->index_buffers_count; i++) { - obj_index_buffer* buffer = &handler->index_buffers[i]; - if (buffer->meshes) - for (uint32_t j = 0; j < buffer->meshes_count; j++) - obj_mesh_index_buffer_free(&buffer->meshes[j]); - free(buffer->meshes); + for (uint32_t i = 0; i < handler->index_buffer_num; i++) { + obj_index_buffer* buffer = &handler->index_buffer_data[i]; + if (buffer->mesh_data) + for (uint32_t j = 0; j < buffer->mesh_num; j++) + obj_mesh_index_buffer_free(&buffer->mesh_data[j]); + free(buffer->mesh_data); } - free(handler->index_buffers); - handler->index_buffers = 0; - handler->index_buffers_count = 0; + free(handler->index_buffer_data); + handler->index_buffer_data = 0; + handler->index_buffer_num = 0; } -static int32_t obj_set_texture_ids_sort(void const* src1, void const* src2) { +static int32_t obj_set_tex_id_data_sort(void const* src1, void const* src2) { std::pair* p1 = (std::pair*)src1; std::pair* p2 = (std::pair*)src2; return p1->first - p2->first; @@ -1358,22 +1330,24 @@ static bool obj_set_handler_load_textures(obj_set_handler* handler, void* data, obj_set* set = handler->obj_set; if (!set || !data) return true; - else if (!set->texture_ids_count) + else if (!set->tex_id_num) return false; { txp_set txp; txp.unpack_file(data, big_endian); - handler->textures_count = (int32_t)txp.textures.size(); - texture_txp_set_load(&txp, &handler->texture_data, set->texture_ids); + handler->tex_num = (int32_t)txp.textures.size(); + texture_txp_set_load(&txp, &handler->tex_data, set->tex_id_data); } - uint32_t* texture_ids = set->texture_ids; - int32_t textures_count = handler->textures_count; - texture** texture_data = handler->texture_data; - for (int32_t i = 0; i < textures_count; i++) { - handler->texture_ids.push_back({ texture_ids[i], i }); - handler->textures.push_back(texture_data[i]->tex); + handler->tex_id_data.reserve(handler->tex_num); + handler->gentex.reserve(handler->tex_num); + uint32_t* tex_id_data = set->tex_id_data; + int32_t tex_num = handler->tex_num; + texture** tex_data = handler->tex_data; + for (int32_t i = 0; i < tex_num; i++) { + handler->tex_id_data.push_back({ tex_id_data[i], i }); + handler->gentex.push_back(tex_data[i]->tex); } return false; } @@ -1382,63 +1356,65 @@ static bool obj_set_handler_load_textures_modern(obj_set_handler* handler, void* obj_set* set = handler->obj_set; if (!set || !data || !size) return true; - else if (!set->texture_ids_count) + else if (!set->tex_id_num) return false; { txp_set txp; txp.unpack_file_modern(data, size); - handler->textures_count = (int32_t)txp.textures.size(); - texture_txp_set_load(&txp, &handler->texture_data, set->texture_ids); + handler->tex_num = (int32_t)txp.textures.size(); + texture_txp_set_load(&txp, &handler->tex_data, set->tex_id_data); } - uint32_t* texture_ids = set->texture_ids; - uint32_t textures_count = handler->textures_count; - texture** texture_data = handler->texture_data; - 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); + handler->tex_id_data.reserve(handler->tex_num); + handler->gentex.reserve(handler->tex_num); + uint32_t* tex_id_data = set->tex_id_data; + uint32_t tex_num = handler->tex_num; + texture** tex_data = handler->tex_data; + for (uint32_t i = 0; i < tex_num; i++) { + handler->tex_id_data.push_back({ tex_id_data[i], i }); + handler->gentex.push_back(tex_data[i]->tex); } return false; } static bool obj_set_handler_vertex_buffer_load(obj_set_handler* handler) { obj_set* set = handler->obj_set; - handler->vertex_buffers_count = set->objects_count; - handler->vertex_buffers = force_malloc_s(obj_vertex_buffer, set->objects_count); - if (!handler->vertex_buffers) + handler->vertex_buffer_num = set->obj_num; + handler->vertex_buffer_data = force_malloc_s(obj_vertex_buffer, set->obj_num); + if (!handler->vertex_buffer_data) return true; - for (uint32_t i = 0; i < set->objects_count; i++) { - obj* obj = &set->objects[i]; - obj_vertex_buffer* buffer = &handler->vertex_buffers[i]; + for (uint32_t i = 0; i < set->obj_num; i++) { + obj* obj = &set->obj_data[i]; + obj_vertex_buffer* buffer = &handler->vertex_buffer_data[i]; - buffer->meshes_count = obj->meshes_count; - buffer->meshes = force_malloc_s(obj_mesh_vertex_buffer, obj->meshes_count); - if (!buffer->meshes) + buffer->mesh_num = obj->num_mesh; + buffer->mesh_data = force_malloc_s(obj_mesh_vertex_buffer, obj->num_mesh); + if (!buffer->mesh_data) return false; - for (uint32_t j = 0; j < buffer->meshes_count; j++) - if (!obj_mesh_vertex_buffer_load(&buffer->meshes[j], &obj->meshes[j])) + for (uint32_t j = 0; j < buffer->mesh_num; j++) + if (!obj_mesh_vertex_buffer_load(&buffer->mesh_data[j], &obj->mesh_array[j])) return false; } return true; } static void obj_set_handler_vertex_buffer_free(obj_set_handler* handler) { - if (!handler->vertex_buffers) + if (!handler->vertex_buffer_data) return; - for (uint32_t i = 0; i < handler->vertex_buffers_count; i++) { - obj_vertex_buffer* buffer = &handler->vertex_buffers[i]; - if (buffer->meshes) - for (uint32_t j = 0; j < buffer->meshes_count; j++) - obj_mesh_vertex_buffer_free(&buffer->meshes[j]); - free(buffer->meshes); + for (uint32_t i = 0; i < handler->vertex_buffer_num; i++) { + obj_vertex_buffer* buffer = &handler->vertex_buffer_data[i]; + if (buffer->mesh_data) + for (uint32_t j = 0; j < buffer->mesh_num; j++) + obj_mesh_vertex_buffer_free(&buffer->mesh_data[j]); + free(buffer->mesh_data); } - free(handler->vertex_buffers); - handler->vertex_buffers = 0; - handler->vertex_buffers_count = 0; + free(handler->vertex_buffer_data); + handler->vertex_buffer_data = 0; + handler->vertex_buffer_num = 0; } inline static void obj_skin_block_constraint_attach_point_load( @@ -1470,68 +1446,68 @@ inline static void obj_skin_block_node_free(obj_skin_block_node* node) { string_free(&node->parent_name); } -inline static size_t obj_vertex_flags_get_vertex_size(obj_vertex_flags flags) { +inline static size_t obj_vertex_format_get_vertex_size(obj_vertex_format format) { size_t size = 0; - if (flags & OBJ_VERTEX_POSITION) + if (format & OBJ_VERTEX_FORMAT_POSITION) size += 12; - if (flags & OBJ_VERTEX_NORMAL) + if (format & OBJ_VERTEX_FORMAT_NORMAL) size += 12; - if (flags & OBJ_VERTEX_TANGENT) + if (format & OBJ_VERTEX_FORMAT_TANGENT) size += 16; - if (flags & OBJ_VERTEX_BINORMAL) + if (format & OBJ_VERTEX_FORMAT_BINORMAL) size += 12; - if (flags & OBJ_VERTEX_TEXCOORD0) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD0) size += 8; - if (flags & OBJ_VERTEX_TEXCOORD1) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD1) size += 8; - if (flags & OBJ_VERTEX_TEXCOORD2) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD2) size += 8; - if (flags & OBJ_VERTEX_TEXCOORD3) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD3) size += 8; - if (flags & OBJ_VERTEX_COLOR0) + if (format & OBJ_VERTEX_FORMAT_COLOR0) size += 16; - if (flags & OBJ_VERTEX_COLOR1) + if (format & OBJ_VERTEX_FORMAT_COLOR1) size += 16; - if (flags & OBJ_VERTEX_BONE_DATA) + if (format & OBJ_VERTEX_FORMAT_BONE_DATA) size += 32; - if (flags & OBJ_VERTEX_UNKNOWN) + if (format & OBJ_VERTEX_FORMAT_UNKNOWN) size += 16; return size; } -inline static size_t obj_vertex_flags_get_vertex_size_comp(obj_vertex_flags flags) { +inline static size_t obj_vertex_format_get_vertex_size_comp(obj_vertex_format format) { size_t size = 0; - if (flags & OBJ_VERTEX_POSITION) + if (format & OBJ_VERTEX_FORMAT_POSITION) size += 12; - if (flags & OBJ_VERTEX_NORMAL) + if (format & OBJ_VERTEX_FORMAT_NORMAL) size += 8; - if (flags & OBJ_VERTEX_TANGENT) + if (format & OBJ_VERTEX_FORMAT_TANGENT) size += 8; - if (flags & OBJ_VERTEX_TEXCOORD0) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD0) size += 4; - if (flags & OBJ_VERTEX_TEXCOORD1) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD1) size += 4; - if (flags & OBJ_VERTEX_TEXCOORD2) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD2) size += 4; - if (flags & OBJ_VERTEX_TEXCOORD3) + if (format & OBJ_VERTEX_FORMAT_TEXCOORD3) size += 4; - if (flags & OBJ_VERTEX_COLOR0) + if (format & OBJ_VERTEX_FORMAT_COLOR0) size += 8; - if (flags & OBJ_VERTEX_BONE_DATA) + if (format & OBJ_VERTEX_FORMAT_BONE_DATA) size += 16; return size; } obj_set_handler::obj_set_handler(): obj_loaded(), tex_loaded(), obj_set(), -textures_count(), texture_data(), set_id(), vertex_buffers_count(), vertex_buffers(), -index_buffers_count(), index_buffers(), load_count(), modern() { +tex_num(), tex_data(), set_id(), vertex_buffer_num(), vertex_buffer_data(), +index_buffer_num(), index_buffer_data(), load_count(), modern() { } obj_set_handler::~obj_set_handler() { - for (uint32_t i = 0; i < textures_count; i++) - texture_free(texture_data[i]); - free(texture_data); + for (uint32_t i = 0; i < tex_num; i++) + texture_free(tex_data[i]); + free(tex_data); obj_set_handler_index_buffer_free(this); obj_set_handler_vertex_buffer_free(this); diff --git a/src/CRE/object.hpp b/src/CRE/object.hpp index ce88b4dd..a02dbf72 100644 --- a/src/CRE/object.hpp +++ b/src/CRE/object.hpp @@ -33,13 +33,13 @@ struct obj_mesh_vertex_buffer { }; struct obj_index_buffer { - uint32_t meshes_count; - obj_mesh_index_buffer* meshes; + uint32_t mesh_num; + obj_mesh_index_buffer* mesh_data; }; struct obj_vertex_buffer { - uint32_t meshes_count; - obj_mesh_vertex_buffer* meshes; + uint32_t mesh_num; + obj_mesh_vertex_buffer* mesh_data; }; struct obj_set_handler { @@ -48,16 +48,16 @@ struct obj_set_handler { p_file_handler tex_file_handler; bool tex_loaded; obj_set* obj_set; - std::vector> object_ids; - uint32_t textures_count; - std::vector textures; - std::vector> texture_ids; - texture** texture_data; + std::vector> obj_id_data; + uint32_t tex_num; + std::vector gentex; + std::vector> tex_id_data; + texture** tex_data; int32_t set_id; - uint32_t vertex_buffers_count; - obj_vertex_buffer* vertex_buffers; - uint32_t index_buffers_count; - obj_index_buffer* index_buffers; + uint32_t vertex_buffer_num; + obj_vertex_buffer* vertex_buffer_data; + uint32_t index_buffer_num; + obj_index_buffer* index_buffer_data; uint32_t load_count; std::string name; p_file_handler farc_file_handler; @@ -67,9 +67,6 @@ struct obj_set_handler { virtual ~obj_set_handler(); }; -extern obj_material_shader_lighting_type obj_material_shader_get_lighting_type( - obj_material_shader_flags* flags); -extern int32_t obj_material_texture_get_blend(obj_material_texture* tex); extern int32_t obj_material_texture_type_get_texcoord_index( obj_material_texture_type type, int32_t index); extern int32_t obj_material_texture_type_get_texture_index( diff --git a/src/CRE/post_process/dof.cpp b/src/CRE/post_process/dof.cpp index c012394b..5ffcdfe1 100644 --- a/src/CRE/post_process/dof.cpp +++ b/src/CRE/post_process/dof.cpp @@ -620,7 +620,8 @@ 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() { +post_process_dof::post_process_dof() : data(), width(), +height(), textures(), fbo(), vao(), program(), ubo() { post_process_dof_load_shaders(this); } @@ -959,11 +960,6 @@ static void post_process_dof_calculate_texcoords(vec2* data, float_t size) { } static void post_process_dof_free_fbo(post_process_dof* dof) { - dof->fbo[0]; - dof->fbo[1]; - dof->fbo[2]; - dof->fbo[3]; - if (dof->vao) { glDeleteVertexArrays(1, &dof->vao); dof->vao = 0; diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 7010db23..3a0bebf4 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -490,12 +490,6 @@ void render_context::ctrl() { rob_chara_array[i].item_equip->shadow_type = SHADOW_CHARA; }*/ - Glitter::glt_particle_manager.cam_projection = camera->projection; - Glitter::glt_particle_manager.cam_view = camera->view; - Glitter::glt_particle_manager.cam_inv_view = camera->inv_view; - Glitter::glt_particle_manager.cam_inv_view_mat3 = camera->inv_view_mat3; - Glitter::glt_particle_manager.cam_view_point = camera->view_point; - Glitter::glt_particle_manager.cam_rotation_y = camera->rotation.y; Glitter::glt_particle_manager.rctx = this; rctx_ptr = this; @@ -645,7 +639,7 @@ void render_context::light_param_data_glow_set(light_param_glow* glow) { } void render_context::light_param_data_ibl_set( - light_param_ibl * ibl, light_param_data_storage * storage) { + light_param_ibl * ibl, light_param_data_storage* storage) { if (!ibl->ready) return; @@ -742,8 +736,8 @@ void render_context::light_param_data_face_set(light_param_face* face) { shadow::shadow() : field_8(), field_158(), view_point(), interest(), field_1A8(), view_point_shared(), interest_shared(), field_2F0() { - field_170 = 1.2f; - field_174 = 1.0f; + view_region = 1.2f; + range = 1.0f; for (int32_t i = 0; i < 2; i++) { view_point[i] = vec3_identity; field_1C0[i] = 0.0f; @@ -799,9 +793,9 @@ void shadow::ctrl(render_context* rctx) { vec3_negate(direction, direction); vec3_length(direction, length); if (length < 0.000001) - direction = { 0.0f, 1.0f, 0.0f }; + this->direction = { 0.0f, 1.0f, 0.0f }; else - vec3_mult_scalar(direction, 1.0f / length, direction); + vec3_mult_scalar(direction, 1.0f / length, this->direction); for (int32_t i = 0; i < 2; i++) if (draw_task_get_count(rctx, (draw_object_type)((int32_t)DRAW_OBJECT_SHADOW_CHARA + i))) @@ -884,7 +878,7 @@ void shadow::ctrl(render_context* rctx) { float_t v2 = max(field_1C8[0], field_1C8[1]); field_2F5 = false; - field_170 = v2 + 1.2f; + view_region = v2 + 1.2f; field_200[0] = 0; field_200[1] = 1; if (field_2EC >= 2) { @@ -908,11 +902,11 @@ void shadow::ctrl(render_context* rctx) { v16 = 0.0f; if (v16 > 1.2f) { - field_170 = v2 + 2.4f; + view_region = v2 + 2.4f; field_2F5 = true; } else - field_170 = v2 + 1.2f + v16; + view_region = v2 + 1.2f + v16; float_t t3; float_t t4; @@ -996,7 +990,7 @@ void shadow::ctrl(render_context* rctx) { vec3 view_point = vec3_null; vec3 interest = vec3_null; - int32_t count = 0;; + int32_t count = 0; for (int32_t i = 0; i < 2; i++) { int32_t c = (int32_t)field_1D0[i].size(); vec3 view_point_temp; @@ -1015,7 +1009,7 @@ void shadow::ctrl(render_context* rctx) { float_t v2 = 0.0; float_t v67 = max(field_1C8[0], field_1C8[1]); field_2F5 = false; - field_170 = v67 + 1.2f; + view_region = v67 + 1.2f; field_200[0] = 0; field_200[1] = 1; if (field_2EC >= 2) { @@ -1055,11 +1049,11 @@ void shadow::ctrl(render_context* rctx) { v79 = v70; if (v79 > v67 + 1.2f) { - field_170 = v67 + 2.4f; + view_region = v67 + 2.4f; field_2F5 = true; } else - field_170 = v79 + 1.2f; + view_region = v79 + 1.2f; vec3 interest_chara; vec3 interest_stage; @@ -1076,7 +1070,7 @@ void shadow::ctrl(render_context* rctx) { } } - for (std::vector i : field_1D0) + for (std::vector& i : field_1D0) i.clear(); } diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 28adca80..d8561f3d 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -410,7 +410,7 @@ struct object_data_buffer { struct object_data_culling_info { int32_t objects; int32_t meshes; - int32_t sub_meshes; + int32_t submesh_array; }; struct object_data { @@ -507,8 +507,8 @@ struct render_context { struct shadow { render_texture field_8[7]; render_texture* field_158[3]; - float_t field_170; - float_t field_174; + float_t view_region; + float_t range; vec3 view_point[2]; vec3 interest[2]; vec3 field_1A8[2]; diff --git a/src/CRE/rob.cpp b/src/CRE/rob.cpp index 6e54ae4b..cef835e4 100644 --- a/src/CRE/rob.cpp +++ b/src/CRE/rob.cpp @@ -9,6 +9,7 @@ #include "../KKdLib/key_val.hpp" #include "../KKdLib/str_utils.h" #include "random.hpp" +#include "stage.hpp" #define OSG_SET_TEXT_BUF_SIZE 0x400 #define SKP_TEXT_BUF_SIZE 0x400 @@ -460,14 +461,6 @@ struct rob_manager_rob_impl { const char* name; }; -struct struc_150 { - const char* name; - const char* chara_name; - const char* auth_3d_name; - const char* field_18; - const char* jp_name; -}; - static bone_data* bone_data_init(bone_data* bone); static float_t bone_data_limit_angle(float_t angle); static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select); @@ -544,7 +537,6 @@ static const float_t get_osage_gravity_const(); 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); static void mot_blend_set_frame(mot_blend* a1, float_t frame); @@ -563,8 +555,6 @@ static void mot_key_data_interpolate(mot_key_data* a1, float_t frame, 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_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, @@ -713,15 +703,15 @@ 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, +static void mothead_func_73_rob_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, +static void mothead_func_75_rob_adjust_global(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, +static void mothead_func_76_rob_arm_adjust(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, +static void mothead_func_77_disable_eye_motion(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); @@ -737,7 +727,6 @@ static bool motion_blend_mot_interpolate_get_reverse(int32_t* a1); static void motion_blend_mot_load_file(motion_blend_mot* a1, int32_t motion_id, 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, @@ -771,6 +760,9 @@ static void rob_disp_rob_chara_ctrl_thread_main(rob_chara* rob_chr); static void rob_disp_rob_chara_disp(rob_chara* rob_chr); static void rob_disp_rob_chara_free(rob_chara* rob_chr); +static void rob_motion_modifier_rob_chara_ctrl(rob_chara* rob_chr); + +static float_t rob_chara_array_get_data_adjust_scale(int32_t chara_id); static rob_chara_item_equip* rob_chara_array_get_item_equip(int32_t chara_id); static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, std::vector* bones); @@ -783,7 +775,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, std::vector* vec_bone_data, + rob_chara_bone_data_ik_scale* ik_scale, std::vector* bones, 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, @@ -813,7 +805,6 @@ static void rob_chara_bone_data_motion_blend_mot_list_init(rob_chara_bone_data* static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, int32_t motion_id, MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data); -static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data); static void rob_chara_bone_data_set_eyelid_anim_duration(rob_chara_bone_data* rob_bone_data, float_t duration, float_t step, float_t offset); static void rob_chara_bone_data_set_eyelid_frame(rob_chara_bone_data* rob_bone_data, float_t frame); @@ -848,12 +839,6 @@ static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_da static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y); static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* mat); -static void rob_chara_data_adjuct_reset(rob_chara_adjust_data* rob_chr_adj); - -static void rob_chara_data_miku_rot_reset(rob_chara_data_miku_rot* rob_mik_rot); - -static void rob_chara_data_reset(rob_chara_data* rob_chr_data); - static bool rob_chara_item_cos_data_check_for_npr_flag(rob_chara_item_cos_data* itm_cos_data); static object_info rob_chara_item_cos_data_get_head_object_replace( rob_chara_item_cos_data* item_cos_data, int32_t head_object_id); @@ -927,7 +912,6 @@ static void rob_chara_item_equip_object_skp_load( rob_chara_item_equip_object* itm_eq_obj, key_val* kv, bone_database* bone_data); static void rob_chara_item_equip_object_skp_load_file( rob_chara_item_equip_object* itm_eq_obj, void* data, bone_database* bone_data, object_database* obj_db); -static void rob_chara_item_equip_reset(rob_chara_item_equip* rob_itm_equip); static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_itm_equip, bone_node* bone_nodes); static void rob_chara_item_equip_set_item_equip_range(rob_chara_item_equip* rob_itm_equip, bool value); @@ -957,8 +941,8 @@ static void rob_chara_load_default_motion(rob_chara* rob_chr, 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_adjust(rob_chara* rob_chr, rob_chara_data_adjust* adjust_new, + rob_chara_data_adjust* adjust, rob_chara_data_adjust* 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); @@ -967,7 +951,6 @@ static void rob_cmn_mottbl_read(void* a1, void* data, size_t size); static rob_manager_rob_impl* rob_manager_rob_impls1_get(TaskRobManager* rob_mgr); static rob_manager_rob_impl* rob_manager_rob_impls2_get(TaskRobManager* rob_mgr); -static void rob_osage_reset(rob_osage* rob_osg); static void rob_osage_init_data(rob_osage* rob_osg, obj_skin_block_osage* osg_data, obj_skin_osage_node* osg_nodes, bone_node* ex_data_bone_nodes, obj_skin* skin); @@ -1139,11 +1122,11 @@ static const mothead_func_struct mothead_func_array[] = { { mothead_func_70, 0 }, { mothead_func_71_osage_move_cancel, 0 }, { mothead_func_72, 0 }, - { mothead_func_73_hand_adjust, 0 }, + { mothead_func_73_rob_hand_adjust, 0 }, { mothead_func_74, 0 }, - { mothead_func_75, 0 }, - { mothead_func_76, 0 }, - { mothead_func_77, 0 }, + { mothead_func_75_rob_adjust_global, 0 }, + { mothead_func_76_rob_arm_adjust, 0 }, + { mothead_func_77_disable_eye_motion, 0 }, { mothead_func_78, 0 }, { mothead_func_79_rob_chara_coli_ring, 0 }, { mothead_func_80_adjust_get_global_trans, 0 }, @@ -1772,17 +1755,79 @@ static const chara_init_data chara_init_data_array[] = { } }; -struc_150 stru_140A247C0[] = { - { "MIKU" , "MIK", "MIK", "MIK", "ミク" }, - { "RIN" , "RIN", "RIN", "RIN", "リン" }, - { "LEN" , "LEN", "LEN", "LEN", "レン" }, - { "LUKA" , "LUK", "LUK", "LUK", "ルカ" }, - { "NERU" , "NER", "NER", "NER", "ネル" }, - { "HAKU" , "HAK", "HAK", "HAK", "ハク" }, - { "KAITO" , "KAI", "KAI", "KAI", "カイト" }, - { "MEIKO" , "MEI", "MEI", "MEI", "メイコ" }, - { "SAKINE", "SAK", "SAK", "SAK", "サキネ" }, - { "TETO" , "TET", "TET", "TET", "テト" }, +static const motion_bone_index rob_ik_hand_leg_bones[] = { + MOTION_BONE_C_KATA_R, MOTION_BONE_C_KATA_L, + MOTION_BONE_CL_MOMO_R, MOTION_BONE_CL_MOMO_L, +}; + +static const motion_bone_index dword_140A2DC90[] = { + MOTION_BONE_C_KATA_R, MOTION_BONE_KL_TE_R_WJ, MOTION_BONE_N_HITO_R_EX, + MOTION_BONE_NL_HITO_R_WJ, MOTION_BONE_NL_HITO_B_R_WJ, MOTION_BONE_NL_HITO_C_R_WJ, + MOTION_BONE_N_KO_R_EX, MOTION_BONE_NL_KO_R_WJ, MOTION_BONE_NL_KO_B_R_WJ, + MOTION_BONE_NL_KO_C_R_WJ, MOTION_BONE_N_KUSU_R_EX, MOTION_BONE_NL_KUSU_R_WJ, + MOTION_BONE_NL_KUSU_B_R_WJ, MOTION_BONE_NL_KUSU_C_R_WJ, MOTION_BONE_N_NAKA_R_EX, + MOTION_BONE_NL_NAKA_R_WJ, MOTION_BONE_NL_NAKA_B_R_WJ, MOTION_BONE_NL_NAKA_C_R_WJ, + MOTION_BONE_N_OYA_R_EX, MOTION_BONE_NL_OYA_R_WJ, MOTION_BONE_NL_OYA_B_R_WJ, + MOTION_BONE_NL_OYA_C_R_WJ, MOTION_BONE_N_STE_R_WJ_EX, MOTION_BONE_N_SUDE_R_WJ_EX, + MOTION_BONE_N_SUDE_B_R_WJ_EX, MOTION_BONE_N_HIJI_R_WJ_EX, MOTION_BONE_N_UP_KATA_R_EX, + MOTION_BONE_N_SKATA_R_WJ_CD_EX, MOTION_BONE_N_SKATA_B_R_WJ_CD_CU_EX, + MOTION_BONE_N_SKATA_C_R_WJ_CD_CU_EX, MOTION_BONE_NONE +}; + +static const motion_bone_index dword_140A2DD10[] = { + MOTION_BONE_C_KATA_L, MOTION_BONE_KL_TE_L_WJ, MOTION_BONE_N_HITO_L_EX, + MOTION_BONE_NL_HITO_L_WJ, MOTION_BONE_NL_HITO_B_L_WJ, MOTION_BONE_NL_HITO_C_L_WJ, + MOTION_BONE_N_KO_L_EX, MOTION_BONE_NL_KO_L_WJ, MOTION_BONE_NL_KO_B_L_WJ, + MOTION_BONE_NL_KO_C_L_WJ, MOTION_BONE_N_KUSU_L_EX, MOTION_BONE_NL_KUSU_L_WJ, + MOTION_BONE_NL_KUSU_B_L_WJ, MOTION_BONE_NL_KUSU_C_L_WJ, MOTION_BONE_N_NAKA_L_EX, + MOTION_BONE_NL_NAKA_L_WJ, MOTION_BONE_NL_NAKA_B_L_WJ, MOTION_BONE_NL_NAKA_C_L_WJ, + MOTION_BONE_N_OYA_L_EX, MOTION_BONE_NL_OYA_L_WJ, MOTION_BONE_NL_OYA_B_L_WJ, + MOTION_BONE_NL_OYA_C_L_WJ, MOTION_BONE_N_STE_L_WJ_EX, MOTION_BONE_N_SUDE_L_WJ_EX, + MOTION_BONE_N_SUDE_B_L_WJ_EX, MOTION_BONE_N_HIJI_L_WJ_EX, MOTION_BONE_N_UP_KATA_L_EX, + MOTION_BONE_N_SKATA_L_WJ_CD_EX, MOTION_BONE_N_SKATA_B_L_WJ_CD_CU_EX, + MOTION_BONE_N_SKATA_C_L_WJ_CD_CU_EX, MOTION_BONE_NONE +}; + +static const motion_bone_index dword_140A2DD90[] = { + MOTION_BONE_CL_MOMO_R, MOTION_BONE_KL_ASI_R_WJ_CO, MOTION_BONE_KL_TOE_R_WJ, + MOTION_BONE_N_HIZA_R_WJ_EX, MOTION_BONE_N_MOMO_A_R_WJ_CD_EX, + MOTION_BONE_N_MOMO_B_R_WJ_EX, MOTION_BONE_N_MOMO_C_R_WJ_EX, MOTION_BONE_NONE +}; + +static const motion_bone_index dword_140A2DDB0[] = { + MOTION_BONE_CL_MOMO_L, MOTION_BONE_KL_ASI_L_WJ_CO, MOTION_BONE_KL_TOE_L_WJ, + MOTION_BONE_N_HIZA_L_WJ_EX, MOTION_BONE_N_MOMO_A_L_WJ_CD_EX, + MOTION_BONE_N_MOMO_B_L_WJ_EX, MOTION_BONE_N_MOMO_C_L_WJ_EX, MOTION_BONE_NONE +}; + +static const rob_bone_index dword_140A2DDD0[] = { + ROB_BONE_NONE, ROB_BONE_KL_TE_R_WJ, ROB_BONE_KL_TE_L_WJ, ROB_BONE_KL_ASI_R_WJ_CO, + ROB_BONE_KL_ASI_L_WJ_CO, ROB_BONE_J_SUNE_R_WJ, ROB_BONE_J_SUNE_L_WJ, + ROB_BONE_UDE_R_WJ, ROB_BONE_UDE_L_WJ, ROB_BONE_CL_KAO, ROB_BONE_NONE, + ROB_BONE_NONE, ROB_BONE_NONE, ROB_BONE_NONE, ROB_BONE_NONE, ROB_BONE_NONE, + ROB_BONE_NONE, ROB_BONE_KL_TE_R_WJ, ROB_BONE_KL_TE_L_WJ, ROB_BONE_KL_ASI_R_WJ_CO, + ROB_BONE_KL_ASI_L_WJ_CO, ROB_BONE_J_SUNE_R_WJ, ROB_BONE_J_SUNE_L_WJ, + ROB_BONE_UDE_R_WJ, ROB_BONE_UDE_L_WJ, ROB_BONE_CL_KAO, ROB_BONE_NONE, +}; + +static const motion_bone_index rob_motion_c_kata_bones[] = { + MOTION_BONE_C_KATA_L, + MOTION_BONE_C_KATA_R, +}; + +static const rob_bone_index rob_kl_te_bones[] = { + ROB_BONE_KL_TE_L_WJ, + ROB_BONE_KL_TE_R_WJ +}; + +static const motion_bone_index* off_140C9E000[] = { + dword_140A2DC90, + dword_140A2DD10, +}; + +static const motion_bone_index* off_140C9E020[] = { + dword_140A2DD10, + dword_140A2DC90, }; static const struc_241 chara_some_data_array[] = { @@ -2061,26 +2106,24 @@ int32_t chara_init_data_get_chara_size_index(chara_index chara_index) { return 1; } -float_t chara_size_table_get_value(uint32_t a1) { +float_t chara_size_table_get_value(uint32_t index) { 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]; + if (index >= 0 && index <= 4) + return chara_size_table[index]; + return 1.0f; } -float_t chara_pos_adjust_y_table_get_value(uint32_t a1) { +float_t chara_pos_adjust_y_table_get_value(uint32_t index) { 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]; + if (index >= 0 && index <= 4) + return chara_pos_adjust_y_table[index]; + return 0.0f; } void motion_set_load_mothead(uint32_t set, std::string* mdata_dir, motion_database* mot_db) { @@ -2145,7 +2188,7 @@ void rob_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.set_callback_data(0, rob_cmn_mottbl_read, 0); rob_mot_tbl_file_handler.read_now(); rob_mot_tbl_file_handler.free_data(); } @@ -2265,7 +2308,7 @@ static void rob_chara_item_equip_object_ctrl(rob_chara_item_equip_object* itm_eq } static void rob_chara_item_equip_ctrl(rob_chara_item_equip* rob_itm_equip) { - if (!rob_itm_equip->field_D8) + if (!rob_itm_equip->disable_update) for (int32_t i = rob_itm_equip->first_item_equip_object; i < rob_itm_equip->max_item_equip_object; i++) rob_chara_item_equip_object_ctrl(&rob_itm_equip->item_equip_object[i]); } @@ -2292,34 +2335,36 @@ static void sub_140509D30(rob_chara* rob_chr) { const struc_218* v3 = rob_chr->chara_init_data->field_828; const struc_218* v6 = rob_chr->chara_init_data->field_830; + mat4* m; mat4 mat; for (int32_t i = 0; i < 27; i++) { - mat = *rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, v3->bone_index); - mat4_translate_mult(&mat, v3->bone_offset.x, v3->bone_offset.y, v3->bone_offset.z, &mat); + m = rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, v3->bone_index); + mat4_translate_mult(m, v3->bone_offset.x, v3->bone_offset.y, v3->bone_offset.z, &mat); *v42 = mat; - mat = *rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, v6->bone_index); - mat4_translate_mult(&mat, v3->bone_offset.x, v3->bone_offset.y, v3->bone_offset.z, &mat); + m = rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, v6->bone_index); + mat4_translate_mult(m, v3->bone_offset.x, v3->bone_offset.y, v3->bone_offset.z, &mat); *v43 = mat; - float_t v14 = rob_chr->data.adjust_data.scale; + + float_t chara_scale = rob_chr->data.adjust_data.scale; vec3 v23; - vec3_mult_scalar(*(vec3*)&v42->row3, v14, v23); + vec3_mult_scalar(*(vec3*)&v42->row3, chara_scale, v23); vec3_add(v23, rob_chr->data.adjust_data.trans, v23); *(vec3*)&v42->row3 = v23; vec3 v29; - vec3_mult_scalar(*(vec3*)&v43->row3, v14, v23); + vec3_mult_scalar(*(vec3*)&v43->row3, chara_scale, v23); vec3_add(v23, rob_chr->data.adjust_data.trans, v29); *(vec3*)&v43->row3 = v29; - float_t v20 = v3->scale * v14; + float_t v20 = v3->scale * chara_scale; v39->scale = v20; v39->field_24 = v20; v39->prev_trans = v39->trans; v39->trans = v23; - float_t v19 = v6->scale * v14; + float_t v19 = v6->scale * chara_scale; v40->scale = v19; v40->field_24 = v19; v40->prev_trans = v40->trans; @@ -2374,13 +2419,14 @@ static motion_bone_index rob_motion_c_kata_bone_get(int32_t index) { return MOTION_BONE_NONE; } -static void sub_14041C4F0(rob_chara_bone_data* rob_bone_data, int32_t a2, float_t a3) { +static void rob_chara_bone_data_set_motion_arm_length(rob_chara_bone_data* rob_bone_data, + motion_bone_index motion_bone_index, float_t value) { motion_blend_mot* v3 = rob_bone_data->motion_loaded.front(); - v3->bone_data.bones.data()[a2].field_2E0 = a3; + v3->bone_data.bones.data()[motion_bone_index].arm_length = value; } -static void sub_14041BB70(rob_chara_bone_data* rob_bone_data, bool a2) { - rob_bone_data->field_758 = a2; +static void rob_chara_bone_data_set_disable_eye_motion(rob_chara_bone_data* rob_bone_data, bool value) { + rob_bone_data->disable_eye_motion = value; } static bool rob_osage_check_osage_setting_parts_bit(rob_osage* rob_osg, int32_t parts_bits) { @@ -2449,8 +2495,8 @@ static void sub_14041B9D0(rob_chara_bone_data* rob_bone_data) { v1->field_74 = vec3_null; v1->field_80 = vec3_null; v1->field_8C = 1.0f; - v1->field_90 = 0; - v1->field_98 = 1.0f; + v1->bones = 0; + v1->step = 1.0f; } static void sub_14041D6F0(rob_chara_bone_data* rob_bone_data, bool a2) { @@ -2471,7 +2517,7 @@ static float_t sub_14054FDE0(rob_chara* rob_chr) { 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) + else if (rob_chr->data.motion.motion_id == rob_chr->data.motion.prev_motion_id) return 4.0f; 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) @@ -2566,7 +2612,7 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { bool v3; if (!a2) v3 = 0; - else if (rob_chr->data.adjust.prev_motion_id == -1) + else if (rob_chr->data.motion.prev_motion_id == -1) v3 = 0; else { v3 = ~rob_chr->data.field_1588.field_0.field_20.field_0 & 0x400 @@ -2594,7 +2640,7 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { v7 = 2; } - float_t v8 = rob_chr->data.adjust.frame_data.frame; + float_t v8 = rob_chr->data.motion.frame_data.frame; float_t v9 = 0.0f; float_t v10 = 0.0f; if (v3) @@ -2706,7 +2752,7 @@ static void mothead_apply2_inner(struc_380* a1, int32_t type, const mothead_data 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; + a1->rob_chara_data->motion.field_24 = 0; } break; case 2: { v19->field_0.field_1E8 = ((int32_t*)v35)[0]; @@ -2722,7 +2768,7 @@ static void mothead_apply2_inner(struc_380* a1, int32_t type, const mothead_data } break; case 40: { v19->field_0.field_238 = ((int16_t*)v35)[0]; - if ((a1->rob_chara_data->adjust.field_28 & 8) != 0) + if ((a1->rob_chara_data->motion.field_28 & 8) != 0) v19->field_0.field_23C = -((float_t*)v35)[1]; else v19->field_0.field_23C = ((float_t*)v35)[1]; @@ -2736,14 +2782,14 @@ static void mothead_apply2_inner(struc_380* a1, int32_t type, const mothead_data } break; case 46: { if (v19->field_0.field_10.field_0 & 0x100) { - if (a1->rob_chara_data->adjust.field_28 & 8) + if (a1->rob_chara_data->motion.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) + if (a1->rob_chara_data->motion.field_28 & 8) v19->field_0.field_2B8 = -((int16_t*)v35)[0]; else v19->field_0.field_2B8 = ((int16_t*)v35)[0]; @@ -2755,7 +2801,7 @@ static void mothead_apply2_inner(struc_380* a1, int32_t type, const mothead_data } break; case 64: { float_t v31 = ((float_t*)v35)[0]; - if (a1->rob_chara_data->adjust.field_28 & 8) + if (a1->rob_chara_data->motion.field_28 & 8) v31 = -v31; v19->field_0.field_318.x = v31; v19->field_0.field_318.y = ((float_t*)v35)[1]; @@ -2878,23 +2924,23 @@ void rob_chara::load_motion(int32_t motion_id, bool a3, float_t frame, data.miku_rot.position.y = data.miku_rot.field_24.y; if (a3) - data.adjust.field_28 ^= (data.adjust.field_28 ^ ~data.adjust.field_28) & 0x04; + data.motion.field_28 ^= (data.motion.field_28 ^ ~data.motion.field_28) & 0x04; - if (data.adjust.field_28 & 0x04) - data.adjust.field_28 |= 0x08; + if (data.motion.field_28 & 0x04) + data.motion.field_28 |= 0x08; else - data.adjust.field_28 &= ~0x08; + data.motion.field_28 &= ~0x08; - data.adjust.field_28 &= 0x2F; - data.adjust.field_28 |= 0x10; - data.adjust.field_2C = 0; - data.adjust.field_30 = 0; + data.motion.field_28 &= 0x2F; + data.motion.field_28 |= 0x10; + data.motion.field_2C = 0; + data.motion.field_30 = 0; - rob_chara_data_parts_adjust* parts_adjust = data.adjust.parts_adjust; + rob_chara_data_adjust* parts_adjust = data.motion.parts_adjust; for (int32_t i = 0; i < 13; i++, parts_adjust++) parts_adjust->reset(); - data.adjust.field_10D8[0].reset(); + data.motion.adjust_global.reset(); data.adjust_data.offset = vec3_null; data.adjust_data.offset_x = true; @@ -2902,22 +2948,17 @@ void rob_chara::load_motion(int32_t motion_id, bool a3, float_t frame, data.adjust_data.offset_z = true; data.adjust_data.get_global_trans = false; - 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_arm_adjust* arm_adjust = data.motion.arm_adjust; + rob_chara_data_hand_adjust* hand_adjust = data.motion.hand_adjust; + rob_chara_data_hand_adjust* hand_adjust_prev = data.motion.hand_adjust_prev; + for (int32_t i = 0; i < 2; i++, arm_adjust++, hand_adjust++, hand_adjust_prev++) { hand_adjust->reset(); hand_adjust_prev->reset(); - - v13->field_0 = 0; - v13->field_4 = 0.0f; - v13->field_8 = 0.0f; - v13->field_C = 0.0f; - v13->duration = 0.0f; - v13->frame = 0.0f; - sub_14041C4F0(this->bone_data, rob_motion_c_kata_bone_get(i), 0.0f); + arm_adjust->reset(); + rob_chara_bone_data_set_motion_arm_length(this->bone_data, + rob_motion_c_kata_bone_get(i), 0.0f); } - sub_14041BB70(this->bone_data, 0); + rob_chara_bone_data_set_disable_eye_motion(this->bone_data, false); rob_chara_item_equip_set_osage_move_cancel(item_equip, 0, 0.0f); for (int32_t i = 0; i < 13; i++) @@ -2935,22 +2976,22 @@ void rob_chara::load_motion(int32_t motion_id, bool a3, float_t frame, if (~data.field_1588.field_0.field_20.field_0 & 0x10 && frame > 0.0f) data.field_1588.field_0.field_20.field_0 &= ~0x08; - 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; + data.motion.prev_motion_id = data.motion.motion_id; + data.motion.frame_data.frame = frame; + data.motion.field_24 = 0; + data.motion.motion_id = motion_id; + if (data.motion.step_data.step < 0.0f) + data.motion.step_data.frame = 1.0f; else - data.adjust.step_data.frame = data.adjust.step_data.step; + data.motion.step_data.frame = data.motion.step_data.step; - float_t step = data.adjust.step; + float_t step = data.motion.step; if (step < 0.0f) - step = data.adjust.step_data.frame; + step = data.motion.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_140419D30(this->bone_data, data.motion.step_data.frame, + data.motion.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); @@ -3002,11 +3043,11 @@ static void sub_140513C60(rob_chara_item_equip* rob_itm_equip, item_id id, bool void rob_chara::reset_data(rob_chara_pv_data* pv_data, bone_database* bone_data, motion_database* mot_db) { - rob_chara_bone_data_reset(this->bone_data); + this->bone_data->reset(); 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); + data.reset(); + data_prev.reset(); 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; @@ -3031,8 +3072,8 @@ void rob_chara::reset_data(rob_chara_pv_data* pv_data, 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; + chr_data->motion.field_150.head_object = head_obj; + chr_data->motion.field_3B0.head_object = head_obj; set_parts_disp(ITEM_MAX, true); } @@ -3067,13 +3108,13 @@ static bool sub_14053F2B0(RobPartialMotion* a1); static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, RobEyelidMotion* motion, int32_t type, motion_database* mot_db) { if (type == 1 || type == 2) { - rob_chr->data.adjust.field_3B0.eyelid.data = motion->data; - if (rob_chr->data.adjust.field_29 & 0x80) + rob_chr->data.motion.field_3B0.eyelid.data = motion->data; + if (rob_chr->data.motion.field_29 & 0x80) return; } else { - rob_chr->data.adjust.field_150.eyelid.data = motion->data; - if (rob_chr->data.adjust.field_29 & 0x80) + rob_chr->data.motion.field_150.eyelid.data = motion->data; + if (rob_chr->data.motion.field_29 & 0x80) return; } @@ -3087,13 +3128,13 @@ static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, static void rob_chara_set_eyes_motion(rob_chara* rob_chr, RobEyesMotion* motion, int32_t type, motion_database* mot_db) { if (type == 1 || type == 2) { - rob_chr->data.adjust.field_3B0.eye.data = motion->data; - if (~rob_chr->data.adjust.field_29 & 0x40) + rob_chr->data.motion.field_3B0.eye.data = motion->data; + if (~rob_chr->data.motion.field_29 & 0x40) return; } else { - rob_chr->data.adjust.field_150.eye.data = motion->data; - if (rob_chr->data.adjust.field_29 & 0x40) + rob_chr->data.motion.field_150.eye.data = motion->data; + if (rob_chr->data.motion.field_29 & 0x40) return; } @@ -3107,13 +3148,13 @@ static void rob_chara_set_eyes_motion(rob_chara* rob_chr, static void rob_chara_set_face_motion(rob_chara* rob_chr, RobFaceMotion* motion, int32_t type, motion_database* mot_db) { if (type == 2 || type == 1) { - rob_chr->data.adjust.field_3B0.face.data = motion->data; - if (~rob_chr->data.adjust.field_29 & 0x04) + rob_chr->data.motion.field_3B0.face.data = motion->data; + if (~rob_chr->data.motion.field_29 & 0x04) return; } else { - rob_chr->data.adjust.field_150.face.data = motion->data; - if (rob_chr->data.adjust.field_29 & 0x04) + rob_chr->data.motion.field_150.face.data = motion->data; + if (rob_chr->data.motion.field_29 & 0x04) return; } @@ -3127,13 +3168,13 @@ static void rob_chara_set_face_motion(rob_chara* rob_chr, static void rob_chara_set_hand_l_motion(rob_chara* rob_chr, RobHandMotion* motion, int32_t type, motion_database* mot_db) { if (type == 2) - rob_chr->data.adjust.field_3B0.hand_l.data = motion->data; + rob_chr->data.motion.field_3B0.hand_l.data = motion->data; else if (type == 1) - rob_chr->data.adjust.field_150.hand_l.data = motion->data; + rob_chr->data.motion.field_150.hand_l.data = motion->data; else - rob_chr->data.adjust.hand_l.data = motion->data; + rob_chr->data.motion.hand_l.data = motion->data; - if (~rob_chr->data.adjust.field_29 & 0x08 || rob_chr->data.adjust.field_2A & 0x04) + if (~rob_chr->data.motion.field_29 & 0x08 || rob_chr->data.motion.field_2A & 0x04) return; rob_chara_bone_data_load_hand_l_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); @@ -3146,13 +3187,13 @@ static void rob_chara_set_hand_l_motion(rob_chara* rob_chr, static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, RobHandMotion* motion, int32_t type, motion_database* mot_db) { if (type == 2) - rob_chr->data.adjust.field_3B0.hand_r.data = motion->data; + rob_chr->data.motion.field_3B0.hand_r.data = motion->data; else if (type == 1) - rob_chr->data.adjust.field_150.hand_r.data = motion->data; + rob_chr->data.motion.field_150.hand_r.data = motion->data; else - rob_chr->data.adjust.hand_r.data = motion->data; + rob_chr->data.motion.hand_r.data = motion->data; - if (~rob_chr->data.adjust.field_29 & 0x10 || rob_chr->data.adjust.field_2A & 0x08) + if (~rob_chr->data.motion.field_29 & 0x10 || rob_chr->data.motion.field_2A & 0x08) return; rob_chara_bone_data_load_hand_r_motion(rob_chr->bone_data, motion->data.motion_id, mot_db); @@ -3165,13 +3206,13 @@ static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, static void rob_chara_set_mouth_motion(rob_chara* rob_chr, RobMouthMotion* motion, int32_t type, motion_database* mot_db) { if (type == 1 || type == 2) { - rob_chr->data.adjust.field_3B0.mouth.data = motion->data; - if (~rob_chr->data.adjust.field_29 & 0x20) + rob_chr->data.motion.field_3B0.mouth.data = motion->data; + if (~rob_chr->data.motion.field_29 & 0x20) return; } else { - rob_chr->data.adjust.field_150.mouth.data = motion->data; - if (rob_chr->data.adjust.field_29 & 0x20) + rob_chr->data.motion.field_150.mouth.data = motion->data; + if (rob_chr->data.motion.field_29 & 0x20) return; } @@ -3183,12 +3224,12 @@ static void rob_chara_set_mouth_motion(rob_chara* rob_chr, } static void sub_1405500F0(rob_chara* rob_chr) { - rob_chr->data.adjust.field_29 &= ~0x01; - int32_t v1 = rob_chr->data.adjust.field_150.field_1C0; + rob_chr->data.motion.field_29 &= ~0x01; + int32_t v1 = rob_chr->data.motion.field_150.field_1C0; if (v1 == 2 || v1 == 3) return; - switch (rob_chr->data.adjust.field_150.face.data.mottbl_index) { + switch (rob_chr->data.motion.field_150.face.data.mottbl_index) { case 0x07: case 0x09: case 0x0B: @@ -3233,7 +3274,7 @@ static void sub_1405500F0(rob_chara* rob_chr) { case 0x67: case 0x69: case 0x6B: - rob_chr->data.adjust.field_29 |= 0x01; + rob_chr->data.motion.field_29 |= 0x01; break; } } @@ -3241,18 +3282,18 @@ static void sub_1405500F0(rob_chara* rob_chr) { 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 = data.adjust.field_150.field_1C0; + a2 = data.motion.field_150.field_1C0; RobEyelidMotion v13; switch (a2) { case 0: case 2: - v13.data = data.adjust.field_150.face.data; + v13.data = data.motion.field_150.face.data; break; case 1: value = 1.0f; case 3: { - int32_t mottbl_index = data.adjust.field_150.face.data.mottbl_index; + int32_t mottbl_index = data.motion.field_150.face.data.mottbl_index; switch (mottbl_index) { case 0x07: case 0x09: @@ -3322,11 +3363,11 @@ void rob_chara::set_eyelid_mottbl_motion_from_face(int32_t a2, if (motion_id == -1) { duration = 0.0f; a2 = 0; - v13.data = data.adjust.field_150.face.data; + v13.data = data.motion.field_150.face.data; } else if (value <= 0.0f) { a2 = 0; - v13.data = data.adjust.field_150.face.data; + v13.data = data.motion.field_150.face.data; } else { v13.data.state = 0; @@ -3338,10 +3379,10 @@ void rob_chara::set_eyelid_mottbl_motion_from_face(int32_t a2, v13.data.offset = offset; v13.data.duration = duration; - data.adjust.field_150.field_1C0 = a2; + data.motion.field_150.field_1C0 = a2; sub_1405500F0(this); - data.adjust.field_29 &= ~0x02; - data.adjust.field_150.time = 0.0f; + data.motion.field_29 &= ~0x02; + data.motion.field_150.time = 0.0f; rob_chara_set_eyelid_motion(this, &v13, 0, mot_db); } @@ -3357,8 +3398,8 @@ void rob_chara::set_eyelid_mottbl_motion(int32_t type, 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.frame_data = &data.motion.frame_data; + v13.data.step_data = &data.motion.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { @@ -3367,8 +3408,8 @@ void rob_chara::set_eyelid_mottbl_motion(int32_t type, } if (!type) { - data.adjust.field_29 &= ~2; - data.adjust.field_150.time = 0.0f; + data.motion.field_29 &= ~2; + data.motion.field_150.time = 0.0f; } rob_chara_set_eyelid_motion(this, &v13, type, mot_db); } @@ -3385,8 +3426,8 @@ void rob_chara::set_eyes_mottbl_motion(int32_t type, 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.frame_data = &data.motion.frame_data; + v13.data.step_data = &data.motion.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { @@ -3398,9 +3439,9 @@ void rob_chara::set_eyes_mottbl_motion(int32_t type, static void sub_140553970(rob_chara* rob_chr, object_info a2, int32_t type) { if (type == 1) - rob_chr->data.adjust.field_150.head_object = a2; + rob_chr->data.motion.field_150.head_object = a2; else - rob_chr->data.adjust.field_3B0.head_object = a2; + rob_chr->data.motion.field_3B0.head_object = a2; } void rob_chara::set_face_mottbl_motion(int32_t type, @@ -3415,8 +3456,8 @@ void rob_chara::set_face_mottbl_motion(int32_t type, v27.data.offset = offset; v27.data.field_24 = a7; if (sub_14053F290(&v27)) { - v27.data.frame_data = &data.adjust.frame_data; - v27.data.step_data = &data.adjust.step_data; + v27.data.frame_data = &data.motion.frame_data; + v27.data.step_data = &data.motion.step_data; } v27.data.field_38 = a9; if (v27.data.motion_id != -1) { @@ -3462,27 +3503,27 @@ void rob_chara::set_face_mottbl_motion(int32_t type, } } - else if (data.adjust.field_150.head_object != v17) { + else if (data.motion.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); + data.motion.field_150.eye.data.duration = 0.0f; + rob_chara_set_eyes_motion(this, &data.motion.field_150.eye, 0, mot_db); duration = 0.0f; } if (type == 1 || type == 2) { if (a11) set_eyelid_mottbl_motion_from_face(2, duration, -1.0f, offset, mot_db); - else if (data.adjust.field_29 & 0x02) { + else if (data.motion.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; + data.motion.field_150.field_1C0, 3.0f, -1.0f, 0.0f, mot_db); + data.motion.field_29 |= 0x02; } else { float_t v21 = -1.0f; - if (data.adjust.field_150.field_1C0 == 3) { - float_t v23 = data.adjust.field_150.eyelid.data.frame_count - 1.0f; + if (data.motion.field_150.field_1C0 == 3) { + float_t v23 = data.motion.field_150.eyelid.data.frame_count - 1.0f; if (v23 > 0.0f) - v21 = data.adjust.field_150.eyelid.data.frame / v23; + v21 = data.motion.field_150.eyelid.data.frame / v23; float_t v25 = bone_data->eyelid.blend.duration; float_t v26 = bone_data->eyelid.blend.frame; @@ -3499,7 +3540,7 @@ void rob_chara::set_face_mottbl_motion(int32_t type, v28.data = v27.data; v28.data.duration = duration; v28.data.offset = offset; - data.adjust.field_29 |= 0x80; + data.motion.field_29 |= 0x80; rob_chara_set_eyelid_motion(this, &v28, 2, mot_db); } } @@ -3523,8 +3564,8 @@ void rob_chara::set_hand_l_mottbl_motion(int32_t type, 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.frame_data = &data.motion.frame_data; + v13.data.step_data = &data.motion.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { @@ -3546,8 +3587,8 @@ void rob_chara::set_hand_r_mottbl_motion(int32_t type, 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.frame_data = &data.motion.frame_data; + v13.data.step_data = &data.motion.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { @@ -3560,15 +3601,15 @@ void rob_chara::set_hand_r_mottbl_motion(int32_t type, 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 && data.adjust.motion_id == motion_id) + if (!a5 && data.motion.motion_id == motion_id) return false; if (duration <= 0.0f) blend_type = MOTION_BLEND; 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; + data.motion.field_28 |= 0x80; + data.motion.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) @@ -3606,8 +3647,8 @@ void rob_chara::set_mouth_mottbl_motion(int32_t type, 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.frame_data = &data.motion.frame_data; + v13.data.step_data = &data.motion.step_data; } v13.data.field_38 = a9; if (v13.data.motion_id != -1) { @@ -3630,9 +3671,9 @@ void rob_chara::set_osage_reset() { } void rob_chara::set_osage_step(float_t value) { - data.adjust.step = value; + data.motion.step = value; if (value < 0.0f) - value = data.adjust.step_data.frame; + value = data.motion.step_data.frame; rob_chara_item_equip_set_osage_step(item_equip, value); } @@ -4145,14 +4186,14 @@ static void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { float_t rot_2nd_sin; float_t rot_2nd_cos; if (v8 > 0.000001f) { - float_t v26 = a1->field_2E0; - if (v26 > 0.0001f) { - float_t v27 = (ik_segment_length + ik_2nd_segment_length) * v26; + if (a1->arm_length > 0.0001f) { + float_t v27 = (ik_segment_length + ik_2nd_segment_length) * a1->arm_length; if (v10 > v27) { v10 = v27; v8 = v27 * v27; } } + float_t v28 = (v8 - ik_2nd_segment_length * ik_2nd_segment_length) / ik_segment_length; rot_cos = (v28 + ik_segment_length) / (2.0f * v10); rot_2nd_cos = (v28 - ik_segment_length) / (2.0f * ik_2nd_segment_length); @@ -5790,32 +5831,6 @@ static void sub_14047E240(rob_osage* rob_osg, mat4* a2, vec3* a3, std::vectornodes.clear(); - rob_osg->node.reset(); - rob_osg->wind_direction = vec3_null; - rob_osg->field_1EB4 = 0.0f; - rob_osg->yz_order = 0; - rob_osg->field_2A0 = true; - rob_osg->motion_reset_data.clear(); - rob_osg->move_cancel = 0.0f; - rob_osg->field_1F0C = false; - rob_osg->osage_reset = false; - rob_osg->field_1F0E = false; - rob_osg->ring = osage_ring_data(); - rob_osg->field_1F0F = 0; - rob_osg->skin_param.reset(); - rob_osg->skin_param_ptr = &rob_osg->skin_param; - rob_osg->osage_setting = osage_setting_osg_cat(); - rob_osg->reset_data_list = 0; - rob_osg->field_2A4 = 0.0f; - rob_osg->field_2A1 = false; - rob_osg->set_external_force = false; - rob_osg->external_force = vec3_null; - rob_osg->parent_mat_ptr = 0; - rob_osg->parent_mat = mat4u_null; -} - static void rob_osage_add_motion_reset_data(rob_osage* rob_osg, int32_t motion_id, float_t frame) { int32_t frame_int = (int32_t)roundf(frame * 1000.0f); @@ -5835,7 +5850,7 @@ static void rob_osage_add_motion_reset_data(rob_osage* rob_osg, int32_t motion_i static void rob_osage_init_data(rob_osage* rob_osg, obj_skin_block_osage* osg_data, obj_skin_osage_node* osg_nodes, bone_node* ex_data_bone_nodes, obj_skin* skin) { - rob_osage_reset(rob_osg); + rob_osg->reset(); bone_node_expression_data_set_position_rotation_vec3( &rob_osg->exp_data, &osg_data->base.position, @@ -6256,15 +6271,6 @@ static void sub_1404119A0(struc_313* a1) { sub_1404122C0(a1, &v5, &v4, &v3); } -static void mot_blend_reset(mot_blend* a1) { - mot_play_data_reset(&a1->mot_play_data); - a1->blend.Reset(); - a1->field_0.bone_check_func = 0; - sub_1404119A0(&a1->field_0.field_8); - a1->field_0.motion_bone_count = 0; - a1->field_30 = 0; -} - static void mot_blend_set_duration(mot_blend* a1, float_t duration, float_t step, float_t offset) { a1->blend.SetDuration(duration, step, offset); } @@ -6492,30 +6498,6 @@ static void mot_key_data_reserve_key_sets(mot_key_data* a1) { a1->key_sets_ready = true; } -static void mot_play_data_reset(mot_play_data* play_data) { - mot_play_frame_data_reset(&play_data->frame_data); - play_data->field_30 = 0; - play_data->field_34 = 0; - play_data->field_38 = 0; - play_data->field_40 = 0; - play_data->field_48 = 0; -} - -static void mot_play_frame_data_reset(mot_play_frame_data* frame_data) { - frame_data->frame = 0.0f; - frame_data->step = 1.0f; - frame_data->step_prev = 1.0f; - frame_data->frame_count = 0; - frame_data->last_frame = -1.0f; - frame_data->field_14 = -1.0f; - frame_data->field_18 = -1; - frame_data->field_1C = -1; - frame_data->field_20 = 0; - frame_data->field_24 = -1.0f; - frame_data->field_28 = 0; - frame_data->field_2C = -1; -} - static void mot_play_frame_data_set_frame(mot_play_frame_data* a1, float_t frame) { float_t v2 = a1->field_14; a1->frame = frame; @@ -6538,7 +6520,7 @@ 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) + if (rob_chr_data->motion.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]; @@ -6561,7 +6543,7 @@ static void mothead_func_4(mothead_func_data* func_data, 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; + rob_chr_data->motion.field_28 ^= (rob_chr_data->motion.field_28 ^ ~rob_chr_data->motion.field_28) & 0x04; } static void mothead_func_6(mothead_func_data* func_data, @@ -6587,7 +6569,7 @@ 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) + if (rob_chr_data->motion.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)); @@ -6641,15 +6623,15 @@ static void mothead_func_13(mothead_func_data* func_data, rob_chr = func_data->rob_chr; v5 = func_data->rob_chr_data; - v6 = *((int32_t*)data + 1); + 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; + v11 = ((int32_t*)data)[0]; + v12 = (v5->motion.field_28 & 8) != 0; if (v6 & 0x01) { v8 = (char*)rob_chr->field_20; if (!v8) @@ -6663,7 +6645,7 @@ static void mothead_func_13(mothead_func_data* func_data, HIBYTE(v12) = v9; if ((v6 & 2) != 0) HIBYTE(v12) = v9 == 0; - v14 = *((int32_t*)data + 2); + v14 = ((int32_t*)data)[2]; v13 = (v6 & 4) != 0; sub_1401FCE40((int64_t)&v10);*/ } @@ -6721,16 +6703,16 @@ static void mothead_func_17(mothead_func_data* func_data, vec3 v39; // [rsp+30h] [rbp-20h] BYREF __int16 a1; // [rsp+70h] [rbp+20h] BYREF - v4 = *((int16_t*)data + 1); + 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 = v8 - ((float_t*)data)[5]; + v10 = ((float_t*)data)[1]; + if (v9 < v10 && v10 >= 0.0f || (v10 = ((float_t*)data)[2], v9 > v10) && v10 >= 0.0f) v9 = v10; LABEL_8: v11 = &v5->field_1588.field_330.field_20.x; @@ -6743,40 +6725,40 @@ static void mothead_func_17(mothead_func_data* func_data, 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 = v12 - ((float_t*)data)[5]; + v13 = ((float_t*)data)[1]; + if (v9 < v13 && v13 >= 0.0f || (v13 = ((float_t*)data)[2], v9 > v13) && v13 >= 0.0f) 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); + 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); + v14 = ((float_t*)data)[1]; v18 = v18 - (float_t)-v14; } } else - v18 = *((float_t*)data + 1); + v18 = ((float_t*)data)[1]; v5->field_1588.field_330.field_20.z = v17; - v5->field_1588.field_330.field_20.y = 0.0; + v5->field_1588.field_330.field_20.y = 0.0f; v11 = &v5->field_1588.field_330.field_20.x; *(int64_t*)&v39.x = 0i64; - v39.z = 0.0; + v39.z = 0.0f; v5->field_1588.field_330.field_20.x = v15; - v19 = *(__int16*)data; + v19 = ((int16_t*)data)[0]; *(int64_t*)&a3.x = 0i64; - a3.z = 0.0; + a3.z = 0.0f; sub_140533530(func_data, (float_t)v19, &a3); - sub_140533530(func_data, func_data->rob_chr_data->adjust.frame_data.frame, &v39); + sub_140533530(func_data, func_data->rob_chr_data->motion.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; @@ -6799,7 +6781,7 @@ static void mothead_func_17(mothead_func_data* func_data, 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; + v5->field_1588.field_330.field_20.y = 0.0f; 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)) @@ -6819,20 +6801,20 @@ static void mothead_func_17(mothead_func_data* func_data, 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; + v35 = (float_t)((int16_t*)data)[0]; 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; + v37 = v35 - v36->motion.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; + 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.0f; sub_140551AF0(func_data->rob_chr); }*/ } @@ -6935,7 +6917,7 @@ static void mothead_func_29(mothead_func_data* func_data, v20 = ((float_t*)data)[9]; v21 = ((float_t*)data)[10]; v22 = ((float_t*)data)[11]; - if (v11->adjust.field_28 & 8) { + if (v11->motion.field_28 & 8) { v12 = word_140A2D430[v12]; v13 = word_140A2D440[(__int16)v13]; if (stru_140A2D480[v13].field_0) { @@ -6979,8 +6961,8 @@ static void mothead_func_29(mothead_func_data* func_data, 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; + func_data->rob_chr_data->miku_rot.field_30.x = 0.0f; + func_data->rob_chr_data->miku_rot.field_30.z = 0.0f; } static void mothead_func_31(mothead_func_data* func_data, @@ -7004,15 +6986,15 @@ static void mothead_func_32(mothead_func_data* func_data, 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 = ((int32_t*)data)[1]; + v7 = (float_t)(v4->field_1588.field_0.field_8 - 1.0) - v4->motion.frame_data.frame; + v8 = (float_t)((int16_t*)data)[0]; + if ((v4->motion.field_28 & 8) != 0) v5 = sub_140533440(v5); - v9 = *((float_t*)data + 2); + v9 = ((float_t*)data)[2]; if (v7 >= v8) v7 = v8; - v10 = *((int32_t*)data + 3); + v10 = ((int32_t*)data)[3]; v11 = 1; v12 = 236i64; v13 = 3i64; @@ -7066,9 +7048,9 @@ static void mothead_func_33(mothead_func_data* func_data, 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_324 = func_data->rob_chr_data->motion.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; + v8->field_330.field_32C = func_data->rob_chr_data->motion.field_140.y; } static void mothead_func_34(mothead_func_data* func_data, @@ -7172,37 +7154,37 @@ static void mothead_func_52(mothead_func_data* func_data, 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], + func_data->rob_chr->set_face_mottbl_motion(0, ((int32_t*)data)[0], ((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], + func_data->rob_chr->set_hand_r_mottbl_motion(0, ((int32_t*)data)[0], ((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], + func_data->rob_chr->set_hand_l_mottbl_motion(0, ((int32_t*)data)[0], ((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], + func_data->rob_chr->set_mouth_mottbl_motion(0, ((int32_t*)data)[0], ((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], + func_data->rob_chr->set_eyes_mottbl_motion(0, ((int32_t*)data)[0], ((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], + func_data->rob_chr->set_eyelid_mottbl_motion(0, ((int32_t*)data)[0], ((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); } @@ -7212,7 +7194,7 @@ static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, int32_t motion_id, 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_chr->data.motion.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); @@ -7267,40 +7249,40 @@ static void mothead_func_61_set_eyelid_motion_from_face(mothead_func_data* func_ } static void rob_chara_set_parts_adjust_by_index(rob_chara* rob_chr, - rob_osage_parts index, rob_chara_data_parts_adjust* parts_adjust) { + rob_osage_parts index, rob_chara_data_adjust* 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]); + rob_chara_set_adjust(rob_chr, adjust, + &rob_chr->data.motion.parts_adjust[index], + &rob_chr->data.motion.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; + rob_chara_data_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.frame = rob_chr->data.motion.frame_data.frame - mhd_data->frame; + v16.transition_frame = rob_chr->data.motion.frame_data.frame - mhd_data->frame; + v16.motion_id = rob_chr->data.motion.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.external_force.x = ((float_t*)data)[2]; + v16.external_force.y = ((float_t*)data)[3]; + v16.external_force.z = ((float_t*)data)[4]; + v16.external_force_cycle_strength.x = ((float_t*)data)[5]; + v16.external_force_cycle_strength.y = ((float_t*)data)[6]; + v16.external_force_cycle_strength.z = ((float_t*)data)[7]; + v16.external_force_cycle.x = ((float_t*)data)[8]; + v16.external_force_cycle.y = ((float_t*)data)[9]; + v16.external_force_cycle.z = ((float_t*)data)[10]; v16.cycle = ((float_t*)data)[11]; v16.force = ((float_t*)data)[13]; v16.phase = ((float_t*)data)[12]; @@ -7323,7 +7305,7 @@ static void mothead_func_64_osage_reset(mothead_func_data* func_data, 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; + int32_t motion_id = rob_chr->data.motion.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); @@ -7406,9 +7388,9 @@ static void mothead_func_72(mothead_func_data* func_data, v6->offset_z = !!((uint8_t*)data)[26]; } -static void mothead_func_73_hand_adjust(mothead_func_data* func_data, +static void mothead_func_73_rob_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; + rob_chara_motion* v4 = &func_data->rob_chr->data.motion; int32_t hand = ((int16_t*)data)[0]; rob_chara_data_hand_adjust* hand_adjust = &v4->hand_adjust[hand]; @@ -7418,27 +7400,27 @@ static void mothead_func_73_hand_adjust(mothead_func_data* func_data, 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->duration = ((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]) { + switch (hand_adjust->scale_select) { case 0: hand_adjust->enable = true; hand_adjust->rotation_blend = hand_adjust_prev->rotation_blend; - hand_adjust->offset_blend = 1.0f; + hand_adjust->scale_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->arm_length = hand_adjust_prev->arm_length; 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->scale_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]; @@ -7446,7 +7428,7 @@ static void mothead_func_73_hand_adjust(mothead_func_data* func_data, 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->arm_length = ((float_t*)data)[10]; hand_adjust->field_40 = ((int32_t*)data)[11]; break; } @@ -7478,57 +7460,58 @@ static void mothead_func_74(mothead_func_data* func_data, 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]); +void rob_chara_set_adjust_global(rob_chara* rob_chr, rob_chara_data_adjust* a2) { + rob_chara_set_adjust(rob_chr, a2, + &rob_chr->data.motion.adjust_global, &rob_chr->data.motion.adjust_global_prev); } -static void mothead_func_75(mothead_func_data* func_data, +static void mothead_func_75_rob_adjust_global(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; + rob_chara_data_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.frame = rob_chr->data.motion.frame_data.frame - mhd_data->frame; + v14.transition_frame = rob_chr->data.motion.frame_data.frame - mhd_data->frame; + v14.motion_id = rob_chr->data.motion.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.external_force.x = ((float_t*)data)[2]; + v14.external_force.y = ((float_t*)data)[3]; + v14.external_force.z = ((float_t*)data)[4]; + v14.external_force_cycle_strength.x = ((float_t*)data)[5]; + v14.external_force_cycle_strength.y = ((float_t*)data)[6]; + v14.external_force_cycle_strength.z = ((float_t*)data)[7]; + v14.external_force_cycle.x = ((float_t*)data)[8]; + v14.external_force_cycle.y = ((float_t*)data)[9]; + v14.external_force_cycle.z = ((float_t*)data)[10]; v14.cycle = ((float_t*)data)[11]; v14.phase = ((float_t*)data)[12]; } - sub_140555100(rob_chr, &v14); + rob_chara_set_adjust_global(rob_chr, &v14); } -static void mothead_func_76(mothead_func_data* func_data, +static void mothead_func_76_rob_arm_adjust(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]; + rob_chara* rob_chr = func_data->rob_chr; + + rob_chara_data_arm_adjust* arm_adjust = &rob_chr->data.motion.arm_adjust[((int16_t*)data)[0]]; + arm_adjust->enable = true; + arm_adjust->prev_value = arm_adjust->value; + arm_adjust->value = 0.0f; + arm_adjust->next_value = ((float_t*)data)[2]; + arm_adjust->duration = ((float_t*)data)[1]; } -static void mothead_func_77(mothead_func_data* func_data, +static void mothead_func_77_disable_eye_motion(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); + rob_chara_bone_data_set_disable_eye_motion(func_data->rob_chr->bone_data, ((uint8_t*)data)[0] != 0); } static void mothead_func_78(mothead_func_data* func_data, @@ -7539,7 +7522,7 @@ static void mothead_func_78(mothead_func_data* func_data, rob_chara_data* v4 = func_data->rob_chr_data; uint16_t v5 = ((uint8_t*)data)[2]; - if (v4->adjust.field_28 & 8) + if (v4->motion.field_28 & 8) v5 = word_140A2D430[v5]; struc_306* v7 = &v4->field_1588.field_330.field_33C[v5]; @@ -7590,7 +7573,7 @@ static void mothead_func_78(mothead_func_data* func_data, 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); + //rob_chara_set_coli_ring(func_data->rob_chr, ((int8_t*)data)[0]); } static void mothead_func_80_adjust_get_global_trans(mothead_func_data* func_data, @@ -7607,7 +7590,7 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { 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);; + bool get_data = sub_140410250(&a1->field_0.field_8, data->motion_bone_index); if (reverse && data->mirror != 255) data = &bones_data[data->mirror]; @@ -7746,8 +7729,8 @@ size_t sub_14040EB30(struc_313* a1, struc_314* a2, size_t a3) { static void sub_14040E980(struc_313* a1, struc_314* a2, struc_314* a3, size_t a4, bool* a5) { uint32_t* bitfield = a1->bitfield.data(); - struc_314 a2a = *a3; - size_t v8 = sub_14040EB30(a1, &a2a, a4); + struc_314 v19 = *a3; + size_t v8 = sub_14040EB30(a1, &v19, a4); size_t v10 = v8 + a4; size_t v11 = v8; uint32_t* v12 = &bitfield[v10 >> 5]; @@ -7777,32 +7760,32 @@ static void sub_140414550(struc_313* a1, size_t a2, bool a3) { uint32_t* bitfield = a1->bitfield.data(); size_t motion_bone_count = a1->motion_bone_count; if (a2 > motion_bone_count) { - struc_314 a3a; - a3a.field_0 = bitfield; - a3a.field_8 = 0; + struc_314 v7; + v7.field_0 = bitfield; + v7.field_8 = 0; if (motion_bone_count) { - a3a.field_0 = &bitfield[motion_bone_count >> 5]; - a3a.field_8 = motion_bone_count & 0x1F; + v7.field_0 = &bitfield[motion_bone_count >> 5]; + v7.field_8 = motion_bone_count & 0x1F; } - struc_314 a4 = a3a; - sub_14040E980(a1, &a3a, &a4, a2 - motion_bone_count, &a3); + struc_314 v8 = v7; + sub_14040E980(a1, &v7, &v8, a2 - motion_bone_count, &a3); } else if (a2 < motion_bone_count) { - struc_314 a4; - a4.field_0 = bitfield; - a4.field_8 = 0; + struc_314 v8; + v8.field_0 = bitfield; + v8.field_8 = 0; if (motion_bone_count) { - a4.field_0 = &bitfield[motion_bone_count >> 5]; - a4.field_8 = motion_bone_count & 0x1F; + v8.field_0 = &bitfield[motion_bone_count >> 5]; + v8.field_8 = motion_bone_count & 0x1F; } - struc_314 a3a; - a3a.field_0 = &bitfield[a2 >> 5]; - a3a.field_8 = a2 & 0x1F; + struc_314 v7; + v7.field_0 = &bitfield[a2 >> 5]; + v7.field_8 = a2 & 0x1F; - struc_314 a2a; - sub_1404122C0(a1, &a2a, &a3a, &a4); + struc_314 v9; + sub_1404122C0(a1, &v9, &v7, &v8); } } @@ -7914,25 +7897,6 @@ static void motion_blend_mot_mult_mat(motion_blend_mot* a1, mat4* mat) { 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) { @@ -8111,85 +8075,85 @@ static void sub_140507F60(rob_chara* rob_chr) { rob_chr->data.miku_rot.field_6 = (int32_t)((float_t)(atan2f(v10.x, v10.z) * 32768.0f) * (1.0 / M_PI)); } -void rob_chara_data_parts_adjust_ctrl(rob_chara* rob_chr, rob_chara_data_parts_adjust* parts_adjust, - rob_chara_data_parts_adjust* parts_adjust_prev) { - float_t cycle = parts_adjust->cycle; +void rob_chara_data_adjust_ctrl(rob_chara* rob_chr, rob_chara_data_adjust* adjust, + rob_chara_data_adjust* adjust_prev) { + float_t cycle = adjust->cycle; float_t v7 = 0.0f; - parts_adjust->frame += rob_chr->data.adjust.step_data.frame; + adjust->frame += rob_chr->data.motion.step_data.frame; 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); + cycle *= adjust->frame * 2.0f * (float_t)M_PI * (float_t)(1.0 / 60.0f); - switch (parts_adjust->cycle_type) { + switch (adjust->cycle_type) { case 1: - v7 = cosf(parts_adjust->phase * (float_t)M_PI + cycle); + v7 = cosf(adjust->phase * (float_t)M_PI + cycle); break; case 2: - v7 = sinf(parts_adjust->phase * (float_t)M_PI + cycle); + v7 = sinf(adjust->phase * (float_t)M_PI + cycle); break; } vec3 v8; vec3 v9; - vec3_add_scalar(parts_adjust->external_force, v7, v8); - vec3_mult(parts_adjust->external_force_min, parts_adjust->external_force_strength, v9); + vec3_add_scalar(adjust->external_force_cycle, v7, v8); + vec3_mult(adjust->external_force, adjust->external_force_cycle_strength, v9); vec3_mult(v8, v9, v9); - vec3_add(v9, parts_adjust->external_force_min, parts_adjust->curr_external_force); + vec3_add(v9, adjust->external_force, adjust->curr_external_force); - if (parts_adjust->type == 1) { + if (adjust->type == 1) { mat4 mat = mat4_identity; mat4_rotate_y_mult(&mat, (float_t)((double_t)rob_chr->data.miku_rot.rot_y_int16 * M_PI * (1.0 / 32768.0)), &mat); - mat4_mult_vec3(&mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + mat4_mult_vec3(&mat, &adjust->curr_external_force, &adjust->curr_external_force); } - else if (parts_adjust->type == 2) { + else if (adjust->type == 2) { mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 9)->ex_data_mat; if (mat) - mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + mat4_mult_vec3(mat, &adjust->curr_external_force, &adjust->curr_external_force); } - else if (parts_adjust->type == 3) { + else if (adjust->type == 3) { mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 10)->ex_data_mat; if (mat) - mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + mat4_mult_vec3(mat, &adjust->curr_external_force, &adjust->curr_external_force); } - else if (parts_adjust->type == 4) { + else if (adjust->type == 4) { mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 15)->ex_data_mat; if (mat) - mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + mat4_mult_vec3(mat, &adjust->curr_external_force, &adjust->curr_external_force); } - else if (parts_adjust->type == 5) { + else if (adjust->type == 5) { mat4* mat = rob_chara_bone_data_get_node(rob_chr->bone_data, 177)->ex_data_mat; if (mat) { - parts_adjust->curr_external_force.z = -parts_adjust->curr_external_force.z; - mat4_mult_vec3(mat, &parts_adjust->curr_external_force, &parts_adjust->curr_external_force); + adjust->curr_external_force.z = -adjust->curr_external_force.z; + mat4_mult_vec3(mat, &adjust->curr_external_force, &adjust->curr_external_force); } } - if (parts_adjust->ignore_gravity) - parts_adjust->curr_external_force.y = get_osage_gravity_const() + parts_adjust->curr_external_force.y; + if (adjust->ignore_gravity) + adjust->curr_external_force.y = get_osage_gravity_const() + adjust->curr_external_force.y; - parts_adjust->curr_force = parts_adjust->force; - parts_adjust->curr_strength = parts_adjust->strength; + adjust->curr_force = adjust->force; + adjust->curr_strength = adjust->strength; bool transition_frame_step = false; - if (parts_adjust->force_duration > parts_adjust->transition_frame - && fabsf(parts_adjust->force_duration - parts_adjust->transition_frame) > 0.000001f) { + if (adjust->force_duration > adjust->transition_frame + && fabsf(adjust->force_duration - adjust->transition_frame) > 0.000001f) { transition_frame_step = true; - float_t blend = (parts_adjust->transition_frame + 1.0f) / (parts_adjust->force_duration + 1.0f); - vec3_lerp_scalar(parts_adjust_prev->curr_external_force, - parts_adjust->curr_external_force, parts_adjust->curr_external_force, blend); - parts_adjust->curr_force = lerp(parts_adjust_prev->curr_force, parts_adjust->curr_force, blend); + float_t blend = (adjust->transition_frame + 1.0f) / (adjust->force_duration + 1.0f); + vec3_lerp_scalar(adjust_prev->curr_external_force, + adjust->curr_external_force, adjust->curr_external_force, blend); + adjust->curr_force = lerp(adjust_prev->curr_force, adjust->curr_force, blend); } - if (parts_adjust->strength_transition > parts_adjust->transition_frame - && fabsf(parts_adjust->strength_transition - parts_adjust->transition_frame) > 0.000001f) { - float_t blend = (parts_adjust->transition_frame + 1.0f) / (parts_adjust->strength_transition + 1.0f); - parts_adjust->curr_strength = lerp(parts_adjust_prev->curr_strength, parts_adjust->curr_strength, blend); + if (adjust->strength_transition > adjust->transition_frame + && fabsf(adjust->strength_transition - adjust->transition_frame) > 0.000001f) { + float_t blend = (adjust->transition_frame + 1.0f) / (adjust->strength_transition + 1.0f); + adjust->curr_strength = lerp(adjust_prev->curr_strength, adjust->curr_strength, blend); } else if (!transition_frame_step) return; - parts_adjust->transition_frame += rob_chr->data.adjust.step_data.frame; + adjust->transition_frame += rob_chr->data.motion.step_data.frame; } static void rob_chara_item_equip_object_set_parts_external_force( @@ -8265,23 +8229,24 @@ static void rob_chara_item_equip_set_external_force( rob_chara_item_equip_object_set_external_force(&rob_itm_eq->item_equip_object[i], external_force); } -static void rob_chara_set_parts_external_force(rob_chara* rob_chr) { +static void rob_chara_adjust_ctrl(rob_chara* rob_chr) { + rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; + for (int32_t i = 0; i < 13; i++) { - rob_chara_data_parts_adjust* parts_adjust = &rob_chr->data.adjust.parts_adjust[i]; + rob_chara_data_adjust* parts_adjust = &rob_chr->data.motion.parts_adjust[i]; if (parts_adjust->enable) { - rob_chara_data_parts_adjust_ctrl(rob_chr, parts_adjust, &rob_chr->data.adjust.parts_adjust_prev[i]); - rob_chara_item_equip_set_parts_external_force(rob_chr->item_equip, i, + rob_chara_data_adjust_ctrl(rob_chr, parts_adjust, &rob_chr->data.motion.parts_adjust_prev[i]); + rob_chara_item_equip_set_parts_external_force(rob_itm_equip, i, &parts_adjust->curr_external_force, parts_adjust->curr_force, parts_adjust->curr_strength); } } - if (rob_chr->data.adjust.field_10D8[0].enable) { - rob_chara_data_parts_adjust_ctrl(rob_chr, rob_chr->data.adjust.field_10D8, &rob_chr->data.adjust.field_10D8[1]); - rob_chara_item_equip_set_external_force(rob_chr->item_equip, - &rob_chr->data.adjust.field_10D8[0].curr_external_force); + rob_chara_data_adjust* adjust_global = &rob_chr->data.motion.adjust_global; + if (adjust_global->enable) { + rob_chara_data_adjust_ctrl(rob_chr, adjust_global, &rob_chr->data.motion.adjust_global_prev); + rob_chara_item_equip_set_external_force(rob_itm_equip, &adjust_global->curr_external_force); } - rob_chara_item_equip* rob_itm_equip = rob_chr->item_equip; rob_itm_equip->parts_short = false; rob_itm_equip->parts_append = false; rob_itm_equip->parts_white_one_l = false; @@ -8307,27 +8272,33 @@ static vec3* rob_chara_bone_data_get_global_trans(rob_chara_bone_data* rob_bone_ static void rob_chara_data_adjuct_set_trans(rob_chara_adjust_data* rob_chr_adj, vec3* trans, bool pos_adjust, vec3* global_trans) { float_t scale = rob_chr_adj->scale; - vec3 v9 = rob_chr_adj->offset; + vec3 _offset = rob_chr_adj->offset; if (global_trans) - v9.y += global_trans->y; + _offset.y += global_trans->y; - vec3 v5 = *trans; + vec3 _trans = *trans; if (rob_chr_adj->height_adjust) - v5.y += rob_chr_adj->pos_adjust_y; + _trans.y += rob_chr_adj->pos_adjust_y; else { + vec3 temp; + vec3_sub(_trans, _offset, temp); + vec3_mult_scalar(temp, scale, temp); + vec3_add(temp, _offset, temp); + if (!rob_chr_adj->offset_x) - v5.x = (v5.x - v9.x) * scale + v9.x; + _trans.x = temp.x; if (!rob_chr_adj->offset_y) - v5.y = (v5.y - v9.y) * scale + v9.y; + _trans.y = temp.y; if (!rob_chr_adj->offset_z) - v5.z = (v5.z - v9.z) * scale + v9.z; + _trans.z = temp.z; } + if (pos_adjust) - vec3_add(v5, rob_chr_adj->pos_adjust, v5); + vec3_add(_trans, rob_chr_adj->pos_adjust, _trans); vec3 v10; vec3_mult_scalar(*trans, scale, v10); - vec3_sub(v5, v10, rob_chr_adj->trans); + vec3_sub(_trans, v10, rob_chr_adj->trans); } static void rob_chara_set_data_adjust_mat(rob_chara* rob_chr, @@ -8353,7 +8324,7 @@ static void rob_chara_set_data_adjust_mat_pos_adjust_true(rob_chara* rob_chr) { static void rob_base_rob_chara_ctrl(rob_chara* rob_chr) { sub_140507F60(rob_chr); - rob_chara_set_parts_external_force(rob_chr); + rob_chara_adjust_ctrl(rob_chr); sub_140505B20(rob_chr); //sub_14036D130(7, &rob_chr); rob_chara_set_data_adjust_mat_pos_adjust_true(rob_chr); @@ -8377,10 +8348,10 @@ static void sub_1405145F0(rob_chara* rob_chr, bone_database* bone_data, motion_d return; float_t frame; - if (rob_chr->data.adjust.field_28 >= 0) + if (rob_chr->data.motion.field_28 >= 0) frame = 0.0f; else - frame = rob_chr->data.adjust.frame_data.last_set_frame; + frame = rob_chr->data.motion.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); @@ -8498,11 +8469,11 @@ static void* sub_140551F60(rob_chara* rob_chr, uint32_t* a2) { } 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* v2 = sub_140551F60(rob_chr, &rob_chr->data.motion.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) { + rob_chr->data.motion.field_30 = 0; + else if ((float_t)((int16_t*)v2)[2] <= rob_chr->data.motion.frame_data.frame) { int32_t v4 = ((int32_t*)v2)[2]; uint32_t v5 = ((uint32_t*)v2)[0]; if (v5 & 0x400000 && sub_1405054E0(v5) == 1) @@ -8511,7 +8482,7 @@ static void sub_1405077D0(rob_chara* rob_chr, bone_database* bone_data, motion_d 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; + rob_chr->data.motion.field_30 = 0; } } @@ -8534,7 +8505,7 @@ static void sub_140505310(rob_chara* rob_chr, bone_database* bone_data, motion_d 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; + rob_chr->data.motion.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; @@ -8550,7 +8521,7 @@ static void sub_140505310(rob_chara* rob_chr, bone_database* bone_data, motion_d 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) { + if (rob_chr->data.motion.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), @@ -8567,9 +8538,9 @@ static void sub_140505310(rob_chara* rob_chr, bone_database* bone_data, motion_d } } - rob_chr->data.adjust.frame_data.frame = rob_chara_bone_data_get_frame(rob_chr->bone_data); + rob_chr->data.motion.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++; + rob_chr->data.motion.field_2C++; return; } break; case 2: @@ -8584,15 +8555,15 @@ static void sub_140505310(rob_chara* rob_chr, bone_database* bone_data, motion_d static void sub_140505980(rob_chara* rob_chr) { int32_t v3; int32_t v4; - if (rob_chr->data.adjust.field_24) { - if (rob_chr->data.adjust.field_24 != 1) { - if (rob_chr->data.adjust.field_24 != 2) + if (rob_chr->data.motion.field_24) { + if (rob_chr->data.motion.field_24 != 1) { + if (rob_chr->data.motion.field_24 != 2) return; goto LABEL_23; } } else { - if (rob_chr->data.field_1588.field_0.field_78 > rob_chr->data.adjust.frame_data.frame) + if (rob_chr->data.field_1588.field_0.field_78 > rob_chr->data.motion.frame_data.frame) return; if (rob_chr->data.field_1588.field_0.field_10.field_0 & 0x4000) { @@ -8601,10 +8572,10 @@ static void sub_140505980(rob_chara* rob_chr) { rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x20000; } rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x02; - rob_chr->data.adjust.field_24 = 1; + rob_chr->data.motion.field_24 = 1; } - if (rob_chr->data.field_1588.field_0.field_7C > rob_chr->data.adjust.frame_data.frame) + if (rob_chr->data.field_1588.field_0.field_7C > rob_chr->data.motion.frame_data.frame) return; rob_chr->data.field_1588.field_0.field_20.field_0 |= 4; @@ -8625,18 +8596,18 @@ static void sub_140505980(rob_chara* rob_chr) { v4 = rob_chr->data.field_1588.field_0.field_10.field_0; if (v4 & 0x10000 && v4 & 0x20000) rob_chr->data.field_1588.field_0.field_20.field_0 &= ~0x20000; - rob_chr->data.adjust.field_24 = 2; + rob_chr->data.motion.field_24 = 2; LABEL_23: 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 >= 0.0f && v5 <= rob_chr->data.motion.frame_data.frame) { 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; + rob_chr->data.motion.field_24 = 3; } } @@ -8684,9 +8655,9 @@ 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; + rob_chr->data.motion.field_138 = v2; + rob_chr->data.motion.field_13C = v2; + rob_chr->data.motion.field_140 = vec3_null; return; } @@ -8742,7 +8713,7 @@ static void sub_1405044B0(rob_chara* rob_chr) { v8 = rob_chr->data.field_1588.field_330.field_328; } - float_t v15 = rob_chr->data.adjust.frame_data.frame; + float_t v15 = rob_chr->data.motion.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; @@ -8757,63 +8728,58 @@ static void sub_1405044B0(rob_chara* rob_chr) { } } - 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; + rob_chr->data.motion.field_138 = v6; + rob_chr->data.motion.field_13C = v4; + rob_chr->data.motion.field_140.x = 0.0f; + rob_chr->data.motion.field_140.y = v8; + rob_chr->data.motion.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, mot_db); + mothead_apply(&rob_chr->data.field_1588, rob_chr, rob_chr->data.motion.frame_data.frame, mot_db); sub_1405044B0(rob_chr); } -static void sub_1405079B0(rob_chara* rob_chr, int32_t a2, struc_222* a3) { - if (!a3->field_0) +static void rob_chara_data_arm_adjust_ctrl(rob_chara* rob_chr, int32_t index, rob_chara_data_arm_adjust* arm_adjust) { + if (!arm_adjust->enable) return; - float_t v5 = a3->duration; - float_t v6 = a3->frame; - if (v5 <= v6 || fabsf(v5 - v6) <= 0.000001f) { - a3->field_0 = 0; - a3->field_4 = a3->field_C; + float_t prev_value = arm_adjust->prev_value; + float_t next_value = arm_adjust->next_value; + float_t duration = arm_adjust->duration; + float_t frame = arm_adjust->frame; + if (duration <= frame || fabsf(duration - frame) <= 0.000001f) { + arm_adjust->enable = false; + arm_adjust->value = next_value; + return; + } + + float_t blend = (frame + 1.0f) / (duration + 1.0f); + float_t inv_blend = 1.0f - blend; + if (prev_value <= 0.0001f || prev_value >= 1.0f) { + if (next_value != 0.0f) + arm_adjust->value = next_value * blend + inv_blend; + else + arm_adjust->value = 0.0f; } else { - float_t v7 = (v6 + 1.0f) / (v5 + 1.0f); - float_t v8 = a3->field_8; - float_t v9 = 1.0f - v7; - if (v8 <= 0.0001f || v8 >= 1.0f) { - if (a3->field_C != 0.0f) { - a3->field_4 = a3->field_C * v7 + v9; - a3->frame = v6 + rob_chr->data.adjust.step_data.frame; - } - else { - a3->field_4 = 0.0f; - a3->frame = v6 + rob_chr->data.adjust.step_data.frame; - } - } - else { - if (a3->field_C != 0.0f) { - a3->field_4 = a3->field_C * v7 + v8 * v9; - a3->frame = v6 + rob_chr->data.adjust.step_data.frame; - } - else { - a3->field_4 = v8 * v9 + v7; - a3->frame = v6 + rob_chr->data.adjust.step_data.frame; - } - } + if (next_value != 0.0f) + arm_adjust->value = next_value * blend + prev_value * inv_blend; + else + arm_adjust->value = blend + prev_value * inv_blend; } + arm_adjust->frame += rob_chr->data.motion.step_data.frame; - sub_14041C4F0(rob_chr->bone_data, rob_motion_c_kata_bone_get(a2), a3->field_4); + rob_chara_bone_data_set_motion_arm_length(rob_chr->bone_data, + rob_motion_c_kata_bone_get(index), arm_adjust->value); } -static void sub_140507960(rob_chara* rob_chr) { +static void rob_chara_arm_adjust_ctrl(rob_chara* rob_chr) { for (int32_t i = 0; i < 2; i++) - sub_1405079B0(rob_chr, i, &rob_chr->data.adjust.field_12C8[i]); + rob_chara_data_arm_adjust_ctrl(rob_chr, i, &rob_chr->data.motion.arm_adjust[i]); } static void rob_chara_set_face_motion(rob_chara* rob_chr, @@ -8870,8 +8836,8 @@ static void rob_chara_set_face_motion_id(rob_chara* rob_chr, int32_t motion_id, v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); v12.data.field_24 = a6; if (sub_14053F290(&v12)) { - v12.data.frame_data = &rob_chr->data.adjust.frame_data; - v12.data.step_data = &rob_chr->data.adjust.step_data; + v12.data.frame_data = &rob_chr->data.motion.frame_data; + v12.data.step_data = &rob_chr->data.motion.step_data; } v12.data.field_38 = a8; } @@ -8879,7 +8845,7 @@ static void rob_chara_set_face_motion_id(rob_chara* rob_chr, int32_t motion_id, } static void sub_1405509D0(rob_chara* rob_chr, motion_database* mot_db) { - if (sub_14053F1B0(&rob_chr->data.adjust.field_150.face)) + if (sub_14053F1B0(&rob_chr->data.motion.field_150.face)) rob_chara_set_face_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } @@ -8899,8 +8865,8 @@ static void sub_140553E30(rob_chara* rob_chr, int32_t motion_id, float_t frame, v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); v12.data.field_24 = a6; if (sub_14053F290(&v12)) { - v12.data.frame_data = &rob_chr->data.adjust.frame_data; - v12.data.step_data = &rob_chr->data.adjust.step_data; + v12.data.frame_data = &rob_chr->data.motion.frame_data; + v12.data.step_data = &rob_chr->data.motion.step_data; } v12.data.field_38 = a8; } @@ -8908,7 +8874,7 @@ static void sub_140553E30(rob_chara* rob_chr, int32_t motion_id, float_t frame, } static void sub_140550A40(rob_chara* rob_chr, motion_database* mot_db) { - if (sub_14053F1B0(&rob_chr->data.adjust.field_150.hand_l)) + if (sub_14053F1B0(&rob_chr->data.motion.field_150.hand_l)) sub_140553E30(rob_chr, -1, 0.0f, -1, 12.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } @@ -8928,8 +8894,8 @@ static void sub_140554370(rob_chara* rob_chr, int32_t motion_id, float_t frame, v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); v12.data.field_24 = a6; if (sub_14053F290(&v12)) { - v12.data.frame_data = &rob_chr->data.adjust.frame_data; - v12.data.step_data = &rob_chr->data.adjust.step_data; + v12.data.frame_data = &rob_chr->data.motion.frame_data; + v12.data.step_data = &rob_chr->data.motion.step_data; } v12.data.field_38 = a8; } @@ -8937,7 +8903,7 @@ static void sub_140554370(rob_chara* rob_chr, int32_t motion_id, float_t frame, } static void sub_140550AB0(rob_chara* rob_chr, motion_database* mot_db) { - if (sub_14053F1B0(&rob_chr->data.adjust.field_150.hand_r)) + if (sub_14053F1B0(&rob_chr->data.motion.field_150.hand_r)) sub_140553E30(rob_chr, -1, 0.0f, -1, 12.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } @@ -8957,8 +8923,8 @@ static void sub_140554C40(rob_chara* rob_chr, int32_t motion_id, float_t frame, v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); v12.data.field_24 = a6; if (sub_14053F290(&v12)) { - v12.data.frame_data = &rob_chr->data.adjust.frame_data; - v12.data.step_data = &rob_chr->data.adjust.step_data; + v12.data.frame_data = &rob_chr->data.motion.frame_data; + v12.data.step_data = &rob_chr->data.motion.step_data; } v12.data.field_38 = a8; } @@ -8966,7 +8932,7 @@ static void sub_140554C40(rob_chara* rob_chr, int32_t motion_id, float_t frame, } static void sub_140550B20(rob_chara* rob_chr, motion_database* mot_db) { - if (sub_14053F1B0(&rob_chr->data.adjust.field_150.mouth)) + if (sub_14053F1B0(&rob_chr->data.motion.field_150.mouth)) sub_140554C40(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } @@ -8986,8 +8952,8 @@ static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, int32_t motion_id, v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); v12.data.field_24 = a6; if (sub_14053F290(&v12)) { - v12.data.frame_data = &rob_chr->data.adjust.frame_data; - v12.data.step_data = &rob_chr->data.adjust.step_data; + v12.data.frame_data = &rob_chr->data.motion.frame_data; + v12.data.step_data = &rob_chr->data.motion.step_data; } v12.data.field_38 = a8; } @@ -8995,7 +8961,7 @@ static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, int32_t motion_id, } static void sub_140550960(rob_chara* rob_chr, motion_database* mot_db) { - if (sub_14053F1B0(&rob_chr->data.adjust.field_150.eye)) + if (sub_14053F1B0(&rob_chr->data.motion.field_150.eye)) rob_chara_set_eyes_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } @@ -9015,8 +8981,8 @@ static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, int32_t motion_id v12.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); v12.data.field_24 = a6; if (sub_14053F290(&v12)) { - v12.data.frame_data = &rob_chr->data.adjust.frame_data; - v12.data.step_data = &rob_chr->data.adjust.step_data; + v12.data.frame_data = &rob_chr->data.motion.frame_data; + v12.data.step_data = &rob_chr->data.motion.step_data; } v12.data.field_38 = a8; } @@ -9024,7 +8990,7 @@ static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, int32_t motion_id } static void sub_1405508F0(rob_chara* rob_chr, motion_database* mot_db) { - if (sub_14053F1B0(&rob_chr->data.adjust.field_150.eyelid)) + if (sub_14053F1B0(&rob_chr->data.motion.field_150.eyelid)) rob_chara_set_eyelid_motion_id(rob_chr, -1, 0.0f, -1, 6.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); } @@ -9036,32 +9002,32 @@ 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) + if (rob_chr->data.motion.field_29 < 0) return; - int32_t v3 = rob_chr->data.adjust.field_150.field_1C0; + int32_t v3 = rob_chr->data.motion.field_150.field_1C0; if (v3 == 1) { - if (rob_chr->data.adjust.field_29 & 2) { + if (rob_chr->data.motion.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; + rob_chr->data.motion.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; + rob_chr->data.motion.field_150.field_1C0 = 0; + rob_chr->data.motion.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) + if (~rob_chr->data.motion.field_2A & 0x02 && rob_chr->data.motion.field_29 & 0x01) { + rob_chr->data.motion.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) { + if (rob_chr->data.motion.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; + rob_chr->data.motion.field_29 |= 0x02; } } } @@ -9105,10 +9071,10 @@ static void sub_14053F2C0(RobPartialMotion* a1) { } static object_info sub_140550330(rob_chara* rob_chr) { - if (rob_chr->data.adjust.field_29 & 0x04) - return rob_chr->data.adjust.field_3B0.head_object; + if (rob_chr->data.motion.field_29 & 0x04) + return rob_chr->data.motion.field_3B0.head_object; else - return rob_chr->data.adjust.field_150.head_object; + return rob_chr->data.motion.field_150.head_object; } static void sub_140513950( @@ -9126,25 +9092,25 @@ static void sub_140552310(rob_chara* rob_chr, item_id id, } static object_info sub_140550350(rob_chara* rob_chr){ - if (rob_chr->data.adjust.field_29 & 0x08) - return rob_chr->data.adjust.field_3B0.hand_l_object; - else if (rob_chr->data.adjust.field_2A & 0x04) - return rob_chr->data.adjust.hand_l_object; - return rob_chr->data.adjust.field_150.hand_l_object; + if (rob_chr->data.motion.field_29 & 0x08) + return rob_chr->data.motion.field_3B0.hand_l_object; + else if (rob_chr->data.motion.field_2A & 0x04) + return rob_chr->data.motion.hand_l_object; + return rob_chr->data.motion.field_150.hand_l_object; } static object_info sub_140550380(rob_chara* rob_chr) { - if (rob_chr->data.adjust.field_29 & 0x10) - return rob_chr->data.adjust.field_3B0.hand_r_object; - else if (rob_chr->data.adjust.field_2A & 0x08) - return rob_chr->data.adjust.hand_r_object; - return rob_chr->data.adjust.field_150.hand_r_object; + if (rob_chr->data.motion.field_29 & 0x10) + return rob_chr->data.motion.field_3B0.hand_r_object; + else if (rob_chr->data.motion.field_2A & 0x08) + return rob_chr->data.motion.hand_r_object; + return rob_chr->data.motion.field_150.hand_r_object; } static object_info sub_140550310(rob_chara* rob_chr) { - if (rob_chr->data.adjust.field_2A & 0x01) - return rob_chr->data.adjust.field_3B0.face_object; - return rob_chr->data.adjust.field_150.face_object; + if (rob_chr->data.motion.field_2A & 0x01) + return rob_chr->data.motion.field_3B0.face_object; + return rob_chr->data.motion.field_150.face_object; } static void sub_140412DA0(motion_blend_mot* a1, vec3* trans) { @@ -9158,14 +9124,14 @@ static void sub_140419800(rob_chara_bone_data* rob_bone_data, vec3* 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; + return rob_chr->data.motion.field_138 / rob_chr->bone_data->ik_scale.ratio0; + return rob_chr->data.motion.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; + return rob_chr->data.motion.field_13C / rob_chr->bone_data->ik_scale.ratio0; + return rob_chr->data.motion.field_13C; } static void sub_140504F00(rob_chara* rob_chr) { @@ -9175,8 +9141,8 @@ static void sub_140504F00(rob_chara* rob_chr) { 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; + float_t v3 = sub_1405503B0(rob_chr) * rob_chr->data.motion.step_data.frame; + float_t v4 = sub_1405501F0(rob_chr) * rob_chr->data.motion.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; @@ -9206,58 +9172,58 @@ static void sub_140504710(rob_chara* rob_chr, motion_database* mot_db, sub_140550960(rob_chr, mot_db); sub_1405508F0(rob_chr, mot_db); sub_140555F70(rob_chr, mot_db); - sub_14041C9D0(rob_chr->bone_data, !!(rob_chr->data.adjust.field_28 & 0x08)); - sub_14041D2D0(rob_chr->bone_data, !!(rob_chr->data.adjust.field_28 & 0x04)); + sub_14041C9D0(rob_chr->bone_data, !!(rob_chr->data.motion.field_28 & 0x08)); + sub_14041D2D0(rob_chr->bone_data, !!(rob_chr->data.motion.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_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); + sub_14041CA70(rob_chr->bone_data, rob_chr->data.motion.field_138); + sub_14041CAB0(rob_chr->bone_data, rob_chr->data.motion.field_13C); + sub_14041CA10(rob_chr->bone_data, &rob_chr->data.motion.field_140); sub_14041DA00(rob_chr->bone_data); - struc_405* v2 = &rob_chr->data.adjust.field_150; - if ((rob_chr->data.adjust.field_29 & 0x04)) - v2 = &rob_chr->data.adjust.field_3B0; + struc_405* v2 = &rob_chr->data.motion.field_150; + if ((rob_chr->data.motion.field_29 & 0x04)) + v2 = &rob_chr->data.motion.field_3B0; sub_14053F2C0(&v2->face); rob_chara_bone_data_set_face_frame(rob_chr->bone_data, v2->face.data.frame); rob_chara_bone_data_set_face_play_frame_step(rob_chr->bone_data, v2->face.data.play_frame_step); - RobHandMotion* v3 = &rob_chr->data.adjust.field_150.hand_l; - if (rob_chr->data.adjust.field_29 & 0x08) - v3 = &rob_chr->data.adjust.field_3B0.hand_l; - else if (rob_chr->data.adjust.field_2A & 0x04) - v3 = &rob_chr->data.adjust.hand_l; + RobHandMotion* v3 = &rob_chr->data.motion.field_150.hand_l; + if (rob_chr->data.motion.field_29 & 0x08) + v3 = &rob_chr->data.motion.field_3B0.hand_l; + else if (rob_chr->data.motion.field_2A & 0x04) + v3 = &rob_chr->data.motion.hand_l; sub_14053F2C0(v3); rob_chara_bone_data_set_hand_l_frame(rob_chr->bone_data, v3->data.frame); rob_chara_bone_data_set_hand_l_play_frame_step(rob_chr->bone_data, v3->data.play_frame_step); - RobHandMotion* v4 = &rob_chr->data.adjust.field_150.hand_r; - if (rob_chr->data.adjust.field_29 & 0x10) - v4 = &rob_chr->data.adjust.field_3B0.hand_r; - else if (rob_chr->data.adjust.field_2A & 0x08) - v4 = &rob_chr->data.adjust.hand_r; + RobHandMotion* v4 = &rob_chr->data.motion.field_150.hand_r; + if (rob_chr->data.motion.field_29 & 0x10) + v4 = &rob_chr->data.motion.field_3B0.hand_r; + else if (rob_chr->data.motion.field_2A & 0x08) + v4 = &rob_chr->data.motion.hand_r; sub_14053F2C0(v4); rob_chara_bone_data_set_hand_r_frame(rob_chr->bone_data, v4->data.frame); rob_chara_bone_data_set_hand_r_play_frame_step(rob_chr->bone_data, v4->data.play_frame_step); - RobMouthMotion* v5 = &rob_chr->data.adjust.field_150.mouth; - if (rob_chr->data.adjust.field_29 & 0x20) - v5 = &rob_chr->data.adjust.field_3B0.mouth; + RobMouthMotion* v5 = &rob_chr->data.motion.field_150.mouth; + if (rob_chr->data.motion.field_29 & 0x20) + v5 = &rob_chr->data.motion.field_3B0.mouth; sub_14053F2C0(v5); rob_chara_bone_data_set_mouth_frame(rob_chr->bone_data, v5->data.frame); rob_chara_bone_data_set_mouth_play_frame_step(rob_chr->bone_data, v5->data.play_frame_step); - RobEyesMotion* v6 = &rob_chr->data.adjust.field_150.eye; - if (rob_chr->data.adjust.field_29 & 0x40) - v6 = &rob_chr->data.adjust.field_3B0.eye; + RobEyesMotion* v6 = &rob_chr->data.motion.field_150.eye; + if (rob_chr->data.motion.field_29 & 0x40) + v6 = &rob_chr->data.motion.field_3B0.eye; sub_14053F2C0(v6); rob_chara_bone_data_set_eyes_frame(rob_chr->bone_data, v6->data.frame); rob_chara_bone_data_set_eyes_play_frame_step(rob_chr->bone_data, v6->data.play_frame_step); - RobEyelidMotion* v7 = &rob_chr->data.adjust.field_150.eyelid; - if (rob_chr->data.adjust.field_29 & 0x80) - v7 = &rob_chr->data.adjust.field_3B0.eyelid; + RobEyelidMotion* v7 = &rob_chr->data.motion.field_150.eyelid; + if (rob_chr->data.motion.field_29 & 0x80) + v7 = &rob_chr->data.motion.field_3B0.eyelid; sub_14053F2C0(v7); rob_chara_bone_data_set_eyelid_frame(rob_chr->bone_data, v7->data.frame); rob_chara_bone_data_set_eyelid_play_frame_step(rob_chr->bone_data, v7->data.play_frame_step); @@ -9288,7 +9254,7 @@ static void sub_140504710(rob_chara* rob_chr, motion_database* mot_db, rob_chara_bone_data_update(rob_chr->bone_data, 0); sub_140504F00(rob_chr); - rob_chr->data.adjust.field_28 &= ~0x80; + rob_chr->data.motion.field_28 &= ~0x80; } static void sub_140504AC0(rob_chara* rob_chr) { @@ -9321,14 +9287,14 @@ 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_0.field_1EC > rob_chr->data.adjust.frame_data.frame) { + && rob_chr->data.field_1588.field_0.field_1EC > rob_chr->data.motion.frame_data.frame) { v20.x += rob_chr->data.field_3DD4; v20.z += rob_chr->data.field_3DDC; } if (rob_chr->data.field_1588.field_330.field_18 == 3) { v20 = vec3_null; - if (rob_chr->data.field_1588.field_330.field_1C >= rob_chr->data.adjust.frame_data.frame) + if (rob_chr->data.field_1588.field_330.field_1C >= rob_chr->data.motion.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; @@ -9336,12 +9302,12 @@ static void sub_140504AC0(rob_chara* rob_chr) { 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_330.field_1C + if (rob_chr->data.motion.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_330.field_1C - - rob_chr->data.adjust.frame_data.frame; + - rob_chr->data.motion.frame_data.frame; if (v17 < 0.0f) v17 = 0.0f; @@ -9376,7 +9342,7 @@ static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { sub_14054CC80(rob_chr); sub_1405077D0(rob_chr, bone_data, mot_db); sub_1405070E0(rob_chr, bone_data, mot_db); - sub_140507960(rob_chr); + rob_chara_arm_adjust_ctrl(rob_chr); sub_140504710(rob_chr, mot_db, bone_data, data, obj_db); sub_140504AC0(rob_chr); } @@ -9478,7 +9444,1141 @@ static void rob_disp_rob_chara_disp(rob_chara* rob_chr) { static void rob_disp_rob_chara_free(rob_chara* rob_chr) { //sub_140541260(rob_chr->chara_id); - rob_chara_item_equip_reset(rob_chr->item_equip); + rob_chr->item_equip->reset(); +} + +static bool sub_14041A010(rob_chara_bone_data* rob_bone_data) { + float_t v1 = rob_bone_data->field_788.field_A0; + if (v1 > 0.0f) { + float_t v3 = rob_bone_data->field_788.field_A4; + if (v1 > v3 && fabsf(v1 - v3) > 0.000001f) + return true; + } + return rob_bone_data->field_788.field_8E; +} + +static bool sub_140419F90(rob_chara_bone_data* rob_bone_data) { + if (rob_bone_data->field_788.field_8E) + return rob_bone_data->field_788.field_94 > 0.0f; + return false; +} + +static bool sub_140419F00(rob_chara_bone_data* rob_bone_data) { + if (rob_bone_data->field_788.field_14C) + return fabsf(rob_bone_data->field_788.field_150) > 0.000001f; + return false; +} + +static void sub_140409B70(struc_258* a1, vec3* a2, mat4u* a3, bool a4) { + if (a2) { + a1->field_190 = true; + a1->field_191 = a4; + a1->field_192 = a4; + a1->field_193 = a4; + a1->field_194 = a4; + a1->field_195 = a4; + + if (a4 && a1->field_A0 > 0.0f && a1->field_A0 > a1->field_AC + && fabsf(a1->field_A0 - a1->field_AC) > 0.000001f) { + a1->field_AC = a1->field_AC + a1->field_A8; + a1->field_198 = (a1->field_AC + 1.0f) / (a1->field_A0 + 1.0f); + } + else { + a1->field_191 = false; + a1->field_198 = 1.0f; + } + + mat4 mat = *a3; + mat4_inverse(&mat, &mat); + + vec3 v24; + mat4_mult_vec3_trans(&mat, a2, &v24); + + float_t v12 = v24.x - 0.05f; + if (a1->field_184 >= v12) { + v12 = v24.x + 0.05f; + if (a1->field_184 <= v12) + v12 = a1->field_184; + } + a1->field_184 = v12; + + float_t v15 = v24.y - 0.05f; + if (a1->field_188 >= v15) { + v15 = v24.y + 0.05f; + if (a1->field_188 <= v15) + v15 = a1->field_188; + } + a1->field_188 = v15; + + float_t v18 = v24.z - 0.05f; + if (a1->field_18C >= v18) { + v18 = v24.z + 0.05f; + if (a1->field_18C <= v18) + v18 = a1->field_18C; + } + a1->field_18C = v18; + } + else { + if (!a1->field_190 && !a1->field_191) { + a4 = false; + a1->field_198 = 0.0f; + } + else if (a4 && a1->field_A0 > 0.0f && a1->field_A0 > a1->field_AC + && fabsf(a1->field_A0 - a1->field_AC) > 0.000001f) { + a1->field_AC += a1->field_A8; + a1->field_198 = 1.0f - (a1->field_AC + 1.0f) / (a1->field_A0 + 1.0f); + } + else { + a1->field_191 = false; + a1->field_198 = 0.0f; + } + + a1->field_190 = false; + a1->field_191 = a4; + a1->field_192 = false; + a1->field_193 = false; + a1->field_194 = false; + a1->field_195 = false; + } +} + +static void sub_14041C620(rob_chara_bone_data* rob_bone_data, vec3* a2, mat4u* a3, char a4) { + sub_140409B70(&rob_bone_data->field_788, a2, a3, a4); +} + +static void sub_1404189A0(rob_chara_bone_data* rob_bone_data) { + //motion_blend_mot* v2 = rob_bone_data->motion_loaded.front(); + //sub_140407280(&rob_bone_data->field_788, &v2->bone_data.bones, + // &v2->field_4F8.mat, v2->mot_play_data.frame_data.step); +} + +static void sub_14041A160(rob_chara_bone_data* rob_bone_data, mat4u* a2) { + //motion_blend_mot* v2 = rob_bone_data->motion_loaded.front(); + //sub_140409170(&rob_bone_data->field_788, a2, &v2->bone_data.bones, + // &v2->field_4F8.mat, v2->mot_play_data.frame_data.step); +} + +static void sub_14053BEE0(rob_chara* rob_chr) { + if (rob_chr->type != ROB_CHARA_TYPE_2) + return; + + bool v4 = true; + if (rob_chr->data.field_2 & 0x80) + v4 = false; + rob_chr->data.field_2 &= ~0x80; + + rob_chara_bone_data* rob_bone_data = rob_chr->bone_data; + vec3* v3 = 0; + if (sub_14041A010(rob_bone_data) || rob_bone_data->field_788.field_14C) { + if (rob_bone_data->field_788.field_8C) { + vec3 view_point; + camera_get_view_point(rctx_ptr->camera, &view_point); + rob_bone_data->field_788.field_B4 = view_point; + } + + if (sub_140419F90(rob_chr->bone_data) || sub_140419F00(rob_bone_data)) + v3 = &rob_bone_data->field_788.field_B4; + } + + sub_14041C620(rob_bone_data, v3, &rob_chr->data.adjust_data.mat, v4); + sub_1404189A0(rob_bone_data); + sub_14041A160(rob_bone_data, &rob_chr->data.adjust_data.mat); +} + +static void rob_chara_set_hand_adjust(rob_chara* rob_chr, + rob_chara_data_hand_adjust* adjust, rob_chara_data_hand_adjust* prev_adjust) { + if (!adjust->enable) + return; + + float_t chara_scale = rob_chr->data.adjust_data.scale; + float_t opposite_chara_scale = rob_chara_array_get_data_adjust_scale(rob_chr->chara_id ? 0 : 1); + bool chara_opposite_chara_same = fabsf(chara_scale - opposite_chara_scale) <= 0.000001f; + + switch (adjust->type) { + case ROB_CHARA_DATA_HAND_ADJUST_NORMAL: + case 15: + adjust->scale = chara_size_table_get_value(1); + break; + case ROB_CHARA_DATA_HAND_ADJUST_SHORT: + adjust->scale = chara_size_table_get_value(2); + break; + case ROB_CHARA_DATA_HAND_ADJUST_TALL: + adjust->scale = chara_size_table_get_value(0); + break; + case ROB_CHARA_DATA_HAND_ADJUST_MIN: + adjust->scale = min(opposite_chara_scale, chara_scale); + break; + case ROB_CHARA_DATA_HAND_ADJUST_MAX: + adjust->scale = max(opposite_chara_scale, chara_scale); + break; + case ROB_CHARA_DATA_HAND_ADJUST_OPPOSITE_CHARA: + adjust->scale = opposite_chara_scale; + break; + case ROB_CHARA_DATA_HAND_ADJUST_1P: + adjust->scale = rob_chara_array_get_data_adjust_scale(0); + break; + case ROB_CHARA_DATA_HAND_ADJUST_2P: + adjust->scale = rob_chara_array_get_data_adjust_scale(1); + break; + case ROB_CHARA_DATA_HAND_ADJUST_3P: + adjust->scale = rob_chara_array_get_data_adjust_scale(2); + break; + case ROB_CHARA_DATA_HAND_ADJUST_4P: + adjust->scale = rob_chara_array_get_data_adjust_scale(3); + break; + } + + if (adjust->scale_select == 1 && adjust->enable_scale && chara_opposite_chara_same) { + adjust->scale_select = 0; + adjust->rotation_blend = prev_adjust->rotation_blend; + adjust->disable_x = prev_adjust->disable_x; + adjust->disable_y = prev_adjust->disable_y; + adjust->disable_z = prev_adjust->disable_z; + adjust->scale_blend = 1.0f; + } + + float_t prev_scale; + if (prev_adjust->enable || prev_adjust->scale_select == 1) + prev_scale = prev_adjust->current_scale; + else + prev_scale = chara_scale; + + float_t scale; + if (adjust->scale_select == 1) + scale = adjust->scale; + else + scale = chara_scale; + + if (fabsf(prev_scale - scale * adjust->scale_blend) <= 0.000001f || adjust->duration <= adjust->current_time + || fabsf(adjust->duration - adjust->current_time) <= 0.000001f) { + adjust->current_scale = lerp(prev_scale, scale, adjust->scale_blend); + if (fabsf(adjust->current_scale - chara_scale) <= 0.000001f) { + adjust->current_scale = chara_scale; + adjust->enable = false; + } + } + else { + float_t t = (adjust->current_time + 1.0f) / (adjust->duration + 1.0f); + adjust->current_scale = lerp(prev_scale, scale, t * adjust->scale_blend); + adjust->current_time += rob_chr->data.motion.step_data.frame; + } +} + +static void rob_chara_set_hands_adjust(rob_chara* rob_chr) { + for (int32_t i = 0; i < 2; i++) + rob_chara_set_hand_adjust(rob_chr, &rob_chr->data.motion.hand_adjust[i], + &rob_chr->data.motion.hand_adjust_prev[i]); +} + +static void sub_14040AE10(mat4* mat, vec3* a2) { + vec3 v8; + mat4_mult_vec3_inv_trans(mat, a2, &v8); + float_t v3 = v8.x * v8.x + v8.y * v8.y; + float_t v5 = sqrtf(v3); + float_t v6 = sqrtf(v3 + (v8.z * v8.z)); + if (fabsf(v5) > 0.000001f && fabsf(v6) > 0.000001f) { + float_t v7 = v5; + v5 = 1.0f / v5; + v6 = 1.0f / v6; + mat4_rotate_z_mult_sin_cos(mat, v5 * v8.y, v5 * v8.x, mat); + mat4_rotate_y_mult_sin_cos(mat, -v6 * v8.z, v6 * v7, mat); + } +} + +static void sub_140406A70(vec3* a1, std::vector* bones, mat4* a3, vec3* a4, + const motion_bone_index* a5, float_t rotation_blend, float_t arm_length, bool solve_ik) { + bone_data* v8 = bones->data(); + bone_data* v14 = &v8[a5[0]]; + + if (v14->pole_target_mat) { + vec3 v36; + mat4_get_translation(v14->pole_target_mat, &v36); + + mat4 v38 = *v14->node->mat; + sub_14040AE10(&v38, &v14->ik_target); + mat4_mult_vec3_inv_trans(&v38, &v36, &v36); + + v38 = *v14->node->mat; + sub_14040AE10(&v38, a4); + + vec3 v37; + mat4_mult_vec3_trans(&v38, &v36, &v37); + mat4_set_translation(v14->pole_target_mat, &v37); + } + + v14->ik_target = *a4; + v14->rot_mat[1] = mat4_identity; + v14->rot_mat[2] = mat4_identity; + bone_data_mult_ik(v14, 1); + if (a5[1] == MOTION_BONE_NONE) + return; + + bone_data* v25 = &v8[a5[1]]; + if (rotation_blend > 0.0f) { + mat4 v38; + mat4 v39; + mat4_clear_trans(v25->parent_mat, &v38); + mat4_clear_trans(v25->node->mat, &v39); + mat4_transpose(&v38, &v38); + mat4_mult(&v39, &v38, &v38); + if (rotation_blend < 1.0) { + mat4 rot_mat = v25->rot_mat[0]; + mat4_lerp_rotation(&rot_mat, &v38, &v38, rotation_blend); + } + v25->rot_mat[0] = v38; + } + + if (solve_ik) { + a5++; + while (*a5 != MOTION_BONE_NONE) + bone_data_mult_1(&v8[*a5++], a3, v8, true); + } + else + bone_data_mult_1(v25, a3, v8, false); +} + +static void sub_140418A00(rob_chara_bone_data* rob_bone_data, vec3* a2, + const motion_bone_index* a3, float_t rotation_blend, float_t arm_length, bool solve_ik) { + motion_blend_mot* v7 = rob_bone_data->motion_loaded.front(); + mat4 m = v7->field_4F8.mat; + sub_140406A70(rob_bone_data->field_76C, &v7->bone_data.bones, + &m, a2, a3, rotation_blend, arm_length, solve_ik); +} + +static bool sub_14053ACA0(rob_chara* rob_chr, int32_t hand) { + if (hand >= 2 || !rob_chr->data.motion.hand_adjust[hand].enable) + return false; + + float_t rotation_blend = rob_chr->data.motion.hand_adjust[hand].rotation_blend; + float_t chara_scale = rob_chr->data.adjust_data.scale; + float_t adjust_scale = rob_chr->data.motion.hand_adjust[hand].current_scale; + + rob_chara_adjust_data v41 = rob_chr->data.adjust_data; + v41.scale = adjust_scale / chara_scale; + rob_chara_set_data_adjust_mat(rob_chr, &v41, 0); + + int32_t v15 = 0; + bool solve_ik = true; + if (rob_chr->data.motion.hand_adjust[hand].field_40 > 0 + && fabsf(rotation_blend - 1.0f) > 0.000001f + && (fabsf(rob_chr->data.motion.hand_adjust[hand].offset.x) > 0.000001f + || fabsf(rob_chr->data.motion.hand_adjust[hand].offset.y) > 0.000001f + || fabsf(rob_chr->data.motion.hand_adjust[hand].offset.z) > 0.000001f)) { + v15 = rob_chr->data.motion.hand_adjust[hand].field_40; + solve_ik = false; + } + + mat4 v40 = *rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, rob_kl_te_bones[hand]); + mat4 v42 = v41.mat; + mat4_mult(&v40, &v42, &v42); + + vec3 v37; + vec3_mult_scalar(rob_chr->data.motion.hand_adjust[hand].offset, 1.0f - chara_scale / adjust_scale, v37); + + vec3 v38; + mat4_mult_vec3_trans(&v42, &v37, &v38); + + vec3 v27 = vec3_null; + if (rob_chr->data.motion.hand_adjust[hand].disable_x) + v27.x = v40.row3.x - v38.x; + if (rob_chr->data.motion.hand_adjust[hand].disable_y) + v27.y = v40.row3.y - v38.y; + if (rob_chr->data.motion.hand_adjust[hand].disable_z) + v27.z = v40.row3.z - v38.z; + + vec3 v39; + vec3_add(v38, v27, v39); + + vec3 v18 = vec3_null; + if (v15 > 0) { + mat4_mult_vec3_trans(&v42, &rob_chr->data.motion.hand_adjust[hand].offset, &v38); + vec3_add(v38, v27, v18); + } + + sub_140418A00(rob_chr->bone_data, &v39, off_140C9E020[hand], rotation_blend, + rob_chr->data.motion.hand_adjust[hand].arm_length, solve_ik); + + while (v15 > 0) { + mat4 v40 = *rob_chara_bone_data_get_mats_mat(rob_chr->bone_data, rob_kl_te_bones[hand]); + mat4_set_translation(&v40, &v18); + + vec3 v37; + vec3_negate(rob_chr->data.motion.hand_adjust[hand].offset, v37); + mat4_mult_vec3_trans(&v40, &v37, &v39); + if (!--v15) { + rotation_blend = 1.0f; + solve_ik = true; + } + + sub_140418A00(rob_chr->bone_data, &v39, off_140C9E020[hand], rotation_blend, + rob_chr->data.motion.hand_adjust[hand].arm_length, solve_ik); + } + + rob_chr->data.motion.hand_adjust[hand].field_30 = v39; + return true; +} + +static void sub_140412860(motion_blend_mot* mot, motion_bone_index index, mat4* mat) { + if (index >= mot->bone_data.bones.size()) + return; + + bone_data* v4 = &mot->bone_data.bones.data()[index]; + if (!v4) + return; + + switch (v4->type) { + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + *mat = *v4->node[2].mat; + break; + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + *mat = *v4->node[3].mat; + break; + } +} + +static void sub_140419290(rob_chara_bone_data* rob_bone_data, motion_bone_index index, mat4* mat) { + sub_140412860(rob_bone_data->motion_loaded.front(), index, mat); +} + +static bool sub_14053B580(rob_chara* rob_chr, int32_t a2) { + if (a2 < 0 || a2 > 3) + return 0; + + struc_306& v0 = rob_chr->data.field_1588.field_330.field_33C[a2]; + int16_t v7 = v0.field_C; + if (v7 <= 0 || v7 >= 27 || !(v7 < 10 || rob_chr->field_20)) + return false; + + bool v2 = false; + int32_t v8 = v0.field_0; + float_t v9 = rob_chr->data.motion.frame_data.frame; + if (v8 == 0) { + if (v9 + < v0.frame) + return false; + } + else if (v8 == 1) { + if (v9 + < v0.frame + || v9 + >= v0.field_8) + return false; + } + else + return false; + + mat4 mat; + sub_140419290(rob_chr->bone_data, rob_ik_hand_leg_bones[a2], &mat); + vec3 v13; + mat4_get_translation(&mat, &v13); + + vec3 v45; + switch (v0.field_C) { + case 0: + v45 = v0.field_10; + break; + case 16: + vec3_add(v0.field_10, v13, v45); + break; + case 10: { + float_t ratio0 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio0; + vec3_mult_scalar(v13, ratio0, v45); + } break; + case 11: { + float_t ratio1 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio1; + vec3_mult_scalar(v13, ratio1, v45); + } break; + case 12: { + float_t ratio3 = ((rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28))->ik_scale.ratio3; + vec3_mult_scalar(v13, ratio3, v45); + } break; + case 13: { + float_t ratio0 = rob_chr->bone_data->ik_scale.ratio0; + vec3_mult_scalar(v13, 1.0f / ratio0, v45); + } break; + case 14: { + float_t ratio1 = rob_chr->bone_data->ik_scale.ratio1; + vec3_mult_scalar(v13, 1.0f / ratio1, v45); + } break; + case 15: { + float_t ratio3 = rob_chr->bone_data->ik_scale.ratio3; + vec3_mult_scalar(v13, 1.0f / ratio3, v45); + } break; + default: + if (v0.field_C < 16) { + mat4* v26 = rob_chara_bone_data_get_mats_mat( + (rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28), dword_140A2DDD0[v0.field_C]); + mat4_get_translation(v26, &v45); + vec3_add(v45, v0.field_10, v45); + } + else { + mat4* v23 = rob_chara_bone_data_get_mats_mat( + (rob_chara_bone_data*)((size_t)rob_chr->field_20 + 0x28), dword_140A2DDD0[v0.field_C]); + + vec3& v24 = v0.field_10; + + mat4 v49; + mat4_translate_mult(v23, v24.x, v24.y, v24.z, &v49); + mat4_get_translation(&v49, &v45); + } + break; + } + + float_t v29 = rob_chr->data.motion.frame_data.frame; + float_t v30 = v0.frame; + if (v29 < v30) + v29 = v0.frame; + else if (v29 > v0.field_8) + v29 = v0.field_8; + + float_t v31 = 1.0f; + float_t v32 = v0.field_8 - v30 + 1.0f; + if (fabsf(v32) > 0.000001f) { + v31 = (v0.field_8 - v29) / v32; + v31 = clamp(v31, 0.0f, 1.0f); + } + + int32_t v33 = v0.field_0; + vec3 v48 = vec3_null; + if (v33 == 0) { + vec3_lerp_scalar(v45, v13, v48, v31); + } + else if (v33 == 1) { + vec3_lerp_scalar(v13, v45, v48, v31); + } + + switch (v0.field_E) { + case 1: + v48.y = v13.y; + v48.z = v13.z; + break; + case 2: + v48.x = v13.x; + v48.z = v13.z; + break; + case 3: + v48.x = v13.x; + v48.y = v13.y; + break; + case 4: + v48.z = v13.z; + break; + case 5: + v48.y = v13.y; + break; + case 6: + v48.x = v13.z; + break; + } + + vec3 v36; + vec3_sub(v48, v13, v36); + if (v0.field_1C.x != 0.0f && v36.x < v0.field_1C.x) + v48.x = v0.field_1C.x + v13.x; + else if (v0.field_28.x != 0.0f && v36.x > v0.field_28.x) + v48.x = v0.field_28.x + v13.x; + + if (v0.field_1C.y != 0.0f && v36.y < v0.field_1C.y) + v48.y = v0.field_1C.y + v13.y; + else if (v0.field_28.y != 0.0f && v36.y > v0.field_28.y) + v48.y = v0.field_28.y + v13.y; + + if (v0.field_1C.z != 0.0f && v36.z < v0.field_1C.z) + v48.z = v0.field_1C.z + v13.z; + else if (v0.field_28.z != 0.0f && v36.z > v0.field_28.z) + v48.z = v0.field_28.z + v13.z; + sub_140418A00(rob_chr->bone_data, &v48, off_140C9E000[a2], 0.0f, 0.0f, true); + return true; +} + +static void sub_1403F9A40(vec3* a1, vec3* a2, mat4* a3, float_t a4, float_t a5) { + vec3 v10; + mat4_mult_vec3_inv_trans(a3, a2, &v10); + v10.y += a4; + v10.z += a5; + mat4_mult_vec3_trans(a3, &v10, a1); +} + +static bool sub_14040AC40(vec3* a1, vec3* a2, float_t a3, vec3* a4) { + vec3 v4; + vec3_negate(*a2, v4); + float_t v7; + vec3_dot(*a1, v4, v7); + float_t v8; + vec3_dot(v4, v4, v8); + v8 -= a3 * a3; + if (v8 > 0.0f && v7 > 0.0f) + return false; + + float_t v10 = v7 * v7 - v8; + if (v10 < 0.0f) + return false; + + vec3_mult_scalar(*a1, sqrtf(v10) - v7, *a4); + return true; +} + +static void sub_1403FA040(vec3* a1, float_t a2, mat4* a3, float_t a4, + float_t a5, float_t a6, float_t a7, vec3* a8, float_t a9) { + vec3 v16; + mat4_mult_vec3_inv(a3, a1, &v16); + v16.x = 0.0f; + + float_t v18; + vec3_length_squared(v16, v18); + if (fabsf(v18) <= 0.000001f) + goto LABEL_66; + + vec3_normalize(v16, v16); + + vec3 v52; + vec3 v53; + float_t v23; + if (a7 - a6 >= a5 - a4) { + v23 = (a5 - a4) * 0.5f; + + v53.x = 0.0f; + v53.y = a5 - v23; + v53.z = a6 + v23; + + v52.x = 0.0f; + v52.y = a5 - v23; + v52.z = a7 - v23; + if (fabsf(v16.y) <= 0.000001f) { + if (fabsf(a4) <= 0.000001f || fabsf(a5) <= 0.000001f) { + vec3_mult_scalar(v16, a2, v16); + if (v16.z < a6 + v23) { + v16.z = a6 + v23; + goto LABEL_66; + } + else if (v16.z > a7 - v23) { + v16.z = a7 - v23; + goto LABEL_66; + } + goto LABEL_60; + } + } + else if ((fabsf(a4) > 0.000001f || v16.y >= 0.0f) && (fabsf(a5) > 0.000001f || v16.y <= 0.0f)) { + float_t v22 = a5; + if (v16.y * a5 <= 0.0f) + v22 = a4; + + float_t v31 = v22 * v16.z / v16.y; + if (v31 >= a6 + v23 && v31 <= a7 - v23) { + float_t v32 = sqrtf(v31 * v31 + v22 * v22); + bool v17 = true; + if (a2 < v32) { + v32 = a2; + v17 = false; + } + vec3_mult_scalar(v16, v32, v16); + if (v17) + goto LABEL_66; + } + } + else { + v16.y = 0.0f; + if (fabsf(v16.z) > 0.000001f) { + vec3_normalize(v16, v16); + vec3_mult_scalar(v16, a2, v16); + v16.z = clamp(v16.z, a6, a7); + } + goto LABEL_66; + } + } + else { + v23 = (a7 - a6) * 0.5f; + + v53.x = 0.0f; + v53.y = a5 - v23; + v53.z = a7 - v23; + + v52.x = 0.0f; + v52.y = 0.0f; + v52.z = a7 - v23; + if (fabsf(v16.z) <= 0.000001f) { + if (fabsf(a6) <= 0.000001f || fabsf(a7) <= 0.000001f) { + vec3_mult_scalar(v16, a2, v16); + if (v16.y < a4 + v23) { + v16.y = a4 + v23; + goto LABEL_66; + } + else if (v16.y > a5 - v23) { + v16.y = a5 - v23; + goto LABEL_66; + } + goto LABEL_60; + } + } + else if ((fabsf(a6) > 0.000001f || v16.z >= 0.0f) && (fabsf(a7) > 0.000001f || v16.z <= 0.0f)) { + float_t v22 = a7; + if (v16.z * a7 <= 0.0f) + v22 = a6; + + float_t v31 = v22 * v16.y / v16.z; + if (v31 >= a4 + v23 && v31 <= a5 - v23) { + float_t v32 = sqrtf(v31 * v31 + v22 * v22); + bool v17 = true; + if (a2 < v32) { + v32 = a2; + v17 = false; + } + vec3_mult_scalar(v16, v32, v16); + if (v17) + goto LABEL_66; + } + } + else { + v16.z = 0.0f; + if (fabsf(v16.y) > 0.000001f) { + vec3_normalize(v16, v16); + vec3_mult_scalar(v16, a2, v16); + v16.y = clamp(v16.y, a4, a5); + } + goto LABEL_66; + } + } + + { + vec3 v51 = vec3_null; + if (!sub_14040AC40(&v16, &v53, v23, &v51) && !sub_14040AC40(&v16, &v52, v23, &v51)) { + v16 = vec3_null; + goto LABEL_66; + } + + float_t v40; + vec3_length(v51, v40); + bool v17 = true; + if (a2 < v40) { + v40 = a2; + v17 = false; + } + vec3_mult_scalar(v16, v40, v16); + if (v17) + goto LABEL_66; + } + +LABEL_60: + { + float_t v20; + vec3_dot(*a8, v16, v20); + if (v20 != 0.0f) { + float_t v43; + vec3_length(*a8, v43); + float_t v44 = v43 + (v43 * 0.97f - v43) * a9; + + float_t v45; + vec3_length(v16, v45); + if (v45 < v44) { + if (v45 != 0.0f) + vec3_mult_scalar(v16, 1.0f / v45, v16); + vec3_mult_scalar(v16, v44, v16); + } + } + } + +LABEL_66: + mat4_mult_vec3(a3, &v16, a1); + *a8 = v16; +} + +static void sub_1403FA770(struc_312* a1) { + mat4* v4 = a1->bones->data()[MOTION_BONE_C_KATA_L].node[3].mat; + mat4* v5 = a1->bones->data()[MOTION_BONE_C_KATA_R].node[3].mat; + + vec3 v42; + mat4_get_translation(v4, &v42); + vec3 v43; + mat4_get_translation(v5, &v43); + + vec3 v41; + sub_1403F9A40(&v41, &v42, v4, a1->field_0.field_4, a1->field_0.field_8); + vec3 v40; + sub_1403F9A40(&v40, &v43, v5, a1->field_2C.field_4, a1->field_2C.field_8); + + vec3 v45; + vec3_sub(v41, v40, v45); + + vec3 v44; + vec3_sub(v40, v41, v44); + + float_t v20; + vec3_distance(v41, v40, v20); + + float_t v21 = (a1->field_0.field_0 * a1->field_8C + a1->field_2C.field_0 - v20) * 0.5f; + float_t v22 = (a1->field_2C.field_0 * a1->field_8C + a1->field_0.field_0 - v20) * 0.5f; + + bool v16 = true; + bool v17 = false; + if (v21 <= 0.0f) { + v16 = false; + vec3_length(a1->field_5C, v21); + float_t v25 = (0.97f * v21 - v21) * a1->step + v21; + if (v21 <= 0.001f || v25 <= 0.0f) { + a1->field_5C = vec3_null; + v45 = vec3_null; + } + else { + vec3_mult_scalar(a1->field_5C, v25 / v21, a1->field_5C); + mat4_mult_vec3(v4, &a1->field_5C, &v45); + v17 = true; + } + } + + bool v19 = true; + bool v18 = false; + if (v22 <= 0.0f) { + v19 = false; + vec3_length(a1->field_68, v22); + float_t v31 = (0.97f * v22 - v22) * a1->step + v22; + if (v22 <= 0.001f || v31 <= 0.0f) { + a1->field_68 = vec3_null; + v44 = vec3_null; + } + else { + vec3_mult_scalar(a1->field_68, v31 / v22, a1->field_68); + mat4_mult_vec3(v5, &a1->field_68, &v44); + v18 = true; + } + } + + if (v16) + sub_1403FA040(&v45, v21, v4, a1->field_0.field_C, a1->field_0.field_10, + a1->field_0.field_14, a1->field_0.field_18, &a1->field_5C, a1->step); + + if (v19) + sub_1403FA040(&v44, v22, v5, a1->field_2C.field_C, a1->field_2C.field_10, + a1->field_2C.field_14, a1->field_2C.field_18, &a1->field_68, a1->step); + + if (v16 || v17) { + vec3_add(v42, v45, v42); + sub_14040AE10(a1->bones->data()[MOTION_BONE_C_KATA_L].node[2].mat, &v42); + } + + if (v19 || v18) { + vec3_add(v43, v44, v43); + sub_14040AE10(a1->bones->data()[MOTION_BONE_C_KATA_R].node[2].mat, &v43); + } +} + +static void sub_1403F9B20(struc_312* a1, motion_bone_index motion_bone_index) { + float_t v3; + float_t v4; + float_t a5; + vec3* v6; + float_t v7; + float_t v8; + float_t v9; + float_t v10; + vec3 v11; + float_t v14; + if (motion_bone_index == MOTION_BONE_C_KATA_L) { + v3 = a1->field_0.field_0; + v4 = a1->field_0.field_4; + a5 = a1->field_0.field_8; + v7 = a1->field_0.field_C; + v8 = a1->field_0.field_10; + v9 = a1->field_0.field_14; + v10 = a1->field_0.field_18; + v11 = a1->field_0.field_1C; + v14 = a1->field_0.field_28; + v6 = &a1->field_74; + } + else if (motion_bone_index == MOTION_BONE_C_KATA_R) { + v3 = a1->field_2C.field_0; + v4 = a1->field_2C.field_4; + a5 = a1->field_2C.field_8; + v7 = a1->field_2C.field_C; + v8 = a1->field_2C.field_10; + v9 = a1->field_2C.field_14; + v10 = a1->field_2C.field_18; + v11 = a1->field_2C.field_1C; + v14 = a1->field_2C.field_28; + v6 = &a1->field_80; + } + else + return; + + bone_data* v15 = a1->bones->data(); + bone_node* v18 = v15[motion_bone_index].node; + mat4* v19 = v18[MOTION_BONE_KL_HARA_ETC].mat; + + vec3 v39; + mat4_get_translation(v19, &v39); + + vec3 v37; + sub_1403F9A40(&v37, &v39, v19, v4, a5); + + vec3 v40; + mat4* v23 = v15[MOTION_BONE_KL_MUNE_B_WJ].node->mat; + mat4_mult_vec3_trans(v23, &v11, &v40); + + vec3 v41; + vec3_sub(v37, v40, v41); + + float_t v24; + vec3_length(v41, v24); + float_t v26 = v3 * a1->field_8C + v14 - v24; + if (v26 > 0.0f) + sub_1403FA040(&v41, v26, v19, v7, v8, v9, v10, v6, a1->step); + else { + float_t v31; + vec3_length(*v6, v31); + float_t v32 = (0.97f * v31 - v31) * a1->step + v31; + if (v31 <= 0.001f || v32 <= 0.0f) { + *v6 = vec3_null; + return; + } + vec3_mult_scalar(*v6, v32 / v31, *v6); + mat4_mult_vec3(v19, v6, &v41); + } + + mat4* v42 = v15[motion_bone_index].node[2].mat; + vec3_add(v39, v41, v39); + sub_14040AE10(v42, &v39); +} + +static void sub_1403FAF30(struc_312* a1, std::vector* bones, float_t step) { + a1->step = step; + a1->bones = bones; + if (a1->field_58) + sub_1403FA770(a1); + + if (a1->field_59) { + sub_1403F9B20(a1, MOTION_BONE_C_KATA_L); + sub_1403F9B20(a1, MOTION_BONE_C_KATA_R); + } +} + +static void sub_14041AB50(rob_chara_bone_data* rob_bone_data) { + motion_blend_mot* v2 = rob_bone_data->motion_loaded.front(); + sub_1403FAF30(&rob_bone_data->field_958, &v2->bone_data.bones, v2->mot_play_data.frame_data.step); +} + +static bool rob_chara_hands_adjust(rob_chara* rob_chr) { + rob_chara_set_hands_adjust(rob_chr); + bool v2 = false; + if (sub_14053ACA0(rob_chr, 0) || sub_14053B580(rob_chr, 1)) + v2 = true; + if (sub_14053ACA0(rob_chr, 1) || sub_14053B580(rob_chr, 0)) + v2 = true; + sub_14041AB50(rob_chr->bone_data); + return v2; +} + +static bool sub_14053B530(rob_chara* rob_chr) { + return sub_14053B580(rob_chr, 2) | sub_14053B580(rob_chr, 3); +} + +static float_t sub_140406E90(bone_data* a1, bone_data* a2, float_t a3, vec3* a4) { + vec3 v18 = vec3_null; + mat4_mult_vec3_trans(a1->node[3].mat, &v18, &v18); + *a4 = v18; + + vec3 v17; + v17.x = 0.01f; + v17.y = -0.05f; + v17.z = 0.0; + mat4_mult_vec3_trans(a2->node[0].mat, &v18, &v17); + + if (v18.y - a3 <= v17.y) + return v18.y - a3; + return v17.y; +} + +static float_t sub_14064AD10(vec3* a1, float_t a2) { + task_stage_info v5; + task_stage_get_current_stage_info(&v5); + if (task_stage_has_stage_info(&v5)) { + stage* stg = task_stage_get_stage(v5); + if (!stg) + return -1000.0f; + + stage_data* v3 = stg->stage_data; + if (!v3) + return -1000.0f; + + if (a1->x < v3->ring_rectangle_x - a2 + || a1->z < v3->ring_rectangle_y - a2 + || a1->x > v3->ring_rectangle_x + v3->ring_rectangle_width + || a1->z > v3->ring_rectangle_y + v3->ring_rectangle_height) + return v3->ring_out_height; + return v3->ring_height; + } + return -1000.0f; +} + +static void sub_140406920(vec3* a1, bone_data* a2, bone_data* a3, float_t heel_height, vec3* a5, float_t step) { + vec3 v18; + float_t v7 = sub_140406E90(a2, a3, heel_height, &v18); + float_t v8 = sub_14064AD10(&v18, heel_height); + if (a5->y != v8) { + a5->x = a5->y; + a5->z = 0.0f; + } + a5->y = v8; + + a5->z = step * 10.0f + a5->z; + if (a5->z > 1.0f) { + a5->x = v8; + a5->z = 1.0f; + } + + float_t v11 = v8 - v7; + float_t v12 = a5->x - v7; + if (v11 < 0.0f) + v11 = 0.0f; + if (v12 < 0.0f) + v12 = 0.0f; + + a2->ik_target.x = v18.x; + a2->ik_target.y = v18.y + lerp(v12, v11, a5->z); + a2->ik_target.z = v18.z; +} + +static void sub_1404065B0(vec3* a1, std::vector* a2, mat4* a3, float_t a4, + bone_database_skeleton_type skeleton_type, const motion_bone_index* a6, const motion_bone_index* a7) { + bone_database* bone_data = &rctx_ptr->data->data_ft.bone_data; + const char* name = bone_database_skeleton_type_to_string(skeleton_type); + float_t* base_heel_height = 0; + float_t* heel_height = 0; + if (!bone_data->get_skeleton_heel_height(name, &heel_height)) + return; + + sub_140406920(a1, &a2->data()[a6[0]], &a2->data()[MOTION_BONE_KL_TOE_L_WJ], *heel_height, &a1[0], a4); + sub_140406920(a1, &a2->data()[a7[0]], &a2->data()[MOTION_BONE_KL_TOE_R_WJ], *heel_height, &a1[1], a4); + + ::bone_data* v7 = a2->data(); + ::bone_data* v17 = &v7[a6[0]]; + v17->rot_mat[1] = mat4_identity; + v17->rot_mat[2] = mat4_identity; + bone_data_mult_ik(v17, 1); + + ::bone_data* v20 = &v7[a7[0]]; + v20->rot_mat[1] = mat4_identity; + v20->rot_mat[2] = mat4_identity; + bone_data_mult_ik(v20, 1); + + motion_bone_index v21 = a6[1]; + + a6++; + while (*a6 != MOTION_BONE_NONE) + bone_data_mult_1(&v7[*a6++], a3, v7, true); + + a7++; + while (*a7 != MOTION_BONE_NONE) + bone_data_mult_1(&v7[*a7++], a3, v7, true); +} + +static void sub_140418810(rob_chara_bone_data* rob_bone_data, const motion_bone_index* a6, const motion_bone_index* a7) { + motion_blend_mot* v3 = rob_bone_data->motion_loaded.front(); + mat4 m = v3->field_4F8.mat; + sub_1404065B0(rob_bone_data->field_76C, &v3->bone_data.bones, &m, + v3->mot_play_data.frame_data.step, rob_bone_data->skeleton_type, a6, a7); +} + +static void sub_14053B260(rob_chara* rob_chr) { + if (rob_chr->data.field_1588.field_0.field_20.field_C & 0x10000000) + sub_140418810(rob_chr->bone_data, dword_140A2DDB0, dword_140A2DD90); +} + +static void rob_chara_bone_data_left_hand_scale(rob_chara_bone_data* rob_bone_data, float_t scale) { + mat4* kl_te_wj_mat = rob_chara_bone_data_get_mats_mat(rob_bone_data, ROB_BONE_KL_TE_L_WJ); + if (!kl_te_wj_mat) + return; + + vec3 trans; + mat4_get_translation(kl_te_wj_mat, &trans); + + mat4 mat; + mat4_scale(scale, scale, scale, &mat); + + vec3 temp; + vec3_mult_scalar(trans, scale, temp); + vec3_sub(trans, temp, trans); + + mat4_set_translation(&mat, &trans); + + for (int32_t i = ROB_BONE_KL_TE_L_WJ; i <= ROB_BONE_NL_OYA_C_L_WJ; i++) { + mat4* m = rob_chara_bone_data_get_mats_mat(rob_bone_data, i); + if (m) + mat4_mult(m, &mat, m); + } + + for (int32_t i = MOT_BONE_KL_TE_L_WJ; i <= MOT_BONE_NL_OYA_C_L_WJ; i++) { + bone_node* node = rob_chara_bone_data_get_node(rob_bone_data, i); + if (node) + node->exp_data.scale = { scale, scale, scale }; + } +} + +static void rob_chara_bone_data_right_hand_scale(rob_chara_bone_data* rob_bone_data, float_t scale) { + mat4* kl_te_wj_mat = rob_chara_bone_data_get_mats_mat(rob_bone_data, ROB_BONE_KL_TE_R_WJ); + if (!kl_te_wj_mat) + return; + + vec3 trans; + mat4_get_translation(kl_te_wj_mat, &trans); + + mat4 mat; + mat4_scale(scale, scale, scale, &mat); + + vec3 temp; + vec3_mult_scalar(trans, scale, temp); + vec3_sub(trans, temp, trans); + + mat4_set_translation(&mat, &trans); + + for (int32_t i = ROB_BONE_KL_TE_R_WJ; i <= ROB_BONE_NL_OYA_C_R_WJ; i++) { + mat4* m = rob_chara_bone_data_get_mats_mat(rob_bone_data, i); + if (m) + mat4_mult(m, &mat, m); + } + + for (int32_t i = MOT_BONE_KL_TE_R_WJ; i <= MOT_BONE_NL_OYA_C_R_WJ; i++) { + bone_node* node = rob_chara_bone_data_get_node(rob_bone_data, i); + if (node) + node->exp_data.scale = { scale, scale, scale }; + } +} + +static void rob_motion_modifier_rob_chara_ctrl(rob_chara* rob_chr) { + sub_14053BEE0(rob_chr); + rob_chara_hands_adjust(rob_chr); + if (!sub_14053B530(rob_chr)) + sub_14053B260(rob_chr); + + float_t left_hand_scale_default = rob_chr->data.adjust_data.left_hand_scale_default; + float_t right_hand_scale_default = rob_chr->data.adjust_data.right_hand_scale_default; + float_t left_hand_scale = rob_chr->data.adjust_data.left_hand_scale; + float_t right_hand_scale = rob_chr->data.adjust_data.right_hand_scale; + + if (left_hand_scale_default > 0.0f) { + if (left_hand_scale <= 0.0f) + left_hand_scale = rob_chr->data.adjust_data.left_hand_scale_default; + else + left_hand_scale *= left_hand_scale_default; + } + + if (right_hand_scale_default > 0.0f) { + if (right_hand_scale <= 0.0f) + right_hand_scale = rob_chr->data.adjust_data.right_hand_scale_default; + else + right_hand_scale *= right_hand_scale_default; + } + + if (left_hand_scale > 0.0f) + rob_chara_bone_data_left_hand_scale(rob_chr->bone_data, left_hand_scale); + + if (right_hand_scale > 0.0f) + rob_chara_bone_data_right_hand_scale(rob_chr->bone_data, right_hand_scale); +} + +static float_t rob_chara_array_get_data_adjust_scale(int32_t chara_id) { + if (rob_chara_pv_data_array_check_chara_id(chara_id)) + return rob_chara_array[chara_id].data.adjust_data.scale; + return 1.0f; } static rob_chara_item_equip* rob_chara_array_get_item_equip(int32_t chara_id) { @@ -9571,7 +10671,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, std::vector* vec_bone_data, + rob_chara_bone_data_ik_scale* ik_scale, std::vector* bones, 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); @@ -9582,10 +10682,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->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]; + ::bone_data* b_cl_mune = &bones->data()[MOTION_BONE_CL_MUNE]; + ::bone_data* b_kl_kubi = &bones->data()[MOTION_BONE_KL_KUBI]; + ::bone_data* b_c_kata_l = &bones->data()[MOTION_BONE_C_KATA_L]; + ::bone_data* b_cl_momo_l = &bones->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; @@ -9772,13 +10872,13 @@ static void sub_14041AD90(rob_chara_bone_data* rob_bone_data) { if (rob_bone_data->eyelid.mot_key_data.key_sets_ready && rob_bone_data->eyelid.mot_key_data.mot_data && !rob_bone_data->eyelid.field_30) sub_140413EA0(&rob_bone_data->face.field_0, sub_14041B1C0); - else if (rob_bone_data->field_758 || rob_bone_data->eyes.mot_key_data.key_sets_ready + else if (rob_bone_data->disable_eye_motion || rob_bone_data->eyes.mot_key_data.key_sets_ready && rob_bone_data->eyes.mot_key_data.mot_data && !rob_bone_data->eyes.field_30) sub_140413EA0(&rob_bone_data->face.field_0, sub_14041B440); } static void sub_14041AD50(rob_chara_bone_data* rob_bone_data) { - if (rob_bone_data->field_758 || rob_bone_data->eyes.mot_key_data.key_sets_ready + if (rob_bone_data->disable_eye_motion || rob_bone_data->eyes.mot_key_data.key_sets_ready && rob_bone_data->eyes.mot_key_data.mot_data && !rob_bone_data->eyes.field_30) sub_140413EA0(&rob_bone_data->eyelid.field_0, sub_14041B440); } @@ -9787,7 +10887,7 @@ static void sub_14041ABA0(rob_chara_bone_data* a1) { for (motion_blend_mot*& i : a1->motion_loaded) { if (a1->face.mot_key_data.key_sets_ready && a1->face.mot_key_data.mot_data && !a1->face.field_30) { - if (!a1->field_758 || a1->eyes.mot_key_data.key_sets_ready + if (!a1->disable_eye_motion || a1->eyes.mot_key_data.key_sets_ready && a1->eyes.mot_key_data.mot_data && !a1->eyes.field_30) sub_140413EA0(&i->field_0, sub_14041B4E0); else @@ -9799,7 +10899,7 @@ static void sub_14041ABA0(rob_chara_bone_data* a1) { sub_140413EA0(&i->field_0, sub_14041B800); if (a1->eyelid.mot_key_data.key_sets_ready && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) { - if (!a1->field_758 + if (!a1->disable_eye_motion || a1->eyes.mot_key_data.key_sets_ready && a1->eyes.mot_key_data.mot_data && !a1->eyes.field_30) sub_140413EA0(&i->field_0, sub_14041B1C0); @@ -10008,9 +11108,10 @@ static void sub_1401EAD00(bone_data* a1, bone_data* a2) { } } -static void sub_140412BB0(motion_blend_mot* a1, std::vector* a2) { +static void sub_140412BB0(motion_blend_mot* a1, std::vector* bones) { + bone_data* bone = bones->data(); for (bone_data& i : a1->bone_data.bones) - sub_1401EAD00(&i, &a2->data()[i.motion_bone_index]); + sub_1401EAD00(&i, &bone[i.motion_bone_index]); } static void sub_14041AE40(rob_chara_bone_data* rob_bone_data) { @@ -10020,7 +11121,7 @@ static void sub_14041AE40(rob_chara_bone_data* rob_bone_data) { if (rob_bone_data->face.mot_key_data.key_sets_ready && rob_bone_data->face.mot_key_data.mot_data && !rob_bone_data->face.field_30) { - if (!rob_bone_data->field_758 + if (!rob_bone_data->disable_eye_motion || rob_bone_data->eyes.mot_key_data.key_sets_ready && rob_bone_data->eyes.mot_key_data.mot_data && !rob_bone_data->eyes.field_30) sub_140413EA0(v3, sub_14041B4E0); @@ -10033,7 +11134,7 @@ static void sub_14041AE40(rob_chara_bone_data* rob_bone_data) { sub_140413EA0(v3, sub_14041B800); if (rob_bone_data->eyelid.mot_key_data.key_sets_ready && rob_bone_data->eyelid.mot_key_data.mot_data && !rob_bone_data->eyelid.field_30) { - if (!rob_bone_data->field_758 + if (!rob_bone_data->disable_eye_motion || rob_bone_data->eyes.mot_key_data.key_sets_ready && rob_bone_data->eyes.mot_key_data.mot_data && !rob_bone_data->eyes.field_30) sub_140413EA0(v3, sub_14041B1C0); @@ -10194,9 +11295,7 @@ static void sub_1403FAEF0(struc_312* a1) { a1->field_0.field_10 = 0.0f; a1->field_0.field_14 = 0.0f; a1->field_0.field_18 = 0.0f; - a1->field_0.field_1C = 0; - a1->field_0.field_20 = 0.0f; - a1->field_0.field_24 = 0.0f; + a1->field_0.field_1C = vec3_null; a1->field_0.field_28 = 0.0f; a1->field_2C.field_0 = 0.0f; a1->field_2C.field_4 = 0.0f; @@ -10205,61 +11304,19 @@ static void sub_1403FAEF0(struc_312* a1) { a1->field_2C.field_10 = 0.0f; a1->field_2C.field_14 = 0.0f; a1->field_2C.field_18 = 0.0f; - a1->field_2C.field_1C = 0; - a1->field_2C.field_20 = 0.0f; - a1->field_2C.field_24 = 0.0f; + a1->field_2C.field_1C = vec3_null; a1->field_2C.field_28 = 0.0f; a1->field_58 = false; a1->field_59 = false; a1->field_8C = 1.0f; - a1->field_90 = 0; - a1->field_98 = 1.0f; + a1->bones = 0; + a1->step = 1.0f; a1->field_5C = vec3_null; a1->field_68 = vec3_null; a1->field_74 = vec3_null; a1->field_80 = vec3_null; } -static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { - rob_bone_data->object_bone_count = 0; - rob_bone_data->motion_bone_count = 0; - rob_bone_data->total_bone_count = 0; - rob_bone_data->ik_bone_count = 0; - rob_bone_data->chain_pos = 0; - rob_bone_data->mats.clear(); - rob_bone_data->mats2.clear(); - rob_bone_data->nodes.clear(); - rob_bone_data->base_skeleton_type = BONE_DATABASE_SKELETON_NONE; - rob_bone_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; - - if (rob_bone_data->motions.size() == 3) { - rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 0); - for (motion_blend_mot*& i : rob_bone_data->motions) - motion_blend_mot_reset(i); - rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); - } - else { - rob_chara_bone_data_motion_blend_mot_free(rob_bone_data); - rob_chara_bone_data_motion_blend_mot_init(rob_bone_data); - } - - mot_blend_reset(&rob_bone_data->face); - mot_blend_reset(&rob_bone_data->hand_l); - mot_blend_reset(&rob_bone_data->hand_r); - mot_blend_reset(&rob_bone_data->mouth); - mot_blend_reset(&rob_bone_data->eyes); - mot_blend_reset(&rob_bone_data->eyelid); - rob_bone_data->field_758 = 0; - rob_bone_data->ik_scale.ratio0 = 1.0f; - rob_bone_data->ik_scale.ratio1 = 1.0f; - rob_bone_data->ik_scale.ratio2 = 1.0f; - rob_bone_data->ik_scale.ratio3 = 1.0f; - rob_bone_data->field_76C = vec3_null; - rob_bone_data->field_778 = vec3_null; - sub_1404198D0(&rob_bone_data->field_788); - sub_1403FAEF0(&rob_bone_data->field_958); -} - static void rob_chara_bone_data_set_eyelid_anim_duration(rob_chara_bone_data* rob_bone_data, float_t duration, float_t step, float_t offset) { mot_blend_set_duration(&rob_bone_data->eyelid, duration, step, offset); @@ -10630,47 +11687,6 @@ static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* motion_blend_mot_mult_mat(rob_bone_data->motion_loaded.front(), mat); } -static void rob_chara_data_adjuct_reset(rob_chara_adjust_data* rob_chr_adj) { - rob_chr_adj->scale = 1.0f; - rob_chr_adj->height_adjust = false; - rob_chr_adj->pos_adjust_y = 0.0f; - rob_chr_adj->pos_adjust = vec3_null; - rob_chr_adj->offset = vec3_null; - rob_chr_adj->offset_x = true; - rob_chr_adj->offset_y = false; - rob_chr_adj->offset_z = true; - rob_chr_adj->get_global_trans = false; - mat4 mat; - mat4_translate(rob_chr_adj->trans.x, rob_chr_adj->trans.y, - rob_chr_adj->trans.z, &mat); - rob_chr_adj->mat = mat; - rob_chr_adj->left_hand_scale = -1.0f; - rob_chr_adj->right_hand_scale = -1.0f; - rob_chr_adj->left_hand_scale_default = -1.0f; - rob_chr_adj->right_hand_scale_default = -1.0f; -} - -static void rob_chara_data_miku_rot_reset(rob_chara_data_miku_rot* rob_mik_rot) { - rob_mik_rot->rot_y_int16 = 0; - rob_mik_rot->field_2 = 0; - rob_mik_rot->field_4 = 0; - rob_mik_rot->field_6 = 0; - rob_mik_rot->field_8 = 0; - rob_mik_rot->field_C = 0; - rob_mik_rot->field_10 = 0.0f; - rob_mik_rot->field_14 = 0; - rob_mik_rot->position = vec3_null; - rob_mik_rot->field_24 = vec3_null; - rob_mik_rot->field_30 = vec3_null; - rob_mik_rot->field_3C = vec3_null; - rob_mik_rot->field_48 = vec3_null; - rob_mik_rot->field_54 = vec3_null; - rob_mik_rot->field_60 = 0; - rob_mik_rot->field_64 = 0; - rob_mik_rot->field_68 = 0; - rob_mik_rot->field_6C = mat4u_identity; -} - void sub_140506C20(struc_523* a1) { a1->field_0 = 0; a1->field_1 = 0; @@ -10768,65 +11784,6 @@ static void sub_140505C90(struc_264* a1) { a1->field_1D4 = 0; } -static void sub_140506440(rob_chara_adjust* a1) { - a1->motion_id = -1; - a1->prev_motion_id = -1; - a1->frame_data.frame = 0.0f; - a1->frame_data.prev_frame = 0.0f; - a1->frame_data.last_set_frame = 0.0f; - a1->step_data.frame = 0.0f; - a1->step_data.field_4 = 0.0f; - a1->step_data.step = -1.0f; - a1->step = -1.0f; - a1->field_24 = 0; - a1->field_28 = 0; - a1->field_29 = 0; - a1->field_2A = 0; - a1->field_2C = 0; - a1->field_30 = 0; - a1->field_34 = 0; - a1->field_36 = 0; - - for (int32_t& i : a1->field_38) - i = 0; - for (int32_t& i : a1->field_B8) - i = 0; - - a1->field_138 = 1.0f; - a1->field_13C = 1.0f; - a1->field_140 = vec3_null; - a1->field_150.Reset(); - a1->hand_l.Reset(); - a1->hand_r.Reset(); - a1->hand_l_object = object_info(); - a1->hand_r_object = object_info(); - a1->field_3B0.Reset(); - - for (rob_chara_data_parts_adjust& i : a1->parts_adjust) - i.reset(); - - for (rob_chara_data_parts_adjust& i : a1->parts_adjust_prev) - i.reset(); - - for (rob_chara_data_parts_adjust& i : a1->field_10D8) - i.reset(); - - for (struc_222& i : a1->field_12C8) { - i.field_0 = 0; - i.field_4 = 0.0f; - i.field_8 = 0.0f; - i.field_C = 0.0f; - i.duration = 0.0f; - i.frame = 0.0f; - } - - for (rob_chara_data_hand_adjust& i : a1->hand_adjust) - i.reset(); - - for (rob_chara_data_hand_adjust& i : a1->hand_adjust_prev) - i.reset(); -} - static void sub_140536DD0(struc_223* a1) { a1->field_0.field_84 = 0; a1->field_0.field_88 = 0; @@ -11154,35 +12111,6 @@ static void sub_140505FB0(struc_209* a1) { a1->field_1F26 = 0; } -static void rob_chara_data_reset(rob_chara_data* rob_chr_data) { - sub_140505C90(&rob_chr_data->field_8); - rob_chr_data->rob_sub_action.Reset(); - sub_140506440(&rob_chr_data->adjust); - sub_140539750(&rob_chr_data->field_1588); - rob_chara_data_miku_rot_reset(&rob_chr_data->miku_rot); - rob_chara_data_adjuct_reset(&rob_chr_data->adjust_data); - sub_140505FB0(&rob_chr_data->field_1E68); - rob_chr_data->field_3D90 = 0; - rob_chr_data->field_3D94 = 0; - rob_chr_data->field_3D98 = 0; - rob_chr_data->field_3D9C = 0; - rob_chr_data->field_3DA0 = 0; - rob_chr_data->field_3DA8 = 0; - rob_chr_data->field_3DB0 = 0; - rob_chr_data->field_3DB8 = 0; - rob_chr_data->field_3DBC = 0; - rob_chr_data->field_3DA4 = 0; - rob_chr_data->field_3DC8 = 0; - rob_chr_data->field_3DD4 = 0.0f; - rob_chr_data->field_3DCC = 0; - rob_chr_data->field_3DC0 = 0; - rob_chr_data->field_3DC4 = 0; - rob_chr_data->field_3DD8 = 0; - rob_chr_data->field_3DD0 = 0; - rob_chr_data->field_3DDC = 0.0f; - rob_chr_data->field_3DE0 = 0; -} - static bool rob_chara_item_cos_data_check_for_npr_flag(rob_chara_item_cos_data* itm_cos_data) { int32_t* arr = itm_cos_data->cos.arr; for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) { @@ -11428,12 +12356,6 @@ static void sub_140513B90(rob_chara_item_equip* rob_itm_equip, item_id id, objec rob_itm_equip->item_equip_object[id].disp = false; } -static const char* sub_140508180(chara_index chara_index) { - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) - return stru_140A247C0[chara_index].chara_name; - return 0; -} - static void sub_14052C560(rob_chara_item_cos_data* item_sub_data, rob_chara_item_equip* rob_itm_equip, int32_t item_no, item_table_item* item, item_sub_id sub_id, bone_database* bone_data, void* data, object_database* obj_db) { @@ -11485,7 +12407,7 @@ static void sub_14052C560(rob_chara_item_cos_data* item_sub_data, if (!(item->attr & 0x800)) return; - const char* chara_name = sub_140508180(item_sub_data->chara_index); + const char* chara_name = chara_index_get_chara_name(item_sub_data->chara_index); char buf[0x100]; for (int32_t i = 0; i < 9; i++) { sprintf_s(buf, sizeof(buf), "%sITM%03d_ATAM_HEAD_%02d_SP__DIVSKN", chara_name, item_no, i); @@ -12554,30 +13476,9 @@ static void rob_chara_item_equip_object_skp_load_file( rob_chara_item_equip_object_skp_load(itm_eq_obj, &kv, bone_data); } -static void rob_chara_item_equip_reset(rob_chara_item_equip* rob_itm_equip) { - rob_itm_equip->bone_nodes = 0; - rob_itm_equip->matrices = 0; - for (int32_t i = ITEM_BODY; i < ITEM_MAX; i++) - rob_chara_item_equip_object_init_members(&rob_itm_equip->item_equip_object[i]); - rob_itm_equip->item_equip_range = false; - rob_itm_equip->shadow_type = (shadow_type_enum)-1; - rob_itm_equip->field_A0 = 5; - rob_itm_equip->texture_pattern.clear(); - rob_itm_equip->field_D0 = object_info(); - rob_itm_equip->field_D4 = -1; - rob_itm_equip->field_D8 = false; - rob_itm_equip->parts_short = false; - rob_itm_equip->parts_append = false; - rob_itm_equip->parts_white_one_l = false; - rob_itm_equip->step = 1.0f; - rob_itm_equip->use_opd = false; - rob_itm_equip->first_item_equip_object = ITEM_ATAMA; - rob_itm_equip->max_item_equip_object = ITEM_ITEM16; -} - static void rob_chara_item_equip_reset_init_data(rob_chara_item_equip* rob_itm_equip, bone_node* bone_nodes) { - rob_chara_item_equip_reset(rob_itm_equip); + rob_itm_equip->reset(); rob_itm_equip->bone_nodes = bone_nodes; rob_itm_equip->matrices = bone_nodes->mat; @@ -12808,33 +13709,33 @@ 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) { +static bool rob_chara_data_adjust_compare(rob_chara_data_adjust* left, rob_chara_data_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->external_force_cycle_strength.x == right->external_force_cycle_strength.x + && left->external_force_cycle_strength.y == right->external_force_cycle_strength.y + && left->external_force_cycle_strength.z == right->external_force_cycle_strength.z + && left->external_force_cycle.x == right->external_force_cycle.x + && left->external_force_cycle.y == right->external_force_cycle.y + && left->external_force_cycle.z == right->external_force_cycle.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; +static void rob_chara_set_adjust(rob_chara* rob_chr, rob_chara_data_adjust* adjust_new, + rob_chara_data_adjust* adjust, rob_chara_data_adjust* adjust_prev) { + if (rob_chara_data_adjust_compare(adjust_new, adjust)) { + adjust_new->frame = adjust->frame; + adjust_new->transition_frame = adjust->transition_frame; } - *parts_adjust_prev = *parts_adjust; - *parts_adjust = *parts_adjust_new; + *adjust_prev = *adjust; + *adjust = *adjust_new; } static void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, @@ -13046,7 +13947,7 @@ static void rob_osage_set_yz_order(rob_osage* rob_osg, int32_t yz_order) { } static void rob_osage_free(rob_osage* rob_osg) { - rob_osage_reset(rob_osg); + rob_osg->reset(); } static void skin_param_osage_node_parse(key_val* kv, const char* name, @@ -13449,11 +14350,11 @@ inline bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id) { int32_t rob_chara::get_rob_cmn_mottbl_motion_id(int32_t id) { if (id >= 214 && id <= 223) - return pv_data.field_74[id - 214]; + return pv_data.motion_face_ids[id - 214]; else if (id == 224) - return data.adjust.motion_id; + return data.motion.motion_id; else if (id >= 226 && id <= 235) - return pv_data.field_74[id - 226]; + return pv_data.motion_face_ids[id - 226]; int32_t v2 = data.field_8.field_1A4; if (rob_cmn_mottbl_data @@ -13482,6 +14383,10 @@ bool task_rob_manager_check_chara_loaded(int32_t chara_id) { return task_rob_manager.CheckCharaLoaded(&rob_chara_array[chara_id]); } +void task_rob_manager_free_task() { + task_rob_manager.SetDest(); +} + bone_node_expression_data::bone_node_expression_data() { position = vec3_null; rotation = vec3_null; @@ -13506,7 +14411,7 @@ 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() { +parent_mat(), node(), ik_segment_length(), ik_2nd_segment_length(), arm_length() { eyes_xrot_adjust_neg = 1.0f; eyes_xrot_adjust_pos = 1.0f; } @@ -13521,6 +14426,30 @@ bone_data_parent::~bone_data_parent() { } +void mot_play_frame_data::reset() { + frame = 0.0f; + step = 1.0f; + step_prev = 1.0f; + frame_count = 0; + last_frame = -1.0f; + field_14 = -1.0f; + field_18 = -1; + field_1C = -1; + field_20 = 0; + field_24 = -1.0f; + field_28 = 0; + field_2C = -1; +} + +void mot_play_data::reset() { + frame_data.reset(); + field_30 = 0; + field_34 = 0; + field_38 = 0; + field_40 = 0; + field_48 = 0; +} + MotionBlend::MotionBlend() : field_8(), field_9(), duration(), frame(), step(1.0f), offset(), blend() { @@ -13930,7 +14859,7 @@ struc_240::~struc_240() { motion_blend_mot::motion_blend_mot() : bone_data(), mot_key_data(), mot_play_data(), field_4F8(), field_5CC(), blend() { - mot_play_data_reset(&mot_play_data); + mot_play_data.reset(); field_4F8.field_C0 = 1.0f; field_4F8.field_C4 = 1.0f; } @@ -13939,6 +14868,25 @@ motion_blend_mot::~motion_blend_mot() { } +void motion_blend_mot::reset() { + mot_play_data.reset(); + field_4F8.field_0 = 0; + field_4F8.field_8 = 0; + field_4F8.mat = mat4u_identity; + field_4F8.field_4C = mat4u_identity; + field_4F8.field_8C = false; + field_4F8.eyes_adjust = 0.0f; + field_4F8.prev_eyes_adjust = 0.0f; + field_4F8.field_90 = vec3_identity; + field_4F8.field_9C = vec3_identity; + field_4F8.field_A8 = vec3_identity; + field_4F8.field_BC = 0; + field_4F8.field_BD = 0; + field_4F8.field_C0 = 1.0f; + field_4F8.field_C4 = 1.0f; + field_4F8.field_C8 = vec3_null; +} + rob_chara_bone_data_ik_scale::rob_chara_bone_data_ik_scale() { ratio0 = 1.0f; ratio1 = 1.0f; @@ -13954,9 +14902,18 @@ mot_blend::~mot_blend() { } +void mot_blend::reset() { + mot_play_data.reset(); + blend.Reset(); + field_0.bone_check_func = 0; + sub_1404119A0(&field_0.field_8); + field_0.motion_bone_count = 0; + field_30 = 0; +} + rob_chara_bone_data::rob_chara_bone_data() : field_0(), field_1(), object_bone_count(), total_bone_count(), motion_bone_count(), ik_bone_count(), chain_pos(), -field_758(), field_76C(), field_778(), field_784(), field_788(), field_958() { +disable_eye_motion(), field_76C(), field_784(), field_788(), field_958() { base_skeleton_type = BONE_DATABASE_SKELETON_NONE; skeleton_type = BONE_DATABASE_SKELETON_NONE; } @@ -13968,6 +14925,43 @@ rob_chara_bone_data::~rob_chara_bone_data() { } } +void rob_chara_bone_data::reset() { + object_bone_count = 0; + motion_bone_count = 0; + total_bone_count = 0; + ik_bone_count = 0; + chain_pos = 0; + mats.clear(); + mats2.clear(); + nodes.clear(); + base_skeleton_type = BONE_DATABASE_SKELETON_NONE; + skeleton_type = BONE_DATABASE_SKELETON_NONE; + + if (motions.size() == 3) { + rob_chara_bone_data_motion_blend_mot_list_free(this, 0); + for (motion_blend_mot*& i : motions) + i->reset(); + rob_chara_bone_data_motion_blend_mot_list_init(this); + } + else { + rob_chara_bone_data_motion_blend_mot_free(this); + rob_chara_bone_data_motion_blend_mot_init(this); + } + + face.reset(); + hand_l.reset(); + hand_r.reset(); + mouth.reset(); + eyes.reset(); + eyelid.reset(); + disable_eye_motion = false; + ik_scale = rob_chara_bone_data_ik_scale(); + field_76C[0] = vec3_null; + field_76C[0] = vec3_null; + sub_1404198D0(&field_788); + sub_1403FAEF0(&field_958); +} + rob_chara_pv_data::rob_chara_pv_data() { type = ROB_CHARA_TYPE_2; field_4 = true; @@ -13979,16 +14973,16 @@ rob_chara_pv_data::rob_chara_pv_data() { field_18 = {}; field_44 = {}; field_70 = 0; - field_74[0] = -1; - field_74[1] = -1; - field_74[2] = -1; - field_74[3] = -1; - field_74[4] = -1; - field_74[5] = -1; - field_74[6] = -1; - field_74[7] = -1; - field_74[8] = -1; - field_74[9] = -1; + motion_face_ids[0] = -1; + motion_face_ids[1] = -1; + motion_face_ids[2] = -1; + motion_face_ids[3] = -1; + motion_face_ids[4] = -1; + motion_face_ids[5] = -1; + motion_face_ids[6] = -1; + motion_face_ids[7] = -1; + motion_face_ids[8] = -1; + motion_face_ids[9] = -1; chara_size_index = 1; height_adjust = false; customize_items = {}; @@ -14727,7 +15721,7 @@ void ExOsageBlock::Disp() { void ExOsageBlock::Reset() { index = 0; - rob_osage_reset(&rob); + rob.reset(); field_1FF8 &= ~3; mats = 0; step = 1.0f; @@ -15112,6 +16106,32 @@ rob_osage::~rob_osage() { } +void rob_osage::reset() { + nodes.clear(); + node.reset(); + wind_direction = vec3_null; + field_1EB4 = 0.0f; + yz_order = 0; + field_2A0 = true; + motion_reset_data.clear(); + move_cancel = 0.0f; + field_1F0C = false; + osage_reset = false; + field_1F0E = false; + ring = osage_ring_data(); + field_1F0F = 0; + skin_param.reset(); + skin_param_ptr = &skin_param; + osage_setting = osage_setting_osg_cat(); + reset_data_list = 0; + field_2A4 = 0.0f; + field_2A1 = false; + set_external_force = false; + external_force = vec3_null; + parent_mat_ptr = 0; + parent_mat = mat4u_null; +} + rob_chara_item_equip_object::rob_chara_item_equip_object() : index(), mats(), obj_info(), field_14(), texture_data(), null_blocks_data_set(), alpha(), draw_task_flags(), disp(), field_A4(), mat(), osage_iterations(), bone_nodes(), @@ -15125,11 +16145,11 @@ rob_chara_item_equip_object::~rob_chara_item_equip_object() { rob_chara_item_equip::rob_chara_item_equip() : bone_nodes(), matrices(), item_equip_object(), field_18(), item_equip_range(), first_item_equip_object(), max_item_equip_object(), field_A0(), shadow_type(), position(), -eyes_adjust(), field_D4(), field_D8(), field_DC(), texture_color_coeff(), wet(), wind_strength(), chara_color(), -npr_flag(), mat(), field_13C(), field_8BC(), field_8C0(), field_8C4(), field_8C8(), field_8CC(), field_8D0(), -field_8D4(), field_8D8(), field_8DC(), field_8E0(), field_8E4(), field_8E8(), field_8EC(), field_8F0(), -field_8F4(), field_8F8(), field_8FC(), field_900(), field_908(), field_910(), field_918(), field_920(), -field_928(), field_930(), step(1.0f), use_opd(), parts_short(), parts_append(), parts_white_one_l() { +eyes_adjust(), field_D4(), disable_update(), field_DC(), texture_color_coeff(), wet(), wind_strength(), +chara_color(), npr_flag(), mat(), field_13C(), field_8BC(), field_8C0(), field_8C4(), field_8C8(), field_8CC(), +field_8D0(), field_8D4(), field_8D8(), field_8DC(), field_8E0(), field_8E4(), field_8E8(), field_8EC(), +field_8F0(), field_8F4(), field_8F8(), field_8FC(), field_900(), field_908(), field_910(), field_918(), +field_920(), field_928(), field_930(), step(1.0f), use_opd(), parts_short(), parts_append(), parts_white_one_l() { item_equip_object = new rob_chara_item_equip_object[ITEM_MAX]; wind_strength = 1.0f; chara_color = true; @@ -15138,9 +16158,33 @@ field_928(), field_930(), step(1.0f), use_opd(), parts_short(), parts_append(), } rob_chara_item_equip::~rob_chara_item_equip() { - rob_chara_item_equip_reset(this); - delete[] item_equip_object; - item_equip_object = 0; + reset(); + + if (item_equip_object) { + delete[] item_equip_object; + item_equip_object = 0; + } +} + +void rob_chara_item_equip::reset() { + bone_nodes = 0; + matrices = 0; + for (int32_t i = ITEM_BODY; i < ITEM_MAX; i++) + rob_chara_item_equip_object_init_members(&item_equip_object[i]); + item_equip_range = false; + shadow_type = (shadow_type_enum)-1; + field_A0 = 5; + texture_pattern.clear(); + field_D0 = object_info(); + field_D4 = -1; + disable_update = false; + parts_short = false; + parts_append = false; + parts_white_one_l = false; + step = 1.0f; + use_opd = false; + first_item_equip_object = ITEM_ATAMA; + max_item_equip_object = ITEM_ITEM16; } item_cos_texture_change_tex::item_cos_texture_change_tex() : org(), chg(), changed() { @@ -15609,7 +16653,7 @@ void struc_405::Reset() { time = 0.0f; } -void rob_chara_data_parts_adjust::reset() { +void rob_chara_data_adjust::reset() { enable = false; frame = 0.0f; transition_frame = 0.0f; @@ -15622,9 +16666,9 @@ void rob_chara_data_parts_adjust::reset() { type = 6; cycle_type = 0; ignore_gravity = true; - external_force_min = vec3_null; - external_force_strength = vec3_null; external_force = vec3_null; + external_force_cycle_strength = vec3_null; + external_force_cycle = vec3_null; cycle = 1.0f; phase = 0.0f; force = 1.0f; @@ -15638,31 +16682,92 @@ void rob_chara_data_hand_adjust::reset() { type = ROB_CHARA_DATA_HAND_ADJUST_NONE; current_scale = 1.0f; scale = 1.0f; - transition_time = 0.0f; + duration = 0.0f; current_time = 0.0f; rotation_blend = 1.0f; - offset_blend = 1.0f; + scale_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; + arm_length = 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(), -parts_adjust(), parts_adjust_prev(), field_10D8(), hand_adjust(), hand_adjust_prev(), field_12C8() { +void rob_chara_data_arm_adjust::reset() { + enable = false; + value = 0.0f; + prev_value = 0.0f; + next_value = 0.0f; + duration = 0.0f; + frame = 0.0f; +} + +rob_chara_motion::rob_chara_motion() : motion_id(-1), prev_motion_id(-1), frame_data(), step_data(), step(1.0f), +field_24(), field_28(), field_29(), field_2A(), field_2C(), field_30(), field_34(), field_36(), field_38(), +field_B8(), field_138(), field_13C(), field_140(), field_14C(), field_314(), parts_adjust(), +parts_adjust_prev(), adjust_global(), adjust_global_prev(), hand_adjust(), hand_adjust_prev(), arm_adjust() { } -rob_chara_adjust::~rob_chara_adjust() { +rob_chara_motion::~rob_chara_motion() { } +void rob_chara_motion::reset() { + motion_id = -1; + prev_motion_id = -1; + frame_data.frame = 0.0f; + frame_data.prev_frame = 0.0f; + frame_data.last_set_frame = 0.0f; + step_data.frame = 0.0f; + step_data.field_4 = 0.0f; + step_data.step = -1.0f; + step = -1.0f; + field_24 = 0; + field_28 = 0; + field_29 = 0; + field_2A = 0; + field_2C = 0; + field_30 = 0; + field_34 = 0; + field_36 = 0; + + for (int32_t& i : field_38) + i = 0; + for (int32_t& i : field_B8) + i = 0; + + field_138 = 1.0f; + field_13C = 1.0f; + field_140 = vec3_null; + field_150.Reset(); + hand_l.Reset(); + hand_r.Reset(); + hand_l_object = object_info(); + hand_r_object = object_info(); + field_3B0.Reset(); + + for (rob_chara_data_adjust& i : parts_adjust) + i.reset(); + + for (rob_chara_data_adjust& i : parts_adjust_prev) + i.reset(); + + adjust_global.reset(); + adjust_global_prev.reset(); + + for (rob_chara_data_arm_adjust& i : arm_adjust) + i.reset(); + + for (rob_chara_data_hand_adjust& i : hand_adjust) + i.reset(); + + for (rob_chara_data_hand_adjust& i : hand_adjust_prev) + i.reset(); +} mothead_mot::mothead_mot() { field_0.field_0 = 19; @@ -15719,6 +16824,46 @@ struc_223::~struc_223() { } +void rob_chara_data_miku_rot::reset() { + rot_y_int16 = 0; + field_2 = 0; + field_4 = 0; + field_6 = 0; + field_8 = 0; + field_C = 0; + field_10 = 0.0f; + field_14 = 0; + position = vec3_null; + field_24 = vec3_null; + field_30 = vec3_null; + field_3C = vec3_null; + field_48 = vec3_null; + field_54 = vec3_null; + field_60 = 0; + field_64 = 0; + field_68 = 0; + field_6C = mat4u_identity; +} + +void rob_chara_adjust_data::reset() { + scale = 1.0f; + height_adjust = false; + pos_adjust_y = 0.0f; + pos_adjust = vec3_null; + offset = vec3_null; + offset_x = true; + offset_y = false; + offset_z = true; + get_global_trans = false; + mat4 mat; + mat4_translate(trans.x, trans.y, trans.z, &mat); + this->mat = mat; + left_hand_scale = -1.0f; + right_hand_scale = -1.0f; + left_hand_scale_default = -1.0f; + right_hand_scale_default = -1.0f; +} + struc_209::struc_209() : field_0(), field_4(), field_8(), field_C(), field_10(), field_14(), field_18(), field_1C(), field_20(), field_24(), field_28(), field_2C(), field_30(), field_34(), field_38(), field_3C(), field_40(), field_44(), field_48(), field_4C(), field_50(), field_54(), field_58(), field_5C(), field_60(), @@ -15752,6 +16897,35 @@ rob_chara_data::~rob_chara_data() { } +void rob_chara_data::reset() { + sub_140505C90(&field_8); + rob_sub_action.Reset(); + motion.reset(); + sub_140539750(&field_1588); + miku_rot.reset(); + adjust_data.reset(); + sub_140505FB0(&field_1E68); + field_3D90 = 0; + field_3D94 = 0; + field_3D98 = 0; + field_3D9C = 0; + field_3DA0 = 0; + field_3DA8 = 0; + field_3DB0 = 0; + field_3DB8 = 0; + field_3DBC = 0; + field_3DA4 = 0; + field_3DC8 = 0; + field_3DD4 = 0.0f; + field_3DCC = 0; + field_3DC0 = 0; + field_3DC4 = 0; + field_3DD8 = 0; + field_3DD0 = 0; + field_3DDC = 0.0f; + field_3DE0 = 0; +} + rob_chara::rob_chara() : chara_id(), type(), field_C(), field_D(), chara_index(), module_index(), chara_init_data(), field_20() { frame_speed = 1.0f; @@ -15915,11 +17089,11 @@ void MotFile::LoadFile(std::string* mdata_dir, uint32_t set) { 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); + file_handler.set_callback_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); + file_handler.set_callback_data(0, ParseFileParent, this); } load_count = 1; } @@ -15978,7 +17152,7 @@ void MhdFile::LoadFile(const char* path, const char* file, uint32_t set) { 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); + file_handler.set_callback_data(0, ParseFileParent, this); load_count = 1; } @@ -16489,7 +17663,8 @@ RobThreadHandler::~RobThreadHandler() { } } -void RobThreadHandler::AppendRobCharaFunc(int32_t chara_id, rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)) { +void RobThreadHandler::AppendRobCharaFunc(int32_t chara_id, + rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)) { arr[chara_id]->AppendRobCharaFunc(rob_chr, rob_chr_func); } @@ -16657,7 +17832,7 @@ void SkinParamManager::Reset() { i.second = 0; } field_A8.clear(); - + for (struc_461*& i : field_B8) { if (i->file_handler) { delete i->file_handler; @@ -16695,13 +17870,16 @@ void SkinParamManager::sub_14060FBD0() { obj_skin_ex_data* ex_data = &skin->ex_data; int32_t osage_count = 0; + int32_t cloth_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++; + else if (b->type == OBJ_SKIN_BLOCK_CLOTH) + cloth_count++; - if (!ex_data || !(ex_data->field_2C + osage_count)) + if (!ex_data || !cloth_count + osage_count) continue; std::string v64 = "ext_skp_" + std::string(v11) + ".txt"; @@ -16747,7 +17925,7 @@ void SkinParamManager::sub_14060FBD0() { 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); @@ -16758,7 +17936,7 @@ void SkinParamManager::sub_14060FBD0() { 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); @@ -16776,7 +17954,7 @@ void SkinParamManager::sub_14060FBD0() { continue; } - v31->resize((size_t)ex_data->field_2C + osage_count); + v31->resize((size_t)cloth_count + osage_count); v19->field_10 = v31; p_file_handler* v39 = new p_file_handler; @@ -16939,7 +18117,8 @@ bool TaskRobDisp::Ctrl() { for (rob_chara*& i : ctrl_chara) if (i && i->data.field_3 > -1) - rob_thread_handler->AppendRobCharaFunc(i->chara_id, i, rob_disp_rob_chara_ctrl_thread_main); + rob_thread_handler->AppendRobCharaFunc(i->chara_id, i, + rob_disp_rob_chara_ctrl_thread_main); rob_thread_handler->sub_14054E3F0(); @@ -16952,11 +18131,11 @@ bool TaskRobDisp::Ctrl() { bool TaskRobDisp::Dest() { if (pv_osage_manager_array_ptr_get_disp()) { pv_osage_manager_array_ptr_set_not_reset_true(); - return false;; + return false; } /*else if (sub_14047A430()) { sub_140475B30(); - return false;; + return false; }*/ init_chara.clear(); @@ -16965,10 +18144,8 @@ bool TaskRobDisp::Dest() { AppendFreeCharaList(i); ctrl_chara.clear(); - for (rob_chara*& i : free_chara) { - //sub_140541260(i->chara_id); - rob_chara_item_equip_reset(i->item_equip); - } + for (rob_chara*& i : free_chara) + rob_disp_rob_chara_free(i); free_chara.clear(); FreeCharaLists(); @@ -17456,9 +18633,6 @@ bool TaskRobManager::Init() { return true; } -static void sub_140532AF0(TaskRobManager* task, std::list* rob_chr_list) { -} - bool TaskRobManager::Ctrl() { if (!ctrl_state) { if (task_rob_load_check_load_req_data()) @@ -17718,6 +18892,23 @@ bool TaskRobMotionModifier::Init() { } bool TaskRobMotionModifier::Ctrl() { + if (pv_osage_manager_array_ptr_get_disp()) + return false; + + for (rob_chara*& i : init_chara) + if (i) + AppendCtrlCharaList(i); + init_chara.clear(); + + /*for (rob_chara*& i : ctrl_chara) + if (i) + sub_1405484A0(i);*/ + + for (rob_chara*& i : ctrl_chara) + if (i) + rob_motion_modifier_rob_chara_ctrl(i); + + free_chara.clear(); return false; } @@ -17996,23 +19187,23 @@ static void sub_14053F300(RobPartialMotion* a1) { } static void sub_140548660(rob_chara* rob_chr) { - rob_chr->data.adjust.frame_data.prev_frame = rob_chr->data.adjust.frame_data.frame; + rob_chr->data.motion.frame_data.prev_frame = rob_chr->data.motion.frame_data.frame; sub_14041DBA0(rob_chr->bone_data); - if (rob_chr->data.adjust.field_28 < 0) - rob_chara_bone_data_set_frame(rob_chr->bone_data, rob_chr->data.adjust.frame_data.last_set_frame); - rob_chr->data.adjust.frame_data.frame = rob_chara_bone_data_get_frame(rob_chr->bone_data); - sub_14053F300(&rob_chr->data.adjust.field_150.face); - sub_14053F300(&rob_chr->data.adjust.field_150.hand_l); - sub_14053F300(&rob_chr->data.adjust.field_150.hand_r); - sub_14053F300(&rob_chr->data.adjust.field_150.mouth); - sub_14053F300(&rob_chr->data.adjust.field_150.eye); - sub_14053F300(&rob_chr->data.adjust.field_150.eyelid); - sub_14053F300(&rob_chr->data.adjust.field_3B0.face); - sub_14053F300(&rob_chr->data.adjust.field_3B0.hand_l); - sub_14053F300(&rob_chr->data.adjust.field_3B0.hand_r); - sub_14053F300(&rob_chr->data.adjust.field_3B0.mouth); - sub_14053F300(&rob_chr->data.adjust.field_3B0.eye); - sub_14053F300(&rob_chr->data.adjust.field_3B0.eyelid); + if (rob_chr->data.motion.field_28 < 0) + rob_chara_bone_data_set_frame(rob_chr->bone_data, rob_chr->data.motion.frame_data.last_set_frame); + rob_chr->data.motion.frame_data.frame = rob_chara_bone_data_get_frame(rob_chr->bone_data); + sub_14053F300(&rob_chr->data.motion.field_150.face); + sub_14053F300(&rob_chr->data.motion.field_150.hand_l); + sub_14053F300(&rob_chr->data.motion.field_150.hand_r); + sub_14053F300(&rob_chr->data.motion.field_150.mouth); + sub_14053F300(&rob_chr->data.motion.field_150.eye); + sub_14053F300(&rob_chr->data.motion.field_150.eyelid); + sub_14053F300(&rob_chr->data.motion.field_3B0.face); + sub_14053F300(&rob_chr->data.motion.field_3B0.hand_l); + sub_14053F300(&rob_chr->data.motion.field_3B0.hand_r); + sub_14053F300(&rob_chr->data.motion.field_3B0.mouth); + sub_14053F300(&rob_chr->data.motion.field_3B0.eye); + sub_14053F300(&rob_chr->data.motion.field_3B0.eyelid); } static void sub_140548460(rob_chara* rob_chr) { diff --git a/src/CRE/rob.hpp b/src/CRE/rob.hpp index 81828c0c..ba331e77 100644 --- a/src/CRE/rob.hpp +++ b/src/CRE/rob.hpp @@ -39,6 +39,211 @@ enum eyes_base_adjust_type { EYES_BASE_ADJUST_OFF = 2, }; +enum mot_bone_index { + MOT_BONE_N_HARA_CP = 0x00, + MOT_BONE_KG_HARA_Y = 0x01, + MOT_BONE_KL_HARA_XZ = 0x02, + MOT_BONE_KL_HARA_ETC = 0x03, + MOT_BONE_N_HARA = 0x04, + MOT_BONE_CL_MUNE = 0x05, + MOT_BONE_J_MUNE_WJ = 0x06, + MOT_BONE_E_MUNE_CP = 0x07, + MOT_BONE_N_MUNE_B = 0x08, + MOT_BONE_KL_MUNE_B_WJ = 0x09, + MOT_BONE_KL_KUBI = 0x0A, + MOT_BONE_N_KAO = 0x0B, + MOT_BONE_CL_KAO = 0x0C, + MOT_BONE_J_KAO_WJ = 0x0D, + MOT_BONE_E_KAO_CP = 0x0E, + MOT_BONE_FACE_ROOT = 0x0F, + MOT_BONE_N_AGO = 0x10, + MOT_BONE_KL_AGO_WJ = 0x11, + MOT_BONE_N_TOOTH_UNDER = 0x12, + MOT_BONE_TL_TOOTH_UNDER_WJ = 0x13, + MOT_BONE_N_EYE_L = 0x14, + MOT_BONE_KL_EYE_L = 0x15, + MOT_BONE_N_EYE_L_WJ_EX = 0x16, + MOT_BONE_KL_HIGHLIGHT_L_WJ = 0x17, + MOT_BONE_N_EYE_R = 0x18, + MOT_BONE_KL_EYE_R = 0x19, + MOT_BONE_N_EYE_R_WJ_EX = 0x1A, + MOT_BONE_KL_HIGHLIGHT_R_WJ = 0x1B, + MOT_BONE_N_EYELID_L_A = 0x1C, + MOT_BONE_TL_EYELID_L_A_WJ = 0x1D, + MOT_BONE_N_EYELID_L_B = 0x1E, + MOT_BONE_TL_EYELID_L_B_WJ = 0x1F, + MOT_BONE_N_EYELID_R_A = 0x20, + MOT_BONE_TL_EYELID_R_A_WJ = 0x21, + MOT_BONE_N_EYELID_R_B = 0x22, + MOT_BONE_TL_EYELID_R_B_WJ = 0x23, + MOT_BONE_N_KUTI_D = 0x24, + MOT_BONE_TL_KUTI_D_WJ = 0x25, + MOT_BONE_N_KUTI_D_L = 0x26, + MOT_BONE_TL_KUTI_D_L_WJ = 0x27, + MOT_BONE_N_KUTI_D_R = 0x28, + MOT_BONE_TL_KUTI_D_R_WJ = 0x29, + MOT_BONE_N_KUTI_DS_L = 0x2A, + MOT_BONE_TL_KUTI_DS_L_WJ = 0x2B, + MOT_BONE_N_KUTI_DS_R = 0x2C, + MOT_BONE_TL_KUTI_DS_R_WJ = 0x2D, + MOT_BONE_N_KUTI_L = 0x2E, + MOT_BONE_TL_KUTI_L_WJ = 0x2F, + MOT_BONE_N_KUTI_M_L = 0x30, + MOT_BONE_TL_KUTI_M_L_WJ = 0x31, + MOT_BONE_N_KUTI_M_R = 0x32, + MOT_BONE_TL_KUTI_M_R_WJ = 0x33, + MOT_BONE_N_KUTI_R = 0x34, + MOT_BONE_TL_KUTI_R_WJ = 0x35, + MOT_BONE_N_KUTI_U = 0x36, + MOT_BONE_TL_KUTI_U_WJ = 0x37, + MOT_BONE_N_KUTI_U_L = 0x38, + MOT_BONE_TL_KUTI_U_L_WJ = 0x39, + MOT_BONE_N_KUTI_U_R = 0x3A, + MOT_BONE_TL_KUTI_U_R_WJ = 0x3B, + MOT_BONE_N_MABU_L_D_A = 0x3C, + MOT_BONE_TL_MABU_L_D_A_WJ = 0x3D, + MOT_BONE_N_MABU_L_D_B = 0x3E, + MOT_BONE_TL_MABU_L_D_B_WJ = 0x3F, + MOT_BONE_N_MABU_L_D_C = 0x40, + MOT_BONE_TL_MABU_L_D_C_WJ = 0x41, + MOT_BONE_N_MABU_L_U_A = 0x42, + MOT_BONE_TL_MABU_L_U_A_WJ = 0x43, + MOT_BONE_N_MABU_L_U_B = 0x44, + MOT_BONE_TL_MABU_L_U_B_WJ = 0x45, + MOT_BONE_N_EYELASHES_L = 0x46, + MOT_BONE_TL_EYELASHES_L_WJ = 0x47, + MOT_BONE_N_MABU_L_U_C = 0x48, + MOT_BONE_TL_MABU_L_U_C_WJ = 0x49, + MOT_BONE_N_MABU_R_D_A = 0x4A, + MOT_BONE_TL_MABU_R_D_A_WJ = 0x4B, + MOT_BONE_N_MABU_R_D_B = 0x4C, + MOT_BONE_TL_MABU_R_D_B_WJ = 0x4D, + MOT_BONE_N_MABU_R_D_C = 0x4E, + MOT_BONE_TL_MABU_R_D_C_WJ = 0x4F, + MOT_BONE_N_MABU_R_U_A = 0x50, + MOT_BONE_TL_MABU_R_U_A_WJ = 0x51, + MOT_BONE_N_MABU_R_U_B = 0x52, + MOT_BONE_TL_MABU_R_U_B_WJ = 0x53, + MOT_BONE_N_EYELASHES_R = 0x54, + MOT_BONE_TL_EYELASHES_R_WJ = 0x55, + MOT_BONE_N_MABU_R_U_C = 0x56, + MOT_BONE_TL_MABU_R_U_C_WJ = 0x57, + MOT_BONE_N_MAYU_L = 0x58, + MOT_BONE_TL_MAYU_L_WJ = 0x59, + MOT_BONE_N_MAYU_L_B = 0x5A, + MOT_BONE_TL_MAYU_L_B_WJ = 0x5B, + MOT_BONE_N_MAYU_L_C = 0x5C, + MOT_BONE_TL_MAYU_L_C_WJ = 0x5D, + MOT_BONE_N_MAYU_R = 0x5E, + MOT_BONE_TL_MAYU_R_WJ = 0x5F, + MOT_BONE_N_MAYU_R_B = 0x60, + MOT_BONE_TL_MAYU_R_B_WJ = 0x61, + MOT_BONE_N_MAYU_R_C = 0x62, + MOT_BONE_TL_MAYU_R_C_WJ = 0x63, + MOT_BONE_N_TOOTH_UPPER = 0x64, + MOT_BONE_TL_TOOTH_UPPER_WJ = 0x65, + MOT_BONE_N_KUBI_WJ_EX = 0x66, + MOT_BONE_N_WAKI_L = 0x67, + MOT_BONE_KL_WAKI_L_WJ = 0x68, + MOT_BONE_TL_UP_KATA_L = 0x69, + MOT_BONE_C_KATA_L = 0x6A, + MOT_BONE_J_KATA_L_WJ_CU = 0x6B, + MOT_BONE_J_UDE_L_WJ = 0x6C, + MOT_BONE_E_UDE_L_CP = 0x6D, + MOT_BONE_KL_TE_L_WJ = 0x6E, + MOT_BONE_N_HITO_L_EX = 0x6F, + MOT_BONE_NL_HITO_L_WJ = 0x70, + MOT_BONE_NL_HITO_B_L_WJ = 0x71, + MOT_BONE_NL_HITO_C_L_WJ = 0x72, + MOT_BONE_N_KO_L_EX = 0x73, + MOT_BONE_NL_KO_L_WJ = 0x74, + MOT_BONE_NL_KO_B_L_WJ = 0x75, + MOT_BONE_NL_KO_C_L_WJ = 0x76, + MOT_BONE_N_KUSU_L_EX = 0x77, + MOT_BONE_NL_KUSU_L_WJ = 0x78, + MOT_BONE_NL_KUSU_B_L_WJ = 0x79, + MOT_BONE_NL_KUSU_C_L_WJ = 0x7A, + MOT_BONE_N_NAKA_L_EX = 0x7B, + MOT_BONE_NL_NAKA_L_WJ = 0x7C, + MOT_BONE_NL_NAKA_B_L_WJ = 0x7D, + MOT_BONE_NL_NAKA_C_L_WJ = 0x7E, + MOT_BONE_N_OYA_L_EX = 0x7F, + MOT_BONE_NL_OYA_L_WJ = 0x80, + MOT_BONE_NL_OYA_B_L_WJ = 0x81, + MOT_BONE_NL_OYA_C_L_WJ = 0x82, + MOT_BONE_N_STE_L_WJ_EX = 0x83, + MOT_BONE_N_SUDE_L_WJ_EX = 0x84, + MOT_BONE_N_SUDE_B_L_WJ_EX = 0x85, + MOT_BONE_N_HIJI_L_WJ_EX = 0x86, + MOT_BONE_N_UP_KATA_L_EX = 0x87, + MOT_BONE_N_SKATA_L_WJ_CD_EX = 0x88, + MOT_BONE_N_SKATA_B_L_WJ_CD_CU_EX = 0x89, + MOT_BONE_N_SKATA_C_L_WJ_CD_CU_EX = 0x8A, + MOT_BONE_N_WAKI_R = 0x8B, + MOT_BONE_KL_WAKI_R_WJ = 0x8C, + MOT_BONE_TL_UP_KATA_R = 0x8D, + MOT_BONE_C_KATA_R = 0x8E, + MOT_BONE_J_KATA_R_WJ_CU = 0x8F, + MOT_BONE_J_UDE_R_WJ = 0x90, + MOT_BONE_E_UDE_R_CP = 0x91, + MOT_BONE_KL_TE_R_WJ = 0x92, + MOT_BONE_N_HITO_R_EX = 0x93, + MOT_BONE_NL_HITO_R_WJ = 0x94, + MOT_BONE_NL_HITO_B_R_WJ = 0x95, + MOT_BONE_NL_HITO_C_R_WJ = 0x96, + MOT_BONE_N_KO_R_EX = 0x97, + MOT_BONE_NL_KO_R_WJ = 0x98, + MOT_BONE_NL_KO_B_R_WJ = 0x99, + MOT_BONE_NL_KO_C_R_WJ = 0x9A, + MOT_BONE_N_KUSU_R_EX = 0x9B, + MOT_BONE_NL_KUSU_R_WJ = 0x9C, + MOT_BONE_NL_KUSU_B_R_WJ = 0x9D, + MOT_BONE_NL_KUSU_C_R_WJ = 0x9E, + MOT_BONE_N_NAKA_R_EX = 0x9F, + MOT_BONE_NL_NAKA_R_WJ = 0xA0, + MOT_BONE_NL_NAKA_B_R_WJ = 0xA1, + MOT_BONE_NL_NAKA_C_R_WJ = 0xA2, + MOT_BONE_N_OYA_R_EX = 0xA3, + MOT_BONE_NL_OYA_R_WJ = 0xA4, + MOT_BONE_NL_OYA_B_R_WJ = 0xA5, + MOT_BONE_NL_OYA_C_R_WJ = 0xA6, + MOT_BONE_N_STE_R_WJ_EX = 0xA7, + MOT_BONE_N_SUDE_R_WJ_EX = 0xA8, + MOT_BONE_N_SUDE_B_R_WJ_EX = 0xA9, + MOT_BONE_N_HIJI_R_WJ_EX = 0xAA, + MOT_BONE_N_UP_KATA_R_EX = 0xAB, + MOT_BONE_N_SKATA_R_WJ_CD_EX = 0xAC, + MOT_BONE_N_SKATA_B_R_WJ_CD_CU_EX = 0xAD, + MOT_BONE_N_SKATA_C_R_WJ_CD_CU_EX = 0xAE, + MOT_BONE_KL_KOSI_Y = 0xAF, + MOT_BONE_KL_KOSI_XZ = 0xB0, + MOT_BONE_KL_KOSI_ETC_WJ = 0xB1, + MOT_BONE_CL_MOMO_L = 0xB2, + MOT_BONE_J_MOMO_L_WJ = 0xB3, + MOT_BONE_J_SUNE_L_WJ = 0xB4, + MOT_BONE_E_SUNE_L_CP = 0xB5, + MOT_BONE_KL_ASI_L_WJ_CO = 0xB6, + MOT_BONE_KL_TOE_L_WJ = 0xB7, + MOT_BONE_N_HIZA_L_WJ_EX = 0xB8, + MOT_BONE_CL_MOMO_R = 0xB9, + MOT_BONE_J_MOMO_R_WJ = 0xBA, + MOT_BONE_J_SUNE_R_WJ = 0xBB, + MOT_BONE_E_SUNE_R_CP = 0xBC, + MOT_BONE_KL_ASI_R_WJ_CO = 0xBD, + MOT_BONE_KL_TOE_R_WJ = 0xBE, + MOT_BONE_N_HIZA_R_WJ_EX = 0xBF, + MOT_BONE_N_MOMO_A_L_WJ_CD_EX = 0xC0, + MOT_BONE_N_MOMO_B_L_WJ_EX = 0xC1, + MOT_BONE_N_MOMO_C_L_WJ_EX = 0xC2, + MOT_BONE_N_MOMO_A_R_WJ_CD_EX = 0xC3, + MOT_BONE_N_MOMO_B_R_WJ_EX = 0xC4, + MOT_BONE_N_MOMO_C_R_WJ_EX = 0xC5, + MOT_BONE_N_HARA_CD_EX = 0xC6, + MOT_BONE_N_HARA_B_WJ_EX = 0xC7, + MOT_BONE_N_HARA_C_WJ_EX = 0xC8, + MOT_BONE_MAX = 0xC9, +}; + enum mothead_data_type { MOTHEAD_DATA_TYPE_0 = 0x00, MOTHEAD_DATA_TYPE_1 = 0x01, @@ -113,11 +318,11 @@ enum mothead_data_type { MOTHEAD_DATA_TYPE_70 = 0x46, MOTHEAD_DATA_OSAGE_MOVE_CANCEL = 0x47, MOTHEAD_DATA_TYPE_72 = 0x48, - MOTHEAD_DATA_HAND_ADJUST = 0x49, + MOTHEAD_DATA_ROB_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_ROB_ADJUST_GLOBAL = 0x4B, + MOTHEAD_DATA_ROB_ARM_ADJUST = 0x4C, + MOTHEAD_DATA_DISABLE_EYE_MOTION = 0x4D, MOTHEAD_DATA_TYPE_78 = 0x4E, MOTHEAD_DATA_ROB_CHARA_COLI_RING = 0x4F, MOTHEAD_DATA_ADJUST_GET_GLOBAL_TRANS = 0x50, @@ -700,7 +905,7 @@ struct bone_data { bone_node* node; float_t ik_segment_length[2]; float_t ik_2nd_segment_length[2]; - float_t field_2E0; + float_t arm_length; float_t eyes_xrot_adjust_neg; float_t eyes_xrot_adjust_pos; @@ -737,6 +942,8 @@ struct mot_play_frame_data { float_t field_24; bool field_28; int32_t field_2C; + + void reset(); }; struct mot_play_data { @@ -746,6 +953,8 @@ struct mot_play_data { float_t field_38; float_t* field_40; float_t* field_48; + + void reset(); }; struct struc_308 { @@ -890,6 +1099,8 @@ struct motion_blend_mot { motion_blend_mot(); virtual ~motion_blend_mot(); + + void reset(); }; struct rob_chara_bone_data_ik_scale { @@ -910,6 +1121,8 @@ struct mot_blend { mot_blend(); ~mot_blend(); + + void reset(); }; struct struc_241 { @@ -1004,9 +1217,7 @@ struct struc_242 { float_t field_10; float_t field_14; float_t field_18; - int32_t field_1C; - float_t field_20; - float_t field_24; + vec3 field_1C; float_t field_28; }; @@ -1020,8 +1231,8 @@ struct struc_312 { vec3 field_74; vec3 field_80; float_t field_8C; - std::vector* field_90; - float_t field_98; + std::vector* bones; + float_t step; }; struct rob_chara_bone_data { @@ -1047,16 +1258,17 @@ struct rob_chara_bone_data { mot_blend mouth; mot_blend eyes; mot_blend eyelid; - bool field_758; + bool disable_eye_motion; rob_chara_bone_data_ik_scale ik_scale; - vec3 field_76C; - vec3 field_778; + vec3 field_76C[2]; int32_t field_784; struc_258 field_788; struc_312 field_958; rob_chara_bone_data(); virtual ~rob_chara_bone_data(); + + void reset(); }; union rob_chara_pv_data_customize_items { @@ -1080,7 +1292,7 @@ struct rob_chara_pv_data { struc_242 field_18; struc_242 field_44; int32_t field_70; - int32_t field_74[10]; + int32_t motion_face_ids[10]; int32_t chara_size_index; bool height_adjust; rob_chara_pv_data_customize_items customize_items; @@ -1459,6 +1671,8 @@ struct rob_osage { rob_osage(); ~rob_osage(); + + void reset(); }; class ExOsageBlock : public ExNodeBlock { @@ -1673,7 +1887,7 @@ struct rob_chara_item_equip { std::vector texture_pattern; object_info field_D0; int32_t field_D4; - bool field_D8; + bool disable_update; int32_t field_DC; vec4u texture_color_coeff; float_t wet; @@ -1715,6 +1929,8 @@ struct rob_chara_item_equip { rob_chara_item_equip(); virtual ~rob_chara_item_equip(); + + void reset(); }; struct item_cos_texture_change_tex { @@ -2111,7 +2327,7 @@ struct struc_405 { void Reset(); }; -struct rob_chara_data_parts_adjust { +struct rob_chara_data_adjust { bool enable; float_t frame; float_t transition_frame; @@ -2124,9 +2340,9 @@ struct rob_chara_data_parts_adjust { int32_t type; int32_t cycle_type; bool ignore_gravity; - vec3 external_force_min; - vec3 external_force_strength; vec3 external_force; + vec3 external_force_cycle_strength; + vec3 external_force_cycle; float_t cycle; float_t phase; float_t force; @@ -2142,32 +2358,34 @@ struct rob_chara_data_hand_adjust { rob_chara_data_hand_adjust_type type; float_t current_scale; float_t scale; - float_t transition_time; + float_t duration; float_t current_time; float_t rotation_blend; - float_t offset_blend; + float_t scale_blend; bool enable_scale; bool disable_x; bool disable_y; bool disable_z; vec3 offset; vec3 field_30; - float_t field_3C; + float_t arm_length; int32_t field_40; void reset(); }; -struct struc_222 { - bool field_0; - float_t field_4; - float_t field_8; - float_t field_C; +struct rob_chara_data_arm_adjust { + bool enable; + float_t value; + float_t prev_value; + float_t next_value; float_t duration; float_t frame; + + void reset(); }; -struct rob_chara_adjust { +struct rob_chara_motion { int32_t motion_id; int32_t prev_motion_id; struc_389 frame_data; @@ -2194,15 +2412,18 @@ struct rob_chara_adjust { object_info hand_l_object; object_info hand_r_object; struc_405 field_3B0; - rob_chara_data_parts_adjust parts_adjust[13]; - rob_chara_data_parts_adjust parts_adjust_prev[13]; - rob_chara_data_parts_adjust field_10D8[2]; + rob_chara_data_adjust parts_adjust[13]; + rob_chara_data_adjust parts_adjust_prev[13]; + rob_chara_data_adjust adjust_global; + rob_chara_data_adjust adjust_global_prev; rob_chara_data_hand_adjust hand_adjust[2]; rob_chara_data_hand_adjust hand_adjust_prev[2]; - struc_222 field_12C8[2]; + rob_chara_data_arm_adjust arm_adjust[2]; - rob_chara_adjust(); - ~rob_chara_adjust(); + rob_chara_motion(); + ~rob_chara_motion(); + + void reset(); }; struct struc_228 { @@ -2472,6 +2693,8 @@ struct rob_chara_data_miku_rot { int32_t field_64; int32_t field_68; mat4u field_6C; + + void reset(); }; struct rob_chara_adjust_data { @@ -2490,6 +2713,8 @@ struct rob_chara_adjust_data { float_t right_hand_scale; float_t left_hand_scale_default; float_t right_hand_scale_default; + + void reset(); }; struct struc_195 { @@ -2647,7 +2872,7 @@ struct rob_chara_data { int32_t field_4; struc_264 field_8; RobSubAction rob_sub_action; - rob_chara_adjust adjust; + rob_chara_motion motion; struc_223 field_1588; rob_chara_data_miku_rot miku_rot; rob_chara_adjust_data adjust_data; @@ -2676,6 +2901,8 @@ struct rob_chara_data { rob_chara_data(); ~rob_chara_data(); + + void reset(); }; struct struc_307 { @@ -2772,8 +2999,8 @@ extern rob_chara_pv_data* rob_chara_pv_data_array; 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 float_t chara_pos_adjust_y_table_get_value(uint32_t a1); -extern float_t chara_size_table_get_value(uint32_t a1); +extern float_t chara_pos_adjust_y_table_get_value(uint32_t index); +extern float_t chara_size_table_get_value(uint32_t index); 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); @@ -2798,6 +3025,7 @@ 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 task_rob_manager_free_task(); extern void motion_storage_init(); extern bool motion_storage_check_mot_file_not_ready(uint32_t set_id); diff --git a/src/CRE/stage.cpp b/src/CRE/stage.cpp index 61736125..7e1a2ceb 100644 --- a/src/CRE/stage.cpp +++ b/src/CRE/stage.cpp @@ -50,8 +50,6 @@ static void task_stage_set_ring(task_stage_info* stg_info, bool value); static void task_stage_set_sky(task_stage_info* stg_info, bool value); static void task_stage_set_stage_display(task_stage_info* stg_info, bool value); -const task_stage_info task_stage_info_null = { -1, 0 }; - stage_detail::TaskStage task_stage; DtmStg dtm_stg; @@ -218,12 +216,26 @@ static void stage_detail::TaskStage_CtrlInner(stage_detail::TaskStage* a1) { else if (a1->state == 5/* && !sub_1403446E0()*/) { std::vector vec; stage_detail::TaskStage_GetLoadedStageInfos(a1, &vec); - if (vec.size()) + if (vec.size()) { stage_detail::TaskStage_SetStage(a1, vec[0]); + + stage* s = stage_detail::TaskStage_GetStage(a1, vec[0]); + data_struct* data = rctx_ptr->data; + auth_3d_database* auth_3d_db = &data->data_ft.auth_3d_db; + for (int32_t& i : s->stage_data->auth_3d_ids) { + int32_t id = auth_3d_data_load_uid(i, auth_3d_db); + if (id == -1) + continue; + + auth_3d_data_read_file(&id, auth_3d_db); + s->auth_3d_ids.push_back(id); + } + } a1->state = 6; } - else if (a1->state >= 7 && a1->state <= 9) + else if (a1->state >= 7 && a1->state <= 9) { stage_detail::TaskStage_Unload(a1); + } } static void stage_detail::TaskStage_DispShadow(stage_detail::TaskStage* a1) { @@ -249,7 +261,7 @@ static stage* stage_detail::TaskStage_GetStage(stage_detail::TaskStage* a1, task static void stage_detail::TaskStage_GetTaskStageInfo(stage_detail::TaskStage* a1, task_stage_info* stg_info, size_t index) { - *stg_info = task_stage_info_null; + *stg_info = {}; if (index >= 0 && index < TASK_STAGE_STAGE_COUNT) { stg_info->load_index = (int16_t)index; stg_info->load_counter = a1->stages[index].counter; @@ -325,7 +337,7 @@ static void stage_detail::TaskStage_Unload(stage_detail::TaskStage* a1) { } else if (a1->state == 5 || a1->state == 6) { if (a1->state == 6) - stage_detail::TaskStage_SetStage(a1, task_stage_info_null); + stage_detail::TaskStage_SetStage(a1, {}); for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) stage_free(&a1->stages[i]); @@ -364,7 +376,7 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* float_t radius = sphere->radius; shadow* shad = rctx_ptr->draw_pass.shadow_ptr; - float_t v9 = shad->field_170 * shad->field_174; + float_t v9 = shad->view_region * shad->range; if ((center.x + radius) < -v9 || (center.x - radius) > v9 || (center.y + radius) < -v9 @@ -401,6 +413,7 @@ static bool stage_ctrl(stage* s) { for (int32_t& i : s->auth_3d_ids) { auth_3d_data_set_enable(&i, true); + auth_3d_data_set_paused(&i, false); auth_3d_data_set_visibility(&i, s->effect_display); auth_3d_data_set_frame_rate(&i, 0); } @@ -569,17 +582,6 @@ static void stage_load(stage* s) { rctx_ptr->post_process.movie_texture_set( texture_storage_get_texture(s->stage_data->movie_texture)); s->state = 6; - - data_struct* data = rctx_ptr->data; - auth_3d_database* auth_3d_db = &data->data_ft.auth_3d_db; - for (int32_t& i : s->stage_data->auth_3d_ids) { - int32_t id = auth_3d_data_load_uid(i, auth_3d_db); - if (id == -1) - continue; - - auth_3d_data_read_file(&id, auth_3d_db); - s->auth_3d_ids.push_back(id); - } } } @@ -806,6 +808,11 @@ void stage_detail::TaskStage::Disp() { stage_disp(s); } +task_stage_info::task_stage_info() { + load_index = -1; + load_counter = 0; +} + DtmStg::DtmStg() : stage_index(), load_stage_index() { } diff --git a/src/CRE/stage.hpp b/src/CRE/stage.hpp index c9978649..ce0f0f38 100644 --- a/src/CRE/stage.hpp +++ b/src/CRE/stage.hpp @@ -64,6 +64,8 @@ namespace stage_detail { struct task_stage_info { int16_t load_index; uint16_t load_counter; + + task_stage_info(); }; class DtmStg : public Task { diff --git a/src/CRE/stage_modern.cpp b/src/CRE/stage_modern.cpp index 56c74a07..bcdd9323 100644 --- a/src/CRE/stage_modern.cpp +++ b/src/CRE/stage_modern.cpp @@ -50,8 +50,6 @@ static void task_stage_modern_set_ground(task_stage_modern_info* stg_info, bool static void task_stage_modern_set_sky(task_stage_modern_info* stg_info, bool value); static void task_stage_modern_set_stage_display(task_stage_modern_info* stg_info, bool value); -const task_stage_modern_info task_stage_modern_info_null = { -1, 0 }; - stage_detail::TaskStageModern task_stage_modern; extern render_context* rctx_ptr; @@ -208,12 +206,28 @@ static void stage_detail::TaskStageModern_CtrlInner(stage_detail::TaskStageModer else if (a1->state == 5/* && !sub_1403446E0()*/) { std::vector vec; stage_detail::TaskStageModern_GetLoadedStageInfos(a1, &vec); - if (vec.size()) + if (vec.size()) { stage_detail::TaskStageModern_SetStage(a1, vec[0]); + + stage_modern* s = stage_detail::TaskStageModern_GetStage(a1, vec[0]); + for (uint32_t& i : s->stage_data->auth_3d_ids) { + int32_t id = auth_3d_data_load_hash(i, s->stage_data->auth_3d_name_hash, + s->stage_data->auth_3d_name.c_str(), a1->data, a1->obj_db, a1->tex_db); + if (id == -1) + continue; + + auth_3d_data_read_file_modern(&id); + auth_3d_data_set_enable(&id, true); + auth_3d_data_set_paused(&id, false); + auth_3d_data_set_frame_rate(&id, 0); + s->auth_3d_ids.push_back(id); + } + } a1->state = 6; } - else if (a1->state >= 7 && a1->state <= 9) + else if (a1->state >= 7 && a1->state <= 9) { stage_detail::TaskStageModern_Unload(a1); + } } static void stage_detail::TaskStageModern_DispShadow(stage_detail::TaskStageModern* a1) { @@ -240,7 +254,7 @@ static stage_modern* stage_detail::TaskStageModern_GetStage(stage_detail::TaskSt static void stage_detail::TaskStageModern_GetTaskStageModernInfo(stage_detail::TaskStageModern* a1, task_stage_modern_info* stg_info, size_t index) { - *stg_info = task_stage_modern_info_null; + *stg_info = {}; if (index >= 0 && index < TASK_STAGE_STAGE_COUNT) { stg_info->load_index = (int16_t)index; stg_info->load_counter = a1->stages[index].counter; @@ -317,7 +331,7 @@ static void stage_detail::TaskStageModern_Unload(stage_detail::TaskStageModern* } else if (a1->state == 5 || a1->state == 6) { if (a1->state == 6) - stage_detail::TaskStageModern_SetStage(a1, task_stage_modern_info_null); + stage_detail::TaskStageModern_SetStage(a1, {}); for (int32_t i = 0; i < TASK_STAGE_STAGE_COUNT; i++) stage_modern_free(&a1->stages[i]); @@ -356,7 +370,7 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* float_t radius = sphere->radius; shadow* shad = rctx_ptr->draw_pass.shadow_ptr; - float_t v9 = shad->field_170 * shad->field_174; + float_t v9 = shad->view_region * shad->range; if ((center.x + radius) < -v9 || (center.x - radius) > v9 || (center.y + radius) < -v9 @@ -539,18 +553,6 @@ static void stage_modern_load(stage_modern* s, void* data, object_database* obj_ rctx_ptr->post_process.movie_texture_set( texture_storage_get_texture(s->stage_data->movie_texture)); s->state = 6; - - for (uint32_t& i : s->stage_data->auth_3d_ids) { - int32_t id = auth_3d_data_load_hash(i, s->stage_data->auth_3d_name_hash, - s->stage_data->auth_3d_name.c_str(), data, obj_db, tex_db); - if (id == -1) - continue; - - auth_3d_data_read_file_modern(&id); - auth_3d_data_set_enable(&id, true); - auth_3d_data_set_frame_rate(&id, 0); - s->auth_3d_ids.push_back(id); - } } } @@ -731,3 +733,8 @@ void stage_detail::TaskStageModern::Disp() { if (s) stage_modern_disp(s); } + +task_stage_modern_info::task_stage_modern_info() { + load_index = -1; + load_counter = 0; +} diff --git a/src/CRE/stage_modern.hpp b/src/CRE/stage_modern.hpp index e9e270b1..aff5c41e 100644 --- a/src/CRE/stage_modern.hpp +++ b/src/CRE/stage_modern.hpp @@ -68,6 +68,8 @@ namespace stage_detail { struct task_stage_modern_info { int16_t load_index; uint16_t load_counter; + + task_stage_modern_info(); }; extern bool task_stage_modern_check_not_loaded(); diff --git a/src/CRE/texture.cpp b/src/CRE/texture.cpp index 7fdf47b5..ed211422 100644 --- a/src/CRE/texture.cpp +++ b/src/CRE/texture.cpp @@ -200,7 +200,7 @@ inline texture* texture_storage_create_texture(texture_id id) { return i; } - texture* tex = new texture();; + texture* tex = new texture(); tex->init_count = 1; tex->id = id; texture_storage.push_back(tex); diff --git a/src/DivaGL/bone_data.c b/src/DivaGL/bone_data.c index 6ae0ec6e..958b1b72 100644 --- a/src/DivaGL/bone_data.c +++ b/src/DivaGL/bone_data.c @@ -1821,7 +1821,7 @@ static void sub_140505C90(struc_264* a1) { a1->field_94 = 0; a1->field_98 = 0; a1->field_9C = 0; - a1->field_A0 = 0;; + a1->field_A0 = 0; a1->field_A4 = 0; a1->field_A5 = 0; a1->field_A8 = 0; diff --git a/src/KKdLib/a3da.cpp b/src/KKdLib/a3da.cpp index 8bf7eb2a..8801d2eb 100644 --- a/src/KKdLib/a3da.cpp +++ b/src/KKdLib/a3da.cpp @@ -2744,7 +2744,7 @@ static void key_val_write_a3da_key(stream* s, char* buf, } if (value.type == A3DA_KEY_NONE) { - key_val::write_int32_t(s, buf, offset, ".type", 6, 0);; + key_val::write_int32_t(s, buf, offset, ".type", 6, 0); return; } else if (value.type == A3DA_KEY_STATIC) { diff --git a/src/KKdLib/database/bone.cpp b/src/KKdLib/database/bone.cpp index 7ec08bd7..95ad04b0 100644 --- a/src/KKdLib/database/bone.cpp +++ b/src/KKdLib/database/bone.cpp @@ -920,13 +920,13 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s if (!is_x) { uint32_t pos; ee = { 0, 1, 16, 1 }; - ee.sub.push_back({ 0, 4, ENRS_DWORD }); + ee.append(0, 4, ENRS_DWORD); e.vec.push_back(ee); pos = off = 16; skeleton_count *= 2; ee = { off, 1, (uint32_t)(skeleton_count * 4ULL), 1 }; - ee.sub.push_back({ 0, skeleton_count, ENRS_DWORD }); + ee.append(0, skeleton_count, ENRS_DWORD); e.vec.push_back(ee); pos += off = (uint32_t)(skeleton_count * 4ULL); skeleton_count /= 2; @@ -940,7 +940,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); ee = { off, 1, 56, 1 }; - ee.sub.push_back({ 0, 14, ENRS_DWORD }); + ee.append(0, 14, ENRS_DWORD); e.vec.push_back(ee); pos += off = 56; @@ -948,7 +948,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s off += 8; pos += 8; ee = { off, 1, 12, bone_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(bone_count * 12ULL); if (pos + off % 0x10) @@ -957,25 +957,25 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s bone_count--; ee = { off, 1, 12, position_count }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(position_count * 12ULL); pos += off = align_val(off, 0x10); ee = { off, 1, 4, 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); pos += off = 4; object_bone_count += motion_bone_count; ee = { off, 1, (uint32_t)(object_bone_count * 4ULL), 1 }; - ee.sub.push_back({ 0, object_bone_count, ENRS_DWORD }); + ee.append(0, object_bone_count, ENRS_DWORD); e.vec.push_back(ee); pos += off = (uint32_t)(object_bone_count * 4ULL); object_bone_count -= motion_bone_count; ee = { off, 1, (uint32_t)(motion_bone_count * 2ULL), 1 }; - ee.sub.push_back({ 0, motion_bone_count, ENRS_WORD }); + ee.append(0, motion_bone_count, ENRS_WORD); e.vec.push_back(ee); off = (uint32_t)(motion_bone_count * 2ULL); pos += off = align_val(off, 0x04); @@ -983,21 +983,21 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } else { ee = { 0, 2, 24, 1 }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); - ee.sub.push_back({ 0, 2, ENRS_QWORD }); + ee.append(0, 2, ENRS_DWORD); + ee.append(0, 2, ENRS_QWORD); e.vec.push_back(ee); off = 24; off = align_val(off, 0x10); if (skeleton_count % 2) { ee = { off, 1, (uint32_t)(skeleton_count * 8ULL), 1 }; - ee.sub.push_back({ 0, skeleton_count, ENRS_QWORD }); + ee.append(0, skeleton_count, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(skeleton_count * 8ULL); off = align_val(off, 0x10); ee = { off, 1, (uint32_t)(skeleton_count * 8ULL), 1 }; - ee.sub.push_back({ 0, skeleton_count, ENRS_QWORD }); + ee.append(0, skeleton_count, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(skeleton_count * 8ULL); off = align_val(off, 0x10); @@ -1005,7 +1005,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s else { skeleton_count *= 2; ee = { off, 1, (uint32_t)(skeleton_count * 8ULL), 1 }; - ee.sub.push_back({ 0, skeleton_count, ENRS_QWORD }); + ee.append(0, skeleton_count, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(skeleton_count * 8ULL); off = align_val(off, 0x10); @@ -1013,13 +1013,13 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } ee = { off, 7, 112, skeleton_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 7, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 7, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(skeleton_count * 112ULL); off = align_val(off, 0x10); @@ -1035,26 +1035,26 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s bone_count++; off += 8; ee = { off, 1, 16, bone_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(bone_count * 16ULL); bone_count--; ee = { off, 1, 12, position_count }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(position_count * 12ULL); off = align_val(off, 0x10); ee = { off, 1, 4, 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = 4; off = align_val(off, 0x10); if (object_bone_count % 1) { ee = { off, 1, 12, position_count }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(position_count * 12ULL); off = align_val(off, 0x10); @@ -1062,13 +1062,13 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s if (skeleton_count % 2) { ee = { off, 1, (uint32_t)(object_bone_count * 8ULL), 1 }; - ee.sub.push_back({ 0, object_bone_count, ENRS_QWORD }); + ee.append(0, object_bone_count, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(object_bone_count * 8ULL); off = align_val(off, 0x10); ee = { off, 1, (uint32_t)(motion_bone_count * 8ULL), 1 }; - ee.sub.push_back({ 0, motion_bone_count, ENRS_QWORD }); + ee.append(0, motion_bone_count, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(motion_bone_count * 8ULL); off = align_val(off, 0x10); @@ -1076,7 +1076,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s else { object_bone_count += motion_bone_count; ee = { off, 1, (uint32_t)(object_bone_count * 8ULL), 1 }; - ee.sub.push_back({ 0, object_bone_count, ENRS_QWORD }); + ee.append(0, object_bone_count, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(object_bone_count * 8ULL); off = align_val(off, 0x10); @@ -1084,7 +1084,7 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } ee = { off, 1, (uint32_t)(motion_bone_count * 2ULL), 1 }; - ee.sub.push_back({ 0, motion_bone_count, ENRS_WORD }); + ee.append(0, motion_bone_count, ENRS_WORD); e.vec.push_back(ee); off = (uint32_t)(motion_bone_count * 2ULL); off = align_val(off, 0x10); diff --git a/src/KKdLib/database/item_table.cpp b/src/KKdLib/database/item_table.cpp index c2a2b665..e0492b34 100644 --- a/src/KKdLib/database/item_table.cpp +++ b/src/KKdLib/database/item_table.cpp @@ -117,27 +117,6 @@ bool itm_table::load_file(void* data, const char* path, const char* file, uint32 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; @@ -159,6 +138,69 @@ const char* chara_index_get_auth_3d_name(chara_index chara_index) { return chara_names[chara_index]; } +const char* chara_index_get_chara_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]; +} + +const char* chara_index_get_face_mot_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]; +} + +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]; +} + itm_table_item_data_tex::itm_table_item_data_tex() { } diff --git a/src/KKdLib/database/item_table.hpp b/src/KKdLib/database/item_table.hpp index 55bf13c7..f0b5cd3d 100644 --- a/src/KKdLib/database/item_table.hpp +++ b/src/KKdLib/database/item_table.hpp @@ -193,5 +193,7 @@ struct itm_table { 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); +extern const char* chara_index_get_chara_name(chara_index chara_index); +extern const char* chara_index_get_face_mot_name(chara_index chara_index); +extern const char* chara_index_get_name(chara_index chara_index); diff --git a/src/KKdLib/database/object.cpp b/src/KKdLib/database/object.cpp index 214163d5..759118f5 100644 --- a/src/KKdLib/database/object.cpp +++ b/src/KKdLib/database/object.cpp @@ -667,42 +667,42 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* if (!is_x) { ee = { 0, 1, 1, 1 }; - ee.sub.push_back({ 0, 6, ENRS_DWORD }); + ee.append(0, 6, ENRS_DWORD); e.vec.push_back(ee); off = 32; ee = { off, 1, 36, object_set_count }; - ee.sub.push_back({ 0, 5, ENRS_DWORD }); + ee.append(0, 5, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(object_set_count * 36ULL); off = align_val(off, 0x10); ee = { off, 1, 12, object_count }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(object_count * 12ULL); off = align_val(off, 0x10); } else { ee = { 0, 4, 48, 1 }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); + ee.append(0, 3, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); e.vec.push_back(ee); off = 48; ee = { off, 3, 56, object_set_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 3, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 3, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(object_set_count * 56ULL); off = align_val(off, 0x10); ee = { off, 2, 16, object_count }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); + ee.append(0, 2, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(object_count * 16ULL); off = align_val(off, 0x10); diff --git a/src/KKdLib/database/texture.cpp b/src/KKdLib/database/texture.cpp index 9d67fc2a..7776745c 100644 --- a/src/KKdLib/database/texture.cpp +++ b/src/KKdLib/database/texture.cpp @@ -383,21 +383,21 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream if (!is_x) { ee = { 0, 2, 8, textures_count }; - ee.sub.push_back({ 0, 9, ENRS_DWORD }); + ee.append(0, 9, ENRS_DWORD); e.vec.push_back(ee); off = 8; off = align_val(off, 0x10); ee = { off, 2, 8, textures_count }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(textures_count * 16ULL); } else { textures_count++; ee = { 0, 2, 16, textures_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(textures_count * 16ULL); textures_count--; diff --git a/src/KKdLib/dsc.cpp b/src/KKdLib/dsc.cpp index ea384e21..b1d4999b 100644 --- a/src/KKdLib/dsc.cpp +++ b/src/KKdLib/dsc.cpp @@ -2907,7 +2907,7 @@ void dsc::unparse(void** data, size_t* size) { enrs_entry ee; ee = { 0, 1, 4, (uint32_t)s }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); st.enrs = e; diff --git a/src/KKdLib/f2/enrs.cpp b/src/KKdLib/f2/enrs.cpp index db6907c5..1370bce5 100644 --- a/src/KKdLib/f2/enrs.cpp +++ b/src/KKdLib/f2/enrs.cpp @@ -34,6 +34,14 @@ enrs_entry::~enrs_entry() { } +void enrs_entry::append(uint32_t skip_bytes, uint32_t repeat_count, enrs_type type) { + sub.push_back({ skip_bytes, repeat_count, type }); +} + +void enrs_entry::append(enrs_sub_entry&& data) { + sub.push_back(data); +} + enrs::enrs() { } diff --git a/src/KKdLib/f2/enrs.hpp b/src/KKdLib/f2/enrs.hpp index 864f8229..b5c6a5e2 100644 --- a/src/KKdLib/f2/enrs.hpp +++ b/src/KKdLib/f2/enrs.hpp @@ -32,6 +32,9 @@ struct enrs_entry { enrs_entry(); enrs_entry(uint32_t offset, uint32_t count, uint32_t size, uint32_t repeat_count); ~enrs_entry(); + + void append(uint32_t skip_bytes, uint32_t repeat_count, enrs_type type); + void append(enrs_sub_entry&& data); }; struct enrs { diff --git a/src/KKdLib/f2/struct.cpp b/src/KKdLib/f2/struct.cpp index 852f745f..87038fbf 100644 --- a/src/KKdLib/f2/struct.cpp +++ b/src/KKdLib/f2/struct.cpp @@ -187,7 +187,7 @@ static void f2_struct_read_data(stream* s, f2_struct* st, f2_header* h) { st->enrs.read(s); io_set_position(s, pos + l, SEEK_SET); } - else if ((sig & 0xF0FFFFFF) == 'POF0') { + else if ((sig & 0xFFFFFFF0) == 'POF0') { size_t pos = io_get_position(s); st->pof.read(s, sig == 'POF1'); io_set_position(s, pos + l, SEEK_SET); diff --git a/src/KKdLib/key_val.cpp b/src/KKdLib/key_val.cpp index cf706167..1e0630a9 100644 --- a/src/KKdLib/key_val.cpp +++ b/src/KKdLib/key_val.cpp @@ -327,14 +327,11 @@ 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); + std::string s = path + std::string(file); key_val* kv = (key_val*)data; - kv->file_read(string_data(&s)); + kv->file_read(s.c_str()); - string_free(&s); return kv->buf ? true : false; } diff --git a/src/KKdLib/light_param/wind.cpp b/src/KKdLib/light_param/wind.cpp index fc60f91a..33ba316a 100644 --- a/src/KKdLib/light_param/wind.cpp +++ b/src/KKdLib/light_param/wind.cpp @@ -98,14 +98,11 @@ bool light_param_wind::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_wind* wind = (light_param_wind*)data; - wind->read(string_data(&s)); + wind->read(s.c_str()); - string_free(&s); return wind->ready; } diff --git a/src/KKdLib/mat.h b/src/KKdLib/mat.h index 54126b58..7908aaa4 100644 --- a/src/KKdLib/mat.h +++ b/src/KKdLib/mat.h @@ -138,7 +138,7 @@ extern void mat4_scale_x_mult(const mat4* x, float_t y, mat4* z); extern void mat4_scale_y_mult(const mat4* x, float_t y, mat4* z); extern void mat4_scale_z_mult(const mat4* x, float_t y, mat4* z); extern void mat4_scale_w_mult(const mat4* x, float_t y, mat4* z); -extern void mat4_scale_rot(const mat4* s, float_t x, float_t y, float_t z, mat4* d);; +extern void mat4_scale_rot(const mat4* s, float_t x, float_t y, float_t z, mat4* d); extern void mat4_scale_x_rot(const mat4* x, float_t y, mat4* z); extern void mat4_scale_y_rot(const mat4* x, float_t y, mat4* z); extern void mat4_scale_z_rot(const mat4* x, float_t y, mat4* z); diff --git a/src/KKdLib/mot.cpp b/src/KKdLib/mot.cpp index 0875b39f..f064ffa7 100644 --- a/src/KKdLib/mot.cpp +++ b/src/KKdLib/mot.cpp @@ -308,8 +308,8 @@ static void mot_modern_read_inner(mot_set* ms, stream* s) { } mot_data* m = &ms->vec[0]; - m->div_frames = io_read_uint16_t_stream_reverse_endianness(&s_motc);; - m->div_count = io_read_uint8_t(&s_motc);; + m->div_frames = io_read_uint16_t_stream_reverse_endianness(&s_motc); + m->div_count = io_read_uint8_t(&s_motc); io_read_string_null_terminated_offset(&s_motc, mh.name_offset, &m->name); @@ -414,28 +414,28 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { if (!ms->is_x) { ee = { 0, 3, 48, 1 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 7, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 7, ENRS_DWORD); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); o = 48; } else { ee = { 0, 3, 64, 1 }; - ee.sub.push_back({ 0, 7, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 7, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); o = 64; }; ee = { o, 1, 4, 1 }; - ee.sub.push_back({ 0, 2, ENRS_WORD }); + ee.append(0, 2, ENRS_WORD); e.vec.push_back(ee); o = 4; ee = { o, 1, (uint32_t)((m->key_set_count + 3ULL) / 4), 1 }; - ee.sub.push_back({ 0, (uint32_t)((m->key_set_count + 7ULL) / 8), ENRS_WORD }); + ee.append(0, (uint32_t)((m->key_set_count + 7ULL) / 8), ENRS_WORD); e.vec.push_back(ee); o = (m->key_set_count + 3) / 4; o = align_val(o, 4); @@ -444,7 +444,7 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { mot_key_set_data* mks = &m->key_set[j]; if (mks->type == MOT_KEY_SET_STATIC) { ee = { o, 1, 4, 1 }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); o = 4; } @@ -469,16 +469,16 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { o = align_val(o, 4); ee.size = o; - ee.sub.push_back({ 0, 2, ENRS_WORD }); + ee.append(0, 2, ENRS_WORD); if (has_tangents) - ee.sub.push_back({ 0, keys_count, ENRS_DWORD }); + ee.append(0, keys_count, ENRS_DWORD); if (data_type == MOT_KEY_SET_DATA_F16) { - ee.sub.push_back({ 0, keys_count, ENRS_WORD }); - ee.sub.push_back({ keys_count % 2 == 1 ? 2u : 0u, keys_count, ENRS_WORD }); + ee.append(0, keys_count, ENRS_WORD); + ee.append(keys_count % 2 == 1 ? 2u : 0u, keys_count, ENRS_WORD); } else { - ee.sub.push_back({ 0, keys_count, ENRS_DWORD }); - ee.sub.push_back({ 0, keys_count, ENRS_WORD }); + ee.append(0, keys_count, ENRS_DWORD); + ee.append(0, keys_count, ENRS_WORD); } e.vec.push_back(ee); } @@ -487,20 +487,20 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { if (!ms->is_x) { ee = { o, 1, (uint32_t)(m->bone_info_count * 4ULL), 1 }; - ee.sub.push_back({ 0, (uint32_t)m->bone_info_count, ENRS_DWORD }); + ee.append(0, (uint32_t)m->bone_info_count, ENRS_DWORD); e.vec.push_back(ee); o = m->bone_info_count * 4; } else { ee = { o, 1, (uint32_t)(m->bone_info_count * 8ULL), 1 }; - ee.sub.push_back({ 0, (uint32_t)m->bone_info_count, ENRS_QWORD }); + ee.append(0, (uint32_t)m->bone_info_count, ENRS_QWORD); e.vec.push_back(ee); o = m->bone_info_count * 8; } o = align_val(o, 16); ee = { o, 1,(uint32_t)(m->bone_info_count * 8ULL), 1 }; - ee.sub.push_back({ 0, (uint32_t)m->bone_info_count, ENRS_QWORD }); + ee.append(0, (uint32_t)m->bone_info_count, ENRS_QWORD); e.vec.push_back(ee); o = m->bone_info_count * 8; diff --git a/src/KKdLib/msgpack.cpp b/src/KKdLib/msgpack.cpp index 164f3cb6..5525752f 100644 --- a/src/KKdLib/msgpack.cpp +++ b/src/KKdLib/msgpack.cpp @@ -16,7 +16,7 @@ msgpack::msgpack() : data() { type = MSGPACK_NULL; } -msgpack::msgpack(const msgpack& m) : msgpack() { +msgpack::msgpack(const msgpack& m) { if (this == &m) return; @@ -105,7 +105,7 @@ msgpack::msgpack(const msgpack& m) : msgpack() { name = m.name; } -msgpack::msgpack(const char* name, bool array, size_t length) : msgpack() { +msgpack::msgpack(const char* name, bool array, size_t length) { type = array ? MSGPACK_ARRAY : MSGPACK_MAP; MSGPACK_ALLOCATE_PTR(msgpack_array, this); if (name) @@ -116,7 +116,7 @@ msgpack::msgpack(const char* name, bool array, size_t length) : msgpack() { ptr->resize(length); } -msgpack::msgpack(const char* name, bool array, msgpack_array& val) : msgpack() { +msgpack::msgpack(const char* name, bool array, msgpack_array& val) { type = array ? MSGPACK_ARRAY : MSGPACK_MAP; MSGPACK_ALLOCATE_PTR(msgpack_array, this); if (name) @@ -126,13 +126,13 @@ msgpack::msgpack(const char* name, bool array, msgpack_array& val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name) : msgpack() { +msgpack::msgpack(const char* name) { type = MSGPACK_NULL; if (name) this->name = std::string(name); } -msgpack::msgpack(const char* name, bool val) : msgpack() { +msgpack::msgpack(const char* name, bool val) { type = MSGPACK_BOOL; MSGPACK_ALLOCATE_PTR(bool, this); if (name) @@ -142,7 +142,7 @@ msgpack::msgpack(const char* name, bool val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, int8_t val) : msgpack() { +msgpack::msgpack(const char* name, int8_t val) { type = MSGPACK_INT8; MSGPACK_ALLOCATE_PTR(int8_t, this); if (name) @@ -152,7 +152,7 @@ msgpack::msgpack(const char* name, int8_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, uint8_t val) : msgpack() { +msgpack::msgpack(const char* name, uint8_t val) { type = MSGPACK_UINT8; MSGPACK_ALLOCATE_PTR(uint8_t, this); if (name) @@ -162,7 +162,7 @@ msgpack::msgpack(const char* name, uint8_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, int16_t val) : msgpack() { +msgpack::msgpack(const char* name, int16_t val) { type = MSGPACK_INT16; MSGPACK_ALLOCATE_PTR(int16_t, this); if (name) @@ -172,7 +172,7 @@ msgpack::msgpack(const char* name, int16_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, uint16_t val) : msgpack() { +msgpack::msgpack(const char* name, uint16_t val) { type = MSGPACK_UINT16; MSGPACK_ALLOCATE_PTR(uint16_t, this); if (name) @@ -182,7 +182,7 @@ msgpack::msgpack(const char* name, uint16_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, int32_t val) : msgpack() { +msgpack::msgpack(const char* name, int32_t val) { type = MSGPACK_INT32; MSGPACK_ALLOCATE_PTR(int32_t, this); if (name) @@ -192,7 +192,7 @@ msgpack::msgpack(const char* name, int32_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, uint32_t val) : msgpack() { +msgpack::msgpack(const char* name, uint32_t val) { type = MSGPACK_UINT32; MSGPACK_ALLOCATE_PTR(uint32_t, this); if (name) @@ -202,7 +202,7 @@ msgpack::msgpack(const char* name, uint32_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, int64_t val) : msgpack() { +msgpack::msgpack(const char* name, int64_t val) { type = MSGPACK_INT64; MSGPACK_ALLOCATE_PTR(int64_t, this); if (name) @@ -212,7 +212,7 @@ msgpack::msgpack(const char* name, int64_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, uint64_t val) : msgpack() { +msgpack::msgpack(const char* name, uint64_t val) { type = MSGPACK_UINT64; MSGPACK_ALLOCATE_PTR(uint64_t, this); if (name) @@ -222,7 +222,7 @@ msgpack::msgpack(const char* name, uint64_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, float_t val) : msgpack() { +msgpack::msgpack(const char* name, float_t val) { type = MSGPACK_FLOAT; MSGPACK_ALLOCATE_PTR(float_t, this); if (name) @@ -232,7 +232,7 @@ msgpack::msgpack(const char* name, float_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, double_t val) : msgpack() { +msgpack::msgpack(const char* name, double_t val) { type = MSGPACK_DOUBLE; MSGPACK_ALLOCATE_PTR(double_t, this); if (name) @@ -242,7 +242,7 @@ msgpack::msgpack(const char* name, double_t val) : msgpack() { *ptr = val; } -msgpack::msgpack(const char* name, const char* val) : msgpack() { +msgpack::msgpack(const char* name, const char* val) { type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); if (name) @@ -253,7 +253,7 @@ msgpack::msgpack(const char* name, const char* val) : msgpack() { *ptr = std::string(val); } -msgpack::msgpack(const char* name, const wchar_t* val) : msgpack() { +msgpack::msgpack(const char* name, const wchar_t* val) { char* temp = utf16_to_utf8(val); type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); @@ -266,7 +266,7 @@ msgpack::msgpack(const char* name, const wchar_t* val) : msgpack() { free(temp); } -msgpack::msgpack(const char* name, string* val) : msgpack() { +msgpack::msgpack(const char* name, string* val) { type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); if (name) @@ -277,7 +277,7 @@ msgpack::msgpack(const char* name, string* val) : msgpack() { *ptr = std::string(string_data(val), val->length); } -msgpack::msgpack(const char* name, std::string* val) : msgpack() { +msgpack::msgpack(const char* name, std::string* val) { type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); if (name) @@ -288,7 +288,7 @@ msgpack::msgpack(const char* name, std::string* val) : msgpack() { *ptr = *val; } -msgpack::msgpack(const char* name, wstring* val) : msgpack() { +msgpack::msgpack(const char* name, wstring* val) { char* temp = utf16_to_utf8(wstring_data(val)); type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); @@ -301,7 +301,7 @@ msgpack::msgpack(const char* name, wstring* val) : msgpack() { free(temp) } -msgpack::msgpack(const char* name, std::wstring* val) : msgpack() { +msgpack::msgpack(const char* name, std::wstring* val) { char* temp = utf16_to_utf8(val->c_str()); type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); diff --git a/src/KKdLib/obj.cpp b/src/KKdLib/obj.cpp index 8fb4e75e..fb83056c 100644 --- a/src/KKdLib/obj.cpp +++ b/src/KKdLib/obj.cpp @@ -13,21 +13,21 @@ #include "sort.hpp" #include "str_utils.h" -enum obj_vertex_attrib_type { - OBJ_VERTEX_ATTRIB_POSITION = 0x00000001, - OBJ_VERTEX_ATTRIB_NORMAL = 0x00000002, - OBJ_VERTEX_ATTRIB_TANGENT = 0x00000004, - OBJ_VERTEX_ATTRIB_BINORMAL = 0x00000008, - OBJ_VERTEX_ATTRIB_TEXCOORD0 = 0x00000010, - OBJ_VERTEX_ATTRIB_TEXCOORD1 = 0x00000020, - OBJ_VERTEX_ATTRIB_TEXCOORD2 = 0x00000040, - OBJ_VERTEX_ATTRIB_TEXCOORD3 = 0x00000080, - OBJ_VERTEX_ATTRIB_COLOR0 = 0x00000100, - OBJ_VERTEX_ATTRIB_COLOR1 = 0x00000200, - OBJ_VERTEX_ATTRIB_BONE_WEIGHT = 0x00000400, - OBJ_VERTEX_ATTRIB_BONE_INDEX = 0x00000800, - OBJ_VERTEX_ATTRIB_UNKNOWN = 0x00001000, - OBJ_VERTEX_ATTRIB_MODERN_STORAGE = 0x80000000, +enum obj_vertex_format_file { + OBJ_VERTEX_FORMAT_FILE_POSITION = 0x00000001, + OBJ_VERTEX_FORMAT_FILE_NORMAL = 0x00000002, + OBJ_VERTEX_FORMAT_FILE_TANGENT = 0x00000004, + OBJ_VERTEX_FORMAT_FILE_BINORMAL = 0x00000008, + OBJ_VERTEX_FORMAT_FILE_TEXCOORD0 = 0x00000010, + OBJ_VERTEX_FORMAT_FILE_TEXCOORD1 = 0x00000020, + OBJ_VERTEX_FORMAT_FILE_TEXCOORD2 = 0x00000040, + OBJ_VERTEX_FORMAT_FILE_TEXCOORD3 = 0x00000080, + OBJ_VERTEX_FORMAT_FILE_COLOR0 = 0x00000100, + OBJ_VERTEX_FORMAT_FILE_COLOR1 = 0x00000200, + OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT = 0x00000400, + OBJ_VERTEX_FORMAT_FILE_BONE_INDEX = 0x00000800, + OBJ_VERTEX_FORMAT_FILE_UNKNOWN = 0x00001000, + OBJ_VERTEX_FORMAT_FILE_MODERN_STORAGE = 0x80000000, }; struct obj_skin_block_header { @@ -60,26 +60,26 @@ struct obj_sub_mesh_header { }; struct obj_mesh_header { - int64_t sub_meshes_offset; - obj_vertex_attrib_type attrib_type; - uint32_t vertex_size; - uint32_t vertex_count; - int64_t attrib_offsets[20]; - uint32_t attrib_flags; + int64_t submesh_array; + obj_vertex_format_file format; + uint32_t size_vertex; + uint32_t num_vertex; + int64_t vertex_array[20]; + uint32_t vertex_flags; }; struct obj_header { - int64_t meshes_offset; - int64_t materials_offset; + int64_t mesh_array; + int64_t material_array; }; struct obj_set_header { - int32_t max_object_id; - int64_t objects_offset; - int64_t object_skins_offset; - int64_t object_names_offset; - int64_t object_ids_offset; - int64_t texture_ids_offset; + int32_t last_obj_id; + int64_t obj_data; + int64_t obj_skin_data; + int64_t obj_name_data; + int64_t obj_id_data; + int64_t tex_id_data; }; const char obj_material_texture_enrs_table_bin[] = @@ -166,10 +166,10 @@ 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, 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_classic_read_vertex(obj* obj, stream* s, int64_t* vertex_array, obj_mesh* mesh, + int64_t base_offset, uint32_t num_vertex, obj_vertex_format_file vertex_format_file); +static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* vertex_array, obj_mesh* mesh, + int64_t base_offset, uint32_t* num_vertex, obj_vertex_format_file* vertex_format_file, uint32_t* size_vertex); 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, @@ -228,11 +228,11 @@ 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, 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_read_vertex(obj* obj, stream* s, int64_t* vertex_array, obj_mesh* mesh, + const uint32_t attrib_flags, uint32_t num_vertex, uint32_t size_vertex); static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, - int64_t* attrib_offsets, obj_mesh* mesh, uint32_t* attrib_flags, - uint32_t* vertex_count, uint32_t* vertex_size, f2_struct* ovtx); + int64_t* vertex_array, obj_mesh* mesh, uint32_t* attrib_flags, + uint32_t* num_vertex, uint32_t* size_vertex, f2_struct* ovtx); static void obj_skin_block_node_free(obj_skin_block_node* b); 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, @@ -243,14 +243,36 @@ static void obj_skin_strings_push_back_check(std::vector& vec, cons 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() { +obj_material_shader_lighting_type obj_material_shader_attrib::get_lighting_type() { + if (!m.is_lgt_diffuse && !m.is_lgt_specular) + return OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT; + else if (!m.is_lgt_specular) + return OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT; + else + return OBJ_MATERIAL_SHADER_LIGHTING_PHONG; +} + +int32_t obj_texture_attrib::get_blend() { + switch (m.blend) { + case 4: + return 2; + case 6: + return 1; + case 16: + return 3; + default: + return 0; + } +} + +obj_set::obj_set() : ready(), modern(), is_x(), obj_data(), +obj_num(), tex_id_data(), tex_id_num(), reserved() { } obj_set::~obj_set() { - for (uint32_t i = 0; i < objects_count; i++) { - obj* obj = &objects[i]; + for (uint32_t i = 0; i < obj_num; i++) { + obj* obj = &obj_data[i]; for (uint32_t j = 0; j < obj->skin.bones_count; j++) string_free(&obj->skin.bones[j].name); free(obj->skin.bones); @@ -305,24 +327,24 @@ obj_set::~obj_set() { free(obj->skin.ex_data.bone_names); free(obj->skin.ex_data.osage_sibling_infos); - if (obj->meshes) - for (uint32_t j = 0; j < obj->meshes_count; j++) { - obj_mesh* mesh = &obj->meshes[j]; - if (mesh->sub_meshes) - for (uint32_t k = 0; k < mesh->sub_meshes_count; k++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[k]; + if (obj->mesh_array) + for (uint32_t j = 0; j < obj->num_mesh; j++) { + obj_mesh* mesh = &obj->mesh_array[j]; + if (mesh->submesh_array) + for (uint32_t k = 0; k < mesh->num_submesh; k++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[k]; free(sub_mesh->bone_indices); free(sub_mesh->indices); } free(mesh->vertex); - free(mesh->sub_meshes); + free(mesh->submesh_array); } - free(obj->meshes); - free(obj->materials); + free(obj->mesh_array); + free(obj->material_array); string_free(&obj->name); } - free(objects); - free(texture_ids); + free(obj_data); + free(tex_id_data); } void obj_set::pack_file(void** data, size_t* size) { @@ -372,80 +394,81 @@ static void obj_material_texture_enrs_table_free(void) { } static void obj_set_classic_read_inner(obj_set* os, stream* s) { - uint32_t signature = io_read_uint32_t(s); - if (signature != 0x5062500) { + uint32_t version = io_read_uint32_t(s); + if (version != 0x05062500) { os->is_x = false; os->modern = false; os->ready = false; return; } - obj_set_header osh; - memset(&osh, 0, sizeof(obj_set_header)); - os->objects_count = io_read_int32_t(s); - osh.max_object_id = io_read_int32_t(s); - osh.objects_offset = io_read_int32_t(s); - osh.object_skins_offset = io_read_int32_t(s); - osh.object_names_offset = io_read_int32_t(s); - osh.object_ids_offset = io_read_int32_t(s); - osh.texture_ids_offset = io_read_int32_t(s); - os->texture_ids_count = io_read_int32_t(s); + obj_set_header osh = {}; + os->obj_num = io_read_int32_t(s); + osh.last_obj_id = io_read_int32_t(s); + osh.obj_data = io_read_int32_t(s); + osh.obj_skin_data = io_read_int32_t(s); + osh.obj_name_data = io_read_int32_t(s); + osh.obj_id_data = io_read_int32_t(s); + osh.tex_id_data = io_read_int32_t(s); + os->tex_id_num = io_read_int32_t(s); + os->reserved[0] = io_read_uint32_t(s); + os->reserved[1] = io_read_uint32_t(s); - uint32_t count = os->objects_count; - os->objects = force_malloc_s(obj, os->objects_count); + uint32_t count = os->obj_num; + os->obj_data = force_malloc_s(obj, os->obj_num); - 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); + int32_t* obj_datas = 0; + if (osh.obj_data) { + obj_datas = force_malloc_s(int32_t, count); + io_set_position(s, osh.obj_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - objects_offsets[i] = io_read_int32_t(s); + obj_datas[i] = io_read_int32_t(s); } - int32_t* object_skins_offsets = 0; - if (osh.object_skins_offset) { - object_skins_offsets = force_malloc_s(int32_t, count); - io_set_position(s, osh.object_skins_offset, SEEK_SET); + int32_t* obj_skin_datas = 0; + if (osh.obj_skin_data) { + obj_skin_datas = force_malloc_s(int32_t, count); + io_set_position(s, osh.obj_skin_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - object_skins_offsets[i] = io_read_int32_t(s); + obj_skin_datas[i] = io_read_int32_t(s); } - int32_t* object_names_offsets = 0; - if (osh.object_names_offset) { - object_names_offsets = force_malloc_s(int32_t, count); - io_set_position(s, osh.object_names_offset, SEEK_SET); + int32_t* obj_name_datas = 0; + if (osh.obj_name_data) { + obj_name_datas = force_malloc_s(int32_t, count); + io_set_position(s, osh.obj_name_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - object_names_offsets[i] = io_read_int32_t(s); + obj_name_datas[i] = io_read_int32_t(s); } - if (osh.objects_offset) { + if (osh.obj_data) { 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]); + obj* obj = &os->obj_data[i]; + if (obj_datas[i]) + obj_classic_read_model(obj, s, obj_datas[i]); - if (osh.object_skins_offset && object_skins_offsets[i]) - obj_classic_read_skin(obj, s, object_skins_offsets[i]); + if (osh.obj_skin_data && obj_skin_datas[i]) + obj_classic_read_skin(obj, s, obj_skin_datas[i]); - if (osh.object_names_offset && object_names_offsets[i]) - io_read_string_null_terminated_offset(s, object_names_offsets[i], &obj->name); + if (osh.obj_name_data && obj_name_datas[i]) + io_read_string_null_terminated_offset(s, obj_name_datas[i], &obj->name); } - io_set_position(s, osh.object_ids_offset, SEEK_SET); + io_set_position(s, osh.obj_id_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - os->objects[i].id = io_read_uint32_t(s); + os->obj_data[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 (uint32_t i = 0; i < os->texture_ids_count; i++) - os->texture_ids[i] = io_read_uint32_t(s); + if (osh.tex_id_data) { + os->tex_id_data = force_malloc_s(uint32_t, os->tex_id_num); + io_set_position(s, osh.tex_id_data, SEEK_SET); + for (uint32_t i = 0; i < os->tex_id_num; i++) + os->tex_id_data[i] = io_read_uint32_t(s); } - free(objects_offsets); - free(object_skins_offsets); - free(object_names_offsets); + free(obj_datas); + free(obj_skin_datas); + free(obj_name_datas); os->is_x = false; os->modern = false; @@ -468,92 +491,91 @@ static void obj_set_classic_write_inner(obj_set* os, stream* s) { io_write_int32_t(s, 0); io_align_write(s, 0x10); - obj_set_header osh; - memset(&osh, 0, sizeof(obj_set_header)); - osh.max_object_id = -1; + obj_set_header osh = {}; + osh.last_obj_id = -1; - uint32_t count = os->objects_count; + uint32_t count = os->obj_num; - osh.objects_offset = io_get_position(s); + osh.obj_data = io_get_position(s); 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); + int32_t* obj_datas = force_malloc_s(int32_t, count); 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]); + obj_datas[i] = (int32_t)io_get_position(s); + obj_classic_write_model(&os->obj_data[i], s, obj_datas[i]); } io_align_write(s, 0x10); - io_position_push(s, osh.objects_offset, SEEK_SET); + io_position_push(s, osh.obj_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, (int32_t)objects_offsets[i]); + io_write_int32_t(s, (int32_t)obj_datas[i]); io_position_pop(s); - free(objects_offsets); + free(obj_datas); - osh.object_ids_offset = io_get_position(s); + osh.obj_id_data = io_get_position(s); for (uint32_t i = 0; i < count; i++) { - int32_t object_id = os->objects[i].id; + int32_t object_id = os->obj_data[i].id; io_write_uint32_t(s, object_id); - if (osh.max_object_id < object_id) - osh.max_object_id = object_id; + if (osh.last_obj_id < object_id) + osh.last_obj_id = object_id; } io_align_write(s, 0x10); - int32_t* object_names_offsets = force_malloc_s(int32_t, count); + int32_t* obj_name_datas = force_malloc_s(int32_t, count); 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); + obj_name_datas[i] = (int32_t)io_get_position(s); + io_write_string_null_terminated(s, &os->obj_data[i].name); } io_align_write(s, 0x10); - osh.object_names_offset = io_get_position(s); + osh.obj_name_data = io_get_position(s); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, object_names_offsets[i]); + io_write_int32_t(s, obj_name_datas[i]); io_align_write(s, 0x10); - free(object_names_offsets); + free(obj_name_datas); - osh.texture_ids_offset = io_get_position(s); - for (uint32_t i = 0; i < os->texture_ids_count; i++) - io_write_uint32_t(s, os->texture_ids[i]); + osh.tex_id_data = io_get_position(s); + for (uint32_t i = 0; i < os->tex_id_num; i++) + io_write_uint32_t(s, os->tex_id_data[i]); io_align_write(s, 0x10); - osh.object_skins_offset = io_get_position(s); + osh.obj_skin_data = io_get_position(s); 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); + int32_t* obj_skin_datas = force_malloc_s(int32_t, count); for (uint32_t i = 0; i < count; i++) { - if (!os->objects[i].skin_init) { - object_skins_offsets[i] = 0; + if (!os->obj_data[i].skin_init) { + obj_skin_datas[i] = 0; continue; } - object_skins_offsets[i] = (int32_t)io_get_position(s); - obj_classic_write_skin(&os->objects[i], s, object_skins_offsets[i]); + obj_skin_datas[i] = (int32_t)io_get_position(s); + obj_classic_write_skin(&os->obj_data[i], s, obj_skin_datas[i]); } io_align_write(s, 0x10); - io_position_push(s, osh.object_skins_offset, SEEK_SET); + io_position_push(s, osh.obj_skin_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, object_skins_offsets[i]); + io_write_int32_t(s, obj_skin_datas[i]); io_position_pop(s); - free(object_skins_offsets); + free(obj_skin_datas); io_position_push(s, 0x00, SEEK_SET); - io_write_uint32_t(s, 0x5062500); - io_write_int32_t(s, os->objects_count); - io_write_uint32_t(s, osh.max_object_id); - io_write_int32_t(s, (int32_t)osh.objects_offset); - io_write_int32_t(s, (int32_t)osh.object_skins_offset); - io_write_int32_t(s, (int32_t)osh.object_names_offset); - io_write_int32_t(s, (int32_t)osh.object_ids_offset); - io_write_int32_t(s, (int32_t)osh.texture_ids_offset); - io_write_int32_t(s, os->texture_ids_count); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + io_write_uint32_t(s, 0x05062500); + io_write_int32_t(s, os->obj_num); + io_write_uint32_t(s, osh.last_obj_id); + io_write_int32_t(s, (int32_t)osh.obj_data); + io_write_int32_t(s, (int32_t)osh.obj_skin_data); + io_write_int32_t(s, (int32_t)osh.obj_name_data); + io_write_int32_t(s, (int32_t)osh.obj_id_data); + io_write_int32_t(s, (int32_t)osh.tex_id_data); + io_write_int32_t(s, os->tex_id_num); + io_write_uint32_t(s, os->reserved[0]); + io_write_uint32_t(s, os->reserved[1]); io_position_pop(s); } @@ -609,64 +631,76 @@ static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { io_set_position(s, base_offset, SEEK_SET); - obj_header oh; - memset(&oh, 0, sizeof(obj_header)); - io_read(s, 0, 0x08); + obj_header oh = {}; + io_read_uint32_t(s); // version + io_read_uint32_t(s); // flags obj->bounding_sphere.center.x = io_read_float_t(s); obj->bounding_sphere.center.y = io_read_float_t(s); obj->bounding_sphere.center.z = io_read_float_t(s); obj->bounding_sphere.radius = io_read_float_t(s); - obj->meshes_count = io_read_int32_t(s); - oh.meshes_offset = io_read_int32_t(s); - obj->materials_count = io_read_int32_t(s); - oh.materials_offset = io_read_int32_t(s); - io_read(s, 0, 0x28); + obj->num_mesh = io_read_int32_t(s); + oh.mesh_array = io_read_int32_t(s); + obj->num_material = io_read_int32_t(s); + oh.material_array = io_read_int32_t(s); + obj->reserved[0] = io_read_uint32_t(s); + obj->reserved[1] = io_read_uint32_t(s); + obj->reserved[2] = io_read_uint32_t(s); + obj->reserved[3] = io_read_uint32_t(s); + obj->reserved[4] = io_read_uint32_t(s); + obj->reserved[5] = io_read_uint32_t(s); + obj->reserved[6] = io_read_uint32_t(s); + obj->reserved[7] = io_read_uint32_t(s); + obj->reserved[8] = io_read_uint32_t(s); + obj->reserved[9] = io_read_uint32_t(s); - if (oh.meshes_offset > 0) { - obj->meshes = force_malloc_s(obj_mesh, obj->meshes_count); - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + if (oh.mesh_array > 0) { + obj->mesh_array = force_malloc_s(obj_mesh, obj->num_mesh); + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; - io_set_position(s, base_offset + oh.meshes_offset + mesh_size * i, SEEK_SET); + io_set_position(s, base_offset + oh.mesh_array + mesh_size * i, SEEK_SET); - obj_mesh_header mh; - memset(&mh, 0, sizeof(obj_mesh_header)); - io_read(s, 0, 0x04); + obj_mesh_header mh = {}; + mesh->flags = io_read_uint32_t(s); mesh->bounding_sphere.center.x = io_read_float_t(s); mesh->bounding_sphere.center.y = io_read_float_t(s); mesh->bounding_sphere.center.z = io_read_float_t(s); mesh->bounding_sphere.radius = io_read_float_t(s); - mesh->sub_meshes_count = io_read_int32_t(s); - mh.sub_meshes_offset = io_read_int32_t(s); - mh.attrib_type = (obj_vertex_attrib_type)io_read_uint32_t(s); - mh.vertex_size = io_read_int32_t(s); - mh.vertex_count = io_read_int32_t(s); + mesh->num_submesh = io_read_int32_t(s); + mh.submesh_array = io_read_int32_t(s); + mh.format = (obj_vertex_format_file)io_read_uint32_t(s); + mh.size_vertex = io_read_int32_t(s); + mh.num_vertex = io_read_int32_t(s); for (uint32_t j = 0; j < 20; j++) - mh.attrib_offsets[j] = io_read_int32_t(s); + mh.vertex_array[j] = io_read_int32_t(s); - mesh->flags = (obj_mesh_flags)io_read_uint32_t(s); - mh.attrib_flags = io_read_uint32_t(s); - io_read(s, 0, 0x18); + mesh->attrib.w = io_read_uint32_t(s); + mh.vertex_flags = io_read_uint32_t(s); + mesh->reserved[0] = io_read_uint32_t(s); + mesh->reserved[1] = io_read_uint32_t(s); + mesh->reserved[2] = io_read_uint32_t(s); + mesh->reserved[3] = io_read_uint32_t(s); + mesh->reserved[4] = io_read_uint32_t(s); + mesh->reserved[5] = io_read_uint32_t(s); io_read(s, &mesh->name, sizeof(mesh->name)); mesh->name[sizeof(mesh->name) - 1] = 0; - if (mh.sub_meshes_offset) { - mesh->sub_meshes = force_malloc_s(obj_sub_mesh, mesh->sub_meshes_count); - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + if (mh.submesh_array) { + mesh->submesh_array = force_malloc_s(obj_sub_mesh, mesh->num_submesh); + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; - io_set_position(s, base_offset + mh.sub_meshes_offset + sub_mesh_size * j, SEEK_SET); + io_set_position(s, base_offset + mh.submesh_array + sub_mesh_size * j, SEEK_SET); - obj_sub_mesh_header smh; - memset(&smh, 0, sizeof(obj_sub_mesh_header)); - io_read(s, 0, 0x04); + obj_sub_mesh_header smh = {}; + sub_mesh->flags = io_read_uint32_t(s); sub_mesh->bounding_sphere.center.x = io_read_float_t(s); sub_mesh->bounding_sphere.center.y = io_read_float_t(s); sub_mesh->bounding_sphere.center.z = io_read_float_t(s); sub_mesh->bounding_sphere.radius = io_read_float_t(s); sub_mesh->material_index = io_read_uint32_t(s); - io_read(s, &sub_mesh->texcoord_indices, 0x08); + io_read(s, &sub_mesh->uv_index, 0x08); sub_mesh->bone_indices_count = io_read_int32_t(s); smh.bone_indices_offset = io_read_int32_t(s); sub_mesh->bones_per_vertex = io_read_uint32_t(s); @@ -674,7 +708,7 @@ static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { sub_mesh->index_format = (obj_index_format)io_read_uint32_t(s); sub_mesh->indices_count = io_read_int32_t(s); smh.indices_offset = io_read_int32_t(s); - sub_mesh->flags = (obj_sub_mesh_flags)io_read_uint32_t(s); + sub_mesh->attrib.w = io_read_uint32_t(s); sub_mesh->bounding_box.center = sub_mesh->bounding_sphere.center; sub_mesh->bounding_box.size.x = sub_mesh->bounding_sphere.radius * 2.0f; sub_mesh->bounding_box.size.y = sub_mesh->bounding_sphere.radius * 2.0f; @@ -693,15 +727,15 @@ static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { } } - obj_classic_read_vertex(obj, s, mh.attrib_offsets, mesh, - base_offset, mh.vertex_count, mh.attrib_type); + obj_classic_read_vertex(obj, s, mh.vertex_array, mesh, + base_offset, mh.num_vertex, mh.format); } } - if (oh.materials_offset > 0) { - io_set_position(s, base_offset + oh.materials_offset, SEEK_SET); - obj->materials = force_malloc_s(obj_material_data, obj->materials_count); - io_read(s, obj->materials, obj->materials_count * sizeof(obj_material_data)); + if (oh.material_array > 0) { + io_set_position(s, base_offset + oh.material_array, SEEK_SET); + obj->material_array = force_malloc_s(obj_material_data, obj->num_material); + io_read(s, obj->material_array, obj->num_material * sizeof(obj_material_data)); } } @@ -719,17 +753,25 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); - io_write(s,0x28); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); io_align_write(s, 0x10); - obj_header oh; - memset(&oh, 0, sizeof(obj_header)); - if (obj->meshes_count) { - oh.meshes_offset = io_get_position(s) - base_offset; + obj_header oh = {}; + if (obj->num_mesh) { + oh.mesh_array = io_get_position(s) - base_offset; - obj_mesh_header* mhs = force_malloc_s(obj_mesh_header, obj->meshes_count); - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + obj_mesh_header* mhs = force_malloc_s(obj_mesh_header, obj->num_mesh); + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; io_write(s, 0x04); io_write_float_t(s, 0.0f); @@ -751,13 +793,13 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { io_write(s, sizeof(mesh->name)); } - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; obj_mesh_header* mh = &mhs[i]; - if (mesh->sub_meshes_count) { - mh->sub_meshes_offset = io_get_position(s) - base_offset; - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { + if (mesh->num_submesh) { + mh->submesh_array = io_get_position(s) - base_offset; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { io_write(s, 0x04); io_write_float_t(s, 0.0f); io_write_float_t(s, 0.0f); @@ -778,14 +820,13 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { } } - obj_classic_write_vertex(obj, s, mh->attrib_offsets, - mesh, base_offset, &mh->vertex_count, &mh->attrib_type, &mh->vertex_size); + obj_classic_write_vertex(obj, s, mh->vertex_array, + mesh, base_offset, &mh->num_vertex, &mh->format, &mh->size_vertex); - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; - obj_sub_mesh_header smh; - memset(&smh, 0, sizeof(obj_sub_mesh_header)); + obj_sub_mesh_header smh = {}; if (sub_mesh->bones_per_vertex == 4 && sub_mesh->bone_indices_count) { smh.bone_indices_offset = io_get_position(s) - base_offset; io_write(s, sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); @@ -795,14 +836,14 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { smh.indices_offset = io_get_position(s) - base_offset; obj_classic_write_index(obj, s, sub_mesh); - io_position_push(s, base_offset + mh->sub_meshes_offset + sub_mesh_size * j, SEEK_SET); - io_write(s, 0x04); + io_position_push(s, base_offset + mh->submesh_array + sub_mesh_size * j, SEEK_SET); + io_write_uint32_t(s, sub_mesh->flags); io_write_float_t(s, sub_mesh->bounding_sphere.center.x); io_write_float_t(s, sub_mesh->bounding_sphere.center.y); io_write_float_t(s, sub_mesh->bounding_sphere.center.z); io_write_float_t(s, sub_mesh->bounding_sphere.radius); io_write_uint32_t(s, sub_mesh->material_index); - io_write(s, &sub_mesh->texcoord_indices, 0x08); + io_write(s, &sub_mesh->uv_index, 0x08); io_write_int32_t(s, sub_mesh->bone_indices_count); io_write_int32_t(s, (int32_t)smh.bone_indices_offset); io_write_uint32_t(s, sub_mesh->bones_per_vertex); @@ -810,35 +851,40 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { io_write_uint32_t(s, sub_mesh->index_format); io_write_int32_t(s, sub_mesh->indices_count); io_write_int32_t(s, (int32_t)smh.indices_offset); - io_write_uint32_t(s, sub_mesh->flags); + io_write_uint32_t(s, sub_mesh->attrib.w); io_write(s, 0x18); io_write_uint32_t(s, sub_mesh->indices_offset); io_position_pop(s); } } - io_position_push(s, base_offset + oh.meshes_offset, SEEK_SET); - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + io_position_push(s, base_offset + oh.mesh_array, SEEK_SET); + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; obj_mesh_header* mh = &mhs[i]; - io_write(s, 0x04); + io_write_uint32_t(s, mesh->flags); io_write_float_t(s, mesh->bounding_sphere.center.x); io_write_float_t(s, mesh->bounding_sphere.center.y); io_write_float_t(s, mesh->bounding_sphere.center.z); io_write_float_t(s, mesh->bounding_sphere.radius); - io_write_int32_t(s, mesh->sub_meshes_count); - io_write_int32_t(s, (int32_t)mh->sub_meshes_offset); - io_write_uint32_t(s, mh->attrib_type); - io_write_int32_t(s, mh->vertex_size); - io_write_int32_t(s, mh->vertex_count); + io_write_int32_t(s, mesh->num_submesh); + io_write_int32_t(s, (int32_t)mh->submesh_array); + io_write_uint32_t(s, mh->format); + io_write_int32_t(s, mh->size_vertex); + io_write_int32_t(s, mh->num_vertex); for (uint32_t j = 0; j < 20; j++) - io_write_int32_t(s, (int32_t)mh->attrib_offsets[j]); + io_write_int32_t(s, (int32_t)mh->vertex_array[j]); - io_write_int32_t(s, mesh->flags); - io_write_uint32_t(s, mh->attrib_flags); - io_write(s, 0x18); + io_write_uint32_t(s, mesh->attrib.w); + io_write_uint32_t(s, mh->vertex_flags); + io_write_uint32_t(s, mesh->reserved[0]); + io_write_uint32_t(s, mesh->reserved[1]); + io_write_uint32_t(s, mesh->reserved[2]); + io_write_uint32_t(s, mesh->reserved[3]); + io_write_uint32_t(s, mesh->reserved[4]); + io_write_uint32_t(s, mesh->reserved[5]); io_write(s, &mesh->name, sizeof(mesh->name) - 1); io_write_char(s, '\0'); } @@ -846,9 +892,9 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { free(mhs); } - if (obj->materials_count) { - oh.materials_offset = io_get_position(s) - base_offset; - io_write(s, obj->materials, obj->materials_count * sizeof(obj_material_data)); + if (obj->num_material) { + oh.material_array = io_get_position(s) - base_offset; + io_write(s, obj->material_array, obj->num_material * sizeof(obj_material_data)); } io_align_write(s, 0x10); @@ -859,10 +905,20 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { io_write_float_t(s, obj->bounding_sphere.center.y); io_write_float_t(s, obj->bounding_sphere.center.z); io_write_float_t(s, obj->bounding_sphere.radius); - io_write_int32_t(s, obj->meshes_count); - io_write_int32_t(s, (int32_t)oh.meshes_offset); - io_write_int32_t(s, obj->materials_count); - io_write_int32_t(s, (int32_t)oh.materials_offset); + io_write_int32_t(s, obj->num_mesh); + io_write_int32_t(s, (int32_t)oh.mesh_array); + io_write_int32_t(s, obj->num_material); + io_write_int32_t(s, (int32_t)oh.material_array); + io_write_uint32_t(s, obj->reserved[0]); + io_write_uint32_t(s, obj->reserved[1]); + io_write_uint32_t(s, obj->reserved[2]); + io_write_uint32_t(s, obj->reserved[3]); + io_write_uint32_t(s, obj->reserved[4]); + io_write_uint32_t(s, obj->reserved[5]); + io_write_uint32_t(s, obj->reserved[6]); + io_write_uint32_t(s, obj->reserved[7]); + io_write_uint32_t(s, obj->reserved[8]); + io_write_uint32_t(s, obj->reserved[9]); io_position_pop(s); } @@ -871,8 +927,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { obj->skin_init = true; io_set_position(s, base_offset, SEEK_SET); - obj_skin_header sh; - memset(&sh, 0, sizeof(obj_skin_header)); + obj_skin_header sh = {}; sh.bone_ids_offset = io_read_int32_t(s); sh.bone_matrices_offset = io_read_int32_t(s); sh.bone_names_offset = io_read_int32_t(s); @@ -939,8 +994,7 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { sk->ex_data_init = true; io_set_position(s, sh.ex_data_offset, SEEK_SET); - obj_skin_ex_data_header exh; - memset(&exh, 0, sizeof(obj_skin_ex_data_header)); + obj_skin_ex_data_header exh = {}; exh.osage_count = io_read_int32_t(s); ex->osage_nodes_count = io_read_int32_t(s); io_read(s, 0, 0x04); @@ -950,15 +1004,14 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { exh.bone_names_count = io_read_int32_t(s); 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); - 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); + exh.cloth_count = io_read_uint32_t(s); + ex->reserved[0] = io_read_uint32_t(s); + ex->reserved[1] = io_read_uint32_t(s); + ex->reserved[2] = io_read_uint32_t(s); + ex->reserved[3] = io_read_uint32_t(s); + ex->reserved[4] = io_read_uint32_t(s); + ex->reserved[5] = io_read_uint32_t(s); + ex->reserved[6] = io_read_uint32_t(s); if (exh.bone_names_offset) { std::vector bone_names; @@ -1036,9 +1089,6 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { bhs[i].block_offset = io_read_int32_t(s); } - obj_skin_block block; - memset(&block, 0, sizeof(obj_skin_block)); - ex->blocks = force_malloc_s(obj_skin_block, ex->blocks_count); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; @@ -1133,8 +1183,7 @@ 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) { obj_skin* sk = &obj->skin; - obj_skin_header sh; - memset(&sh, 0, sizeof(obj_skin_header)); + obj_skin_header sh = {}; io_write_int32_t(s, 0); io_write_int32_t(s, 0); io_write_int32_t(s, 0); @@ -1198,8 +1247,7 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { 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)); + obj_skin_ex_data_header exh = {}; if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; @@ -1808,14 +1856,13 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_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_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_write_uint32_t(s, (uint32_t)ex->reserved[0]); + io_write_uint32_t(s, (uint32_t)ex->reserved[1]); + io_write_uint32_t(s, (uint32_t)ex->reserved[2]); + io_write_uint32_t(s, (uint32_t)ex->reserved[3]); + io_write_uint32_t(s, (uint32_t)ex->reserved[4]); + io_write_uint32_t(s, (uint32_t)ex->reserved[5]); + io_write_uint32_t(s, (uint32_t)ex->reserved[6]); io_position_pop(s); } @@ -2377,9 +2424,6 @@ static void obj_classic_write_skin_block_motion(obj_skin_block_motion* b, io_write_int32_t(s, (int32_t)*bone_names_offset); io_write_int32_t(s, (int32_t)*bone_matrices_offset); - obj_skin_motion_node node; - memset(&node, 0, sizeof(obj_skin_motion_node)); - if (b->nodes) { io_position_push(s, *bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) @@ -2597,143 +2641,143 @@ static void obj_classic_write_skin_block_osage(obj_skin_block_osage* b, } } -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); +static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* vertex_array, obj_mesh* mesh, + int64_t base_offset, uint32_t num_vertex, obj_vertex_format_file vertex_format_file) { + obj_vertex_format vertex_format = OBJ_VERTEX_FORMAT_NONE; + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_POSITION) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_POSITION); - if (attrib_type & OBJ_VERTEX_ATTRIB_NORMAL) - enum_or(vertex_flags, OBJ_VERTEX_NORMAL); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_NORMAL) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_NORMAL); - if (attrib_type & OBJ_VERTEX_ATTRIB_TANGENT) - enum_or(vertex_flags, OBJ_VERTEX_TANGENT); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TANGENT) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TANGENT); - if (attrib_type & OBJ_VERTEX_ATTRIB_BINORMAL) - enum_or(vertex_flags, OBJ_VERTEX_BINORMAL); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BINORMAL) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_BINORMAL); - if (attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD0) - enum_or(vertex_flags, OBJ_VERTEX_TEXCOORD0); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD0) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TEXCOORD0); - if (attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD1) - enum_or(vertex_flags, OBJ_VERTEX_TEXCOORD1); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD1) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TEXCOORD1); - if (attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD2) - enum_or(vertex_flags, OBJ_VERTEX_TEXCOORD2); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD2) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TEXCOORD2); - if (attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD3) - enum_or(vertex_flags, OBJ_VERTEX_TEXCOORD3); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD3) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TEXCOORD3); - if (attrib_type & OBJ_VERTEX_ATTRIB_COLOR0) - enum_or(vertex_flags, OBJ_VERTEX_COLOR0); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_COLOR0) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_COLOR0); - if (attrib_type & OBJ_VERTEX_ATTRIB_COLOR1) - enum_or(vertex_flags, OBJ_VERTEX_COLOR1); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_COLOR1) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_COLOR1); - if ((attrib_type & (OBJ_VERTEX_ATTRIB_BONE_WEIGHT | OBJ_VERTEX_ATTRIB_BONE_INDEX)) - == (OBJ_VERTEX_ATTRIB_BONE_WEIGHT | OBJ_VERTEX_ATTRIB_BONE_INDEX)) - enum_or(vertex_flags, OBJ_VERTEX_BONE_DATA); + if ((vertex_format_file & (OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT | OBJ_VERTEX_FORMAT_FILE_BONE_INDEX)) + == (OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT | OBJ_VERTEX_FORMAT_FILE_BONE_INDEX)) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_BONE_DATA); else - enum_and(attrib_type, ~(OBJ_VERTEX_ATTRIB_BONE_WEIGHT | OBJ_VERTEX_ATTRIB_BONE_INDEX)); + enum_and(vertex_format_file, ~(OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT | OBJ_VERTEX_FORMAT_FILE_BONE_INDEX)); - if (attrib_type & OBJ_VERTEX_ATTRIB_UNKNOWN) - enum_or(vertex_flags, OBJ_VERTEX_UNKNOWN); + if (vertex_format_file & OBJ_VERTEX_FORMAT_FILE_UNKNOWN) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_UNKNOWN); - obj_vertex_data* vtx = force_malloc_s(obj_vertex_data, vertex_count); + obj_vertex_data* vtx = force_malloc_s(obj_vertex_data, num_vertex); for (uint32_t i = 0; i < 20; i++) { - obj_vertex_attrib_type attribute = (obj_vertex_attrib_type)(1 << i); - if (~attrib_type & attribute) + obj_vertex_format_file attribute = (obj_vertex_format_file)(1 << i); + if (~vertex_format_file & attribute) continue; - io_set_position(s, base_offset + attrib_offsets[i], SEEK_SET); + io_set_position(s, base_offset + vertex_array[i], SEEK_SET); switch (attribute) { - case OBJ_VERTEX_ATTRIB_POSITION: - for (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_POSITION: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_NORMAL: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_TANGENT: + for (uint32_t j = 0; j < num_vertex; 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); vtx[j].tangent.w = io_read_float_t(s); } break; - case OBJ_VERTEX_ATTRIB_BINORMAL: - for (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_BINORMAL: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_TEXCOORD0: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_TEXCOORD1: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_TEXCOORD2: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_TEXCOORD3: + for (uint32_t j = 0; j < num_vertex; 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 (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_COLOR0: + for (uint32_t j = 0; j < num_vertex; 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); vtx[j].color0.w = io_read_float_t(s); } break; - case OBJ_VERTEX_ATTRIB_COLOR1: - for (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_COLOR1: + for (uint32_t j = 0; j < num_vertex; 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); vtx[j].color1.w = io_read_float_t(s); } break; - case OBJ_VERTEX_ATTRIB_BONE_WEIGHT: - for (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT: + for (uint32_t j = 0; j < num_vertex; 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); vtx[j].bone_weight.w = io_read_float_t(s); } break; - case OBJ_VERTEX_ATTRIB_BONE_INDEX: - for (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_BONE_INDEX: + for (uint32_t j = 0; j < num_vertex; 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); vtx[j].bone_index.w = (int32_t)io_read_float_t(s); } break; - case OBJ_VERTEX_ATTRIB_UNKNOWN: - for (uint32_t j = 0; j < vertex_count; j++) { + case OBJ_VERTEX_FORMAT_FILE_UNKNOWN: + for (uint32_t j = 0; j < num_vertex; 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,102 +2787,102 @@ static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets } } mesh->vertex = vtx; - mesh->vertex_count = vertex_count; - mesh->vertex_flags = vertex_flags; + mesh->num_vertex = num_vertex; + mesh->vertex_format = vertex_format; } -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_classic_write_vertex(obj* obj, stream* s, int64_t* vertex_array, obj_mesh* mesh, + int64_t base_offset, uint32_t* num_vertex, obj_vertex_format_file* vertex_format_file, uint32_t* size_vertex) { obj_vertex_data* vtx = mesh->vertex; - uint32_t _vertex_count = mesh->vertex_count; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + uint32_t _num_vertex = mesh->num_vertex; + obj_vertex_format vertex_format = mesh->vertex_format; - obj_vertex_attrib_type _attrib_type = (obj_vertex_attrib_type)0; - uint32_t _vertex_size = 0; - if (vertex_flags & OBJ_VERTEX_POSITION) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_POSITION); - _vertex_size += 0x0C; + obj_vertex_format_file _vertex_format_file = (obj_vertex_format_file)0; + uint32_t _size_vertex = 0; + if (vertex_format & OBJ_VERTEX_FORMAT_POSITION) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_POSITION); + _size_vertex += 0x0C; } - if (vertex_flags & OBJ_VERTEX_NORMAL) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_NORMAL); - _vertex_size += 0x0C; + if (vertex_format & OBJ_VERTEX_FORMAT_NORMAL) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_NORMAL); + _size_vertex += 0x0C; } - if (vertex_flags & OBJ_VERTEX_TANGENT) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_TANGENT); - _vertex_size += 0x10; + if (vertex_format & OBJ_VERTEX_FORMAT_TANGENT) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_TANGENT); + _size_vertex += 0x10; } - if (vertex_flags & OBJ_VERTEX_BINORMAL) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_BINORMAL); - _vertex_size += 0x0C; + if (vertex_format & OBJ_VERTEX_FORMAT_BINORMAL) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_BINORMAL); + _size_vertex += 0x0C; } - if (vertex_flags & OBJ_VERTEX_TEXCOORD0) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_TEXCOORD0); - _vertex_size += 0x08; + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD0) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_TEXCOORD0); + _size_vertex += 0x08; } - if (vertex_flags & OBJ_VERTEX_TEXCOORD1) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_TEXCOORD1); - _vertex_size += 0x08; + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD1) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_TEXCOORD1); + _size_vertex += 0x08; } - if (vertex_flags & OBJ_VERTEX_TEXCOORD2) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_TEXCOORD2); - _vertex_size += 0x08; + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_TEXCOORD2); + _size_vertex += 0x08; } - if (vertex_flags & OBJ_VERTEX_TEXCOORD3) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_TEXCOORD3); - _vertex_size += 0x08; + if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD3) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_TEXCOORD3); + _size_vertex += 0x08; } - if (vertex_flags & OBJ_VERTEX_COLOR0) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_COLOR0); - _vertex_size += 0x10; + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR0) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_COLOR0); + _size_vertex += 0x10; } - if (vertex_flags & OBJ_VERTEX_COLOR1) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_COLOR1); - _vertex_size += 0x10; + if (vertex_format & OBJ_VERTEX_FORMAT_COLOR1) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_COLOR1); + _size_vertex += 0x10; } - if (vertex_flags & OBJ_VERTEX_BONE_DATA) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_BONE_WEIGHT | OBJ_VERTEX_ATTRIB_BONE_INDEX); - _vertex_size += 0x20; + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT | OBJ_VERTEX_FORMAT_FILE_BONE_INDEX); + _size_vertex += 0x20; } - if (vertex_flags & OBJ_VERTEX_UNKNOWN) { - enum_or(_attrib_type, OBJ_VERTEX_ATTRIB_UNKNOWN); - _vertex_size += 0x10; + if (vertex_format & OBJ_VERTEX_FORMAT_UNKNOWN) { + enum_or(_vertex_format_file, OBJ_VERTEX_FORMAT_FILE_UNKNOWN); + _size_vertex += 0x10; } - *vertex_count = _vertex_count; - *attrib_type = _attrib_type; - *vertex_size = _vertex_size; + *num_vertex = _num_vertex; + *vertex_format_file = _vertex_format_file; + *size_vertex = _size_vertex; - if (_attrib_type & OBJ_VERTEX_ATTRIB_POSITION) { - attrib_offsets[0] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_POSITION) { + vertex_array[0] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_NORMAL) { - attrib_offsets[1] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_NORMAL) { + vertex_array[1] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_TANGENT) { - attrib_offsets[2] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TANGENT) { + vertex_array[2] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); @@ -2846,26 +2890,26 @@ static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offset } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_BINORMAL) { - attrib_offsets[3] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BINORMAL) { + vertex_array[3] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD0) { - attrib_offsets[4] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD0) { + vertex_array[4] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; i++) { io_write_float_t(s, vtx[i].texcoord0.x); io_write_float_t(s, vtx[i].texcoord0.y); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_BONE_WEIGHT) { - attrib_offsets[10] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT) { + vertex_array[10] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); @@ -2873,9 +2917,9 @@ static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offset } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_BONE_INDEX) { - attrib_offsets[11] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BONE_INDEX) { + vertex_array[11] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); @@ -2883,33 +2927,33 @@ static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offset } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD1) { - attrib_offsets[5] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD1) { + vertex_array[5] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; i++) { io_write_float_t(s, vtx[i].texcoord1.x); io_write_float_t(s, vtx[i].texcoord1.y); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD2) { - attrib_offsets[6] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD2) { + vertex_array[6] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; i++) { io_write_float_t(s, vtx[i].texcoord2.x); io_write_float_t(s, vtx[i].texcoord2.y); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_TEXCOORD3) { - attrib_offsets[7] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD3) { + vertex_array[7] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; i++) { io_write_float_t(s, vtx[i].texcoord3.x); io_write_float_t(s, vtx[i].texcoord3.y); } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_COLOR0) { - attrib_offsets[8] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_COLOR0) { + vertex_array[8] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); @@ -2917,9 +2961,9 @@ static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offset } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_COLOR1) { - attrib_offsets[9] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_COLOR1) { + vertex_array[9] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); @@ -2927,9 +2971,9 @@ static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* attrib_offset } } - if (_attrib_type & OBJ_VERTEX_ATTRIB_UNKNOWN) { - attrib_offsets[12] = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < _vertex_count; i++) { + if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_UNKNOWN) { + vertex_array[12] = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < _num_vertex; 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); @@ -2948,8 +2992,8 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { io_open(&s_mosd, &st.data); s_mosd.is_big_endian = st.header.use_big_endian; - uint32_t signature = io_read_uint32_t_stream_reverse_endianness(&s_mosd); - if (signature != 0x5062501) { + uint32_t version = io_read_uint32_t_stream_reverse_endianness(&s_mosd); + if (version != 0x05062501) { os->is_x = false; os->modern = false; os->ready = false; @@ -2969,90 +3013,93 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { is_x &= io_read_uint32_t_stream_reverse_endianness(&s_mosd) == 0; io_set_position(&s_mosd, 0x04, SEEK_SET); - obj_set_header osh; - memset(&osh, 0, sizeof(obj_set_header)); + obj_set_header osh = {}; if (!is_x) { - os->objects_count = io_read_int32_t_stream_reverse_endianness(&s_mosd); - osh.max_object_id = io_read_int32_t_stream_reverse_endianness(&s_mosd); - osh.objects_offset = io_read_offset_f2(&s_mosd, st.header.length); - osh.object_skins_offset = io_read_offset_f2(&s_mosd, st.header.length); - osh.object_names_offset = io_read_offset_f2(&s_mosd, st.header.length); - osh.object_ids_offset = io_read_offset_f2(&s_mosd, st.header.length); - osh.texture_ids_offset = io_read_offset_f2(&s_mosd, st.header.length); - os->texture_ids_count = io_read_int32_t_stream_reverse_endianness(&s_mosd); + os->obj_num = io_read_int32_t_stream_reverse_endianness(&s_mosd); + osh.last_obj_id = io_read_int32_t_stream_reverse_endianness(&s_mosd); + osh.obj_data = io_read_offset_f2(&s_mosd, st.header.length); + osh.obj_skin_data = io_read_offset_f2(&s_mosd, st.header.length); + osh.obj_name_data = io_read_offset_f2(&s_mosd, st.header.length); + osh.obj_id_data = io_read_offset_f2(&s_mosd, st.header.length); + osh.tex_id_data = io_read_offset_f2(&s_mosd, st.header.length); + os->tex_id_num = io_read_int32_t_stream_reverse_endianness(&s_mosd); + os->reserved[0] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); + os->reserved[1] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); } else { - os->objects_count = io_read_int32_t_stream_reverse_endianness(&s_mosd); - osh.max_object_id = io_read_int32_t_stream_reverse_endianness(&s_mosd); - osh.objects_offset = io_read_offset_x(&s_mosd); - osh.object_skins_offset = io_read_offset_x(&s_mosd); - osh.object_names_offset = io_read_offset_x(&s_mosd); - osh.object_ids_offset = io_read_offset_x(&s_mosd); - osh.texture_ids_offset = io_read_offset_x(&s_mosd); - os->texture_ids_count = io_read_int32_t_stream_reverse_endianness(&s_mosd); + os->obj_num = io_read_int32_t_stream_reverse_endianness(&s_mosd); + osh.last_obj_id = io_read_int32_t_stream_reverse_endianness(&s_mosd); + osh.obj_data = io_read_offset_x(&s_mosd); + osh.obj_skin_data = io_read_offset_x(&s_mosd); + osh.obj_name_data = io_read_offset_x(&s_mosd); + osh.obj_id_data = io_read_offset_x(&s_mosd); + osh.tex_id_data = io_read_offset_x(&s_mosd); + os->tex_id_num = io_read_int32_t_stream_reverse_endianness(&s_mosd); + os->reserved[0] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); + os->reserved[1] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); } - os->objects = force_malloc_s(obj, os->objects_count); + os->obj_data = force_malloc_s(obj, os->obj_num); - int64_t* objects_offsets = 0; - if (osh.objects_offset) { - objects_offsets = force_malloc_s(int64_t, os->objects_count); - io_set_position(&s_mosd, osh.objects_offset, SEEK_SET); + int64_t* obj_datas = 0; + if (osh.obj_data) { + obj_datas = force_malloc_s(int64_t, os->obj_num); + io_set_position(&s_mosd, osh.obj_data, SEEK_SET); if (!is_x) - for (uint32_t i = 0; i < os->objects_count; i++) - objects_offsets[i] = io_read_offset_f2(&s_mosd, st.header.length); + for (uint32_t i = 0; i < os->obj_num; i++) + obj_datas[i] = io_read_offset_f2(&s_mosd, st.header.length); else - for (uint32_t i = 0; i < os->objects_count; i++) - objects_offsets[i] = io_read_offset_x(&s_mosd); + for (uint32_t i = 0; i < os->obj_num; i++) + obj_datas[i] = io_read_offset_x(&s_mosd); } - int64_t* object_skins_offsets = 0; - if (osh.object_skins_offset) { - object_skins_offsets = force_malloc_s(int64_t, os->objects_count); - io_set_position(&s_mosd, osh.object_skins_offset, SEEK_SET); + int64_t* obj_skin_datas = 0; + if (osh.obj_skin_data) { + obj_skin_datas = force_malloc_s(int64_t, os->obj_num); + io_set_position(&s_mosd, osh.obj_skin_data, SEEK_SET); if (!is_x) - for (uint32_t i = 0; i < os->objects_count; i++) - object_skins_offsets[i] = io_read_offset_f2(&s_mosd, st.header.length); + for (uint32_t i = 0; i < os->obj_num; i++) + obj_skin_datas[i] = io_read_offset_f2(&s_mosd, st.header.length); else - for (uint32_t i = 0; i < os->objects_count; i++) - object_skins_offsets[i] = io_read_offset_x(&s_mosd); + for (uint32_t i = 0; i < os->obj_num; i++) + obj_skin_datas[i] = io_read_offset_x(&s_mosd); } - int64_t* object_names_offsets = 0; - if (osh.object_names_offset) { - object_names_offsets = force_malloc_s(int64_t, os->objects_count); - io_set_position(&s_mosd, osh.object_names_offset, SEEK_SET); + int64_t* obj_name_datas = 0; + if (osh.obj_name_data) { + obj_name_datas = force_malloc_s(int64_t, os->obj_num); + io_set_position(&s_mosd, osh.obj_name_data, SEEK_SET); if (!is_x) - for (uint32_t i = 0; i < os->objects_count; i++) - object_names_offsets[i] = io_read_offset_f2(&s_mosd, st.header.length); + for (uint32_t i = 0; i < os->obj_num; i++) + obj_name_datas[i] = io_read_offset_f2(&s_mosd, st.header.length); else - for (uint32_t i = 0; i < os->objects_count; i++) - object_names_offsets[i] = io_read_offset_x(&s_mosd); + for (uint32_t i = 0; i < os->obj_num; i++) + obj_name_datas[i] = io_read_offset_x(&s_mosd); } - if (osh.objects_offset) - for (uint32_t i = 0; i < os->objects_count; i++) { - obj* obj = &os->objects[i]; - if (osh.object_names_offset && object_names_offsets[i]) + if (osh.obj_data) + for (uint32_t i = 0; i < os->obj_num; i++) { + obj* obj = &os->obj_data[i]; + if (osh.obj_name_data && obj_name_datas[i]) io_read_string_null_terminated_offset(&s_mosd, - object_names_offsets[i], &obj->name); + obj_name_datas[i], &obj->name); } - if (osh.object_ids_offset) { - io_set_position(&s_mosd, osh.object_ids_offset, SEEK_SET); - for (uint32_t i = 0; i < os->objects_count; i++) - os->objects[i].id = io_read_uint32_t_stream_reverse_endianness(&s_mosd); + if (osh.obj_id_data) { + io_set_position(&s_mosd, osh.obj_id_data, SEEK_SET); + for (uint32_t i = 0; i < os->obj_num; i++) + os->obj_data[i].id = io_read_uint32_t_stream_reverse_endianness(&s_mosd); } - free(objects_offsets); - free(object_skins_offsets); - free(object_names_offsets); + free(obj_datas); + free(obj_skin_datas); + free(obj_name_datas); - 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 (uint32_t i = 0; i < os->texture_ids_count; i++) - os->texture_ids[i] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); + if (osh.tex_id_data) { + io_set_position(&s_mosd, osh.tex_id_data, SEEK_SET); + os->tex_id_data = force_malloc_s(uint32_t, os->tex_id_num); + for (uint32_t i = 0; i < os->tex_id_num; i++) + os->tex_id_data[i] = io_read_uint32_t_stream_reverse_endianness(&s_mosd); } int32_t omdl_index = 0; @@ -3095,7 +3142,7 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { s_ovtx_ptr = &s_ovtx; } - obj* obj = &os->objects[omdl_index]; + obj* obj = &os->obj_data[omdl_index]; stream s_omdl; io_open(&s_omdl, &i.data); s_omdl.is_big_endian = i.header.use_big_endian; @@ -3131,23 +3178,22 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { bool is_x = os->is_x; - obj_set_header osh; - memset(&osh, 0, sizeof(obj_set_header)); - osh.max_object_id = -1; + obj_set_header osh = {}; + osh.last_obj_id = -1; - uint32_t count = os->objects_count; + uint32_t count = os->obj_num; if (!is_x) { ee = { 0, 1, 44, 1 }; - ee.sub.push_back({ 0, 9, ENRS_DWORD }); + ee.append(0, 9, ENRS_DWORD); e.vec.push_back(ee); off = 44; } else { ee = { 0, 3, 72, 1 }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 4, 5, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); + ee.append(4, 5, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = 72; off = align_val(off, 0x10); @@ -3167,28 +3213,28 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { if (!is_x) { ee = { off, 1, 4, (uint32_t)count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(count * 4ULL); } else { ee = { off, 1, 8, (uint32_t)count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(count * 8ULL); } off = align_val(off, 0x10); ee = { off, 1, 4, (uint32_t)count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(count * 4ULL); off = align_val(off, 0x10); - ee = { off, 1, 4, (uint32_t)os->texture_ids_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee = { off, 1, 4, (uint32_t)os->tex_id_num }; + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(os->texture_ids_count * 4ULL); + off = (uint32_t)(os->tex_id_num * 4ULL); off = align_val(off, 0x10); if (!is_x) { @@ -3219,7 +3265,7 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { io_align_write(&s_mosd, 0x10); } - osh.objects_offset = io_get_position(&s_mosd); + osh.obj_data = io_get_position(&s_mosd); if (!is_x) for (uint32_t i = 0; i < count; i++) io_write_offset_f2(&s_mosd, 0, 0x20); @@ -3228,7 +3274,7 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { io_write_offset_x(&s_mosd, 0); io_align_write(&s_mosd, 0x10); - osh.object_skins_offset = io_get_position(&s_mosd); + osh.obj_skin_data = io_get_position(&s_mosd); if (!is_x) for (uint32_t i = 0; i < count; i++) io_write_offset_f2(&s_mosd, 0, 0x20); @@ -3237,7 +3283,7 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { io_write_offset_x(&s_mosd, 0); io_align_write(&s_mosd, 0x10); - osh.object_names_offset = io_get_position(&s_mosd); + osh.obj_name_data = io_get_position(&s_mosd); if (!is_x) for (uint32_t i = 0; i < count; i++) io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); @@ -3246,65 +3292,65 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { 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); + osh.obj_id_data = io_get_position(&s_mosd); for (uint32_t i = 0; i < count; i++) - io_write_uint32_t(&s_mosd, os->objects[i].id); + io_write_uint32_t(&s_mosd, os->obj_data[i].id); io_align_write(&s_mosd, 0x10); - osh.texture_ids_offset = io_get_position(&s_mosd); - for (uint32_t i = 0; i < os->texture_ids_count; i++) - io_write_uint32_t(&s_mosd, os->texture_ids[i]); + osh.tex_id_data = io_get_position(&s_mosd); + for (uint32_t i = 0; i < os->tex_id_num; i++) + io_write_uint32_t(&s_mosd, os->tex_id_data[i]); io_align_write(&s_mosd, 0x10); - int64_t* object_names_offsets = force_malloc_s(int64_t, count); + int64_t* obj_name_datas = 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); + obj_name_datas[i] = (int32_t)io_get_position(&s_mosd); + io_write_string_null_terminated(&s_mosd, &os->obj_data[i].name); } io_align_write(&s_mosd, 0x10); - io_position_push(&s_mosd, osh.object_names_offset, SEEK_SET); + io_position_push(&s_mosd, osh.obj_name_data, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < count; i++) - io_write_offset_f2(&s_mosd, object_names_offsets[i], 0x20); + io_write_offset_f2(&s_mosd, obj_name_datas[i], 0x20); else for (uint32_t i = 0; i < count; i++) - io_write_offset_x(&s_mosd, object_names_offsets[i]); + io_write_offset_x(&s_mosd, obj_name_datas[i]); io_position_pop(&s_mosd); - free(object_names_offsets); + free(obj_name_datas); io_position_push(&s_mosd, 0x00, SEEK_SET); if (!is_x) { - io_write_uint32_t(&s_mosd, 0x5062501); - io_write_int32_t(&s_mosd, os->objects_count); + io_write_uint32_t(&s_mosd, 0x05062501); + io_write_int32_t(&s_mosd, os->obj_num); io_write_int32_t(&s_mosd, -1); - io_write_offset_f2(&s_mosd, osh.objects_offset, 0x20); - io_write_offset_f2(&s_mosd, osh.object_skins_offset, 0x20); - io_write_offset_f2(&s_mosd, osh.object_names_offset, 0x20); - io_write_offset_f2(&s_mosd, osh.object_ids_offset, 0x20); - io_write_offset_f2(&s_mosd, osh.texture_ids_offset, 0x20); - io_write_int32_t(&s_mosd, os->texture_ids_count); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); + io_write_offset_f2(&s_mosd, osh.obj_data, 0x20); + io_write_offset_f2(&s_mosd, osh.obj_skin_data, 0x20); + io_write_offset_f2(&s_mosd, osh.obj_name_data, 0x20); + io_write_offset_f2(&s_mosd, osh.obj_id_data, 0x20); + io_write_offset_f2(&s_mosd, osh.tex_id_data, 0x20); + io_write_int32_t(&s_mosd, os->tex_id_num); + io_write_uint32_t(&s_mosd, os->reserved[0]); + io_write_uint32_t(&s_mosd, os->reserved[1]); } else { - io_write_uint32_t(&s_mosd, 0x5062501); - io_write_int32_t(&s_mosd, os->objects_count); + io_write_uint32_t(&s_mosd, 0x05062501); + io_write_int32_t(&s_mosd, os->obj_num); io_write_int32_t(&s_mosd, -1); - io_write_offset_x(&s_mosd, osh.objects_offset); - io_write_offset_x(&s_mosd, osh.object_skins_offset); - io_write_offset_x(&s_mosd, osh.object_names_offset); - io_write_offset_x(&s_mosd, osh.object_ids_offset); - io_write_offset_x(&s_mosd, osh.texture_ids_offset); - io_write_int32_t(&s_mosd, os->texture_ids_count); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); + io_write_offset_x(&s_mosd, osh.obj_data); + io_write_offset_x(&s_mosd, osh.obj_skin_data); + io_write_offset_x(&s_mosd, osh.obj_name_data); + io_write_offset_x(&s_mosd, osh.obj_id_data); + io_write_offset_x(&s_mosd, osh.tex_id_data); + io_write_int32_t(&s_mosd, os->tex_id_num); + io_write_uint32_t(&s_mosd, os->reserved[0]); + io_write_uint32_t(&s_mosd, os->reserved[1]); } io_position_pop(&s_mosd); f2_struct st; for (uint32_t i = 0; i < count; i++) { - obj* obj = &os->objects[i]; + obj* obj = &os->obj_data[i]; st.sub_structs.push_back({}); f2_struct* omdl = &st.sub_structs.back(); @@ -3412,7 +3458,7 @@ static void obj_modern_write_index(obj* obj, stream* s, bool is_x, if (add_enrs) if (type != ENRS_INVALID) { ee = { off, 1, (uint32_t)size, (uint32_t)sub_mesh->indices_count }; - ee.sub.push_back({ 0, 1, type }); + ee.append(0, 1, type); e->vec.push_back(ee); } else { @@ -3446,84 +3492,107 @@ static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, io_set_position(s, base_offset, SEEK_SET); - obj_header oh; - memset(&oh, 0, sizeof(obj_header)); + obj_header oh = {}; if (!is_x) { - io_read(s, 0, 0x08); + io_read_uint32_t(s); // version + io_read_uint32_t(s); // flags obj->bounding_sphere.center.x = io_read_float_t_stream_reverse_endianness(s); obj->bounding_sphere.center.y = io_read_float_t_stream_reverse_endianness(s); obj->bounding_sphere.center.z = io_read_float_t_stream_reverse_endianness(s); obj->bounding_sphere.radius = io_read_float_t_stream_reverse_endianness(s); - obj->meshes_count = io_read_int32_t_stream_reverse_endianness(s); - oh.meshes_offset = io_read_offset_f2(s, header_length); - obj->materials_count = io_read_int32_t_stream_reverse_endianness(s); - oh.materials_offset = io_read_offset_f2(s, header_length); + obj->num_mesh = io_read_int32_t_stream_reverse_endianness(s); + oh.mesh_array = io_read_offset_f2(s, header_length); + obj->num_material = io_read_int32_t_stream_reverse_endianness(s); + oh.material_array = io_read_offset_f2(s, header_length); + obj->reserved[0] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[1] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[2] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[3] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[4] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[5] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[6] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[7] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[8] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[9] = io_read_uint32_t_stream_reverse_endianness(s); } else { - io_read(s, 0, 0x08); - obj->meshes_count = io_read_int32_t_stream_reverse_endianness(s); - obj->materials_count = io_read_int32_t_stream_reverse_endianness(s); + io_read_uint32_t(s); // version + io_read_uint32_t(s); // flags + obj->num_mesh = io_read_int32_t_stream_reverse_endianness(s); + obj->num_material = io_read_int32_t_stream_reverse_endianness(s); obj->bounding_sphere.center.x = io_read_float_t_stream_reverse_endianness(s); obj->bounding_sphere.center.y = io_read_float_t_stream_reverse_endianness(s); obj->bounding_sphere.center.z = io_read_float_t_stream_reverse_endianness(s); obj->bounding_sphere.radius = io_read_float_t_stream_reverse_endianness(s); - oh.meshes_offset = io_read_offset_x(s); - oh.materials_offset = io_read_offset_x(s); + oh.mesh_array = io_read_offset_x(s); + oh.material_array = io_read_offset_x(s); io_read(s, 0, 0x10); obj->flags = io_read_uint8_t(s); io_read(s, 0, 0x07); + obj->reserved[0] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[1] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[2] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[3] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[4] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[5] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[6] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[7] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[8] = io_read_uint32_t_stream_reverse_endianness(s); + obj->reserved[9] = io_read_uint32_t_stream_reverse_endianness(s); } - io_read(s, 0, 0x28); - if (oh.meshes_offset > 0) { - obj->meshes = force_malloc_s(obj_mesh, obj->meshes_count); - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + if (oh.mesh_array > 0) { + obj->mesh_array = force_malloc_s(obj_mesh, obj->num_mesh); + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; - io_set_position(s, base_offset + oh.meshes_offset + mesh_size * i, SEEK_SET); + io_set_position(s, base_offset + oh.mesh_array + mesh_size * i, SEEK_SET); - obj_mesh_header mh; - memset(&mh, 0, sizeof(obj_mesh_header)); - io_read(s, 0, 0x04); + obj_mesh_header mh = {}; + mesh->flags = io_read_uint32_t_stream_reverse_endianness(s); mesh->bounding_sphere.center.x = io_read_float_t_stream_reverse_endianness(s); mesh->bounding_sphere.center.y = io_read_float_t_stream_reverse_endianness(s); mesh->bounding_sphere.center.z = io_read_float_t_stream_reverse_endianness(s); mesh->bounding_sphere.radius = io_read_float_t_stream_reverse_endianness(s); - mesh->sub_meshes_count = io_read_int32_t_stream_reverse_endianness(s); - mh.sub_meshes_offset = io_read_offset(s, header_length, is_x); - mh.attrib_type = (obj_vertex_attrib_type)io_read_uint32_t_stream_reverse_endianness(s); - mh.vertex_size = io_read_int32_t_stream_reverse_endianness(s); - mh.vertex_count = io_read_int32_t_stream_reverse_endianness(s); + mesh->num_submesh = io_read_int32_t_stream_reverse_endianness(s); + mh.submesh_array = io_read_offset(s, header_length, is_x); + mh.format = (obj_vertex_format_file)io_read_uint32_t_stream_reverse_endianness(s); + mh.size_vertex = io_read_int32_t_stream_reverse_endianness(s); + mh.num_vertex = io_read_int32_t_stream_reverse_endianness(s); if (!is_x) for (uint32_t j = 0; j < 20; j++) - mh.attrib_offsets[j] = io_read_offset_f2(s, 0); + mh.vertex_array[j] = io_read_offset_f2(s, 0); else for (uint32_t j = 0; j < 20; j++) - mh.attrib_offsets[j] = io_read_offset_x(s); + mh.vertex_array[j] = io_read_offset_x(s); - mesh->flags = (obj_mesh_flags)io_read_uint32_t_stream_reverse_endianness(s); - mh.attrib_flags = io_read_uint32_t_stream_reverse_endianness(s); - io_read(s, 0, 0x18); + mesh->attrib.w = io_read_uint32_t_stream_reverse_endianness(s); + mh.vertex_flags = io_read_uint32_t_stream_reverse_endianness(s); + mesh->reserved[0] = io_read_uint32_t_stream_reverse_endianness(s); + mesh->reserved[1] = io_read_uint32_t_stream_reverse_endianness(s); + mesh->reserved[2] = io_read_uint32_t_stream_reverse_endianness(s); + mesh->reserved[3] = io_read_uint32_t_stream_reverse_endianness(s); + mesh->reserved[4] = io_read_uint32_t_stream_reverse_endianness(s); + mesh->reserved[5] = io_read_uint32_t_stream_reverse_endianness(s); io_read(s, &mesh->name, sizeof(mesh->name)); mesh->name[sizeof(mesh->name) - 1] = 0; - if (mh.sub_meshes_offset) { - mesh->sub_meshes = force_malloc_s(obj_sub_mesh, mesh->sub_meshes_count); - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + if (mh.submesh_array) { + mesh->submesh_array = force_malloc_s(obj_sub_mesh, mesh->num_submesh); + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; - io_set_position(s, base_offset + mh.sub_meshes_offset + sub_mesh_size * j, SEEK_SET); + io_set_position(s, base_offset + mh.submesh_array + sub_mesh_size * j, SEEK_SET); - obj_sub_mesh_header smh; - memset(&smh, 0, sizeof(obj_sub_mesh_header)); - io_read(s, 0, 0x04); + obj_sub_mesh_header smh = {}; + sub_mesh->flags = io_read_uint32_t_stream_reverse_endianness(s); sub_mesh->bounding_sphere.center.x = io_read_float_t_stream_reverse_endianness(s); sub_mesh->bounding_sphere.center.y = io_read_float_t_stream_reverse_endianness(s); sub_mesh->bounding_sphere.center.z = io_read_float_t_stream_reverse_endianness(s); sub_mesh->bounding_sphere.radius = io_read_float_t_stream_reverse_endianness(s); sub_mesh->material_index = io_read_uint32_t_stream_reverse_endianness(s); - io_read(s, &sub_mesh->texcoord_indices, 0x08); + io_read(s, &sub_mesh->uv_index, 0x08); sub_mesh->bone_indices_count = io_read_int32_t_stream_reverse_endianness(s); smh.bone_indices_offset = io_read_offset(s, header_length, is_x); sub_mesh->bones_per_vertex = io_read_uint32_t_stream_reverse_endianness(s); @@ -3531,7 +3600,7 @@ static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, sub_mesh->index_format = (obj_index_format)io_read_uint32_t_stream_reverse_endianness(s); sub_mesh->indices_count = io_read_int32_t_stream_reverse_endianness(s); smh.indices_offset = io_read_offset(s, 0, is_x); - sub_mesh->flags = (obj_sub_mesh_flags)io_read_uint32_t_stream_reverse_endianness(s); + sub_mesh->attrib.w = io_read_uint32_t_stream_reverse_endianness(s); io_read(s, 0, 0x10); sub_mesh->bounding_box.center.x = io_read_float_t_stream_reverse_endianness(s); sub_mesh->bounding_box.center.y = io_read_float_t_stream_reverse_endianness(s); @@ -3561,20 +3630,20 @@ static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, } } - obj_modern_read_vertex(obj, s_ovtx, mh.attrib_offsets, mesh, - mh.attrib_flags, mh.vertex_count, mh.vertex_size); + obj_modern_read_vertex(obj, s_ovtx, mh.vertex_array, mesh, + mh.vertex_flags, mh.num_vertex, mh.size_vertex); } } - if (oh.materials_offset > 0) { + if (oh.material_array > 0) { obj_material_texture_enrs_table_init(); - io_set_position(s, base_offset + oh.materials_offset, SEEK_SET); - obj->materials = force_malloc_s(obj_material_data, obj->materials_count); - io_read(s, obj->materials, obj->materials_count * sizeof(obj_material_data)); + io_set_position(s, base_offset + oh.material_array, SEEK_SET); + obj->material_array = force_malloc_s(obj_material_data, obj->num_material); + io_read(s, obj->material_array, obj->num_material * sizeof(obj_material_data)); if (s->is_big_endian) - for (uint32_t i = 0; i < obj->materials_count; i++) - obj_material_texture_enrs_table.apply(&obj->materials[i]); + for (uint32_t i = 0; i < obj->num_material; i++) + obj_material_texture_enrs_table.apply(&obj->material_array[i]); } } @@ -3598,114 +3667,112 @@ static void obj_modern_write_model(obj* obj, stream* s, enrs_entry ee; pof pof; - obj_header oh; - memset(&oh, 0, sizeof(obj_header)); - + obj_header oh = {}; if (!is_x) { ee = { 0, 1, 80, 1 }; - ee.sub.push_back({ 0, 10, ENRS_DWORD }); + ee.append(0, 10, ENRS_DWORD); e.vec.push_back(ee); off = 80; } else { ee = { 0, 2, 112, 1 }; - ee.sub.push_back({ 0, 8, ENRS_DWORD }); - ee.sub.push_back({ 0, 2, ENRS_QWORD }); + ee.append(0, 8, ENRS_DWORD); + ee.append(0, 2, ENRS_QWORD); e.vec.push_back(ee); off = 112; } if (!is_x) { - ee = { off, 1, 216, (uint32_t)obj->meshes_count }; - ee.sub.push_back({ 0, 32, ENRS_DWORD }); + ee = { off, 1, 216, (uint32_t)obj->num_mesh }; + ee.append(0, 32, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(obj->meshes_count * 216ULL); + off = (uint32_t)(obj->num_mesh * 216ULL); } else { - ee = { off, 5, 304, (uint32_t)obj->meshes_count }; - ee.sub.push_back({ 0, 6, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 4, 20, ENRS_QWORD }); - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee = { off, 5, 304, (uint32_t)obj->num_mesh }; + ee.append(0, 6, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 3, ENRS_DWORD); + ee.append(4, 20, ENRS_QWORD); + ee.append(0, 2, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(obj->meshes_count * 304ULL); + off = (uint32_t)(obj->num_mesh * 304ULL); } uint32_t total_sub_meshes = 0; - for (uint32_t i = 0; i < obj->meshes_count; i++) - total_sub_meshes += obj->meshes[i].sub_meshes_count; + for (uint32_t i = 0; i < obj->num_mesh; i++) + total_sub_meshes += obj->mesh_array[i].num_submesh; if (!is_x) { ee = { off, 17, 112, total_sub_meshes }; - ee.sub.push_back({ 0, 6, ENRS_DWORD }); - ee.sub.push_back({ 8, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 16, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_WORD }); - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 6, ENRS_DWORD); + ee.append(8, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(16, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_WORD); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); - off = (uint32_t)(obj->meshes_count * 112ULL); + off = (uint32_t)(obj->num_mesh * 112ULL); } else { ee = { off, 17, 128, total_sub_meshes }; - ee.sub.push_back({ 0, 6, ENRS_DWORD }); - ee.sub.push_back({ 8, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 16, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_WORD }); - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 6, ENRS_DWORD); + ee.append(8, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(16, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(0, 1, ENRS_WORD); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); - off = (uint32_t)(obj->meshes_count * 128ULL); + off = (uint32_t)(obj->num_mesh * 128ULL); } int32_t total_bone_indices_count = 0; - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[i]; + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[i]; if (sub_mesh->bones_per_vertex == 4) total_bone_indices_count += sub_mesh->bone_indices_count; } } ee = { off, 1, 2, (uint32_t)total_bone_indices_count }; - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); off = (uint32_t)(2 * (size_t)total_bone_indices_count); off = align_val(off, is_x ? 0x10 : 0x04); - if (obj->materials_count) { + if (obj->num_material) { obj_material_texture_enrs_table_init(); enrs_entry* mte = &obj_material_texture_enrs_table.vec[0]; - ee = { off, 186, 1200, (uint32_t)obj->materials_count, }; + ee = { off, 186, 1200, (uint32_t)obj->num_material, }; ee.offset = off; ee.count = mte->count; ee.size = mte->size; - ee.repeat_count = obj->materials_count; + ee.repeat_count = obj->num_material; ee.sub = mte->sub; e.vec.push_back(ee); off = (uint32_t)(ee.size * ee.repeat_count); @@ -3722,7 +3789,16 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_int32_t(s, 0); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x28); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); } else { io_write_uint32_t(s, 0); @@ -3738,17 +3814,26 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write(s, 0x10); io_write_uint8_t(s, 0); io_write(s, 0x07); - io_write(s, 0x28); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); + io_write_uint32_t(s, 0); } io_align_write(s, 0x10); - if (obj->meshes_count) { - oh.meshes_offset = io_get_position(s) - base_offset; + if (obj->num_mesh) { + oh.mesh_array = io_get_position(s) - base_offset; - 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 (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + obj_mesh_header* mhs = force_malloc_s(obj_mesh_header, obj->num_mesh); + obj_sub_mesh_header** smhss = force_malloc_s(obj_sub_mesh_header*, obj->num_mesh); + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; io_write(s, 0x04); io_write_float_t(s, 0.0f); @@ -3774,14 +3859,14 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write(s, sizeof(mesh->name)); } - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[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 (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { + mh->format = OBJ_VERTEX_FORMAT_FILE_MODERN_STORAGE; + if (mesh->num_submesh) { + mh->submesh_array = io_get_position(s) - base_offset; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { io_write(s, 0x04); io_write_float_t(s, 0.0f); io_write_float_t(s, 0.0f); @@ -3812,20 +3897,20 @@ static void obj_modern_write_model(obj* obj, stream* s, } } - obj_modern_write_vertex(obj, &s_ovtx, is_x, mh->attrib_offsets, mesh, - &mh->attrib_flags, &mh->vertex_count, &mh->vertex_size, ovtx); + obj_modern_write_vertex(obj, &s_ovtx, is_x, mh->vertex_array, mesh, + &mh->vertex_flags, &mh->num_vertex, &mh->size_vertex, ovtx); } - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; obj_mesh_header* mh = &mhs[i]; obj_sub_mesh_header* smhs = 0; - if (mesh->sub_meshes_count) { - smhs = force_malloc_s(obj_sub_mesh_header, mesh->sub_meshes_count); + if (mesh->num_submesh) { + smhs = force_malloc_s(obj_sub_mesh_header, mesh->num_submesh); smhss[i] = smhs; - for (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; obj_sub_mesh_header* smh = &smhs[j]; if (sub_mesh->bones_per_vertex == 4 && sub_mesh->bone_indices_count) { @@ -3840,24 +3925,24 @@ static void obj_modern_write_model(obj* obj, stream* s, } io_align_write(s, is_x ? 0x10 : 0x04); - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[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 (uint32_t j = 0; j < mesh->sub_meshes_count; j++) { - obj_sub_mesh* sub_mesh = &mesh->sub_meshes[j]; + if (mesh->num_submesh) { + io_position_push(s, base_offset + mh->submesh_array, SEEK_SET); + for (uint32_t j = 0; j < mesh->num_submesh; j++) { + obj_sub_mesh* sub_mesh = &mesh->submesh_array[j]; obj_sub_mesh_header* smh = &smhs[j]; - io_write(s, 0x04); + io_write_uint32_t(s, sub_mesh->flags); io_write_float_t(s, sub_mesh->bounding_sphere.center.x); io_write_float_t(s, sub_mesh->bounding_sphere.center.y); io_write_float_t(s, sub_mesh->bounding_sphere.center.z); io_write_float_t(s, sub_mesh->bounding_sphere.radius); io_write_uint32_t(s, sub_mesh->material_index); - io_write(s, &sub_mesh->texcoord_indices, 0x08); + io_write(s, &sub_mesh->uv_index, 0x08); io_write_int32_t(s, sub_mesh->bone_indices_count); io_write_offset(s, smh->bone_indices_offset, 0x20, is_x); io_write_uint32_t(s, sub_mesh->bones_per_vertex); @@ -3865,7 +3950,7 @@ static void obj_modern_write_model(obj* obj, stream* s, io_write_uint32_t(s, sub_mesh->index_format); io_write_int32_t(s, sub_mesh->indices_count); io_write_offset(s, smh->indices_offset, 0, is_x); - io_write_uint32_t(s, sub_mesh->flags); + io_write_uint32_t(s, sub_mesh->attrib.w); io_write(s, 0x10); io_write_float_t(s, sub_mesh->bounding_box.center.x); io_write_float_t(s, sub_mesh->bounding_box.center.y); @@ -3900,34 +3985,39 @@ static void obj_modern_write_model(obj* obj, stream* s, free(smhs); } - io_position_push(s, base_offset + oh.meshes_offset, SEEK_SET); - for (uint32_t i = 0; i < obj->meshes_count; i++) { - obj_mesh* mesh = &obj->meshes[i]; + io_position_push(s, base_offset + oh.mesh_array, SEEK_SET); + for (uint32_t i = 0; i < obj->num_mesh; i++) { + obj_mesh* mesh = &obj->mesh_array[i]; obj_mesh_header* mh = &mhs[i]; - io_write(s, 0x04); + io_write_uint32_t(s, mesh->flags); io_write_float_t(s, mesh->bounding_sphere.center.x); io_write_float_t(s, mesh->bounding_sphere.center.y); io_write_float_t(s, mesh->bounding_sphere.center.z); io_write_float_t(s, mesh->bounding_sphere.radius); - io_write_int32_t(s, mesh->sub_meshes_count); - if (mh->sub_meshes_offset && !is_x) - mh->sub_meshes_offset += 0x20; - io_write_offset(s, mh->sub_meshes_offset, 0, is_x); - io_write_uint32_t(s, mh->attrib_type); - io_write_int32_t(s, mh->vertex_size); - io_write_int32_t(s, mh->vertex_count); + io_write_int32_t(s, mesh->num_submesh); + if (mh->submesh_array && !is_x) + mh->submesh_array += 0x20; + io_write_offset(s, mh->submesh_array, 0, is_x); + io_write_uint32_t(s, mh->format); + io_write_int32_t(s, mh->size_vertex); + io_write_int32_t(s, mh->num_vertex); if (!is_x) for (uint32_t j = 0; j < 20; j++) - io_write_offset_f2(s, mh->attrib_offsets[j], 0); + io_write_offset_f2(s, mh->vertex_array[j], 0); else for (uint32_t j = 0; j < 20; j++) - io_write_offset_x(s, mh->attrib_offsets[j]); + io_write_offset_x(s, mh->vertex_array[j]); - io_write_int32_t(s, mesh->flags); - io_write_uint32_t(s, mh->attrib_flags); - io_write(s, 0x18); + io_write_uint32_t(s, mesh->attrib.w); + io_write_uint32_t(s, mh->vertex_flags); + io_write_uint32_t(s, mesh->reserved[0]); + io_write_uint32_t(s, mesh->reserved[1]); + io_write_uint32_t(s, mesh->reserved[2]); + io_write_uint32_t(s, mesh->reserved[3]); + io_write_uint32_t(s, mesh->reserved[4]); + io_write_uint32_t(s, mesh->reserved[5]); io_write(s, &mesh->name, sizeof(mesh->name) - 1); io_write_char(s, '\0'); } @@ -3936,40 +4026,60 @@ static void obj_modern_write_model(obj* obj, stream* s, free(smhss); } - if (obj->materials) { - oh.materials_offset = io_get_position(s) - base_offset; - for (uint32_t i = 0; i < obj->materials_count; i++) - io_write(s, &obj->materials[i], sizeof(obj_material_data)); + if (obj->material_array) { + oh.material_array = io_get_position(s) - base_offset; + for (uint32_t i = 0; i < obj->num_material; i++) + io_write(s, &obj->material_array[i], sizeof(obj_material_data)); } io_align_write(s, 0x10); io_position_push(s, base_offset, SEEK_SET); if (!is_x) { - io_write_uint32_t(s, 0x10000); - io_write_uint32_t(s, 0x00); + io_write_uint32_t(s, 0x10000); // version + io_write_uint32_t(s, 0x00); // flags io_write_float_t(s, obj->bounding_sphere.center.x); io_write_float_t(s, obj->bounding_sphere.center.y); io_write_float_t(s, obj->bounding_sphere.center.z); io_write_float_t(s, obj->bounding_sphere.radius); - io_write_int32_t(s, obj->meshes_count); - io_write_offset_f2(s, oh.meshes_offset, 0x20); - io_write_int32_t(s, obj->materials_count); - io_write_offset_f2(s, oh.materials_offset, 0x20); + io_write_int32_t(s, obj->num_mesh); + io_write_offset_f2(s, oh.mesh_array, 0x20); + io_write_int32_t(s, obj->num_material); + io_write_offset_f2(s, oh.material_array, 0x20); + io_write_uint32_t(s, obj->reserved[0]); + io_write_uint32_t(s, obj->reserved[1]); + io_write_uint32_t(s, obj->reserved[2]); + io_write_uint32_t(s, obj->reserved[3]); + io_write_uint32_t(s, obj->reserved[4]); + io_write_uint32_t(s, obj->reserved[5]); + io_write_uint32_t(s, obj->reserved[6]); + io_write_uint32_t(s, obj->reserved[7]); + io_write_uint32_t(s, obj->reserved[8]); + io_write_uint32_t(s, obj->reserved[9]); } else { - io_write_uint32_t(s, 0x10000); - io_write_uint32_t(s, 0x00); - io_write_int32_t(s, obj->meshes_count); - io_write_int32_t(s, obj->materials_count); + io_write_uint32_t(s, 0x10000); // version + io_write_uint32_t(s, 0x00); // flags + io_write_int32_t(s, obj->num_mesh); + io_write_int32_t(s, obj->num_material); io_write_float_t(s, obj->bounding_sphere.center.x); io_write_float_t(s, obj->bounding_sphere.center.y); io_write_float_t(s, obj->bounding_sphere.center.z); io_write_float_t(s, obj->bounding_sphere.radius); - io_write_offset_x(s, oh.meshes_offset); - io_write_offset_x(s, oh.materials_offset); + io_write_offset_x(s, oh.mesh_array); + io_write_offset_x(s, oh.material_array); io_write(s, 0x10); io_write_uint8_t(s, obj->flags); io_write(s, 0x07); + io_write_uint32_t(s, obj->reserved[0]); + io_write_uint32_t(s, obj->reserved[1]); + io_write_uint32_t(s, obj->reserved[2]); + io_write_uint32_t(s, obj->reserved[3]); + io_write_uint32_t(s, obj->reserved[4]); + io_write_uint32_t(s, obj->reserved[5]); + io_write_uint32_t(s, obj->reserved[6]); + io_write_uint32_t(s, obj->reserved[7]); + io_write_uint32_t(s, obj->reserved[8]); + io_write_uint32_t(s, obj->reserved[9]); } io_position_pop(s); @@ -4001,8 +4111,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, obj->skin_init = true; io_set_position(s, base_offset, SEEK_SET); - obj_skin_header sh; - memset(&sh, 0, sizeof(obj_skin_header)); + obj_skin_header sh = {}; if (!is_x) { sh.bone_ids_offset = io_read_offset_f2(s, header_length); sh.bone_matrices_offset = io_read_offset_f2(s, header_length); @@ -4038,9 +4147,6 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, } 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 (uint32_t i = 0; i < sk->bones_count; i++) sk->bones[i].id = io_read_uint32_t_stream_reverse_endianness(s); @@ -4087,8 +4193,7 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, sk->ex_data_init = true; io_set_position(s, sh.ex_data_offset, SEEK_SET); - obj_skin_ex_data_header exh; - memset(&exh, 0, sizeof(obj_skin_ex_data_header)); + obj_skin_ex_data_header exh = {}; if (!is_x) { exh.osage_count = io_read_int32_t_stream_reverse_endianness(s); ex->osage_nodes_count = io_read_int32_t_stream_reverse_endianness(s); @@ -4100,14 +4205,13 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_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); - 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); + ex->reserved[0] = io_read_offset_f2(s, header_length); + ex->reserved[1] = io_read_offset_f2(s, header_length); + ex->reserved[2] = io_read_offset_f2(s, header_length); + ex->reserved[3] = io_read_offset_f2(s, header_length); + ex->reserved[4] = io_read_offset_f2(s, header_length); + ex->reserved[5] = io_read_offset_f2(s, header_length); + ex->reserved[6] = io_read_offset_f2(s, header_length); } else { exh.osage_count = io_read_int32_t_stream_reverse_endianness(s); @@ -4120,14 +4224,13 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_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); - 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); + ex->reserved[0] = io_read_offset_x(s); + ex->reserved[1] = io_read_offset_x(s); + ex->reserved[2] = io_read_offset_x(s); + ex->reserved[3] = io_read_offset_x(s); + ex->reserved[4] = io_read_offset_x(s); + ex->reserved[5] = io_read_offset_x(s); + ex->reserved[6] = io_read_offset_x(s); } if (exh.bone_names_offset) { @@ -4301,38 +4404,37 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (!is_x) { ee = { 0, 1, 48, 1 }; - ee.sub.push_back({ 0, 9, ENRS_DWORD }); + ee.append(0, 9, ENRS_DWORD); e.vec.push_back(ee); off = 48; } else { ee = { 0, 3, 72, 1 }; - ee.sub.push_back({ 0, 4, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 4, ENRS_QWORD }); + ee.append(0, 4, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); e.vec.push_back(ee); off = 72; } off = align_val(off, 0x10); - obj_skin_header sh; - memset(&sh, 0, sizeof(obj_skin_header)); + obj_skin_header sh = {}; if (sk->bones_count) { if (sk->bones_count % 4) { ee = { off, 1, 4, (uint32_t)sk->bones_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(sk->bones_count * 4ULL); off = align_val(off, 0x10); ee = { off, 1, 4, (uint32_t)sk->bones_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(sk->bones_count * 4ULL); } else { ee = { off, 1, 4, (uint32_t)(sk->bones_count * 2ULL) }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(sk->bones_count * 2 * 4ULL); } @@ -4340,20 +4442,20 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (!is_x) { ee = { off, 1, 4, (uint32_t)sk->bones_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(sk->bones_count * 4ULL); } else { ee = { off, 1, 8, (uint32_t)sk->bones_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(sk->bones_count * 8ULL); } off = align_val(off, 0x10); ee = { off, 1, 64, (uint32_t)sk->bones_count }; - ee.sub.push_back({ 0, 16, ENRS_DWORD }); + ee.append(0, 16, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(sk->bones_count * 64ULL); off = align_val(off, 0x10); @@ -4363,8 +4465,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, 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_ex_data_header exh = {}; obj_skin_block_header* bhs = 0; int64_t motion_block_node_mats = 0; @@ -4531,17 +4632,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (!is_x) { ee = { off, 1, 80, 1 }; - ee.sub.push_back({ 0, 10, ENRS_DWORD }); + ee.append(0, 10, ENRS_DWORD); e.vec.push_back(ee); off = 80; } else { ee = { off, 5, 128, 1 }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); - ee.sub.push_back({ 0, 4, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 2, ENRS_DWORD); + ee.append(0, 4, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = 128; } @@ -4549,13 +4650,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (ex->osage_nodes_count) { ee = { off, 1, 12, (uint32_t)ex->osage_nodes_count }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(ex->osage_nodes_count * 12ULL); off = align_val(off, 0x10); ee = { off, 1, 12, (uint32_t)ex->osage_sibling_infos_count }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(ex->osage_sibling_infos_count * 12ULL); off = align_val(off, 0x10); @@ -4565,13 +4666,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, int32_t count = exh.osage_count + exh.cloth_count; if (!is_x) { ee = { off, 1, 4, (uint32_t)count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(count * 4ULL); } else { ee = { off, 1, 8, (uint32_t)count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(count * 8ULL); } @@ -4580,13 +4681,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (!is_x) { ee = { off, 1, 4, (uint32_t)exh.bone_names_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(exh.bone_names_count * 4ULL); } else { ee = { off, 1, 8, (uint32_t)exh.bone_names_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(exh.bone_names_count * 8ULL); } @@ -4595,13 +4696,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (ex->blocks_count > 0) { if (!is_x) { ee = { off, 1, 8, (uint32_t)ex->blocks_count }; - ee.sub.push_back({ 0, 2, ENRS_DWORD }); + ee.append(0, 2, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(ex->blocks_count * 8ULL); } else { ee = { off, 1, 16, (uint32_t)ex->blocks_count }; - ee.sub.push_back({ 0, 2, ENRS_QWORD }); + ee.append(0, 2, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(ex->blocks_count * 16ULL); } @@ -4610,17 +4711,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (exh.osage_count) { if (!is_x) { ee = { off, 2, 76, (uint32_t)exh.osage_count }; - ee.sub.push_back({ 0, 14, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_DWORD }); + ee.append(0, 14, ENRS_DWORD); + ee.append(4, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(exh.osage_count * 76ULL); } else { ee = { off, 4, 104, (uint32_t)exh.osage_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 4, ENRS_DWORD }); - ee.sub.push_back({ 8, 1, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 4, ENRS_DWORD); + ee.append(8, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(exh.osage_count * 104ULL); } @@ -4630,17 +4731,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (expressions_count) { if (!is_x) { ee = { off, 1, 84, (uint32_t)expressions_count }; - ee.sub.push_back({ 0, 19, ENRS_DWORD }); + ee.append(0, 19, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(expressions_count * 84ULL); } else { ee = { off, 5, 136, (uint32_t)expressions_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 9, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 9, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(expressions_count * 136ULL); } @@ -4650,16 +4751,16 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (exh.cloth_count) { if (!is_x) { ee = { off, 1, 52, (uint32_t)exh.cloth_count }; - ee.sub.push_back({ 0, 13, ENRS_DWORD }); + ee.append(0, 13, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(exh.cloth_count * 52ULL); } else { ee = { off, 4, 88, (uint32_t)exh.cloth_count }; - ee.sub.push_back({ 0, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 4, ENRS_DWORD }); - ee.sub.push_back({ 0, 6, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 2, ENRS_QWORD); + ee.append(0, 4, ENRS_DWORD); + ee.append(0, 6, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(exh.cloth_count * 88ULL); } @@ -4689,64 +4790,64 @@ static void obj_modern_write_skin(obj* obj, stream* s, switch (cns_type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: ee = { off, 6, 68, 0 }; - ee.sub.push_back({ 0, 17, ENRS_DWORD }); + ee.append(0, 17, ENRS_DWORD); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: ee = { off, 8, 144, 0 }; - ee.sub.push_back({ 0, 29, ENRS_DWORD }); + ee.append(0, 29, ENRS_DWORD); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: ee = { off, 8, 132, 0 }; - ee.sub.push_back({ 0, 33, ENRS_DWORD }); + ee.append(0, 33, ENRS_DWORD); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: ee = { off, 8, 136, 0 }; - ee.sub.push_back({ 0, 34, ENRS_DWORD }); + ee.append(0, 34, ENRS_DWORD); break; } else switch (cns_type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: ee = { off, 6, 96, 0 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 3, ENRS_DWORD); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: ee = { off, 8, 144, 0 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 8, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 6, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 8, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 6, ENRS_DWORD); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: ee = { off, 8, 160, 0 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 8, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 10, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 8, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 10, ENRS_DWORD); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: ee = { off, 8, 168, 0 }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 8, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 11, ENRS_DWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 8, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 11, ENRS_DWORD); break; } constraint_count = 1; @@ -4761,17 +4862,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (!is_x) { ee = { off, 1, 56, (uint32_t)motion_count }; - ee.sub.push_back({ 0, 14, ENRS_DWORD }); + ee.append(0, 14, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(motion_count * 56ULL); } else { ee = { off, 5, 80, (uint32_t)motion_count }; - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 9, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 1, ENRS_DWORD }); - ee.sub.push_back({ 4, 2, ENRS_QWORD }); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 9, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 1, ENRS_DWORD); + ee.append(4, 2, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(motion_count * 80ULL); } @@ -4779,13 +4880,13 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (motion_count) { ee = { off, 1, 64, (uint32_t)motion_nodes_count }; - ee.sub.push_back({ 0, 16, ENRS_DWORD }); + ee.append(0, 16, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(motion_nodes_count * 64ULL); off = align_val(off, 0x10); ee = { off, 1, 4, (uint32_t)motion_nodes_count }; - ee.sub.push_back({ 0, 1, ENRS_DWORD }); + ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(motion_nodes_count * 4ULL); off = align_val(off, 0x10); @@ -4813,7 +4914,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (field_18_count) { ee = { off, 1, 64, (uint32_t)field_18_count }; - ee.sub.push_back({ 0, 16, ENRS_DWORD }); + ee.append(0, 16, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(field_18_count * 64ULL); off = align_val(off, 0x10); @@ -4822,21 +4923,21 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (field_1C_count) { if (!is_x) { ee = { off, 1, 104, (uint32_t)field_1C_count }; - ee.sub.push_back({ 0, 26, ENRS_DWORD }); + ee.append(0, 26, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(field_1C_count * 104ULL); } else { ee = { off, 9, 136, (uint32_t)field_1C_count }; - ee.sub.push_back({ 0, 10, ENRS_DWORD }); - ee.sub.push_back({ 0, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 4, 1, ENRS_QWORD }); - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 10, ENRS_DWORD); + ee.append(0, 1, ENRS_QWORD); + ee.append(0, 3, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 3, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 3, ENRS_DWORD); + ee.append(4, 1, ENRS_QWORD); + ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(field_1C_count * 136ULL); } @@ -4845,7 +4946,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (field_20_count) { ee = { off, 1, 440, (uint32_t)field_20_count }; - ee.sub.push_back({ 0, 110, ENRS_DWORD }); + ee.append(0, 110, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(field_20_count * 440ULL); off = align_val(off, 0x10); @@ -4853,7 +4954,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (field_24_count) { ee = { off, 1, 2, (uint32_t)field_24_count }; - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); off = (uint32_t)(field_24_count * 2ULL); off = align_val(off, 0x10); @@ -4861,7 +4962,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (field_28_count) { ee = { off, 1, 2, (uint32_t)field_28_count }; - ee.sub.push_back({ 0, 1, ENRS_WORD }); + ee.append(0, 1, ENRS_WORD); e.vec.push_back(ee); off = (uint32_t)(field_28_count * 2ULL); off = align_val(off, 0x10); @@ -5665,14 +5766,13 @@ 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_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); + io_write_offset_f2(s, ex->reserved[0], 0x20); + io_write_offset_f2(s, ex->reserved[1], 0x20); + io_write_offset_f2(s, ex->reserved[2], 0x20); + io_write_offset_f2(s, ex->reserved[3], 0x20); + io_write_offset_f2(s, ex->reserved[4], 0x20); + io_write_offset_f2(s, ex->reserved[5], 0x20); + io_write_offset_f2(s, ex->reserved[6], 0x20); } else { io_write_int32_t(s, exh.osage_count); @@ -5685,14 +5785,13 @@ 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_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_write_offset_x(s, ex->reserved[0]); + io_write_offset_x(s, ex->reserved[1]); + io_write_offset_x(s, ex->reserved[2]); + io_write_offset_x(s, ex->reserved[3]); + io_write_offset_x(s, ex->reserved[4]); + io_write_offset_x(s, ex->reserved[5]); + io_write_offset_x(s, ex->reserved[6]); } io_position_pop(s); } @@ -6450,28 +6549,28 @@ static void obj_modern_write_skin_block_osage(obj_skin_block_osage* b, } } -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 - | OBJ_VERTEX_TEXCOORD0 - | OBJ_VERTEX_TEXCOORD1 - | OBJ_VERTEX_COLOR0); +static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* vertex_array, obj_mesh* mesh, + const uint32_t vertex_flags, uint32_t num_vertex, uint32_t size_vertex) { + obj_vertex_format vertex_format = (obj_vertex_format)(OBJ_VERTEX_FORMAT_POSITION + | OBJ_VERTEX_FORMAT_NORMAL + | OBJ_VERTEX_FORMAT_TANGENT + | OBJ_VERTEX_FORMAT_TEXCOORD0 + | OBJ_VERTEX_FORMAT_TEXCOORD1 + | OBJ_VERTEX_FORMAT_COLOR0); - if (attrib_flags == 0x06) - enum_or(vertex_flags, OBJ_VERTEX_TEXCOORD2); - else if (attrib_flags == 0x0A) - enum_or(vertex_flags, OBJ_VERTEX_TEXCOORD2 | OBJ_VERTEX_TEXCOORD3); - else if (attrib_flags == 0x04) - enum_or(vertex_flags, OBJ_VERTEX_BONE_DATA); + if (vertex_flags == 0x06) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TEXCOORD2); + else if (vertex_flags == 0x0A) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_TEXCOORD2 | OBJ_VERTEX_FORMAT_TEXCOORD3); + else if (vertex_flags == 0x04) + enum_or(vertex_format, OBJ_VERTEX_FORMAT_BONE_DATA); - int64_t vtx_offset = attrib_offsets[13]; + int64_t vtx_offset = vertex_array[13]; bool has_tangents = false; - obj_vertex_data* vtx = force_malloc_s(obj_vertex_data, vertex_count); - for (uint32_t i = 0; i < vertex_count; i++) { - io_set_position(s, vtx_offset + (int64_t)vertex_size * i, SEEK_SET); + obj_vertex_data* vtx = force_malloc_s(obj_vertex_data, num_vertex); + for (uint32_t i = 0; i < num_vertex; i++) { + io_set_position(s, vtx_offset + (int64_t)size_vertex * i, SEEK_SET); vec3 position; position.x = io_read_float_t_stream_reverse_endianness(s); @@ -6504,13 +6603,13 @@ static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, texcoord1.y = io_read_half_t_stream_reverse_endianness(s); vec2h_to_vec2(texcoord1, vtx[i].texcoord1); - if (attrib_flags == 0x06) { + if (vertex_flags == 0x06) { vec2h texcoord2; texcoord2.x = io_read_half_t_stream_reverse_endianness(s); texcoord2.y = io_read_half_t_stream_reverse_endianness(s); vec2h_to_vec2(texcoord2, vtx[i].texcoord2); } - else if (attrib_flags == 0x0A) { + else if (vertex_flags == 0x0A) { vec2h texcoord2; texcoord2.x = io_read_half_t_stream_reverse_endianness(s); texcoord2.y = io_read_half_t_stream_reverse_endianness(s); @@ -6529,7 +6628,7 @@ static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, color.w = io_read_half_t_stream_reverse_endianness(s); vec4h_to_vec4(color, vtx[i].color0); - if (attrib_flags == 0x04) { + if (vertex_flags == 0x04) { vec4 bone_weight; bone_weight.x = (float_t)io_read_int16_t_stream_reverse_endianness(s); bone_weight.y = (float_t)io_read_int16_t_stream_reverse_endianness(s); @@ -6559,38 +6658,38 @@ static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* attrib_offsets, } if (!has_tangents) - enum_and(vertex_flags, ~OBJ_VERTEX_TANGENT); + enum_and(vertex_format, ~OBJ_VERTEX_FORMAT_TANGENT); mesh->vertex = vtx; - mesh->vertex_count = vertex_count; - mesh->vertex_flags = vertex_flags; + mesh->num_vertex = num_vertex; + mesh->vertex_format = vertex_format; } static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, - int64_t* attrib_offsets, obj_mesh* mesh, uint32_t* attrib_flags, - uint32_t* vertex_count, uint32_t* vertex_size, f2_struct* ovtx) { + int64_t* vertex_array, obj_mesh* mesh, uint32_t* vertex_flags, + uint32_t* num_vertex, uint32_t* size_vertex, f2_struct* ovtx) { obj_vertex_data* vtx = mesh->vertex; - uint32_t _vertex_count = mesh->vertex_count; - obj_vertex_flags vertex_flags = mesh->vertex_flags; + uint32_t _num_vertex = mesh->num_vertex; + obj_vertex_format vertex_format = mesh->vertex_format; - uint32_t _attrib_flags = 0x02; - uint32_t _vertex_size = 0x2C; + uint32_t _vertex_flags = 0x02; + uint32_t _size_vertex = 0x2C; uint32_t enrs_se3_rc = 12; - if (vertex_flags & OBJ_VERTEX_BONE_DATA) { - _attrib_flags = 0x04; - _vertex_size += 0x0C; + if (vertex_format & OBJ_VERTEX_FORMAT_BONE_DATA) { + _vertex_flags = 0x04; + _size_vertex += 0x0C; enrs_se3_rc += 4; } - else if ((vertex_flags & (OBJ_VERTEX_TEXCOORD2 & OBJ_VERTEX_TEXCOORD3)) - == (OBJ_VERTEX_TEXCOORD2 | OBJ_VERTEX_TEXCOORD3)) { - _attrib_flags = 0x0A; - _vertex_size += 0x08; + else if ((vertex_format & (OBJ_VERTEX_FORMAT_TEXCOORD2 & OBJ_VERTEX_FORMAT_TEXCOORD3)) + == (OBJ_VERTEX_FORMAT_TEXCOORD2 | OBJ_VERTEX_FORMAT_TEXCOORD3)) { + _vertex_flags = 0x0A; + _size_vertex += 0x08; enrs_se3_rc += 4; } - else if (vertex_flags & OBJ_VERTEX_TEXCOORD2) { - _attrib_flags = 0x06; - _vertex_size += 0x04; + else if (vertex_format & OBJ_VERTEX_FORMAT_TEXCOORD2) { + _vertex_flags = 0x06; + _size_vertex += 0x04; enrs_se3_rc += 2; } @@ -6601,22 +6700,22 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, if (e->vec.size() > 0) { off = (uint32_t)((size_t)e->vec.back().size * e->vec.back().repeat_count); if (e->vec.back().sub.begin()[2].repeat_count == enrs_se3_rc) { - e->vec.back().repeat_count += _vertex_count; + e->vec.back().repeat_count += _num_vertex; add_enrs = false; } } if (add_enrs) { - ee = { off, 3, (uint32_t)_vertex_size, (uint32_t)_vertex_count }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); - ee.sub.push_back({ 0, 3, ENRS_WORD }); - ee.sub.push_back({ 2, enrs_se3_rc, ENRS_WORD }); + ee = { off, 3, (uint32_t)_size_vertex, (uint32_t)_num_vertex }; + ee.append(0, 3, ENRS_DWORD); + ee.append(0, 3, ENRS_WORD); + ee.append(2, enrs_se3_rc, ENRS_WORD); e->vec.push_back(ee); } bool has_tangents = false; - attrib_offsets[13] = io_get_position(s); - for (uint32_t i = 0; i < _vertex_count; i++) { + vertex_array[13] = io_get_position(s); + for (uint32_t i = 0; i < _num_vertex; i++) { vec3 position = vtx[i].position; io_write_float_t(s, position.x); io_write_float_t(s, position.y); @@ -6646,7 +6745,13 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, io_write_half_t(s, texcoord1.x); io_write_half_t(s, texcoord1.y); - if (_attrib_flags & 0x08) { + if (_vertex_flags == 0x06) { + vec2h texcoord2; + vec2_to_vec2h(vtx[i].texcoord2, texcoord2); + io_write_half_t(s, texcoord2.x); + io_write_half_t(s, texcoord2.y); + } + else if (_vertex_flags == 0x0A) { vec2h texcoord2; vec2_to_vec2h(vtx[i].texcoord2, texcoord2); io_write_half_t(s, texcoord2.x); @@ -6665,7 +6770,7 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, io_write_half_t(s, color.z); io_write_half_t(s, color.w); - if (_attrib_flags & 0x04) { + if (_vertex_flags == 0x04) { vec4 bone_weight = vtx[i].bone_weight; vec4_mult_min_max_scalar(bone_weight, -32768.0f, 32767.0f, bone_weight); io_write_int16_t(s, (int16_t)bone_weight.x); @@ -6682,9 +6787,9 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, } } - *attrib_flags = _attrib_flags; - *vertex_count = _vertex_count; - *vertex_size = _vertex_size; + *vertex_flags = _vertex_flags; + *num_vertex = _num_vertex; + *size_vertex = _size_vertex; } inline static void obj_skin_block_node_free(obj_skin_block_node* b) { diff --git a/src/KKdLib/obj.hpp b/src/KKdLib/obj.hpp index a1d2a74b..94946686 100644 --- a/src/KKdLib/obj.hpp +++ b/src/KKdLib/obj.hpp @@ -50,25 +50,6 @@ enum obj_material_color_source_type : uint32_t { OBJ_MATERIAL_COLOR_SOURCE_VERTEX_MORPH = 2, }; -enum obj_material_flags : uint32_t { - OBJ_MATERIAL_COLOR = 0x0001, - OBJ_MATERIAL_COLOR_ALPHA = 0x0002, - OBJ_MATERIAL_COLOR_L1 = 0x0004, - OBJ_MATERIAL_COLOR_L1_ALPHA = 0x0008, - OBJ_MATERIAL_COLOR_L2 = 0x0010, - OBJ_MATERIAL_COLOR_L2_ALPHA = 0x0020, - OBJ_MATERIAL_TRANSPARENCY = 0x0040, - OBJ_MATERIAL_SPECULAR = 0x0080, - OBJ_MATERIAL_NORMAL = 0x0100, - OBJ_MATERIAL_NORMALALT = 0x0200, - OBJ_MATERIAL_ENVIRONMENT = 0x0400, - OBJ_MATERIAL_COLOR_L3 = 0x0800, - OBJ_MATERIAL_COLOR_L3_ALPHA = 0x1000, - OBJ_MATERIAL_TRANSLUCENCY = 0x2000, - OBJ_MATERIAL_FLAG_14 = 0x4000, - OBJ_MATERIAL_OVERRIDE_IBL = 0x8000, -}; - enum obj_material_shader_lighting_type : uint32_t { OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT = 0x00, OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT = 0x01, @@ -106,14 +87,6 @@ enum obj_material_vertex_translation_type : uint32_t { OBJ_MATERIAL_VERTEX_TRANSLATION_MORPHING = 2, }; -enum obj_mesh_flags : uint32_t { - OBJ_MESH_FLAG_1 = 0x01, - OBJ_MESH_BILLBOARD_Y_AXIS = 0x02, - OBJ_MESH_TRANSLUCENT_NO_SHADOW = 0x04, - OBJ_MESH_BILLBOARD = 0x08, - OBJ_MESH_COMPRESSED = 0x10, // Own stuff -}; - enum obj_primitive_type : uint32_t { OBJ_PRIMITIVE_POINTS = 0x00, OBJ_PRIMITIVE_LINES = 0x01, @@ -158,31 +131,20 @@ enum obj_skin_osage_root_coli_type { OBJ_SKIN_OSAGE_ROOT_COLI_TYPE_ELLIPSE = 0x04, }; -enum obj_sub_mesh_flags : uint32_t { - OBJ_SUB_MESH_RECIEVE_SHADOW = 0x01, - OBJ_SUB_MESH_CAST_SHADOW = 0x02, - OBJ_SUB_MESH_TRANSPARENT = 0x04, - OBJ_SUB_MESH_FLAG_8 = 0x08, - OBJ_SUB_MESH_FLAG_10 = 0x10, - OBJ_SUB_MESH_FLAG_20 = 0x20, - OBJ_SUB_MESH_FLAG_40 = 0x40, - OBJ_SUB_MESH_FLAG_80 = 0x80, -}; - -enum obj_vertex_flags : uint32_t { - OBJ_VERTEX_NONE = 0x000, - OBJ_VERTEX_POSITION = 0x001, - OBJ_VERTEX_NORMAL = 0x002, - OBJ_VERTEX_TANGENT = 0x004, - OBJ_VERTEX_BINORMAL = 0x008, - OBJ_VERTEX_TEXCOORD0 = 0x010, - OBJ_VERTEX_TEXCOORD1 = 0x020, - OBJ_VERTEX_TEXCOORD2 = 0x040, - OBJ_VERTEX_TEXCOORD3 = 0x080, - OBJ_VERTEX_COLOR0 = 0x100, - OBJ_VERTEX_COLOR1 = 0x200, - OBJ_VERTEX_BONE_DATA = 0x400, - OBJ_VERTEX_UNKNOWN = 0x800, +enum obj_vertex_format : uint32_t { + OBJ_VERTEX_FORMAT_NONE = 0x000, + OBJ_VERTEX_FORMAT_POSITION = 0x001, + OBJ_VERTEX_FORMAT_NORMAL = 0x002, + OBJ_VERTEX_FORMAT_TANGENT = 0x004, + OBJ_VERTEX_FORMAT_BINORMAL = 0x008, + OBJ_VERTEX_FORMAT_TEXCOORD0 = 0x010, + OBJ_VERTEX_FORMAT_TEXCOORD1 = 0x020, + OBJ_VERTEX_FORMAT_TEXCOORD2 = 0x040, + OBJ_VERTEX_FORMAT_TEXCOORD3 = 0x080, + OBJ_VERTEX_FORMAT_COLOR0 = 0x100, + OBJ_VERTEX_FORMAT_COLOR1 = 0x200, + OBJ_VERTEX_FORMAT_BONE_DATA = 0x400, + OBJ_VERTEX_FORMAT_UNKNOWN = 0x800, }; struct obj_axis_aligned_bounding_box { @@ -200,16 +162,114 @@ struct obj_bounding_sphere { float_t radius; }; -struct obj_material_blend_flags { +struct obj_shader_compo_member { + uint32_t color : 1; + uint32_t color_a : 1; + uint32_t color_l1 : 1; + uint32_t color_l1_a : 1; + uint32_t color_l2 : 1; + uint32_t color_l2_a : 1; + uint32_t transparency : 1; + uint32_t specular : 1; + uint32_t normal_01 : 1; + uint32_t normal_02 : 1; + uint32_t envmap : 1; + uint32_t color_l3 : 1; + uint32_t color_l3_a : 1; + uint32_t translucency : 1; + uint32_t flag_14 : 1; + uint32_t override_ibl : 1; + uint32_t dummy : 16; +}; + +union obj_shader_compo { + obj_shader_compo_member m; + uint32_t w; +}; + +struct obj_material_shader_attrib_member { + obj_material_vertex_translation_type vtx_trans_type : 2; + obj_material_color_source_type col_src : 2; + uint32_t is_lgt_diffuse : 1; + uint32_t is_lgt_specular : 1; + uint32_t is_lgt_per_pixel : 1; + uint32_t is_lgt_double : 1; + obj_material_bump_map_type bump_map_type : 2; + uint32_t fresnel_type : 4; + uint32_t line_light : 4; + uint32_t recieve_shadow : 1; + uint32_t cast_shadow : 1; + obj_material_specular_quality specular_quality : 1; + obj_material_aniso_direction aniso_direction : 2; + uint32_t dummy : 9; +}; + +union obj_material_shader_attrib { + obj_material_shader_attrib_member m; + uint32_t w; + + obj_material_shader_lighting_type get_lighting_type(); +}; + +struct obj_texture_attrib_member { + uint32_t repeat_u : 1; + uint32_t repeat_v : 1; + uint32_t mirror_u : 1; + uint32_t mirror_v : 1; + uint32_t ignore_alpha : 1; + uint32_t blend : 5; + uint32_t alpha_blend : 5; + uint32_t border : 1; + uint32_t clamp2edge : 1; + uint32_t filter : 3; + uint32_t mipmap : 2; + uint32_t mipmap_bias : 7; + uint32_t flag_29 : 1; + uint32_t anisotropic_filter : 2; +}; + +union obj_texture_attrib { + obj_texture_attrib_member m; + uint32_t w; + + int32_t get_blend(); +}; + +struct obj_texture_shader_attrib_member { + obj_material_texture_type tex_type : 4; + int32_t uv_idx : 4; + obj_material_texture_coordinate_translation_type texcoord_trans : 3; + uint32_t dummy : 21; +}; + +union obj_texture_shader_attrib { + obj_texture_shader_attrib_member m; + uint32_t w; +}; + +struct obj_material_texture_data { + obj_texture_attrib attrib; + uint32_t tex_index; + obj_texture_shader_attrib shader_info; + char ex_shader[8]; + float_t weight; + mat4u tex_coord_mat; + union { + uint32_t reserved[8]; + int32_t texture_index; + }; +}; + +struct obj_material_attrib_member { uint32_t alpha_texture : 1; uint32_t alpha_material : 1; uint32_t punch_through : 1; uint32_t double_sided : 1; - uint32_t normal_direction_light : 1; + uint32_t normal_dir_light : 1; obj_material_blend_factor src_blend_factor : 4; obj_material_blend_factor dst_blend_factor : 4; uint32_t blend_operation : 3; - uint32_t z_bias : 4; + uint32_t zbias : 4; uint32_t no_fog : 1; uint32_t translucent_priority : 6; uint32_t has_fog_height : 1; @@ -219,94 +279,60 @@ struct obj_material_blend_flags { uint32_t flag_31 : 1; }; -struct obj_material_shader_flags { - obj_material_vertex_translation_type vertex_translation_type : 2; - obj_material_color_source_type color_source_type : 2; - uint32_t lambert_shading : 1; - uint32_t phong_shading : 1; - uint32_t per_pixel_shading : 1; - uint32_t double_shading : 1; - obj_material_bump_map_type bump_map_type : 2; - uint32_t fresnel : 4; - uint32_t line_light : 4; - uint32_t recieve_shadow : 1; - uint32_t cast_shadow : 1; - obj_material_specular_quality specular_quality : 1; - obj_material_aniso_direction aniso_direction : 2; +union obj_material_attrib { + obj_material_attrib_member m; + uint32_t w; }; -struct obj_material_texture_flags { - obj_material_texture_type type : 4; - uint32_t tex_coord_index : 4; - obj_material_texture_coordinate_translation_type tex_coord_trans_type : 4; -}; - -struct obj_material_texture_sampler_flags { - uint32_t repeat_u : 1; - uint32_t repeat_v : 1; - uint32_t mirror_u : 1; - uint32_t mirror_v : 1; - uint32_t ignore_alpha : 1; - uint32_t blend : 5; - uint32_t alpha_blend : 5; - uint32_t border : 1; - uint32_t clamp_to_edge : 1; - uint32_t filter : 3; - uint32_t mip_map : 2; - uint32_t mip_map_bias : 7; - uint32_t flag_29 : 1; - uint32_t anisotropic_filter : 2; -}; - -struct obj_material_texture_texture_flags { - obj_material_texture_type type : 4; - uint32_t tex_coord_index : 4; - obj_material_texture_coordinate_translation_type tex_coord_trans_type : 3; -}; - -struct obj_material_texture { - obj_material_texture_sampler_flags sampler_flags; - uint32_t texture_id; - obj_material_texture_texture_flags texture_flags; - char shader_name[8]; - float_t weight; - mat4u tex_coord_mat; - union { - int32_t reserved[8]; - int32_t texture_index; - }; -}; - -struct obj_material { - obj_material_flags flags; - union { - char name[8]; - int32_t index; - } shader; - obj_material_shader_flags shader_flags; - obj_material_texture textures[8]; - obj_material_blend_flags blend_flags; +struct obj_material_color { vec4u diffuse; vec4u ambient; vec4u specular; vec4u emission; float_t shininess; float_t intensity; - obj_bounding_sphere reserved_sphere; +}; + +struct obj_material { + obj_shader_compo shader_compo; + union { + char name[8]; + int32_t index; + } shader; + obj_material_shader_attrib shader_info; + obj_material_texture_data texdata[8]; + obj_material_attrib attrib; + obj_material_color color; + vec3 center; + float_t radius; char name[64]; float_t bump_depth; uint32_t reserved[15]; }; struct obj_material_data { - uint32_t textures_count; + uint32_t num_of_texture; obj_material material; }; +struct obj_sub_mesh_attrib_member { + uint32_t recieve_shadow : 1; + uint32_t cast_shadow : 1; + uint32_t transparent : 1; + uint32_t flag_3 : 1; + uint32_t dummy : 28; +}; + +union obj_sub_mesh_attrib { + obj_sub_mesh_attrib_member m; + uint32_t w; +}; + struct obj_sub_mesh { + uint32_t flags; obj_bounding_sphere bounding_sphere; uint32_t material_index; - uint8_t texcoord_indices[8]; + uint8_t uv_index[8]; uint16_t* bone_indices; uint32_t bone_indices_count; uint32_t bones_per_vertex; @@ -314,7 +340,7 @@ struct obj_sub_mesh { obj_index_format index_format; uint32_t* indices; uint32_t indices_count; - obj_sub_mesh_flags flags; + obj_sub_mesh_attrib attrib; union { obj_axis_aligned_bounding_box axis_aligned_bounding_box; obj_bounding_box bounding_box; @@ -340,15 +366,31 @@ struct obj_vertex_data { vec4u unknown; }; +struct obj_mesh_attrib_member { + uint32_t flag_0 : 1; + uint32_t billboard_y_axis : 1; + uint32_t translucent_no_shadow : 1; + uint32_t billboard : 1; + uint32_t dummy : 27; // 28 + uint32_t compressed : 1; // Own stuff +}; + +union obj_mesh_attrib { + obj_mesh_attrib_member m; + uint32_t w; +}; + struct obj_mesh { + uint32_t flags; obj_bounding_sphere bounding_sphere; - obj_sub_mesh* sub_meshes; - uint32_t sub_meshes_count; + uint32_t num_submesh; + obj_sub_mesh* submesh_array; + obj_vertex_format vertex_format; + uint32_t size_vertex; + uint32_t num_vertex; obj_vertex_data* vertex; - uint32_t vertex_count; - uint32_t vertex_size; - obj_vertex_flags vertex_flags; - obj_mesh_flags flags; + obj_mesh_attrib attrib; + uint32_t reserved[6]; char name[0x40]; }; @@ -563,14 +605,7 @@ struct obj_skin_ex_data { uint32_t bone_names_count; obj_skin_osage_sibling_info* osage_sibling_infos; 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; + int64_t reserved[7]; }; struct obj_skin_bone { @@ -589,11 +624,12 @@ struct obj_skin { struct obj { obj_bounding_sphere bounding_sphere; - obj_mesh* meshes; - uint32_t meshes_count; - obj_material_data* materials; - uint32_t materials_count; + obj_mesh* mesh_array; + uint32_t num_mesh; + obj_material_data* material_array; + uint32_t num_material; uint8_t flags; + uint32_t reserved[10]; obj_skin skin; bool skin_init; string name; @@ -606,10 +642,11 @@ struct obj_set { bool modern; bool is_x; - obj* objects; - uint32_t objects_count; - uint32_t* texture_ids; - uint32_t texture_ids_count; + obj* obj_data; + uint32_t obj_num; + uint32_t* tex_id_data; + uint32_t tex_id_num; + uint32_t reserved[2]; obj_set(); virtual ~obj_set(); diff --git a/src/KKdLib/pv_exp.cpp b/src/KKdLib/pv_exp.cpp new file mode 100644 index 00000000..68799e19 --- /dev/null +++ b/src/KKdLib/pv_exp.cpp @@ -0,0 +1,234 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "pv_exp.hpp" +#include "f2/struct.hpp" +#include "io/path.h" +#include "io/stream.h" +#include "str_utils.h" + +static void pv_exp_classic_read_inner(pv_exp* exp, stream* s); +static void pv_exp_classic_write_inner(pv_exp* exp, stream* s); +static void pv_exp_modern_read_inner(pv_exp* exp, stream* s, uint32_t header_length); +static void pv_exp_modern_write_inner(pv_exp* exp, stream* s); + +pv_exp_mot::pv_exp_mot() : face_data(), face_cl_data() { + +} + +pv_exp_mot::~pv_exp_mot() { + if (face_data) { + delete[] face_data; + face_data = 0; + } + + if (face_cl_data) { + delete[] face_cl_data; + face_cl_data = 0; + } +} + +pv_exp::pv_exp() : ready(), modern(), is_x() { + +} + +pv_exp::~pv_exp() { + +} + +void pv_exp::read(const char* path, bool modern) { + if (!path) + return; + + if (!modern) { + char* path_bin = str_utils_add(path, ".bin"); + if (path_check_file_exists(path_bin)) { + stream s; + io_open(&s, path_bin, "rb"); + if (s.io.stream) { + uint8_t* data = force_malloc_s(uint8_t, s.length); + io_read(&s, data, s.length); + stream s_bin; + io_open(&s_bin, data, s.length); + pv_exp_classic_read_inner(this, &s_bin); + io_free(&s_bin); + free(data); + } + io_free(&s); + } + free(path_bin); + } + else { + char* path_dex = str_utils_add(path, ".dex"); + if (path_check_file_exists(path_dex)) { + f2_struct st; + st.read(path_dex); + if (st.header.signature == reverse_endianness_uint32_t('EXPC')) { + stream s_expc; + io_open(&s_expc, &st.data); + s_expc.is_big_endian = st.header.use_big_endian; + pv_exp_modern_read_inner(this, &s_expc, st.header.length); + io_free(&s_expc); + } + } + free(path_dex); + } +} + +void pv_exp::read(const wchar_t* path, bool modern) { + if (!path) + return; + + if (!modern) { + wchar_t* path_bin = str_utils_add(path, L".bin"); + if (path_check_file_exists(path_bin)) { + stream s; + io_open(&s, path_bin, L"rb"); + if (s.io.stream) { + uint8_t* data = force_malloc_s(uint8_t, s.length); + io_read(&s, data, s.length); + stream s_bin; + io_open(&s_bin, data, s.length); + pv_exp_classic_read_inner(this, &s_bin); + io_free(&s_bin); + free(data); + } + io_free(&s); + } + free(path_bin); + } + else { + wchar_t* path_dex = str_utils_add(path, L".dex"); + if (path_check_file_exists(path_dex)) { + f2_struct st; + st.read(path_dex); + if (st.header.signature == reverse_endianness_uint32_t('EXPC')) { + stream s_expc; + io_open(&s_expc, &st.data); + s_expc.is_big_endian = st.header.use_big_endian; + pv_exp_modern_read_inner(this, &s_expc, st.header.length); + io_free(&s_expc); + } + } + free(path_dex); + } +} + +void pv_exp::read(const void* data, size_t size, bool modern) { + if (!data || !size) + return; + + if (!modern) { + stream s; + io_open(&s, data, size); + pv_exp_classic_read_inner(this, &s); + io_free(&s); + } + else { + f2_struct st; + st.read(data, size); + if (st.header.signature == reverse_endianness_uint32_t('EXPC')) { + stream s_expc; + io_open(&s_expc, &st.data); + s_expc.is_big_endian = st.header.use_big_endian; + pv_exp_modern_read_inner(this, &s_expc, st.header.length); + io_free(&s_expc); + } + } +} + +void pv_exp::write(const char* path) { + if (!path || !ready) + return; + + if (!modern) { + char* path_bin = str_utils_add(path, ".bin"); + stream s; + io_open(&s, path_bin, "wb"); + if (s.io.stream) + pv_exp_classic_write_inner(this, &s); + io_free(&s); + free(path_bin); + } + else { + char* path_dex = str_utils_add(path, ".dex"); + stream s; + io_open(&s, path_dex, "wb"); + if (s.io.stream) + pv_exp_modern_write_inner(this, &s); + io_free(&s); + free(path_dex); + } +} + +void pv_exp::write(const wchar_t* path) { + if (!path || !ready) + return; + + if (!modern) { + wchar_t* path_bin = str_utils_add(path, L".bin"); + stream s; + io_open(&s, path_bin, L"wb"); + if (s.io.stream) + pv_exp_classic_write_inner(this, &s); + io_free(&s); + free(path_bin); + } + else { + wchar_t* path_dex = str_utils_add(path, L".dex"); + stream s; + io_open(&s, path_dex, L"wb"); + if (s.io.stream) + pv_exp_modern_write_inner(this, &s); + io_free(&s); + free(path_dex); + } +} + +void pv_exp::write(void** data, size_t* size) { + if (!data || !size || !ready) + return; + + stream s; + io_open(&s); + if (!modern) + pv_exp_classic_write_inner(this, &s); + else + pv_exp_modern_write_inner(this, &s); + io_align_write(&s, 0x10); + io_copy(&s, data, size); + io_free(&s); +} + +bool pv_exp::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; + + std::string s = path + std::string(file, file_len); + + pv_exp* exp = (pv_exp*)data; + exp->read(s.c_str(), exp->modern); + + return exp->ready; +} + +static void pv_exp_classic_read_inner(pv_exp* exp, stream* s) { + +} + +static void pv_exp_classic_write_inner(pv_exp* exp, stream* s) { + +} + +static void pv_exp_modern_read_inner(pv_exp* exp, stream* s, uint32_t header_length) { + +} + +static void pv_exp_modern_write_inner(pv_exp* exp, stream* s) { + +} diff --git a/src/KKdLib/pv_exp.hpp b/src/KKdLib/pv_exp.hpp new file mode 100644 index 00000000..5081ebfa --- /dev/null +++ b/src/KKdLib/pv_exp.hpp @@ -0,0 +1,47 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include "default.h" + +struct pv_exp_data { + float_t frame; + int16_t type; + int16_t id; + float_t value; + float_t trans; +}; + +struct pv_exp_mot { + pv_exp_data* face_data; + pv_exp_data* face_cl_data; + std::string name; + + pv_exp_mot(); + ~pv_exp_mot(); +}; + +struct pv_exp { + bool ready; + bool modern; + bool is_x; + + std::vector motion_data; + + pv_exp(); + ~pv_exp(); + + void read(const char* path, bool modern); + void read(const wchar_t* path, 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* size); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; diff --git a/src/KKdLib/str_utils.c b/src/KKdLib/str_utils.c index 303c0a54..c34bba15 100644 --- a/src/KKdLib/str_utils.c +++ b/src/KKdLib/str_utils.c @@ -424,7 +424,7 @@ wchar_t* str_utils_copy(const wchar_t* str) { } inline int32_t str_utils_compare(const char* str0, const char* str1) { - int32_t diff = 0;; + int32_t diff = 0; char c0; char c1; do @@ -438,7 +438,7 @@ inline int32_t str_utils_compare(const char* str0, const char* str1) { } inline int32_t str_utils_compare(const wchar_t* str0, const wchar_t* str1) { - int32_t diff = 0;; + int32_t diff = 0; wchar_t c0; wchar_t c1; do @@ -457,7 +457,7 @@ inline int32_t str_utils_compare_length(const char* str0, size_t str0_len, const else if (!str1_len) return *str0; - int32_t diff = 0;; + int32_t diff = 0; char c0; char c1; do @@ -476,7 +476,7 @@ inline int32_t str_utils_compare_length(const wchar_t* str0, size_t str0_len, co else if (!str1_len) return *str0; - int32_t diff = 0;; + int32_t diff = 0; wchar_t c0; wchar_t c1; do diff --git a/src/KKdLib/txp.cpp b/src/KKdLib/txp.cpp index c078b678..21594cda 100644 --- a/src/KKdLib/txp.cpp +++ b/src/KKdLib/txp.cpp @@ -287,24 +287,24 @@ bool txp_set::produce_enrs(enrs* enrs) { enrs_entry ee; ee = { 0, 1, 12, 1 }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); enrs->vec.push_back(ee); l += o = 12; ee = { o, 1, (uint32_t)(count * 4), 1 }; - ee.sub.push_back({ 0, (uint32_t)count, ENRS_DWORD }); + ee.append(0, (uint32_t)count, ENRS_DWORD); enrs->vec.push_back(ee); l += (size_t)(o = (uint32_t)(count * 4ULL)); tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) { ee = { o, 1, 12, 1 }; - ee.sub.push_back({ 0, 3, ENRS_DWORD }); + ee.append(0, 3, ENRS_DWORD); enrs->vec.push_back(ee); l += o = 12; ee = { o, 1, tex->array_size * 4, tex->mipmaps_count }; - ee.sub.push_back({ 0, tex->array_size, ENRS_DWORD }); + ee.append(0, tex->array_size, ENRS_DWORD); enrs->vec.push_back(ee); l += (size_t)(o = (uint32_t)((size_t)tex->array_size * tex->mipmaps_count * 4)); @@ -312,7 +312,7 @@ bool txp_set::produce_enrs(enrs* enrs) { for (size_t j = 0; j < tex->array_size; j++) { for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { ee = { o, 1, 24, 1 }; - ee.sub.push_back({ 0, 6, ENRS_DWORD }); + ee.append(0, 6, ENRS_DWORD); enrs->vec.push_back(ee); l += (size_t)(o = (uint32_t)(24 + tex_mipmap->size)); }